免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 2189 | 回复: 5

求一多维数组接近的算法。 [复制链接]

论坛徽章:
0
发表于 2018-03-16 16:56 |显示全部楼层
5可用积分
RT

A=[3, -1, 4]

B = numpy.array([1,1,1],
                           [1,-1,1],
                           [1,1, -1])

A 在数组B中最接近的是 [1, -1, 1], 比较条件:正负的权重大于加减,这句话说明白了吧。

B1 = numpy.array([1,1,1],
                           [1,-1,1],
                           [1,1, -1],
                           [3,1,4])     结果还是[1,-1,1]。因为加减没有全匹配到。


数字中没有0.

最佳答案

查看完整内容

2, -1, 3 是自己加上去的。

论坛徽章:
11
子鼠
日期:2014-10-11 16:46:4815-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:532016科比退役纪念章
日期:2018-03-16 10:24:05
发表于 2018-03-16 16:56 |显示全部楼层
本帖最后由 523066680 于 2018-03-17 15:32 编辑
  1. my $A = [3, -1, 4];

  2. my $B = [
  3.     [1, 1, 1],
  4.     [1,-1, 1],
  5.     [2,-1, 3],
  6.     [1, 1,-1],
  7.     [3, 1, 4]
  8.    ];

  9. # 估值
  10. my @esta;
  11. my @estb;
  12. my $e_a;
  13. my $e_b;

  14. for my $subset ( @$B )
  15. {
  16.     $e_a = 0;
  17.     $e_b = 0;
  18.     for my $id ( 0 .. $#$A )
  19.     {
  20.         $e_a ++ if ( $subset->[$id] / $A->[$id] < 0 );   # 若正负相反,估值变大
  21.         $e_b += ($subset->[$id] - $A->[$id])**2;         # 分量距离作为估值
  22.     }

  23.     push @esta, $e_a;
  24.     push @estb, sqrt($e_b);
  25. }

  26. # 显示各组估值情况
  27. for my $id ( 0..$#esta )
  28. {
  29.     printf "%4.1f %4.1f %4.1f  ", @{$B->[$id]};
  30.     printf "esta: %d estb: %.3f\n", $esta[$id], $estb[$id];
  31. }

  32. # 分级排序,正负估值优先,向量距离其次
  33. my @order=
  34.     sort
  35.     {
  36.         $esta[$a] <=> $esta[$b] ||
  37.         $estb[$a] <=> $estb[$b]
  38.     } ( 0 .. $#esta );

  39. my $best = $order[0];

  40. # 结果
  41. printf "\nBest: %s\n", join(", ", @{ $B->[$best] } );
复制代码


2, -1, 3 是自己加上去的。

1.0  1.0  1.0  esta: 1 estb: 4.123
1.0 -1.0  1.0  esta: 0 estb: 3.606
2.0 -1.0  3.0  esta: 0 estb: 1.414
1.0  1.0 -1.0  esta: 2 estb: 5.745
3.0  1.0  4.0  esta: 1 estb: 2.000

Best: 2, -1, 3

论坛徽章:
39
技术图书徽章
日期:2018-08-21 13:30:492015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00平安夜徽章
日期:2015-12-26 00:06:30技术图书徽章
日期:2018-08-21 13:30:242016科比退役纪念章
日期:2018-03-07 11:23:33
发表于 2018-03-16 18:35 |显示全部楼层
这个需求还是说不清,
[-1,-1,1]和[1,-1,-1]哪个更接近?  如果没有正好匹配的,哪个更接近?
[1,-1,1]和[2,-2,1]哪个更接近?   正负匹配, 加减也一样,怎么算?

论坛徽章:
0
发表于 2018-03-17 12:10 |显示全部楼层
回复 2# laputa73

看来是我没说清楚。重点考虑正负,没有没有正负,返回没有匹配到,匹配到正负后,算出最接近得

论坛徽章:
0
发表于 2018-03-17 14:45 |显示全部楼层
回复 2# 523066680

多多感谢

论坛徽章:
0
发表于 2018-03-19 09:55 |显示全部楼层
A = np.array([3,-1, 4])

B = np.array([[1,1,1],[1,-1,1],[1,1,-1]])

# distances array-wise
np.abs(B - A)

# sum of absolute values of distances (smallest is closest)
np.sum(np.abs(B - A), axis=1)

# index of smallest (in this case index 1)
np.argmin(np.sum(np.abs(B - A), axis=1))

# all in one line (take array 1 from B)
result = B[np.argmin(np.sum(np.abs(B - A), axis=1))]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

数据风云,十年变迁
DTCC 第十届中国数据库技术大会已启航!

2019年5月8日~5月10日,由IT168旗下ITPUB企业社区平台主办的第十届中国数据库技术大会(DTCC2019),将在北京隆重召开。大会将邀请百余位行业专家,就热点技术话题进行分享,是广大数据领域从业人士的又一次年度盛会和交流平台。与SACC2018类似,本届大会将采用“3+2”模式:3天传统技术演讲+2天深度主题培训。大会不仅提供超100场的主题演讲,还会提供连续2天的深度课程培训,深化数据领域的项目落地实践方案。
DTCC2019,一场值得期待的数据技术盛会,殷切地希望您报名参与!

活动入口>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP