社团挖掘算法——BGLL算法

在说明该社团分解的算法前,先简单介绍一下衡量社区划分的模块度的概念(modularity),该值被定义为:
社团挖掘算法——BGLL算法_第1张图片
其中 Aij 表示节点i之间的权值(无向图边权值为1), ki 表示网络中节点i的权值之和, ci 表示节点i所属的社区,如果i和j在同一个社区则 δ(ci,cj)=1 否则等于0,m为整个网络的边数。
简化后网络的模块度计算公式变为:

Q= ncv=1[(lvM)(dv2M)2]

其中n是社团数量, lv 是社团v内部的边数, dv 是社团v中所有节点的度之和,M为边数。
该公式其实就是每个社区的模块度之和,这也就让我们知道了每个社区的模块度求法。

模块度可以用来衡量一个社团分化算法的优劣。给定一个网络,不同的社团分割所对应的模块度值一般是不一样的,社团分割的两个极端情况是:1、把整个网络化为一个社团,对应的模块度恒为0;2、把每一个节点视为一个社团,模块度恒为负。一个给定的网络模块度最大的社团分割称为该网络的最优分割。

BGLL社团算法介绍:该算法是由Blondel等人基于模块度概念提出的一种能够用于加权网络的层次化社团结构分析的凝聚算法,简称BGLL。

算法简述:算法分为重复迭代的两个部分。
第一部分:假设网络中有N个节点,首先我们给每个节点分配一个社区,所以初始阶段有多少个节点就有多少个社区。然后,对于网络中每个节点i,我们考虑他所有的邻居节点j,我们评估当把节点i从它所在的社区移动到其邻居j所在的社区时,模块度的增量变化,我们把节点i移动到使模块度增加最大(非负)的节点j所在的社区。如果所有计算出来的增益都不是正数,则将该节点仍处于原社区中。该过程对所有的节点重复并且按顺序应用,直到没有节点移动,则第一个过程停止,也就是任何一个节点的移动都不会导致模块度的增加。从该过程可以肯定,有些节点会被不止一次的考虑到。当然节点考虑顺序对算法最后的输出也是有影响的,但是最后对最后所划分的社区的模块度影响不大。但是节点的排序顺序是可以影响算法的运行时间的。
每一次节点移动一个孤立节点到其邻居所在的社团模块度增益为 ΔQ
这里写图片描述
其中 in 是社区C内部的所有边的权重之和, tot 是社区C中所有节点相关的边的权重之和。 ki 是发生在节点i上的所有边的权重之和。 ki,in 是节点i到社区C中的所有节点的边的权重和,m是网络中所有边的权重之和。
第二部分:用第一部分所划分出来的社区当作节点组成一个新的网络。新节点之间的边的权重为两个新节点之间(其实是两个社区之间)原本的权重之和。处在同一个社区中的节点之间的边导致新网络中该新节点有自环的边。然后对于构建的新网络使用第一部分的方法进行迭代。当网络不再改变也就是出现了最大模块度的时候停止迭代。

这里得说明一下的是,原论文中对于求 ΔQ 这个公式的各个变量的意义说的不是很清楚,导致我在编写代码的时候遇到了很大的问题。后来根据前面的模块度计算公式推导了一下,才搞清楚该公式中各个量的具体含义:其中的m确实是所有边的权重。但是 tot in 的意义并不是所有边的权重之和,而是遍历节点,看与节点相关的边的权重之和,也就是说在计算社团内部的边时,同一条边会被计算两次。
根据上述模块度计算公式,我们可以推出任何节点在移动到其他社区带来的 ΔQ 变化:
ΔQ =(节点i移除原先所在社区后该社区的模块度-节点i原先所在社区的模块度)+(节点i移动到社区j后社区j的模块度-社区j原本的模块度)

该算法复杂度为Md,m为边数,d为节点的度。通过实验该算法可以很好的将网络划分社区,并且在百万级的网络中也可以在有限时间内跑完(1百万节点,1千万条边的真实网络一个小时以内就可以划分完毕)。一般所有时间都花在了第一次迭代上,后面由于超级节点的合并,速度越来越快。

附上该算法的python代码:
http://download.csdn.net/download/qq_31192383/9927398

你可能感兴趣的:(复杂网络)