5

次のような多数の機能があります。

id1 28273 20866 29961 27190 31790 19714 8643 14482 5384 ....  upto 1000
id2 12343 45634 29961 27130 33790 14714 7633 15483 4484 ....  
id3 ..... ..... ..... ..... ..... ..... .... ..... .... .... .   .   .
...
id200000 .... .... ... ..  .  .  .  .

IDごとにユークリッド距離を計算し、それらを並べ替えて、最も近い5つの点を見つけたいと思います。私のデータセットは非常に大きいためです。それを行う最善の方法は何ですか。

4

2 に答える 2

19

scikit-learn には最近傍検索機能があります。例:

  1. データを NumPy 配列にロードします。

    >>> import numpy as np
    >>> X = np.array([[28273, 20866, 29961, 27190, 31790, 19714, 8643, 14482, 5384, ...],
                      [12343, 45634, 29961, 27130, 33790, 14714, 7633, 15483, 4484, ...], 
                      ...
                      ])
    

    (2点だけ掲載しています。)

  2. オブジェクトをフィットさせNearestNeighborsます。

    >>> from sklearn.neighbors import NearestNeighbors
    >>> knn = NearestNeighbors(n_neighbors=5)
    >>> knn.fit(X)
    NearestNeighbors(algorithm='auto', leaf_size=30, n_neighbors=5, p=2,
             radius=1.0, warn_on_equidistant=True)
    

    p=2ユークリッド (L2) 距離を意味します。p=1マンハッタン (L1) 距離を意味します。

  3. クエリを実行します。の近傍を取得するにはX[0]、最初のデータ ポイント:

    >>> knn.kneighbors(X[0], return_distance=False)
    array([[0, 1]])
    

    したがって、 の最近傍X[0]X[0]それ自体とX[1](もちろん) です。

n_neighbors=6セット内のすべてのポイントが独自の最近傍になるため、必ず設定してください。

免責事項: 私は scikit-learn の開発に携わっているため、これは公平なアドバイスではありません。

于 2012-09-11T13:31:11.360 に答える
2

あなたの質問から、あなたの問題の詳細が何であるかは完全には明らかではありません。これまでのところ、大量のデータポイント間のユークリッド距離を計算する必要があることを理解しました。Pythonの最速のソリューションは、おそらくscipy.spatial.distanceモジュールを利用します。ご覧ください

http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html

http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html

numpyデータ型に精通し、これらの関数の1つの入力データを作成し、結果のデータをさらに評価する必要があります。おそらく、配列の最大/最小N値を取得しようとすることになります。その時点で、numpy配列でN個の最大値のインデックスを取得するにはどうすればよいですか。助けることができます。

于 2012-09-11T12:24:41.420 に答える