一、社团发现算法
人们发现许多实际网络均具有社团结构, 即整个网络由若干个社团组成,社团之间的连接相对稀疏、社团内部的连接相对稠密。社团发现则是利用图拓扑结构中所蕴藏的信息从复杂网络 中解析出其模块化的社团结构,该问题的深入研 究有助于以一种分而治之的方式研究整个网络的 模块、功能及其演化,更准确地理解复杂系统的组 织原则、拓扑结构与动力学特性,具有十分重要的 意义。
社团发现算法派系繁多,在这里我们重点介绍非重叠社团发现算法,参照《复杂网络社团发现算法研究新进展》中大致可分为以下几类
- 基于模块度优化的社团发现算法
- 基于谱分析的社团发现算法
- 基于信息论的社团发现算法
- 基于标号传播的社团发现算法
基于模块度优化的社团发现算法是目前研究最多的一类算法,其思想是将社团发现问题定义 为优化问题,然后搜索目标值最优的社团结构。 由 Newman 等 首先提出的模块度 Q值是目前使 用最广泛的优化目标,该指标通过比较真实网络 中各社团的边密度和随机网络中对应子图的边密 度之间的差异来度量社团结构的显著性。模块度 优化算法根据社团发现时的计算顺序大致可分为 三类:
- 第一类算法采用聚合思想,自底向上进行,典型代表算法有 Newman快速算法 、CNM算法 和 MSG-MV算法等
- 第二类算法主要采用分裂的思想,自顶向下 进行。如GN算法等
- 第三类算法则是直接寻优法。如EO算法
BGLL算法就属于基于模块度优化中的聚合类算法,自底向上的不断聚合,下面主要介绍下BGLL算法。
二、BGLL算法
论文:Fast unfolding of communities in large networks
2.1 BGLL算法优点
- 速度快,可以处理大规模网络。处理1亿+节点的网络只需要158分钟
- 可发现不同粒度的社区。由于是自底向上的聚合发现社区,每次迭代后都会得到一个粒度的社团结构
- 无需指定社团数量,当模块度不再增益时自动停止
2.2 BGLL算法流程
BGLL算法主要分为两步:
第一步:假设网络中有N个节点,首先我们给每个节点分配一个社区,所以初始阶段有多少个节点就有多少个社区。然后,对于网络中每个节点i,我们考虑他所有的邻居节点j,我们评估当把节点i从它所在的社区移动到其邻居j所在的社区时,模块度的增量变化,我们把节点i移动到使模块度增加最大的节点j所在的社区。如果所有计算出来的增益都不是正数,则将该节点仍处于原社区中。该过程对所有的节点重复并且按顺序应用,直到没有节点移动,则第一个过程停止,也就是任何一个节点的移动都不会导致模块度的增加。从该过程可以肯定,有些节点会被不止一次的考虑到。当然节点考虑顺序对算法最后的输出也是有影响的,但是最后对最后所划分的社区的模块度影响不大。但是节点的排序顺序是可以影响算法的运行时间的。
每一次节点移动一个孤立节点到其邻居所在的社团模块度增益为ΔQ:
其中∑in∑in是社区C内部的所有边的权重之和,∑tot∑tot是社区C中所有节点相关的边的权重之和。kiki是发生在节点i上的所有边的权重之和。ki,inki,in是节点i到社区C中的所有节点的边的权重和,m是网络中所有边的权重之和。
第二步:用第一部分所划分出来的社区当作节点组成一个新的网络。新节点之间的边的权重为两个新节点之间(其实是两个社区之间)原本的权重之和。处在同一个社区中的节点之间的边导致新网络中该新节点有自环的边。然后对于构建的新网络使用第一部分的方法进行迭代。当网络不再改变也就是出现了最大模块度的时候停止迭代。
三、JAVA实现
Qucik Start
example
BGLL bgll = new BGLL()
//inputPath is a origin network file
//outPath is the result
bgll.excuteBGLL(String inputPath, String outPath)
input
a file like this: the first column is the id of nodeA,the second column is the id of nodeB,the last column is weight between nodeA and nodeB.The weight can be both integer and float.
1,2,14
2,3,10
1,4,9
2,3,6
output
the output is the result of Hierarchical Clustering.there shows a faked result so that we can understand the output.
1,1,1
2,1,1
3,2,1
4,2,1
5,3,2
6,3,2
7,4,2
8,4,2
As the output show,there are 8 nodes in the network.the first column is the id of nodes,the the second column is the community id of the first clustering,we get 4 community in the first step.The final column is the community id of the last step clustering,the 8 nodes final divided into 2 clusters.