dahe_1984 发表于 2018-03-16 16:56

求一多维数组接近的算法。


RT

A=

B = numpy.array(,
                           ,
                           )

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

B1 = numpy.array(,
                           ,
                           ,
                           )   结果还是。因为加减没有全匹配到。


数字中没有0.

523066680 发表于 2018-03-16 16:56

本帖最后由 523066680 于 2018-03-17 15:32 编辑

my $A = ;

my $B = [
    ,
    ,
    ,
    ,
   
   ];

# 估值
my @esta;
my @estb;
my $e_a;
my $e_b;

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

    push @esta, $e_a;
    push @estb, sqrt($e_b);
}

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

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

my $best = $order;

# 结果
printf "\nBest: %s\n", join(", ", @{ $B->[$best] } );


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

1.01.01.0esta: 1 estb: 4.123
1.0 -1.01.0esta: 0 estb: 3.606
2.0 -1.03.0esta: 0 estb: 1.414
1.01.0 -1.0esta: 2 estb: 5.745
3.01.04.0esta: 1 estb: 2.000

Best: 2, -1, 3

laputa73 发表于 2018-03-16 18:35

这个需求还是说不清,
[-1,-1,1]和哪个更接近?如果没有正好匹配的,哪个更接近?
和哪个更接近?   正负匹配, 加减也一样,怎么算?

dahe_1984 发表于 2018-03-17 12:10

回复 2# laputa73

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

dahe_1984 发表于 2018-03-17 14:45

回复 2# 523066680

多多感谢

dahe_1984 发表于 2018-03-19 09:55

A = np.array()

B = np.array([,,])

# 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
页: [1]
查看完整版本: 求一多维数组接近的算法。