Modularity,中文称为模块度,是 Community Detection(社区发现/社团检测) 中用来衡量社区划分质量的一种方法。要理解Modularity,我们先来看社团和社团检测的概念。

社团检测

社团检测,就是要在一个图(包含顶点和边)上发现社团结构,也就是要把图中的结点进行聚类,构成一个个的社团。关于社团(community),目前还没有确切的定义,一般认为社团内部的点之间的连接相对稠密,而不同社团的点之间的连接相对稀疏。

社团检测算法的输入是一张图:

上图可以用边表(edge list)文件表示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

0 1
0 2
0 3
1 2
1 3
2 4
4 5
4 7
5 6
5 7
5 8
6 8
7 8
7 10
8 9
9 10
9 12
9 13
10 11
10 12
11 12
11 13
12 13

在计算机中,也可能以邻接矩阵的方式存储这张图:

邻接矩阵A,Aij=1表示 结点i 和 结点j 之间有一条边, Aij=0表示 结点i 和 结点j 之间没有边。特别的,这里结点自己和自己的连接是0,即Aii=0,不考虑结点自己和自己的连边。

输入图后,社团检测算法会输出一种社团划分,例如下面这个样子

具体的输出文件可能这样:

1
2
3

0 1 2 3
4 5 6 7 8
9 10 11 12 13

每行表示一个社团,里面的数字表示属于该社团的结点编号。

公式中用到的字母

在不同的文献中,可能用不同的字母表示相同的东西,这样就给理解造成了一定困难。本文中的所有公式都使用下面的字母定义。

和图相关的

用 n 表示图的结点个数,这里n=14(结点编号0到13)

用 m 表示图中边的个数,这里m=23(上图中共23条边)

用 k 表示图中结点的度(degree),无向图中一个结点的度就是该结点连出去的边的条数。显然图中14个结点都有自己的度,我们用ki来表示结点i的度。例如:k0=3,k5=4,k6=2。

用 A 表示图的邻接矩阵。邻接矩阵A,Aij=1表示 结点v 和 结点w 之间有一条边, Aij=0表示 结点i 和 结点j 之间没有边。无向图的邻接矩阵是对称的,即Aij=Aji。特别的,这里结点自己和自己的连接是0,即Aii=0,不考虑结点自己和自己的连边。

Modularity第一版

Newman 在2003年的论文 “Finding and evaluating community structure in networks” 中首次提出了modularity的定义,在论文中用来度量自己的社团检测算法的好坏。

Consider a particular division of a network into k communities. Let us define a k×k symmetric matrix e whose element eij is the fraction of all edges in the network that link vertices in community i to vertices in community j [49].

假设社团划分把一个网络划分为k个社团,定义一个k*k的矩阵e。eij表示连接 社团i 和 社团j 的边的数目 占 总边数 的比例。特别的,eii表示的是社团i和社团i之间的边占总边数的比例,也就是社团i内部的边占总边数的比例。

结合我们的例子

例子中,边数m=23 。社团1内部有5条边,于是有 e11=523。

社团2和社团3之间有2条边,这样看来 e23=223 。那么e32等于多少?如果你没有看这句话后面的注释,也许你会以为e32=e23=223 。但其实不是的,我们看后面的注释:

[49] As discussed in [33], it is crucial to make sure each edge is counted only once in the matrix eij—the same edge should not appear both above and below the diagonal. Alternatively, an edge linking communities i and j can be split, half-and-half, between the ij and ji elements, which has the advantage of making the matrix symmetric. Either way, there are a number of factors of 2 in the calculation that must be watched carefully, lest they escape one’s attention and make mischief.

这里说,在矩阵e中,每条边要确保只计数了1次。一条边的计数不能同时出现在e矩阵的对角线上方和下方。如果e32=e23=223,那么连接社团2和社团3的两条边就分别计数了2次。因此,可以的情况是:

e32=223,e23=023 或者 e32=023,e23=223 或者e32=123,e23=123

一种可行的方法是,把社团i和j之间的边分成2份,分别计入eij 和 eji,这样可以保证e是对称的。这样计算eij时,分母上就会多一个2 。

我们这个图中,社团1内部有5条边,社团2内部有7条边,社团3内部有8条边。社团1和社团2之间有1条边,社团1和社团3之间有0条边,社团2和社团3之间有2条边。可以得到e矩阵如下:

  1 2 3
