Python:查找与值最匹配的输入列表值的列表

时间:2012-11-26 15:23:08

标签: python numpy

我有一个给定的值列表和一组具有相似值的列表(列表ABC)。我正在尝试找到一种方法来返回与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,但没有找到任何有用的东西。任何帮助将不胜感激!

2 个答案:

答案 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