0

与えられた値のリストと、同様の値を持つリスト(リスト、、、および)ABコレクションがあります。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ソリューションは最も効率的ではありませんが、距離メトリックに最小二乗法を使用する1つの実装があります。

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 に答える