1 523 12×123 12×023
2 12×123 723 12×223
3 12×023 12×223 823

这样,矩阵e的迹 tr(e)=∑ieii,也就是矩阵对角元素的和,就表示了社团内部的边的比例。这个值越大,代表社团内部联系越紧密。然而这样有一个缺陷,如果把整张图分成1个社团,这个值就是最大值1 。

So we further define the row (or column) sums ai=∑jeij , which represent the fraction of edges that connect to vertices in community i.

因此定义了一个e的行和a, ai=∑jeij,它表示连接到 社团i 中的边占总边数的比例。这句话是不准确的。

因为上面e矩阵中,我们对不同社团之间的边要除以2,因此这里连接到 社团i 中的边是有不同权重的,完全在社团i中的边权重为1,而只有一端在社团i中的边权重就是12。

由于权重的不同,如果把一条边看做有两个端点,准确的说法是

ai=∑jeij,它表示连接到 社团i 中的边的端点数(相当于社团中所有点的度相加) 占总端点数(2m) 的比例 ,即

ai=kCi2m

kCi表示社团i内部所有点的度数之和。

例子里我们的a如下:

a  
1 523+12×123+12×023 = 1146
2 12×123+723+12×223 = 1746
3 12×023+12×223+823 = 1846

In a network in which edges fall between vertices without regard for the communities they belong to, we would have eij=aiaj.

这句话我还没看懂,看懂的可以再评论区教下博主0.0

Thus we can define a modularity measure by

Q=∑i(eii–ai2)=Tre–||e2||

where ||x|| indicates the sum of the elements of the matrix x.

模块度的公式,定义是:

Q=∑i(eii–ai2)=∑ieii–∑iai2

如果用ei表示社团i内部的边数,则eii=eim 。然后把ai=kCi2m代入,就可以得到计算modularity最常用的公式

Q=∑i(eim–(kCi2m)2)

我们用定义算一下我们这个例子中划分的模块度:

Q=523+723+823–(1146)2–(1746)2–(1846)2=5531058=0.52268431

还可以推导一下,得到矩阵公式:

Q=∑i(eii–ai2)=∑ieii–∑iai2=Tre–||e2||

要证明这个,就是要∑iai2=||e2|| 。 由于ai=∑jeij,也就是

∑i(∑jeij)2=||e2||

注意到e是对称的。也就是e矩阵的每行求和,然后平方,再相加 等于 e矩阵平方再求和。(我还没看懂,看懂的可以再评论区教下博主0.0)

可以验证用矩阵公式算也会得到同样的Q。

这里顺便比较一下∑iai2 和 ||e2||

∑iai2=(523+146+0)2+(146+723+123)2+(0+123+823)2
e2=(52314601467231230123823)×(52314601467231230123823)=

我感觉第一个式子拆开后,正好就是后一个式子里面矩阵中的元素两两相乘。最后累加结果也相同。

Modularity第二版

Newman论文中的定义

2006年,Newman 在论文“Modularity and community structure in networks”中重新定义了modularity,目的是为了满足spectral properties。原话为:

Here we take a different approach based on a reformulation of the modularity in terms of the spectral properties of the network of interest.

Suppose our network contains n vertices.

n 表示图的结点个数

For a particular division of the network into two groups let s_i = 1 if vertex i belongs to group 1 and s_i = -1 if it belongs to group 2. Observing that the quantity 12(sisj+1)  is 1 if i and j are in the same group and 0 otherwise

论文中的例子是分为了2个社区。然后定义了si,si=1 表示结点i属于社团1,si=−1 表示结点i属于社团2 。那么 12(sisj+1) 的值就可以表示结点i和j是否在同一个社团,在同一个社团时值是1,在不同社团时值是0.

And let the number of edges between vertices i and j be Aij, which will normally be 0 or 1, although larger values are possible in networks where multiple edges are allowed.(The quantities Aij are the elements of the so-called adjacency matrix.)

Aij 表示 结点i 和 结点j 之间边的数目, 一般无权图中Aij 的取值是0或者1。但可以扩展到两点之间多条边的情形。

这里有2点文中没到的:

1. 无向图的邻接矩阵是对称的,即Aij=Aji。因此,如果把矩阵A的所有元素相加,得到的值是图中边的数目的2倍:2m=∑Aij。

