原创文章,转载请注明,谢谢~

一、背景介绍
  Modularity(模块度), 这个概念是2003年一个叫Newman的人提出的。这个人先后发表了很多关于社区划分的论文,包括2002年发表的著名的Girvan-Newman(G-N)算法,和2004发表的Fast Newman(F-B)算法,Modularity就是F-B算法中提出的(03年提出的概念,04年确认发表)。
  在2006年的时候Newman重新定义了Modularity,实际上只是对原来的公式做了变换,使其适用于Spectral Optimization Algorithms。
  早期的算法不能够很好的确认什么样的社区划分是最优的。Modularity这个概念就是为了定义一个对于社区划分结果优劣的评判。

二、Modularity
  我们先从06年的定义讲起:

Q=12m∑vw[Avw−kvkw2m]δ(cv,cw)(1)

Q = \frac{1}{2m}\sum_{vw}[A_{vw}-\frac{k_vk_w}{2m}]\delta(c_v,c_w) \tag{1}

  Q就是模块度,模块度越大则表明社区划分效果越好。Q值的范围在[-0.5,1),论文表示当Q值在0.3~0.7之间时,说明聚类的效果很好。
  我们现在假设有xx个节点,每个节点都代表一个输入,并且我们已经将这些输入划分为了NN个社区,节点彼此之间共有mm个连接。vv和ww是xx中的任意两个节点,当两个节点直接相连时Avw=1A_{vw}=1,否则Avw=0A_{vw}=0。kvk_v代表的是节点vv的度,度是图论的基础知识,从一个节点出发有几个边,我们就说这个节点的度是多少。很容易理解,这里的2m2m实际就是整个图中的度(每个节点都计算一次度,那么每条边对应两个节点,所以要乘以2)。δ(cv,cw)\delta(c_v,c_w)是用来判断节点vv和ww是否在同一个社区内,在同一个社区内`δ(cv,cw)=1\delta(c_v,c_w)=1,否则δ(cv,cw)=0\delta(c_v,c_w)=0。

  下面我们举个栗子来看一下这个公式是怎么计算的:


  如上图所示,共有A、B、C三个节点,其中节点A和C在社区2,节点B在社区1。可以表达为矩阵形式:


⎡⎣⎢011100100⎤⎦⎥[212] \begin{bmatrix} 0&1&1&\\ 1&0&0&\\ 1&0&0& \end{bmatrix} \begin{bmatrix}2&1&2\end{bmatrix}

   左边是邻接矩阵,右边是社区划分,我们也称之为label。


Q=12×2[(0−2×22×2)×1+0+(1−2×12×2)×1]+12×2[0+(0−1×12×2)×1+0]+12×2[(0−1×22×2)×1+0+(1−1×12×2)×1]=−18 Q = \frac{1}{2\times2}[(0- \frac{2\times2}{2\times2})\times1+0+(1- \frac{2\times1}{2\times2})\times1]\\ +\frac{1}{2\times2}[0+(0-\frac{1\times1}{2\times2})\times1+0]\\ +\frac{1}{2\times2}[(0- \frac{1\times2}{2\times2})\times1+0+(1- \frac{1\times1}{2\times2})\times1]\\ =-\frac{1}{8}

   下面我们来谈一下对于公式的理解,这个概念首先是在04年提出的,06年进行了数学上的推导。因此通过04年的公式,我们会非常清楚的看懂这个概念的含义。我们先给出公式的划归:


Q=12m∑vw[Avw−kvkw2m]δ(cv,cw)=∑ci=1(eii−a2i)(2) Q = \frac{1}{2m}\sum_{vw}[A_{vw}-\frac{k_vk_w}{2m}]\delta(c_v,c_w) = \sum_{i=1}^c(e_{ii}-a_i^2) \tag{2}


eij=∑vwAvw2m(3) e_{ij} = \sum_{vw}\frac{A_{vw}}{2m} \tag{3}


ai=ki2m=∑jeij(4) a_{i} = \frac{k_i}{2m} = \sum_{j}e_{ij} \tag{4}

   eije_{ij}表示一个节点在社区ii内,另一个节点在社区jj内的边。那么eiie_{ii}就表示在社区ii内所有的边与整个网络所有的边的一个比值(因为这个的A计算了两次,所以下边变数m也乘上了2,可以理解为一个社区内部的度比上整个网络的度)。而aia_i则表示i社区内的节点的度(包含了一点在社区i内一点在社区i外的边的度)占整个网络的度比值。
  可以理解为在一个社区网络结构中,社区内连边数与随机期望的一个差值。当实际的连边越高于随机的期望时,这个社区的节点就存在集中于几个社区内的一个趋势。对于这个理解,也有的用下面的公式来描述:


Q=∑c(∑in2m−(∑tot2m)2)(5) Q = \sum_{c}(\frac{\sum_{in}}{2m} - (\frac{\sum_{tot}}{2m})^2) \tag{5}


Q=∑c(Im−(2I+O2m)2)(6) Q = \sum_{c}(\frac{I}{m} - (\frac{2I+O}{2m})^2) \tag{6}

  上式中,II表示两个端点均在同一社区中的边的数目,OO表示其中一个端点在社区中,而另一个端点不在相同社区中的边的数目。
  (2)(5)(6)这三个式子其实是完全等价的,只不过最后一个公式是用边去计量,前面两个则是用度,但是很容易理解,边与度是可以相互转化的。
  下面我用04年的定义来重新计算上面的简单社区。


Q=[22×2−(32×2)2]+[02×2−(12×2)2]=−18 Q = [\frac{2}{2\times2} - (\frac{3}{2\times2})^2]+[\frac{0}{2\times2} - (\frac{1}{2\times2})^2]= -\frac{1}{8}

  可见两种定义确实是等价的。但是在实际的计算过程中我们可以发现,两层遍历使得算法非常的耗时,因此我们下面讲如何将这样的算法等价到矩阵形式上面去减少计算的时长。

三、Modularity 的矩阵形式
  首先我们定义一个n*r的矩阵SS,Sir=1S_{ir}=1表示第ii个节点属于第rr社区。则我们有:


Q=12m∑vw[Avw−kvkw2m]δ(cv,cw)=12mTr(STBS) Q = \frac{1}{2m}\sum_{vw}[A_{vw}-\frac{k_vk_w}{2m}]\delta(c_v,c_w) = \frac{1}{2m}Tr(S^TBS)

Bij=Aij−kikj2m B_{ij}=A_{ij}-\frac{k_ik_j}{2m}

  矩阵形式的简洁美啊,让我感叹一句,哈哈。

四、关于权重
  在进行社区划分的时候我们往往要考虑两个节点之间的重要性,也就是边的权重,计算方法是一样的,在理解上,可以这样理解:

五、算法实现
下面给出我的代码:

% Matlab
A = [0,1,1;1,0,0;1,0,0]; %邻接矩阵定义,与上面的例子是一致的
S = [0,1;1,0;0,1]; %label定义
m = sum(sum(A))/2;
k = sum(A,2);
B = A - (repmat(k,[1,size(A,1)]) .* repmat(k',[size(A,1),1])) / (2*m);
Q = 1/(2*m) .* trace(S'*B*S);

  没错就是这么简单,一共只有四行代码(前两行是输入定义),貌似网上还没有这么短的代码 → →,这就是矩阵的魅力了,通过计算我们得到:

Q=-0.1250

和上面计算出来的结果−18-\frac{1}{8}是完全一致的。

六、感言
  首先真的要特别感谢我的林老师,其实一直有写博客的打算,但是因为平时太忙,总觉得写博客很浪费时间,所以迟迟没有动笔。林老师的课程要求我们每周写一篇LeetCode的题解,间接性的带动了我写博客的欲望,也确实能够让我对整个知识有一个梳理。

  关于Fast-Newman算法,我在网上并没有找到比较可信的资料,因为说法众多,讲的也不全面,所以就写了这篇博文和大家分享交流。如果你有疑问可以留言,我们相互探讨一下,我会尽量回复,不过平时确实比较忙碌,如有疏忽,也请见谅。

  学海无涯,水滴石穿。

七、参考

Paper:
Newmana M E J. Fast algorithm for detecting community structure in network[J]. Physical Review E, 2004: 69.
https://arxiv.org/pdf/cond-mat/0309508.pdf
Newman M E J. Modularity and community structure in networks[J]. Proceedings of the national academy of sciences, 2006, 103(23): 8577-8582.
http://www.pnas.org/content/103/23/8577.full.pdf

Wiki:
https://en.wikipedia.org/wiki/Modularity_(networks)#Matrix_formulation

Blog:
https://greatpowerlaw.wordpress.com/2013/02/24/community-detection-modularity/
http://blog.csdn.net/wangyibo0201/article/details/52048248
http://wiki.swarma.net/index.php/%E7%BD%91%E7%BB%9C%E7%A4%BE%E5%8C%BA%E5%88%92%E5%88%86%E7%AE%97%E6%B3%95
http://blog.csdn.net/wangyibo0201/article/details/52048248

模块度(Modularity)与Fast Newman算法讲解与代码实现相关推荐

  1. 模块度计算python代码_转:模块度(Modularity)与Fast Newman算法讲解与代码实现

    一.背景介绍 Modularity(模块度), 这个概念是2003年一个叫Newman的人提出的.这个人先后发表了很多关于社区划分的论文,包括2002年发表的著名的Girvan-Newman(G-N) ...

  2. Community detection|模块度含义理解|Louvain算法

    文章目录 Community detection:团伙挖掘/社团发现 Modularity:模块度 模块度增益 Louvain算法 Community detection:团伙挖掘/社团发现 利用图拓 ...

  3. 快速排序算法讲解及代码(详细)

    快速排序算法 一.序言 二.快速排序基本思想 三.具体步骤 四.具体代码 一.序言 快速排序是一种高效且使用广泛的排序算法,在很多语言的标准库中自带的排序都是快速排序.所以我们也有必要了解快排的原理以 ...

  4. fast unfolding 算法——论文总结

    一.社区划分问题 1.网络结构和社团结构 在社交网络中,用户相当于每一个点,用户之间通过互相的关注关系构成了整个网络的结构,在这样的网络中,有的用户之间的连接较为紧密,有的用户之间的连接关系较为稀疏, ...

  5. 社团划分——Fast Unfolding算法

    社团划分--Fast Unfolding算法 一.社区划分问题 1.社区以及社区划分 在社交网络中,用户相当于每一个点,用户之间通过互相的关注关系构成了整个网络的结构,在这样的网络中,有的用户之间的连 ...

  6. 社团发现算法-BGLL算法(附代码实现)

    一.社团发现算法 人们发现许多实际网络均具有社团结构, 即整个网络由若干个社团组成,社团之间的连接相对稀疏.社团内部的连接相对稠密.社团发现则是利用图拓扑结构中所蕴藏的信息从复杂网络 中解析出其模块化 ...

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

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

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

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

  9. 模块度计算python代码_LPA算法C++实现及模块度计算

    前言 这学期开始看社团检测的东西,了解了一些经典算法.比如GN算法,BGLL算法(又叫Louvain, 因为该算法是作者在Louvain大学时提出的),LPA算法,等等. 我先看的LPA(毕竟算法思想 ...

最新文章

  1. 正则表达式提取字符串内所有的img标签下的src路径
  2. Swift里计数相关的小细节
  3. last modified php,lastModified属性_用法示例-javascript词典-js编程词典-php中文网
  4. layui之在table的编辑的按钮的思考
  5. 修改结构体中成员的值
  6. UnrealEngine4 PBR Shading Model 概述
  7. UI实用素材|购物车界面不同设计,可临摹的好模板
  8. HDU2090 算菜价【水题】
  9. linux apache压缩包安装目录,源码包安装Apache服务
  10. Shader 学习笔记:水面
  11. xv6 System Call
  12. 计算机毕设项目论文介绍(Java智慧物业管理系统为例)
  13. 字母数字下划线常用正则表达式
  14. Photoshop 2022下缩放和平移图像
  15. 父子id mysql,一道关于数据库(经典父子级 ID 关联)更新题
  16. buuctf misc 小易的U盘
  17. Windows下运行Makefile
  18. SQL Server AlwaysON从入门到进阶(3)——基础架构
  19. 网络管理系统、网管、network manage system、运维系统
  20. (转)音频输出PCM与LPCM有什么不同

热门文章

  1. 中国各地旅游五十项注意,请大家谨记
  2. QtAV的编译与使用(MSVC2015+Qt5.9.8)
  3. 线性加权平均 c语言程序,【求助】编的一个加权平均分计算程序,总是出错。求高手指点~...
  4. 记录下我在csdn做过的直播
  5. 济南电子机械工程学校计算机专业班主任,济南电子机械工程学校
  6. 路由器AP、路由、桥接模式有什么区别【详细介绍】
  7. 使用maven-sql-plugin实现持续数据库集成(CDBI) [ 光影人像 东海陈光剑 的博客 ]
  8. TCP与UDP协议初步学习——网络环境中分布式进程通信的基本概念
  9. mac 上格式化移动硬盘出现MediaKit报告设备上的空间不足以执行请求的解决办法
  10. python-数据分析-pandas