数百万のデータポイントに対する最近傍計算の繰り返しが遅すぎる


14

3Dで数百万のデータポイントに走るデータセットがあります。私が行っている計算では、半径内の各データポイントの近傍(範囲検索)を計算し、関数をフィットさせ、フィットの誤差を計算し、次のデータポイントに対してこれを繰り返す必要があります。私のコードは正常に動作しますが、実行に非常に長い時間がかかり、データポイントごとに約1秒かかります!おそらく、各ポイントについて、データセット全体を検索する必要があるためです。プロセスを高速化する方法はありますか。どういうわけか、最初の隣人との間に何らかの隣接関係を確立できれば、これはそれほど遅くないという考えがあります。それが役立つ場合は、3Dで最適なParzenウィンドウ幅を見つけようとしています。

回答:


9

ボリューム階層の境界(特にBSPツリー)のグーグルを提案します。点群を考えると、2つの等しいサブクラウドに分割する平面を見つけることができます。次に、テストポイントのある半径R内にあるポイントのコレクションを見つける必要がある場合、まずテストポイントをその平面と比較し、その上の高さがRより大きい場合、次に平面の下のサブクラウド全体を比較できますまた、Rよりも遠くにある必要があります(したがって、これらのポイントをチェックする必要はありません)。この考え方を再帰的に適用して、最終的にn 2乗ではなくn log n型の複雑さをもたらすこともできます。(これはBSP /バイナリスペースパーティショニングです。


7

位置と近接に関する情報を保持するデータを保存するためのデータ構造がいくつかあります。そこで、最近傍の高速決定を可能にします。

特にRツリー(およびR * ツリーなどの特殊な形式)およびXツリー。わずかに異なる用途に最適化された多くの選択肢。

素朴な最近傍検索ではなくR *ツリーを選択することは、特定のコードから10000倍高速化するための大きな部分でした。(ナイーブルックアップがひどく、それはキャッシュを壊したようにコーディングされていたので。OK、多分R * -treeた数百もので、残りのほとんどはだった::ため息::

ONログNNOログN


5

これは、分子動力学の分野における最大の課題の1つである非結合粒子間のすべてのペアワイズ相互作用の計算に非常に似ています。

そこで、セルリスト(または隣接リスト)を使用して、近くにあるものを見つけやすくしています。このアプリケーションでは、おそらくセルリストの方が使いやすいアルゴリズムです。

  • ボックスを一連のセルに分割します。
  • パーティクルごとに、どのセルに割り当てるかを決定します(パーティクルごとにO(1))。
  • 次に、パーティクルごとに、「独自の」セルと隣接セルを確認します。これらのいずれかが占有されている場合、それ以上の検索は不要です。
  • すべての最近傍が空の場合、粒子が見つかるまで、次に近い近傍に展開します。

システムの粒子の分布が多かれ少なかれ均一であれば、グリッドの粗さに応じてアルゴリズムのコストが大幅に削減されます。ただし、微調整が必​​要です。グリッドが粗すぎると、時間を節約できません。細かすぎるため、空のグリッドセルをサイクリングするのに多くの時間を費やすことになります。


セルの端の長さは少なくとも検索半径である必要があること、または各パーティクルが独自の検索半径を持っている場合は最大半径であることを指摘する必要があります。
ペドロ

これはMDの場合に当てはまります。ここではその半径がアプリオリであるかはわかりません。
aeismail

同様のスキームが、大規模な粒子雲重力シミュレーションで長時間使用されました。それがまだ最新技術の一部であるかどうかはわかりません。
dmckee ---元モデレーター子猫

4

ポイントセットの選択方法であるKDツリーoctreeを必ず確認する必要があります(BSPは一般的なオブジェクト用で、グリッドはほぼ均一な密度用です)。これらは非常にコンパクトで高速で、メモリと計算の両方のオーバーヘッドを最小限に抑えることができ、実装も簡単です。

グリッドのような非階層空間の細分割を試したい場合は、ポイントが多かれ少なかれ均一に分布している場合(空の領域があっても、密度の特異性やその他の高濃度があってはなりません)、球のパッキングを確認します。


3

おそらく、ドロネー三角形分割の構築を検討する必要があります(まあ、その3Dアナログ)。2Dでは、これは常に最近傍を含むデータポイントの特別な三角形分割です。3Dでも同じことが言えますが、四面体です。

nログn

それが役に立てば幸い!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.