2. 自己和自己的连接在矩阵中是0,即Aii=0。

At the same time, the expected number of edges between vertices i and j if edges are placed at random is kikj2m, where ki and kj are the degrees of the vertices and m=12∑iki is the total number of edges in the network.

同时,如果把同一个图中的边随机放置,则结点i和结点j之间边数的期望值是kikj2m(解释见下一节)。其中ki 和 kj 表示结点i和结点j的度, m=12∑iki 是图中边的个数。

Thus the modularity Q is given by the sum of Aij–kikj2m   over all pairs of vertices i, j that fall in the same group.

Aij–kikj2m 表示的是结点i和结点j之间的连边数,减去 随机情况下 结点i和结点j之间的期望连边数。(关于随机情况的讨论在下面)

we can then express the modularity as

Q=14m∑ij(Aij–kikj2m)(sisj+1)

The leading factor of 14m is merely conventional: it is included for compatibility with the previous definition of modularity (17).

Q计算公式前面的14m仅仅是为了和之前第一版的modularity计算公式相兼容。

把这个公式变形一下:

Q=12m∑ij(Aij–kikj2m)(sisj+1)2

这样就可以看出,后面的因子12(sisj+1)是为了确保求和时只对i和j属于同一个社团的情况进行求和。由于用s=1和-1只能表示有2个社团的情况,在多个社团时,我们可以引入记号δ(i,j) ,δ(i,j)=0 表示结点i 和 j 不在同一个社团,δ(i,j)=1 表示结点 i 和 j 在同一个社团。这样计算公式就变成了

Q=12m∑ij(Aij–kikj2m)δ(i,j)

其实就是下面的意思:

在同一社团Q=12m∑i,j在同一社团(Aij–kikj2m)

再来看一下这个式子中各个项的意义:

Aij 表示 结点i 和 结点j 之间边的数目

kikj2m 表示 随机放置边的情况下,结点i和结点j 之间边数的期望值

带上前面的求和号,

∑i,jAij 就表示 社团内部实际的 边 的数目 的2倍(2倍是因为ij和ji会计算2次)

∑i,jkikj2m 就表示 随机放置边的情况下,社团内部边数的期望值 的2倍(2倍是因为ij和ji会计算2次)

最后除以2m,之所以是2m,就是因为前面的边数都是2倍,这样一除就可以得到边的比例。(其实有没有12m是无所谓的,乘以常数并不影响求最值的问题)

12m∑i,jAij 就表示 社团内部实际的边数的比例

12m∑i,jkikj2m就表示 随机情况下社团内部期望的边数的比例

因此,Modularity的定义可以看做:

在社区内部的边的比例,减去边随机放置时社区内部期望边数的比例。

期望边数kikj2m的来源

参考论文Finding community structure in networks using the eigenvectors of matrices

每个结点的度不变,边重新连接,这就需要一个已知每个结点的度,来随机生成图的模型。图生成模型最重要的特征就是两个点i和j之间连边的概率(或者叫边的数目的期望值),记为Pij,那么Pij会满足什么性质呢?

1.每个结点度不变,最终总边数也不会变。因此随机连边后,图中的边数期望值等于原来真实图中的边数

∑i,jPij=∑i,jAij=2m

2.对每个节点来说,它的度也不会变,就有

∑jPij=ki

在满足这两个式子的情况下,随机的进行连边。这样在选定了一个点(边的一个端点)后,选另一个点(边的另一个端点)时,会选到结点i的概率,就只与结点i的度ki有关。而一条边的两个端点进行选择的时候都是独立随机的。因此Pij,选到i的概率与ki有关,选到j的概率与kj有关,就可以写成

Pij=f(ki)f(kj)

由于Pij=Pji,因此上面两个函数f是相同的。

∑jPij=∑jf(ki)f(kj)=f(ki)∑jf(kj)

根据上面性质中的第二个式子∑jPij=ki,就有

f(ki)∑jf(kj)=ki

由于∑jf(kj)并不包含i,可以看出f(ki)和ki之间是倍数关系,不妨设

f(ki)=Cki

C是常量。代入上面性质的第一个式子∑i,jPij=∑i,jAij=2m ,有

∑i,jPij=2m
∑i,jf(ki)f(kj)=2m
∑i,jCkiCkj=2m
C2∑ijkikj=2m

