与えられた場合、異なるグループを表すAと呼ばれる10個のベクトルのリストを言います。次に、ベクトルv1、v2、...、vnの時系列があり、それぞれがベクトルでもあります。距離計量を定義した場合、v1、v2、...、vnごとにAで「最も近い」ベクトルを見つける方法があるかどうか疑問に思いました。
ループしてすべてのエントリを比較する以外に、これを行う簡単な方法はありますか?
編集:いいえ、k-meansなどの方法を尋ねているわけではありません。
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]
メトリックを定義する場合、それを min 関数で使用できます。
closest = min(A, key=distance)
したがって、いくつかのサンプルコードは次のとおりです。
# 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はこれが発生するインデックスを返します
お役に立てれば。