2017-12-28 34 views
0

例えば、私はベクトルxaが最も近いneigbourです。それで、bはその次に近い隣りです。 PytonやRには、[a, b]のようなものを出力するパッケージがあります。これは、最も近い隣人(おそらく多数決による)であり、bは2番目に近い隣人です。2つ以上の最近傍を返すKNNアルゴリズム

答えて

2

これは、これらのメトリックツリーが構築されているものです。うち

import numpy as np 
from sklearn.neighbors import KDTree 

X = np.array([[1,1],[2,2], [3,3]]) # 3 points in 2 dimensions 
tree = KDTree(X) 
dist, ind = tree.query([[1.25, 1.35]], k=2) 
print(ind) # indices of 2 closest neighbors 
print(dist) # distances to 2 closest neighbors 

[[0 1]] 
[[ 0.43011626 0.99247166]] 

そして、ちょうどにあなたがsklearnのKDTreeを(劇中のあなたのメトリックに応じて、BallTreeを考慮)を使用して、そのような単純なものを求めているとしてあなたの質問は読み込み

明確である:KNN 通常は、分類作業のためのメトリクスツリー(KDTree、BallTree)に基づくいくつかの事前構築アルゴリズムを指す。多くの場合、これらのデータ構造は、1が興味を持っている唯一のものです。

編集

私が正しくあなたのコメントを解釈する場合は、manhattan/taxicab/l1 metricを使用します。

これらの空間ツリーの互換性リストについては、hereを参照してください。

あなたはちょうどそのようにそれを使用します。

X = np.array([[1,1],[2,2], [3,3]]) # 3 points in 2 dimensions 
tree = KDTree(X, metric='l1')           # !!! 
dist, ind = tree.query([[1.25, 1.35]], k=2) 
print(ind) # indices of 2 closest neighbors 
print(dist) # distances to 2 closest neighbors 

アウト:

[[0 1]] 
[[ 0.6 1.4]] 
+0

感謝。あなたはベクトルの要素の距離行列である私自身の距離メトリックを挿入することで私を助けてくれるのですか?例えば、2つのベクトル[x1、x2]と[y2、y2]がある場合、ベクトル間の距離を距離行列から要素ごとに求める距離メトリックを挿入することが可能です。したがって、xとyとの間の距離は| x1-y1 | + | x2-y2 |となる。 – spartan

+0

floatを返すdisting関数dist(x、y)を使って 'tree = KDTree(X、metric = dist)' 'を試してみるとエラーが出ます:ValueError:metric PyFuncDistanceはKDTreeに対して無効です – spartan

+0

@spartan – sascha

関連する問題