∑ijkikj是可以用m表示的。假设结点编号从1到n,则

2m=k1+k2+…+kn
(2m)2=(k1+k2+…+kn)2

平方展开,正好等于n个k值两两相乘,这正好等于∑ijkikj。即

(2m)2=(k1+k2+…+kn)2=∑ijkikj

再回到上面的式子,C2∑ijkikj=2m就变成了

C2(2m)2=2m
C=12m

因此求得Pij

Pij=f(ki)f(kj)=C2kikj=kikj2m

这个结果,当m非常大的时候,就等于configuration model中的概率

configuration model

configuration model是一种生成图的模型,它已知每个结点的度ki,然后随机生成边。

结点i的度ki可以看做结点i有ki个端点(stub)可以连接

所有结点的端点的个数为 ln=∑iki=2m

我们的图来说就是这样:

因为我们的原图有23条边,因此有46个端点。然后端点之间随机相连,每个端点连1次。例如连接5次后可能这样

现在的问题是,这样把边随机放置后,结点v和结点w之间边数的期望值是多少。

可以这样考虑,在一次随机选择两个末梢连边时,选定结点i的末梢后,选择另一个端点时共有2m-1中选择,而i和j连接的选择共有kj种,概率就是kj2m−1。而结点i共有ki个端点,也就是这样的选择机会有ki次。因此i和j相连的概率为

Pij=kikj2m−1

当m很大的时候,2m-1中的-1可以去掉,这样就和modularity中的概率一致了。

版本二和版本一的关系

版本二从不同的角度定义了modularity,但是两个版本其实是相等的。也就是说

版本一:(c是社团个数)

Q=∑ic(eii–ai2)=∑ieii–∑iai2

版本二:

在同一社团Q=12m∑i,j在同一社团(Aij–kikj2m)

这两个相等,也就是

在同一社团∑ieii–∑iai2=12m∑i,j在同一社团(Aij–kikj2m)

先看第一项

在同一社团∑iceii=12m∑i,j在同一社团(Aij)

