我有一个给定的值列表和一组具有相似值的列表(列表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,但没有找到任何有用的东西。任何帮助将不胜感激!
答案 0 :(得分: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()
答案 1 :(得分: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