本文所罗列的社区检测算法主要是igraph包里面的社区检测算法及对网络进行社区划分的应用,便于对社区检测方向有研究兴趣的小伙伴来研究。
1、社区检测算法目录:算法后面的[]里面的内容是提出该算法的人和年份
#(1) nx.k_clique_communities(G, 3) [Newman 2005] 应用较多,性能一般
#(2) fastgreedy.community [Clauset et al., 2004] (modularity optimization method) 性能相对较好
#(3) edge.betweenness.community [Newman and Girvan, 2004] 性能比(1)好
#(4) label.propagation.community [Raghavan et al., 2007] 和GN算法性能差不多
#(5) multilevel.community [Blondel et al., 2008] (the Louvain method) 性能是这几个算法里面最好的
#(6) walktrap.community [Pons and Latapy, 2005]
#(7) leading.eigenvector.community [Newman, 2006]
#(8) infomap.community [Rosvall and Bergstrom, 2008] 性能适用于大网络,对小网络效果较差
#(9) spinglass.community [Reichardt and Bornholdt, 2006]
#(10) optimal.community [Brandes et al., 2008]
#(11) GSA [Karaboga, 2009]
这里关于性能的比较主要是通过个人对网络进行社区检测过程中得出的个人结论,而且对于不同规模的网络,不同算法的性能是不同的,对其感兴趣的可以自己去测试一下。
2、算法的实际应用(本文采用的测试网络主要是karate网络,即空手道俱乐部网络)
(1)K派系算法import networkx as nx
from igraph import*
import matplotlib.pyplot as plt
import igraph as ig
karate=open('C:\\Users\\Lenovo\\Desktop\\network.txt')
karate=karate.read()
G = nx.Graph()
liebiao=dolphins.split("\n") # 用回车符分裂字符串
for i in range(0,len(liebiao)-1):
liebiao1=liebiao[i].split() # 用空格符分裂‘0’和‘1’
node1=int(liebiao1[0]) #节点转化为整数
node2=int(liebiao1[1])
G.add_edge(node1,node2)
c=list(nx.k_clique_communities(G, 3)) # k=3
#若只想得到社区划分结果,到这里就可以了,后面的计算只是为了计算模块度值,其他算法中的步骤类似
membership=[]
for i in range(0,len(G)):
membership.append(0)
for i in range(0,len(c)):
nodes=c[i]
for j in nodes:
membership[j]=i
origin_edges=nx.to_edgelist(G)
new_list=[]
for edge_i in range(0,len(origin_edges)):
node_dict=origin_edges[edge_i]
new_list.append([node_dict[0],node_dict[1]])
g1=Graph(new_list)
Q=GraphBase.modularity(g1, membership)
print Q
(2)fastgreedy算法CNM算法
import networkx as nx
from igraph import*
import matplotlib.pyplot as plt
karate=open('C:\\Users\\Lenovo\\Desktop\\network.txt')
karate=karate.read()
G = nx.Graph()
liebiao=karate.split("\n") #用回车符分裂字符串
for i in range(0,l