0

我有一个给定的值列表和一组具有相似值的列表(列表A、、B和)。C我正在尝试找到一种方法来返回与列表最匹配的given列表。我想使用最小二乘拟合作为距离度量。

given = [0, 1, 2, 3, 4, 5]
A = [0.1, 0.9, 2, 3.3, 3.6, 5.1]
B = [-0.1, 0.9, 2.1, 3.1, 3.9, 5]
C = [0, 1.1, 2, 2.9, 4, 5.1]

所以在这种情况下,它将C作为最接近的匹配返回given

我想我可以加入类似的东西:

match = [min([val[idx] for val in [A,B,C]], key=lambda x: abs(x-given[idx])) for idx in range(len(given))]

但这只会返回每个列表元素的最接近的值。我不确定如何将列表 C 识别为最接近的逐点匹配。

另外,如果列表的长度不同,如果我不逐个索引比较它们,我真的不知道该怎么办。例如:

given = [0, 1, 2, 3, 4, 5]
A = [0.1, 0.9, 2, 3.3, 3.6, 2, 5.1, 3, 6.8, 7.1, 8.2, 9]
B = [-0.1, 0.9, 2.1, 3.1, 3.9]
C = [-1.7, -1, 0, 1.1, 2, 2.9, 4, 5.1, 6, 7.1, 8]

仍将C作为最接近的匹配返回。

我也在使用 Numpy,但没有发现任何有用的东西。任何帮助将不胜感激!

4

2 回答 2

1

纯 python 解决方案不是最有效的,但这是使用最小二乘法作为距离度量的一种实现。

def distance(x,y):
    return sum( (a-b)**2 for a,b in zip(x,y) )

given = [0, 1, 2, 3, 4, 5]
A = [0.1, 0.9, 2, 3.3, 3.6, 5.1]
B = [-0.1, 0.9, 2.1, 3.1, 3.9, 5]
C = [0, 1.1, 2, 2.9, 4, 5.1]

min((A,B,C),key=lambda x:distance(x,given))

假设np.ndarrays大小相同,distance可以写成:

def distance(x,y):
    return ((x-y)**2).sum()
于 2012-11-26T15:28:37.117 回答
1

您可以使用平方误差的总和。我做了一个简单的例子:

from copy import copy

def squaredError(a, b):
    r = copy(a)

    for i in range(len(a)):
        r[i] -= b[i]
        r[i] *= r[i]

    return sum(r)

given = [0, 1, 2, 3, 4, 5]
A = [0.1, 0.9, 2, 3.3, 3.6, 5.1]
B = [-0.1, 0.9, 2.1, 3.1, 3.9, 5]
C = [0, 1.1, 2, 2.9, 4, 5.1]

print squaredError(given, A)
print squaredError(given, B)
print squaredError(given, C)

match = min(map(lambda x: (squaredError(given, x), x), [A,B,C]))[1]
print match
于 2012-11-26T15:42:20.350 回答