忘记密码   免费注册 查看新帖 |

ChinaUnix.net

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

论坛徽章:
37
CU大牛徽章
日期:2013-03-13 15:32:35CU十二周年纪念徽章
日期:2013-10-24 15:41:34射手座
日期:2013-10-24 21:01:23辰龙
日期:2013-12-20 17:07:19狮子座
日期:2014-05-12 11:00:00寅虎
日期:2014-06-04 16:25:27IT运维版块每日发帖之星
日期:2015-08-17 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00平安夜徽章
日期:2015-12-26 00:06:30IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
发表于 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))]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP