networkx: алгоритм обнаружения сообщества k_clique_communities

алгоритм
networkx: алгоритм обнаружения сообщества k_clique_communities

Суммировать

社区发现
渗透算法
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对象形成了一个更大的社区,第二组图是一个重叠社区的示意图。

image.png

image.png

image.png

2 / Введение параметра алгоритма K-clique-communities

from networkx.algorithms.community import k_clique_communities

image.png

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内存的机器上测试了几个不同规模的网络,相应的输出如下:

image.png

image.png

image.png

image.png

根据最后一张图可以知道:
该算法在单机上适合于计算10万以下节点中小规模网络社区结构。
对于大规模的社交网络,必须要用分布式集群才行啊。