社区发现算法 python源码,复杂网络社区结构发现算法-基于python networkx clique渗透算法...

前言

最近因为业务数据分析的需要,看社区发现相关的东东稍多些,刚刚写过一篇基于igraph C library的方法(http://km.oa.com/group/22323/articles/show/240332),然后想用kclique衍生的clique渗透算法时发现igraph

C library 并未提供现成的api,对于懒人来说,这很不幸。既而发现networkx这个python包中是有的(且是唯一一个用于社区发现的算法),故而折腾折腾,记录下处理过程,供同道朋友们参考吧。

准备工作

networkx安装的时候,会依赖 decorator、setuptools 这样的包,所以全部需要安装

安装好之后,进入python交互环境,测试一下

import networkx as nx

如果没有报错,就算准备好基础工作了。可以开始使用networkx这个网络分析包了。因为本文聚焦于网络中社区结构的发现,故而networkx的基础使用方法就略过了,各位看官可自行google之。

clique渗透算法简介

对于一个图G而言,如果其中有一个完全子图(任意两个节点之间均存在边),节点数是k,那么这个完全子图就可称为一个k-clique。

进而,如果两个k-clique之间存在k-1个共同的节点,那么就称这两个clique是“相邻”的。彼此相邻的这样一串clique构成最大集合,就可以称为一个社区(而且这样的社区是可以重叠的,即所谓的overlapping community,就是说有些节点可以同时属于多个社区)。下面第一组图表示两个3-clique形成了一个社区,第二组图是一个重叠社区的示意图。

L3Byb3h5L2h0dHAva20ub2EuY29tL2ZpbGVzL3Bvc3RfcGhvdG8vMDk2LzI1NjA5Ni9jOGVhNDliNDZkNDBkYjdiNjE1NDNhNmRmMDIzMTc2NTE0NDMyNzcwMTUucG5n.jpg -->  

L3Byb3h5L2h0dHAva20ub2EuY29tL2ZpbGVzL3Bob3Rvcy9waWN0dXJlcy8yMDE1MDkvMTQ0MzI2ODg1M18zMV93NTgyX2gzNjAucG5n.jpg

L3Byb3h5L2h0dHAva20ub2EuY29tL2ZpbGVzL3Bob3Rvcy9waWN0dXJlcy8yMDE1MDkvMTQ0MzI2NzQ0NF83NV93NTk4X2g2NjAuanBn.jpg

networkx中实现的clique渗透算法接口如下:

L3Byb3h5L2h0dHAva20ub2EuY29tL2ZpbGVzL3Bob3Rvcy9waWN0dXJlcy8yMDE1MDkvMTQ0MzI3MDQwN181MV93NzA5X2g1NTQucG5n.jpg

找社区(上代码)

以无向无权图为示例

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

L3Byb3h5L2h0dHAva20ub2EuY29tL2ZpbGVzL3Bob3Rvcy9waWN0dXJlcy8yMDE1MDkvMTQ0MzI3MzA3NV83N193MzkwX2gyNDgucG5n.jpg  

L3Byb3h5L2h0dHAva20ub2EuY29tL2ZpbGVzL3Bob3Rvcy9waWN0dXJlcy8yMDE1MDkvMTQ0MzI3MzE3NF80MV93MzkxX2gyNDYucG5n.jpg

L3Byb3h5L2h0dHAva20ub2EuY29tL2ZpbGVzL3Bob3Rvcy9waWN0dXJlcy8yMDE1MDkvMTQ0MzI3NDY1NF80NV93MzkxX2gyNDcucG5n.jpg

L3Byb3h5L2h0dHAva20ub2EuY29tL2ZpbGVzL3Bob3Rvcy9waWN0dXJlcy8yMDE1MDkvMTQ0MzI3NjQyMV83NV93NTQzX2gxMTIucG5n.jpg

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

时间: 04-17

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值