「グラノーラ棒」のような構造の集合質量を見つけるアルゴリズムは?


19

私は惑星科学研究者であり、私が取り組んでいるプロジェクトの1つは、土星の環のN体シミュレーションです。この特定の研究の目標は、粒子が自身の自己重力の下で凝集するのを観察し、凝集塊の総質量とセル内のすべての粒子の平均速度を測定することです。これが、土星の夏至の間にカッシーニ宇宙船によって行われた観測を説明できるかどうかを解明しようとしています。以下は、任意のタイムステップがどのように見えるかのスクリーンショットです。(各粒子の直径は2 mで、シミュレーションセル自体の直径は約700 mです。)

土星のリングのシミュレーションの_N_-bodyセル。黒い背景に小さな影付きの球体として粒子が表示されています。

私が使用しているコードは、すでにすべてのタイムステップで平均速度を吐き出します。私がしなければならないのは、塊の中の浮遊粒子ではなく、塊の中の粒子の質量を決定する方法を見つけ出すことです。私はすべての粒子の位置、質量、サイズなどを知っていますが、例えば、粒子30,000〜40,000と102,000〜105,000が人間の目に明らかな1本の鎖を構成していることは簡単にはわかりません。

したがって、私が記述する必要があるアルゴリズムは、すべての粒子位置を通過し、どの粒子が塊に属しているかを把握し、計算するユーザー入力パラメーターを可能な限り少なくする必要があります(複製可能性と客観性のため)質量。セル上のすべてとは対照的に、「各」クランプ/ストランドに対してそれを行うことができれば素晴らしいと思いますが、実際にそれらを分離する必要はないと思います。

私が考えていた唯一のことは、あらゆる粒子間の距離を計算するN 2距離計算を行うことでした。たとえば、最も近い100個の粒子が特定の距離内にある場合、その粒子はクラスタ。しかし、それはかなりずさんなようであり、CSの人々やプログラマーがよりエレガントなソリューションを知っていることを望んでいましたか?


私のソリューションで編集: 私がやったのは、ある種の最近隣/クラスターアプローチを採用し、最初にクイックnダーティN 2実装を行うことでした。したがって、すべての粒子を取得し、他のすべての粒子までの距離を計算します。クラスター内のしきい値は、d距離内にN個の粒子があるかどうかでした(残念ながら、先験的に設定する必要がある2つのパラメーターですが、応答/コメント、私はそれらのいくつかを持っていないことで逃げるつもりはなかった)。

次に、距離を並べ替えずに、順序Nの検索を行ってd内のパーティクルのカウンターをインクリメントすることで速度を上げました。その速度は6倍になりました。ツリーコードについてはほとんど何もありません)。Iは、グリッドの設定数に(グリッドサイズ≈7ときに最良の結果をシミュレーションセルを分割D細胞と主グリッドラインアップは、1つのグリッドがで半分だけオフセットされている)のxyの、及び他の二つがずれています1/4 x ± xおよび± y。次に、コードはパーティクルをグリッドに分割し、各パーティクルNはそのセル内の他のパーティクルまでの距離を計算するだけで済みます。

理論的には、これが実際のツリーである場合、N 2の速度ではなく次数N * log(N)を取得する必要があります。私は2つの間のどこかに行きました、そこでは50,000個の粒子のサブセットで速度が17倍になり、150,000個の粒子のセルでは速度が38倍になりました。最初の12秒、2番目の53秒、500,000粒子セルの460秒。これらは、コードがシミュレーションを1タイムステップ先に実行するのにかかる時間に匹敵する速度であるため、この時点では妥当です。ああ-そしてそれは完全にスレッド化されているので、私がそれに投げつけることができる限り多くのプロセッサーを必要とします。


3
私はこの主題について特に知識がありませんので、私自身はほとんど支援を提供できませんが、クラスター分析に関するウィキペディアの記事を読んでいますか?非常に活発な研究分野のようです。
コールキャンベル

