web-dev-qa-db-ja.com

Networkxでのコミュニティ検出

私はネットワーク内の検出コミュニティについて研究しています。

私はigraphとPythonを使用しています

モジュール性の尺度の観点からコミュニティの最適な数について:

from igraph import *
karate = Nexus.get("karate")
cl = karate.community_fastgreedy()
cl.as_clustering().membership

必要な数のコミュニティを提供するには:

from igraph import *
karate = Nexus.get("karate")
cl = karate.community_fastgreedy()
k=2
cl.as_clustering(k).membership

しかし、私はnetworkxを使用してこれを行うのが好きです。モジュール性の尺度に関して、最適な数のコミュニティを取得できることを私は知っています。

import community # --> http://perso.crans.org/aynaud/communities/
import fastcommunity as fg # --> https://networkx.lanl.gov/trac/ticket/245
import networkx as nx

g = nx.karate_club_graph()
partition = community.best_partition(g)
print "Louvain Modularity: ", community.modularity(partition, g)
print "Louvain Partition: ", partition

cl = fg.communityStructureNewman(g)
print "Fastgreed Modularity: ", cl[0]
print "Fastgreed Partition: ", cl[1]

しかし、希望する数のコミュニティを取得できません。 Networkxを使用して、これに対応するアルゴリズムはありますか?

13
Alan Valejo

私はnetworkxとigraphも初めてで、データ視覚化ツール/ソフトウェアであるGephiを使用しました。そして、それはあなたが現在使用しているnetworkxのものと同じコミュニティ検出アルゴリズムを持っています。具体的には、 http://perso.crans.org/aynaud/communities/

これは、大規模ネットワークにおけるコミュニティの高速展開、Vincent D Blondel、Jean-Loup Guillaume、Renaud Lambiotte、Renaud Lefebvre、Journal of Statistics Mechanics:Theory and Experiment 2008(10)、P10008(12pp)で説明されているルーバン法を使用します。

私が知っているように、希望する数のコミュニティを取得することはできません。試す価値のある2つの方法があります。

  • Gephiを使用します。 gephiを使用でき、取得するコミュニティのサイズを変更するresolutionというパラメーターがあります。
  • NetworkXを使用します。今回は、best_partition(G)を使用できなくなります。しかし、partition_at_level(dendrogram, level)を使用してください。これが役立つかもしれません。

詳細については、 ソースコード を確認してください。

4
zihaolucky

誤解しているかもしれませんが、best_partitionアルゴリズムのNetworkX実装によって出力されるコミュニティの数が必要な場合は、best_partition(G)がノードをキーとして、パーティション番号を値として持つ辞書を提供することに注意してください。

次のように、辞書内の一意の値の数を数えることができます(最適ではない可能性があります)。

dict = {'a':1,'b':1,'c':2,'d':1,'e':3,'f':4,'g':5}
count=list(set([i for i in dict.values()]))
print count
print len(count)

結果として

[1, 2, 3, 4, 5]
5
1
Johannes Wachs