基于Modularity的社区发现

一、简介

1、社区

社区是一个子图,包含顶点和边,同一社区内结点与结点之间的连接很紧密,而社区与社区之间的连接比较稀疏。

2、louvain与Modularity

Louvain算法是一种基于图数据的社区发现算法,通过模块度(Modularity)来衡量一个社区的紧密程度。被认为是性能最好的社区发现算法之一。

二、Modularity

1、Modularity模块度

Modularity模块度定义:
Q = \sum_c( \frac{E_c}{m}-(\frac{\sum tot}{2m})^2)

其中m表示图中边的数量,c表示社区,E_c表示社区c内边的数量,\sum tot表示社区c节点的度之和

计算案例[1]
例如将图划分为三个社区,计算该图的模块度

这个图包含23条边,包含3个社区
社区1内部边5条(E_1=5),结点度之和为2+3+3+3=11
(\sum tot=11)。
社区2内部边7条(E_2=7),结点度之和为3+4+4+4+2=17
(\sum tot=17)。
社区3内部边8条(E_3=8),结点度之和为4+3+4+3+4=18
(\sum tot=18)。

因此该图的模块度为:
Q=[\frac{5}{23}-(\frac{11}{46})^2] + [\frac{7}{23}-(\frac{17}{46})^2] + [\frac{8}{23}-(\frac{18}{46})^2]=0.523

2、模块度与社区紧密关系

模块度值越大,说明社区划分的越好,社区越紧密。

模块度用来衡量一个社区的紧密程度

(1)计算左图模块度
左图包含23条边,包含2个社区

社区1内部边13条(E_1=13),结点度之和为2+3+3+3+3+4+4+4+2=28 (\sum tot=28)。
社区2内部边8条(E_1=8),结点度之和为4+3+3+4+4=18 (\sum tot=18)。
左图的模块度为:
Q=[\frac{13}{23}-(\frac{28}{46})^2] + [\frac{8}{23}-(\frac{18}{46})^2]=0.3894

(2)计算右图模块度
右图包含23条边,包含2个社区

社区1内部边5条(E_1=5),结点度之和为2+3+3+3=11 (\sum tot=11)。
社区2内部边17条(E_1=17),结点度之和为3+4+2+4+4+4+4+3+4+3 = 35 (\sum tot=35)。
右图的模块度为:
Q=[\frac{5}{23}-(\frac{11}{46})^2] + [\frac{17}{23}-(\frac{35}{46})^2]=0.3204

可以发现该图划分为三个社区的模块度值最大,划分为三个社区会比划分为两个社区更好。

三、louvain算法

Louvain算法是一种基于图数据的社区发现算法,通过模块度(Modularity)来衡量一个社区的紧密程度。

louvain如何使用Modularity来实现社区的发现?

1、louvain算法步骤

louvain算法步骤

(1)初始化,将每个节点看作一个独立社区
(2)尝试把节点i分配到相邻节点所在社区,计算分配前与分配后的模块度变化\Delta Q,并记录\Delta Q最大的社区,如果Max \Delta Q > 0,则将该节点分配到该社区。
(3)重复操作步骤(2)直到所有节点的所属社区不再变化

探索一下该步骤:
结点0:分配到相邻结点1,2,3所在社区
分配前模块度:-0.0043;分配到{1}模块度:0.0265,分配到{2}模块度:0.0265,分配到{3}模块度:0.0317;根据最大模块度差异把结点0和3组合为一个社区。

结点1:分配到相邻结点0,2,3所在社区{0,3},{2}
分配前模块度:-0.0043;分配到{0,3}模块度:0.1002,{2}模块度:0.0265;
根据最大模块度差异把结点1和2组合为一个社区,此时{1,2},{0,3}

结点2:分配到相邻结点0,1,4所在社区{0,3},{1},{4}
分配前模块度:-0.0043;分配到{0,3}模块度:0.0567,分配到{1}模块度:0.0265,分配到{4}模块度:0.0265。
根据最大模块度差异把结点2和3组合为一个社区,此时{0,2,3},{1},{4}
发现结点2的所属社区发生了变化

结点1:分配到相邻结点0,2,3所在社区{0,2,3}
分配前模块度:-0.0043;分配到{0,2,3}模块度:0.1167,比原社区{1}的模块度大,形成新的社区{0,1,2,3}

···

2、python-louvain

python-louvain提供community.best_partition函数,该函数通过计算最大模块度实现社区发现,是louvain算法的封装。

3、案例计算

(1)图关系构建

import networkx as nx
import community
import matplotlib.pyplot as plt

# 使用networkx建立图形
G = nx.Graph()
G.add_nodes_from([0,1,2,3,4,5,6,7,8,9,10,11,12,13])
G.add_edges_from([(3, 0), (3, 1), (1, 0), (1, 2), (0, 2), (2, 4), (4, 7), (4, 5), (5, 7), (5, 6), (5, 8), (6, 8), (7, 8), (7, 10), (8, 9), (9, 10), (9, 12), (9, 13), (10, 12), (10, 11), (11, 13), (11, 12), (12,13)])
nx.draw(G,with_labels=True)
plt.show()

(2)社区发现

# louvain社区发现
partition = community.best_partition(G)
# {0: 0, 1: 0, 2: 0, 3: 0, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 2, 10: 2, 11: 2, 12: 2, 13: 2}
# 最大模块度
community.modularity(partition,G)
# 0.5226843100189036

(3)验证上述左图、右图的计算结果

s1 = {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1}
community.modularity(s1,G)
# 结果为:0.3894139886578449

s2 = {0: 0, 1: 0, 2: 0, 3: 0, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1}
community.modularity(s2,G)
# 结果为:0.3204158790170131

参考资料

[1] 社区检测:https://zhuanlan.zhihu.com/p/41105026
https://www.jianshu.com/p/4ebe42dfa8ec
[2] python-louvain函数文档:https://python-louvain.readthedocs.io/_/downloads/en/latest/pdf/
[3] 06年《Modularity and Community structure in networks 》一文:https://wenku.baidu.com/view/15394e520912a216147929cc.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容