Суммировать
社区发现
渗透算法
k-clique对象:k个节点两两存在边关系,这就是一个k-clique对象。
如果存在多个k-clique对象之间存在k-1个共同节点,则说明这2个k-clique对象是相邻的。
完全子图
k-clique-communities算法发现的社区是可以重叠的,及一个节点既可以存在于a社区,也可以存在于b社区。
1/ Что такое алгоритм проникновения клики
对于一个图G而言,如果其中有一个完全子图(任意两个节点之间均存在边),节点数是k,那么这个完全子图就可称为一个k-clique对象
进而,如果两个k-clique对象之间存在k-1个共同的节点,那么就称这两个k-clique对象是“相邻”的。
彼此相邻的这样一串clique构成最大集合,就可以称为一个社区(而且这样的社区是可以重叠的,即所谓的overlapping community,就是说有些节点可以同时属于多个社区)。
下面第一组图表示两个3-clique对象形成了一个更大的社区,第二组图是一个重叠社区的示意图。
2 / Введение параметра алгоритма K-clique-communities
from networkx.algorithms.community import k_clique_communities
3/Применение k-кликовых сообществ
# 以无向无权图为例
#!/usr/bin/python
#coding:utf-8
import sys
import networkx as nx
import time
def find_community(graph,k):
return list(nx.k_clique_communities(graph,k))
if __name__ == '__main__':
if len(sys.argv) < 2:
print "Usage: %s <InputEdgeListFile>" % sys.argv[0]
sys.exit(1)
#创建一个无向、无权图
edge_list_file = sys.argv[1]
wbNetwork = nx.read_edgelist(edge_list_file,delimiter='\t')
print "图的节点数:%d" % wbNetwork.number_of_nodes()
print "图的边数:%d" % wbNetwork.number_of_edges()
#调用kclique社区算法
for k in xrange(3,6):
print "############# k值: %d ################" % k
start_time = time.clock()
rst_com = find_community(wbNetwork,k)
end_time = time.clock()
print "计算耗时(秒):%.3f" % (end_time-start_time)
print "生成的社区数:%d" % len(rst_com)
算法输出及讨论
单机64G内存的机器上测试了几个不同规模的网络,相应的输出如下:
根据最后一张图可以知道:
该算法在单机上适合于计算10万以下节点中小规模网络社区结构。
对于大规模的社交网络,必须要用分布式集群才行啊。