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