少なくともDBSCANのようなクラスターコードには警戒しています。視覚的にはクラスターの一部ではないがアルゴリズム的にはわかっている細い鎖のいくつかを「追跡」すると思うからです。DBSCANタイプのコードは、クレーターを研究するために他の作業に使用しているため、経験があります。
スチュアートロビンス

1
このようなストランドを識別するコードには、ほぼ確実に何らかの「感度」設定が付属しています。
ロバートハーベイ

2
同意した。ここでの本当の難点は、「クランプ」が明確に定義された用語ではないことです。最終的には、何らかのクラスター分析アルゴリズム(実際には既に提案されているソリューションです)を使用する必要があります。おそらく、何らかのノイズ低減パスと組み合わせる必要があります。
コールキャンベル

2
あなたは、有効な塊が(そしておそらく無効1)と思われるもの、あなたの絵に描く場合には役立つかもしれない
JK。

回答:


3

私の最初の提案は、問題を2つの問題に分割することです。まず、必要なものを見つけ出し、次に、必要なものを効率的に取得する方法を見つけます。まだ定義していないものを効率的に取得することはできません。この定義を見つけるのに役立つアイデアをこの回答に入れます。最初に好きなアイデアを非効率的に実装し、あまり大きくないいくつかのデータセットに適用し、結果を手動で評価し、定義を調整して、(おそらくここに別の質問をする)満足するまで繰り返すことをお勧めしますあなたの定義。その後、定義の結果を効率的に計算する方法についてさらに質問することをお勧めします(まだ助けが必要な場合)。

それでは、「ストランド」の直感的なアイデアに対応するものを見てみましょう。ストランドはほぼ均一に分布したポイントで構成されているようですが、(元のデータセットの)ズームイン画像を作成して確認する必要があります-画像の解像度が低すぎるため、ポイントが実際にほぼ均一に分布しているとは言えません。私は彼らがこの答えのためだと思います。

最初のアイデアは、すべてのポイントの最近傍を調べることです。点Xを選択し、その最近傍Yを呼び出して、XとYの間の距離としてDを設定します。次に、半径D * AのXの周りの円Cを調べます。ここで、AはA = 3などの調整パラメーターです。Xがストランドの一部である場合、Cのすべての点Zについて、Zからその最も近い隣接Wまでの距離はDとほぼ同じであると予想されます。 B)Xは明らかに、Xよりも互いにはるかに近いポイントに近いため、Xはおそらくストランドの一部ではありません。

ただし、この基準は完全ではありません。それは、点が密集している領域と点が密集していない領域の間の「境界」を検出するための基準を提供するだけです。ポイントをひとまとめにしてストランドにする必要があります。

これは単純ではないことを示す特徴が写真にあります。写真の右下隅には、多くの迷走ポイントがある比較的広い領域があります。これらの浮遊ポイント自体はほぼ均一に分布しているため、周囲のストランドのすべてのポイント(および他のすべてのポイント)を削除する場合、ストランド検出アルゴリズムがこの浮遊ポイントのセットをストランドとしてマークすることが予想されます!したがって、クラスターを作成するときは注意が必要です。

アイデアは次のようにすることです。これらのポイントでグラフを作成します。ここで、頂点はポイントであり、エッジは2つのポイントの密度が似ていることを示します。すべてのポイントについて、上記の基準を確認します。チェックアウトする場合、XをエッジとCのすべてのポイントに接続します。チェックアウトしない場合、エッジを追加せず、Xを「迷走」としてマークします。すべてのポイントでこれを行った後、接続されたコンポーネントのセットを検討します。これらは、ストランド内のすべてのポイントで構成される単一の接続コンポーネント(写真の場合、ただし他のデータセットには複数ある場合があります)に加えて、単一の漂遊ポイントとこれらの「漂遊ストランド」で構成される(潜在的に多くの)コンポーネントで構成される必要があります。ただし、これらの漂遊ストランドには「漂遊」とマークされたポイントが含まれているため、「漂遊」とマークされたポイントを含むコンポーネントはすべて無視できます。

