fast unfolding 算法——论文总结

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dulingmo/article/details/86593476

一、社区划分问题

1、网络结构和社团结构

在社交网络中,用户相当于每一个点,用户之间通过互相的关注关系构成了整个网络的结构,在这样的网络中,有的用户之间的连接较为紧密,有的用户之间的连接关系较为稀疏,在这样的的网络中,连接较为紧密的部分可以被看成一个社区,其内部的节点之间有较为紧密的连接,而在两个社区间则相对连接较为稀疏,这便称为社团结构。

3、社区划分的评价标准

为了评价社区划分的优劣,Newman等人提出了模块度的概念,用模块度来衡量社区划分的好坏。简单来讲,就是将连接比较稠密的点划分在一个社区中,这样模块度的值会变大,最终,模块度最大的划分是最优的社区划分

二、模块度的概念

1、模块度的公式

社区划分的目标是使得划分后的社区内部的连接较为紧密,而在社区之间的连接较为稀疏,通过模块度的可以刻画这样的划分的优劣,模块度越大,则社区划分的效果越好 ,模块度的公式如下所示:

2、模块度公式的简化形式

上述的模块度的计算可以得到以下的简化形式:

3、模块度公式的解释

模块度(modularity)指的是网络中连接社区结构内部顶点的边所占的比例,减去在同样的社团结构下任意连接这两个节点的比例的期望值。

 

三、算法的讲解

1、Fast Unfolding算法的思路

模块度成为度量社区划分优劣的重要标准,划分后的网络模块度值越大,说明社区划分的效果越好,Fast Unfolding算法便是基于模块度对社区划分的算法,Fast Unfolding算法是一种迭代的算法,主要目标是不断划分社区使得划分后的整个网络的模块度不断增大。

2、Fast Unfolding算法的过程

Fast Unfolding算法主要包括两个阶段,如下图所示:

http://i.imgur.com/OuycozJ.jpg

 

 

具体的算法过程如下所示:

第一个阶段:主要是将每个节点划分到与其邻接的节点所在的社区中,以使得模块度的值不断变大;

首先将每个节点指定到唯一的一个社区,然后按顺序将节点在这些社区间进行移动。怎么移动呢?假设有一节点 i ,它有三个邻居节点 j1, j2, j3,我们分别尝试将节点 i 移动到 j1, j2, j3 所在的社区,并计算相应的 modularity 变化值ΔQ,哪个变化值最大就将节点 i 移动到相应的社区中去(当然,这里我们要求最大的 modularity 变化值要为正,如果变化值均为负,则节点 i 保持不动)。按照这个方法反复迭代,直到网络中任何节点的移动都不能再改善总的 modularity 值为止。

移动到一个社区C中所获得的模块化Q增益可以很容易地计算出来:

其中Σin是在社区C内的链路的权重总和,如果是初始情况,即一个节点作为一个community时,它就为这个节点自己到自己的连接,这时候仍然需要起点加weight,终点加weight(即使这个时候起点和终点为同一节点)

Σtot是关联到C中的节点的链路上的权重的总和

ki是关联到节点i的链路的权重的总和

ki,in是从节点i连接到C中的节点的链路的总和

m是网络中的所有链路的权重的总和

 

第二个阶段:主要是将第一步划分出来的社区聚合成为一个点,即根据上一步生成的社区结构重新构造网络。重复以上的过程,直到网络中的结构不再改变为止。

将第一个阶段得到的社区视为新的“节点”(一个社区对应一个),重新构造子图,两个新“节点”之间边的权值为相应两个社区之间各边的权值的总和。如这个图所示,如果第一个阶段得到的社区有以下三个,那么第二个阶段的任务就是将这三个社分别看一个新的节点,然后将任意两个节点之间的所有连线的权重相加得到的和,作为这两个节点之间的连线的权重。

我们将上述两个阶段合起来称为一个 pass,显然,这个 pass  可以继续下去。

 

3. 算法的效果:

在与其他算法进行比较过程中,作者得到以下数据:

一个小的社会网络、一个有9000个科学论文引文的网络、因特网的子网络、由几十万个网页组成的网页网络。

可以从这张表中观察到不同算法获得模块化的最大值和速度,从这两个方面来看,fast unfolding 算法比另外三种算法都要好,该算法的计算时间也比较小。并且,论文中还提到,fast unfolding算法实现社区发现的pass的次数很少,Karate网络只需要3次pass(以空手道俱乐部[24]为例,一共有3pass:在第一个pass期间,网络的34个节点被划分为6个社团;在第二个社区之后,只剩下四个社区;在第三个过程中,什么都没有发生,因此算法停止。),而在以上例子中,pass的次数总是小于5的。

基准测试比较:

这篇论文中还通过将这个算法应用于具有已知社区结构的ad-hoc网络来测试算法的灵敏度。他们使用128个节点组成的网络,这些网络被分成4个社区,每个社区32个节点,同一社区的节点对 用概率Pin连接,属于不同社区的节点对用概率Pout连接,通过测量正确识别的节点的分数和标准化的互信息来评估算法的准确性,在[30] Comparing community structure identification论文中提出的基准中,正确识别的节点的分数对于zout = 8是0.67,对于zout = 7是0.92,对于zout = 6是0.98,这种精度与Pons and Latapy的算法和Reichardt and Bornholdt的算法的精度类似[31]。

论文中还提到,只有两种算法具有比fast unfolding算法更好的精度,Duch and Arenas的算法以及模拟退火算法,但它们的计算成本限制了它们适用于比较小的网络。

该算法也已在其他基准测试中成功测试,在Detecting the overlapping and hierarchical community structure in complex networks这篇论文中提出的基准测试中,对于具有混合参数k3到35的宏观社区,归一化的互信息几乎为1.当混合参数大约为55时,它达到0.5。

4. 算法的优点:

  ①步骤直观且易于实施,无人监督。

  ②算法速度快,在大型的ad-hoc模块化网络上的算法应用表明复杂度为线性的。因为使用公式可以很容易的计算模块化的可能增益,且在几次迭代后增益会急剧减少。

  ③算法具有固有的多层次特性,所以模块化的分辨率限制问题也可以被规避。因为该算法的第一阶段设计为将单一的节点从一个社区移位到另一个社区。

(模块化分辨率限制问题:以模块度最大化为目标可能无法发现一下规模较小的社区,即党最大模块度值对应的社团结构中包含小于一定规模的社团时,就不能确定这些社团是单独的社区或者更小的社区的若连接合并了)。

 

5. 应用及意义:

为了验证所获得的社区,论文中还提到将该算法应用于从一家比利时移动电话公司的记录构建的大型网络。该网络由260万用户组成,在这些用户之间画出加权链接,表示他们在6个月内的总通话次数。每个客户由一个代理键标识,该代理键与多个条目相关联,例如他的年龄、性别、语言和居住地的邮政编码。由于比利时两种主要语言社区(法语和荷兰语)并存的特殊情况,这个庞大的社交网络是非常特殊的,它通过观察社区的语言同质性,来检测社区发现方法的有效性。(从更社会学的角度来看,突出社区的语言,宗教或种族同质性的可能性为描述一个国家的社会凝聚力和潜在的脆弱性开辟了视角。)

在这个特定的网络中,该算法已经确定了六个级别的层次结构。在底层,每个客户都是自己的社区,在顶层,有261个社区拥有超过100个客户。这些社区约占所有客户的75%。我们对这261个社区进行了语言分析(见图3)。社区的同质性的特征是那些在该社区中使用主导语言的人的百分比;当社区倾向于单语时,这个数量变为1。论文分析表明,网络是强烈隔离的,大多数社区几乎是单语的。有36个社区拥有超过10000个客户,除了两个语言群集之间的界面中的一个社区外,所有这些社区中超过85%的成员使用相同的语言(完整分发见图4)。该算法可以通过获得的层次结构中的较低级别的子社区来分析具有更加平衡的语言分布的社区。这些具有相同的语言的人群紧密联系,语言就不会成为他们彼此歧视的因素,对社会稳定和国家和谐具有一定作用。

可以通过使用这种算法来分析和观察不同语言社区的不同社会行为,这与其他语言的存在有关,如下图,法语社区和荷兰语社区比较密切,法语社区之间的联系强度比荷兰语之间的联系强54%,这两种自网络之间的结构差异表明了这两个语言社区具有不同的社会行为。

 

这个网络大约有200万用户。节点的大小与对应社区中的个体数量成正比,其红绿比例尺上的颜色代表社区中使用的主要语言(红色代表法语,绿色代表荷兰语)。只有100多个客户组成的社区被绘制出来。请注意两个主要语言集群之间的中间混合色社区。放大到更高的分辨率,可以发现它是由几个语言分离不太明显的子社区组成的。

 

6. 结论:

 Fast unfolding算法是一种比较优的社区发现算法,这个算法的局限性在于网络在主存储器中的存储而不是计算时间,这就为解开整个国家或互联网的大部分复杂系统的模块化结构提供了可能,算法的准确性也在ad-hoc模块化网络中进行了测试,且与其他社区检测方法相比更加算法使用的时间短,效果好。并且,通过一些简单的方法,算法的速度还可以提高,比如,给定modularity增益的阈值、从原始网络社区中移除节点度为1(为叶节点)的节点,然后在社区计算后再加入到社区中。

且论文中还说明,尽管只检测了最后一层得到的社区的有效性和准确性,但是算法得到的中间分区也是有意义的,中间分区对应与模块性的局部最大值。

展开阅读全文

没有更多推荐了,返回首页