eii表示的是社团i内部边的比例,求和后就是所有社团内部的边的比例。右边的求和∑(Aij就等于内部边数的2倍,除以2m也就是社团内部边的比例。这两个相等是容易看出的。

再看第二项

在同一社团∑icai2=12m∑i,j在同一社团(kikj2m)

在版本一中,ai表示连接到 社团i 中的边占总边数的比例。这里连接到 社团i 中的边是有不同权重的,完全在社团i中的边权重为1,而只有一端在社团i中的边权重就是1/2。

乘以2的话,2∗ai就正好是社团i内结点的度数之和 占总边数的比例(完全在社团i中的边权重为2,而只有一端在社团i中的边权重就是1,正好是度数之和)

在乘以m,就可以去掉比例,2m∗ai是社团i内结点的度数之和。也就是,ai = 社团i内结点的度数之和 / 2m

ai2就是社团i内结点的度数之和的平方 / (2m)2

右边在同一社团在同一社团右边=12m∑i,j在同一社团(kikj2m)=1(2m)2∑i,j在同一社团(kikj)

度数之和的平方,展开正好就是右边的 社团内部的度数两两相乘再相加在同一社团∑i,j在同一社团(kikj)

因此这两个是相等的

在同一社团Q=∑ieii–∑iai2=12m∑i,j在同一社团(Aij–kikj2m)

针对有权图和重叠社团的推广

参考论文:Identification of overlapping community structure in complex networks using fuzzy c-means clustering

上面的Modularity公式,可以写成下面的形式:

Q=∑k(ekkm–(dk2m)2)

其中, ekk表示社团k内部的边数,dk 表示社团i内部所有点的度数之和,m表示图中边的个数。

在有权图中,相当于把原来有一条边算作1,现在算作权值w的。

而针对重叠社团的情况,根据所属社团的个数,给边的贡献加一个权值:

若 结点i 属于 n 个社团(其中包括社团k),则定义 wik=1n 。而在无重叠的情况下,wik=1,且k仅有一个

ekk=12∑i,j∈Ckwik+wjk2Aij

系数 1/2 是因为社团内的一条边 ij和ji 会计算两次

A是图的邻接矩阵,Aij也就是对应边的权值。

为了求得社团内部边的度数,先计算社团连出去的边数:

ekout=∑i∈Ck,j∉Ck(wik+(1–wjk))Aij
dk=2ekk+ekout

C++代码计算

Modularity计算的C++代码 | 雅乐网

转自:http://www.yalewoo.com/modularity_community_detection.html

Modularity的计算方法——社团检测中模块度计算公式详解相关推荐

  1. Modularity的计算方法——社团检测中模块度计算公式详解(转)

    文章转自http://www.yalewoo.com/modularity_community_detection.html Modularity,中文称为模块度,是 Community Detect ...

  2. 西林电桥测量法的基本原理中电容Cx计算公式详解

    在复习高电压技术课本的过程中看到了Cx的计算公式,发现比较难推导,同时参考了吴广宁老师的课本和华电王伟老师的课本,下面给出我的推导过程,希望能对大家有所启发,书本给出的公式是下图 C x = R 4 ...

  3. 【积】louvain社团检测算法(python)代码图片双解(一)

    louvain社团检测算法(python) 这里写目录标题 louvain社团检测算法(python) 壹.完整代码 贰.分步解释 1.为网络中的每个节点分配一个社团: 2. 算法初始化 3. 第一阶 ...

  4. Burp Suite中Intruder模块的使用详解

    Burp Suite中Intruder模块的使用详解 Intruder(入侵者) Target(目标) Attack Target Positions(位置) Payload Positions Pa ...

  5. python xlrd课程_python中xlrd模块的使用详解

    一.xlrd的安装 打开cmd输入pip install xlrd安装完成即可 二.xlrd模块的使用 下面以这个工作簿为例 1.导入模块 import xlrd 2.打开工作薄 # filename ...

  6. Python中random模块生成随机数详解

    Python中random模块生成随机数详解 本文给大家汇总了一下在Python中random模块中最常用的生成随机数的方法,有需要的小伙伴可以参考下 Python中的random模块用于生成随机数. ...

  7. python中selenium模块驱动谷歌详解

    python中selenium模块驱动谷歌详解 Selenium的介绍.配置和调用 Selenium(浏览器自动化测试框架) 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中 ...

  8. python中xlrd模块的使用详解

    python中xlrd模块的使用详解 两个问题: 什么是xlrd模块? 为什么使用xlrd模块? 1.什么是xlrd模块? python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读 ...

  9. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

最新文章

  1. Synchronized同步的考虑
  2. CTFHUB 《基础认证》:burp使用,basic请求了解
  3. 统计数字(信息学奥赛一本通-T1239)
  4. heroku服务器_如何在Heroku上使用Express服务器部署React应用
  5. java timestamp时间戳_求助!java中关于时间戳Timestamp的问题
  6. CSRF漏洞原理/防御
  7. oracle查询:分组查询,取出每组中的第一条记录
  8. 纯新手DSP编程--5.21--DSP/BIOS使用
  9. 局部内部类使用局部变量应注意什么?
  10. arduino超声波测距接线图详细_Arduino:超声波传感器+测距
  11. 【Java 并发编程】Java 创建线程池的正确姿势: Executors 和 ThreadPoolExecutor 详解...
  12. 【有利可图网】PS实战教程55:打破次元壁,将照片从三次元跨越到二次元
  13. 【备忘】修复过的SCCM报错
  14. 北京市参加汽车摇号条件
  15. Unity 灯光系统
  16. 配置iterms窗口在其他界面上悬浮
  17. code-push常用命令
  18. python创建一个列表、包括学生姓名年龄祖籍_Python列表(list)练习题
  19. 进阶面试的必看的ORM架构之 ORM简介
  20. SQL语句查询所有表和查询表里的所有字段

热门文章

  1. 202106裁判文书网采集思路 理论无视更新
  2. 32寸+4K+HDR10,大屏细腻好色彩明基EW3270U都给你
  3. python怎么识别鼠标的动作_使用python检测窗口中的鼠标点击
  4. 破解通达信接口是违法的吗?一分钟为你科普
  5. 安卓桌面壁纸_小米全新MIUI 12正式发布,惊艳而强大 堪称安卓最美系统
  6. html_css_flex弹性盒模型_ZHOU125disorder_
  7. mysql -省市区(省)
  8. 拓扑排序Kahn算法
  9. java - 78. 子集
  10. YOLOv3训练自己的数据集