Skip to main content
QUICK REVIEW

[論文レビュー] KDTREE 2: Fortran 95 and C++ software to efficiently search for near neighbors in a multi-dimensional Euclidean space

Matthew B. Kennel|ArXiv.org|Aug 14, 2004
Robotics and Automated Systems被引用数 66
ひとこと要約

KDTREE2 は、多次元ユークリッド空間における近似最近傍探索のための高性能な C++ および Fortran 95 実装である。キャッシュに配慮したメモリアクセス、ヒープベースの優先度キュー、および強化された pruning を通じて、前回のバージョンと比較して最大 10 倍の高速化を達成している。特に高次元および大規模データセットにおいて顕著な性能向上を実現している。

ABSTRACT

Many data-based statistical algorithms require that one find extit{near or nearest neighbors} to a given vector among a set of points in that vector space, usually with Euclidean topology. The k-d data structure and search algorithms are the generalization of classical binary search trees to higher dimensional spaces, so that one may locate near neighbors to an example vector in $O(\log N)$ time instead of the brute-force O(N) time, with $N$ being the size of the data base. KDTREE2 is a Fortran 95 module, and a parallel set of C++ classes which implement tree construction and search routines to find either a set of $m$ nearest neighbors to an example, or all the neighbors within some Euclidean distance $r.$ The two versions are independent and function fully on their own. Considerable care has been taken in the implementation of the search methods, resulting in substantially higher computational efficiency (up to an order of magnitude faster) than the author's previous Internet-distributed version. Architectural improvements include rearrangement for memory cache-friendly performance, heap-based priority queues for large $m$searches, and more effective pruning of search paths by geometrical constraints to avoid wasted effort. The improvements are the most potent in the more difficult and slowest cases: larger data base sizes, higher dimensionality manifolds containing the data set, and larger numbers of neighbors to search for. The C++ implementation requires the Standard Template Library as well as the BOOST C++ library be installed.

研究の動機と目的

  • 多次元ユークリッド空間における最近傍探索のための高性能でポータブルな k-d ツリー実装を開発すること。
  • 特に高次元および大規模データ環境下で顕著な性能ボトルネックを示す既存の k-d ツリーソフトウェアの課題を克服すること。
  • メモリアクセスパターンや pruning ヒューリスティクスの最適化を含む、アーキテクチャ的およびアルゴリズム的最適化を通じて計算効率を向上させること。
  • 標準ライブラリ(STL、Boost)と完全に独立し互換性を持つ、Fortran 95 および C++ の両方のインターフェースを提供すること。
  • 研究および本番環境での利用を自由に可能とするオープンソースのソフトウェアとして提供し、明確な引用およびライセンス条項を設けること。

提案手法

  • 各ノードに対してバウンディングハイパースペース(バウンディングボックス)を生成するように、データ空間を最大の拡張を持つ次元に沿って再帰的に分割する k-d ツリーのデータ構造を使用する。
  • トップダウンで一回のパスでツリーを構築するアルゴリズムを採用し、分割の基準値としてその次元の算術平均値を用い、子ノードのインデックスを効率的に再割り当てする。
  • 大規模な m-近傍探索に対しては、優先度キュー(最小ヒープ)を用いて、最も有望な候補のみを保持する。
  • 幾何的 pruning を適用し、クエリポイントからノードのバウンディングボックスまでの距離が、現在の最良の近傍よりも近くなる可能性があるかをチェックする。
  • 探索中の走査時に CPU キャッシュミスを減らすために、データの再配置とキャッシュに配慮したレイアウトを最適化する。
  • 固定数(n-近傍)および固定半径(r-近傍)探索モードをサポートし、時系列データの文脈では近接する点を除外するための追加の非相関フィルタリングを実装する。

実験結果

リサーチクエスチョン

  • RQ1高次元および大規模データセットにおける k-d ツリー探索の性能をどのように大幅に向上させることができるか?
  • RQ2正しさを損なわずに、どのようなアーキテクチャ的およびアルゴリズム的変更が最近傍探索の大幅な高速化をもたらすか?
  • RQ3キャッシュに配慮したメモリアクセスとヒープベースの優先度キューは、k-d ツリー探索においてどれほど性能向上をもたらすか?
  • RQ4幾何的 pruning は、探索中の不要なノード走査をどれほど効果的に削減できるか?
  • RQ5C++ と Fortran 95 の両言語で実装されたソフトウェアは、多様な科学技術計算環境をカバーしつつ、機能的同等性を維持できるか?

主な発見

  • KDTREE2 は、前回のバージョンと比較して最大 10 倍の探索スループットを達成しており、特に高次元(8D)および大規模データセット(50,000 点)のシナリオで最大の向上が見られた。
  • 8D 空間における 50,000 点のデータに対して、m=500 の探索では KDTREE2 は 1 秒間に 396 回の探索を実行したが、旧バージョンではわずか 49 回にとどまり、ほぼ 8 倍の高速化が達成された。
  • 3D 空間における 200,000 点のデータに対して、m=500 の探索では、KDTREE2 は 1 秒間に 3,001 回の探索を実行したが、旧バージョンでは 261 回にとどまり、12 倍の高速化が達成された。
  • 性能向上は、計算的に最も困難なケース、すなわち高次元、大規模データ、および大きな m の場合に顕著に現れた。
  • キャッシュに配慮したメモリレイアウトとヒープベースの優先度キューは、大規模な m 探索におけるオーバーヘッドを顕著に低減し、最大で1桁の効率向上をもたらした。
  • C++ および Fortran 95 の両バージョンとも、同一の機能と性能特性を維持しており、機能の完全性が保たれている。

より良い研究を、今すぐ始めましょう

論文設計から論文執筆まで、研究時間を劇的に削減しましょう。

クレジットカード登録不要

このレビューはAIが作成し、人間の編集者が確認しました。