大きなグラフ(約5000の頂点と10000のエッジを持つ)でクラスターを見つけるための効率的なアルゴリズムを探しています。
これまでは、JUNG javaライブラリに実装されたGirvan–Newmanアルゴリズムを使用していますが、多くのエッジを削除しようとすると非常に遅くなります。
大きなグラフのより良い代替案を提案してもらえますか?
大きなグラフ(約5000の頂点と10000のエッジを持つ)でクラスターを見つけるための効率的なアルゴリズムを探しています。
これまでは、JUNG javaライブラリに実装されたGirvan–Newmanアルゴリズムを使用していますが、多くのエッジを削除しようとすると非常に遅くなります。
大きなグラフのより良い代替案を提案してもらえますか?
回答:
私は個人的にマルコフクラスタリングを提案しています。過去に何度か使用して、良い結果を得ています。
アフィニティ伝播は別の実行可能なオプションですが、マルコフクラスタリングよりも一貫性が低いようです。
他にもさまざまなオプションがありますが、これらの2つはそのまま使用でき、グラフのクラスタリング(スパース行列として表示できる)の特定の問題に適しています。使用している距離測定も考慮事項です。適切なメトリックを使用している場合、あなたの人生は楽になります。
これは友人から勧められました。ウィキペディアによると:
この方法では、ノードペア間の(通常はトポロジ的な)タイプの類似性を定量化する類似性尺度を定義します。一般的に使用される尺度には、コサイン類似度、Jaccardインデックス、および隣接行列の行間のハミング距離が含まれます。次に、この測定に従って、類似のノードをコミュニティにグループ化します。グループ化を実行するためのいくつかの一般的なスキームがあり、2つの最も単純な単一リンククラスタリングは、異なるグループのノードのすべてのペアが特定のしきい値よりも低い類似性を持ち、完全なリンケージクラスタリングである場合にのみ、2つのグループを個別のコミュニティと見なします、すべてのグループ内のすべてのノードの類似度がしきい値を超えています。
これは私があなたの状況で使用するものです。これは非常に便利なアルゴリズムです。アルゴリズムに関する素晴らしいPDFへのリンクを見つけました。これは優れたアルゴリズムであり、より良い用語がないため、非常に「強力」です。試してみてください。
ここでの問題については、頂点エッジを各頂点の座標セットにマッピングする方法を考える必要があると思います。これを行うより良い方法があるかどうかはわかりません。しかし、各頂点をディメンションとして表すことから始めて、特定の頂点のエッジ値がその特定のディメンションで作業する必要がある値になると思います。その後、単純なユークリッド距離を実行し、それを使用できます。