解決策のいくつかの可能な部分を次に示します。各段階にはさまざまな選択肢があり、Ncluster、データの変化の速さ、および手段で何をしたいかによって異なります。
3 ステップ: 量子化、ボックス化、K-means。
1) 量子化: X、Y、Z の 2^8 パーセンタイルを別々に取得することにより、入力 XYZ 座標をそれぞれ 8 ビットに減らします。これにより、詳細をあまり失うことなく、フロー全体が高速化されます。すべての 1G ポイント、またはランダムな 1M だけを並べ替えて、2^(30- 8) 各範囲のポイント。float X -> 8 ビット x をマッピングするには、展開されたバイナリ検索が高速です — Bentley、Pearls p. 95。
追加: Kd ツリー
は、任意のポイント クラウドを異なるサイズのボックスに分割し、それぞれが ~ Leafsize のポイントを持ちます。上記のように XYZ を分割するよりもはるかに優れています。しかし、最初の16Mボックスのみを分割し、ポイントではなくカウントのみを保持するには、独自のKdツリーコードをロールバックする必要があります。
2) ボックス: 各 3d ボックス [xj .. xj+1, yj .. yj+1, zj .. zj+1] 内の点の数を数えます。平均的なボックスには 2^(30-3*8) ポイントがあります。分布は、データがどれだけ塊になっているかによって異なります。いくつかのボックスが大きすぎたり、ポイントが多すぎたりする場合は、a) それらを 8 つに分割し、b) 各ボックス内のポイントの中心を追跡し、それ以外の場合はボックスの中間点のみを取得します。
3)
2^(3*8) ボックスの中心でのK-means クラスタリング。(Google パラレル "k means" -> 121k ヒット。) これは、K aka Ncluster に強く依存し、半径 R にも依存します。大まかなアプローチは
、27*Ncluster ボックスのヒープを最も多くのポイントで成長させてから、半径の制約を受ける最大のもの。(最小スパニング ツリーから始めて
、K-1 個の最長リンクを削除して K 個のクラスターを取得するのが好きです。)
色の量子化も参照してください。
Nbit、ここでは 8 を最初からパラメーターにします。
あなたの Ncluster は何ですか?
追加: ポイントが時間内に移動している場合は、
SOのcollision-detection-of- huge-number-of-circlesを参照してください。