2017-08-02 16 views
-1

私は約300万サンプルのデータセットを持っています(各々3つのフィーチャーのみ)。私はscikitのsklearn.neighborsモジュール、具体的にはradius_neighbor_graphを使用して、特定のサンプルの小さな半径内にあるサンプルを見つけます。サンプルのサブセットに最も近いネイバーを見つける

これはうまくいきますが、意外にも、実際にはこのグラフを計算するのが本当に遅いです。

私のサンプルの小さなサブセット(そのうちの10万〜)については、近隣の人たちだけを知る必要があるため、これも非常に無駄です。このサブセットは事前に分かっています。

だから、サンプルのこの部分集合のために与えられた半径内の近傍を計算することによって、より効率的な方法がありますか?シンプルであるように思えますが、簡単なやり方は考えられません。

答えて

0

まず、半径近傍グラフを作成するタスクには、データセットに関連付けられたN×Nの距離行列を読み込む必要があります。距離行列には素敵な性質があるので時間を節約できますが、複雑さはO(N^2)のどこかにあります。ここでNはデータセットX内のデータポイントの数です。

したがって、N点の数がごくわずかですが、近隣の中心としてN点が重要ですが、ポイントの大半はちょうど隣人として興味深い。これは、行iがデータ点iと各データ点jとの距離を含むn×Nの距離行列をもたらすことになる。しかし、この「距離行列」は、 ε-近傍グラフを作成するプロセスを高速化するために使用できる通常の距離行列(それは正方行列ではない)の望ましい特性のどれも持っていません。

したがって、私はあなたのケースにあらかじめ定義された関数を見つけるとは思わない。独自のものを作成する場合は、次の手順を実行する必要があります。Xをデータセットとし、iをデータポイントにする。

  1. データセットに関連付けられた距離行列Dを作成し、scipy.spatial.distance_matrixを使用し、xとしてデータセットの小さなサブセットを取り、データセット全体をyとします。
  2. リストを作成します。neighbors = []
  3. 距離行列のi行目にループします。 D(i、j)<イプシロンの場合は、隣人にjを保存します。これは、iのイプシロン近傍のデータ点のインデックスです。
  4. もちろんの戻り隣人

(あなたはクラスのすべてを包む場合)多分のinit(中)距離行列の計算が最初に一度起こるべき、と返す関数/メソッドデータ点のすべてのイプシロン近傍は、問題のデータ点のインデックスにのみ依存する必要があります。

希望すると便利です。

関連する問題