2014-02-27 78 views
10

我正在研究网络中的检测社区。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的算法?

+0

这是一个非常新的工作,但非常有用:HTTPS ://journals.aps.org/prl/abstract/10.1103/PhysRevLett.117.078301 – Peaceful

回答

3

我也是networkx和igraph的新手,我使用了一个数据可视化工具/软件Gephi。它与您现在使用的networkx中的社区检测算法具有相同的社区检测算法。具体而言,在http://perso.crans.org/aynaud/communities/

它使用在大型网络中快速展开社区的描述的鲁汶方法,文森特d布隆德尔,让 - Loup的纪尧姆雷诺Lambiotte,雷诺列弗斐尔,杂志统计力学的理论与实验2008( 10),P10008(12pp)

你不能得到所需的社区数量,因为我知道,这里有两种方法值得一试:

  • 使用Gephi。您可以使用gephi,并且有一个名为resolution的参数可以改变您获得的社区的大小。
  • 使用NetworkX。这一次,我们可能不再使用best_partition(G)。但使用partition_at_level(dendrogram, level),我想这可能会有所帮助。

查看source code在这里获取更多信息。

+3

NetworkX没有社区检测。这一切都来自基于NetworkX的'community'。更具体地说,'best_partition()'是'community.best_partition()'。 – MERose

1

也许我误解了你,但是如果你想通过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

我认为OP有兴趣说明要检测的社区数量,而不是接收最佳社区数量 – duhaime