web-dev-qa-db-ja.com

ベクトルのリストから最も近いベクトルを見つける| Python

与えられた場合、異なるグループを表すAと呼ばれる10個のベクトルのリストを言います。次に、ベクトルv1、v2、...、vnの時系列があり、それぞれがベクトルでもあります。距離計量を定義した場合、v1、v2、...、vnごとにAで「最も近い」ベクトルを見つける方法があるかどうか疑問に思いました。

ループしてすべてのエントリを比較する以外に、これを行う簡単な方法はありますか?

編集:いいえ、k-meansなどの方法を尋ねているわけではありません。

11
ajl123

scipyの空間KDtree を使用できます。高速ツリーアルゴリズムを使用して、任意の次元のベクトルの近くの点を識別します。

編集:申し訳ありませんが、 任意の距離メトリック を探している場合は、ツリーのような構造がまだオプションである可能性があります。

次に例を示します。

>>> from scipy import spatial
>>> A = [[0,1,2,3,4], [4,3,2,1,0], [2,5,3,7,1], [1,0,1,0,1]]
>>> tree = spatial.KDTree(A)

これにより、AのすべてのポイントでKDTreeがセットアップされ、その中で高速な空間検索を実行できるようになります。このようなクエリはベクトルを受け取り、Aの最近傍を返します。

>>> tree.query([0.5,0.5,0.5,0.5,0.5])
(1.1180339887498949, 3)

最初の戻り値は最近傍の距離であり、2番目の戻り値はAでの位置であり、たとえば次のように取得できます。

>>> A[ tree.query([0.5,0.5,0.5,0.5,0.5])[1] ]
[1, 0, 1, 0, 1]
18
haraldkl

メトリックを定義する場合、それを min 関数で使用できます。

closest = min(A, key=distance)
1
jojonas

したがって、いくつかのサンプルコードは次のとおりです。

# build a KD-tree to compare to some array of vectors 'centall'
tree = scipy.spatial.KDTree(centall) 
print 'shape of tree is ', tree.data.shape

# loop through different regions and identify any clusters that belong to a different region
[d1, i1] = tree.query(group1)
[d2, i2] = tree.query(group2)

これにより、変数dとiが返されます。 dは最も近い距離を格納しますiはこれが発生するインデックスを返します

お役に立てれば。

1
ajl123