重叠社区发现CPM算法
示例
之前的推送介绍了几种非重叠社区算法:
【社区发现】Fast-Unfolding算法Python实现
【社区发现】FN算法实现优化,效率更快
【社区发现】FN算法Python实现
非重叠就是指每个节点都将会被划分到唯一的一个社区,今天将介绍一种重叠社区发现算法,重叠社区简单的说就是一个节点可能属于多个社区,例如,你本科的社交圈可以看做一个社区,你研究生的社交圈可以看做一个社区,那么可以认为你同时属于这两个社区。如下图,是某位同学的微博关系网,红色点为该同学,蓝色点为他关注的人,绿色的点为二级关注(他关注的人的关注)。
通过整理,可以明显看出他的两个社区圈(左边四个蓝色点和右边八个蓝色的点)。
而今天介绍的CPM(Clique Percolation Method)算法则是重叠社区发现算法的一种基础算法。下图是重叠社区的示意图:
去看原文
算法介绍
在介绍算法原理时,首先需要弄清楚一个概念:团或派系(Clique),Clique是指完全子图,即在同一Clique中的所有节点两两都相连。
该算法首先会寻找出网络中所有的极大团,可采用Bron-Kerbosch算法来实现。
然后在这些极大团中,通过clique-clique重叠矩阵进行标准成分分析来构建k派系社区(k-clique-communities )。在这个clique-clique重叠矩阵中的每行每列分别代表识别的极大团,矩阵对应的值表示两个clique共享节点的个数。当需要构建k派系社区时,参数k用来筛选clique节点重叠的个数,当非对角线的值小于k-1时则置为0,当对角线的值小于k时则置为0。
例如,上图有6个cliques,分别定义为:
A:[1,2,3,4]
B:[2,4,6]
C:[2,5,6]
D:[4,6,7,8]
E:[4,6,8,9,10]
F:[3,4,9,10]
Python实现及结果
# -*- coding: utf-8 -*-
# @Author: 武辛
# @Email: geo_data_analysis@163.com
# @Note: 如有疑问,可加微信"wxid-3ccc"
# @All Rights Reserved!
k = 4
if __name__ == '__main__':
# plot network
G = nx.read_edgelist("network.txt", create_using = nx.Graph())
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels = True, font_weight = 'bold')
# plt.show()
plt.savefig("test.png", phi = 300)
start_time = time.time()
network = load_network("network.txt")
communities = find_overlap_community(network, k)
print("Find %d communities %s with %.2f seconds" % (len(communities), communities, time.time() - start_time))
6 cliques found!
Find 2 communities [set([1, 2, 3, 4]), set([3, 4, 6, 7, 8, 9, 10])] with 0.00 seconds
原文有源码,更多内容,请关注地学分析与算法。