このアイデアの危険性は、ストランドに沿って移動するにつれてストランドの密度が次第に低下し、密度が非常に低くなり、漂遊点のセットになるだけの機能を持つ可能性があることです。基準は「ローカル」であるため、これを検出せず、これらの浮遊ポイントをストランドの一部としてマークする場合があります。これが問題になるかどうかはわかりません。密度の変化があなたの写真で非常に急激に見えるので、ほとんどの浮遊ポイントは基準によってキャッチされるべきだと思います。

この問題が発生した場合は、接続されたコンポーネントを取得する代わりに代替手段を試してください。すべての点Xについて、その最近傍D(X)までの距離を計算します。最小のD(X)で開始し、BFS(またはDFS、順序は関係ありません)を実行します。D(Y)が(調整可能な要因によって)D(X)よりも大きくないポイントYを追加します。D(Y)が大きすぎるポイントYに遭遇した場合、エッジ(X、Y)を削除し、Yを「迷い」としてマークし、BFSでYにアクセスしたことがないかのように動作します。適切に調整されていれば、これで上記の問題を防ぐことができます。

この問題を修正する別のアイデアは、もう少しローカルに作用します:BFSを実行し、最も低いと思われる最低のD(X)を追跡できます(ポイント周辺の密度の測定としてD(X)を使用します)前のBFSステップ、およびこのD(X)よりもはるかに大きいD(Y)を持つYに遭遇した場合、私が提供した他の(潜在的な)ソリューションと同じことを行います。

免責事項:上記のすべてのアイデアは、今その場で考えましたが、この特定の問題が以前に研究されたかどうかはわかりませんので、ナンセンスを発しているだけかもしれません。自分にとって賢明なアイデア(自分のアイデアでも自分のアイデアでも)を試してみて、それらが実際に機能するかどうかを確認してから、それらを効率的に実装することに集中してください。


2

モジュラー分解を使用して、リーフとしてのすべての粒子を含むツリーを作成し、上位ノードがこれらをクラスター化できます。そのツリーに基づいて、ルートからリーフまで、そのすべてのノードに適用されるメジャーを定義できます。測定値がユーザー定義のしきい値に達すると、この下向きの走査を停止します。そのような測定の1つは、クラスター内のすべての粒子の凸包の密度です。


1

機械学習クラスタリングアルゴリズムを使用していると思います。

Python SciKit Learnツールキットのこのページには、DBSCANアルゴリズム(Wikipedia)が探しているものである可能性を示唆する写真があります。入力パラメーターは近傍サイズであるため、理想的と思われますが、他のほとんどのクラスタリングアルゴリズムでは、事前にはわからないクラスターの数が必要です。

「ノイズのある大規模な空間データベースでクラスターを発見するための密度ベースのアルゴリズム」エステル、M.、HPクリーゲル、J。サンダー、およびX.徐、知識発見とデータマイニングに関する第2回国際会議の議事録、オレゴン州ポートランド、AAAI Press、ページ226–231。1996


0

私はこの問題について考えてきました。私は物理学の専門家ではありませんので、ご容赦ください。

塊を決定するためにカウントされるのは、粒子間の距離ではないようです。重力場が重なるかどうかです。

粒子Pを取得し、重なっている重力場を持つ他の粒子を決定します。

次に、それらのいずれかを取り、同じことを行います。あなたの目標は、塊の中のすべての粒子を見つけることではなく、その境界を見つけることです。

すべての塊が見つかるまでこれを繰り返します。

戻って、塊の質量を決定します。浮遊粒子が除去され、塊の境界を使用して質量を見つけることができます。

これが役立つかどうかはわかりませんが、考えられるのはそれだけです。


重力場とは何ですか?
デビッドカウデン

0

各タイムステップの最後に、データをグラフに変換し、最小スパニングツリーを計算してから、特定のしきい値を超えるエッジの削除を開始できます。これにより、塊ができ、各塊の粒子を簡単に列挙できます。

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