2015-09-07 60 views
8

与えられた場合、異なるグループを表すAと呼ばれる10のベクトルのリストを言う。次に、ベクトルv1、v2、...、vnの時系列を持ち、それぞれベクトルでもあります。私は、距離メトリックを定義すると、各v1、v2、...、vnのAに "最も近い"ベクトルを見つける方法があるかどうか疑問に思っていましたか?ベクトルのリストから最も近いベクトルを見つける| Python

ループするだけでなく、すべてのエントリを比較するだけでなく、これを行う簡単な方法はありますか?

編集:いいえ私はk-meansやそのようなことをする方法を尋ねていません。あなたはメトリックを定義する場合

+1

[Pythonを使って最近傍アルゴリズムでデータを分類するにはどうすればいいですか?](http://stackoverflow.com/questions/7326958/how-can-i-classify-data-with-the-nearest -neighbor-algorithm-using-python) – Sneftel

答えて

12

あなたはspatial KDtree in scipyを使用することができます。高速木アルゴリズムを使用して、任意の次元のベクトルの近くの点を識別します。

を編集してください。申し訳ありませんが、arbitrary distance metricsをお探しの場合は、ツリーのような構造が選択肢として残っている可能性があります。ここで

は一例です:

>>> 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] 
+0

うーん。だから私はKDTreeに "10個の異なるベクトル(グループ)"を持つ行列Aを送ります。それから、私は単に私の興味のシリーズ全体をループし、tree.query(data [i])を実行するだけですか?私はそれを試みましたが、出力は非常に直感的ではなく、このメソッドのドキュメントは非常に欠けていました... – ajl123

+0

はい、あなたは一度にすべてのポイントを渡すことができます。 Perデフォルトクエリーは、Aの最も近いベクトルを与えられたものに戻します。そして、それはそのベクトルへの距離とAにおける最も近いベクトルの位置を返します。 – haraldkl

1

、あなたはそれがmin機能で使用することができます。

closest = min(A, key=distance) 
+0

非常にきれいですが、OPのように聞こえますが、Aの各ベクトルにA内の最も近いベクトルを見つける方法がありますが、 – lemonhead

1

だから、いくつかのサンプルコードは次のとおりです。

# 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と私の変数を返します。 dは最も近い距離を格納します 私はこれが起こるインデックスを返します

これは役立ちます。

関連する問題