【转载】LOUVAIN算法

hxy    2018-11-19 21:19

Louvain 算法来源于文章2010年的论文Fast unfolding of communities in large networks,简称为Louvian [1]。

算法原理

Louvain算法是基于模块度(Modularity)的社区发现算法,该算法在效率和效果上都表现比较好,并且能够发现层次性的社区结构,其优化的目标是最大化整个图属性结构(社区网络)的模块度。

其中需要理解的核心点有:

  1. 模块度Modularity的定义,这个定义是描述社区内紧密程度的值QQ
  2. 模块度增量ΔQ\Delta Q,即把一个孤立的点放入一个社区C后,计算Modularity的变化,其中计算过程的要点是,首先计算1个点的Modularity,和社区C的Modularity,再计算合并后新社区的Modularity,新社区的Modularity减去前两个Modularity就是ΔQ\Delta Q

对上述公式的理解是,将ΔQ\Delta Q展开其等价于1/2*(ki,in/m-Sumtot/m*ki/m)1/2 *( k_i,in / m - Sum_{tot} / m * ki / m ),其中kik_i,in/min/m表示的是将孤立的节点和社区C放在一起对整个网络 Modularity 的影响,而 Sumtot/mSum_{tot} / m 和 ki/mki / m 分别表示孤立的节点和社区C分开式分别对整个网络Modularity的影响,所以他们的差值就反应了孤立的节点放入社区C前后对整个网络Modularity的影响。

算法的计算过程如下:每个点作为一个community,然后考虑每个community的邻居节点,合并到community,然后看ΔQ\Delta Q;找到最大的正ΔQ\Delta Q,合并点到community;多进行几轮,至不再变动,那么结束; 

其中存在的问题是,不同的节点访问顺序将导致不同的结果,实验中发现这个顺序对结果影响不大,但是会在一定程度上影响计算时间。将新的community作为点,重复上述过程。那么如何确定新的点之前的权重呢?答案是将两个community之间相邻的点之间的权重和作为两个community退化成一个点后的新的权重。

该算法的优点主要有3个:

  1. 易于理解
  2. 非监督
  3. 计算快速

最后我们可以得到的结果是层次化的社区发现结果。

spark实现: https://github.com/Sotera/spark-distributed-louvain-modularity

Figure 1 Louvain结果示意图1
Figure 2 Louvain结果示意图2

算法的改进: 还有其加速实现的论文,例如[2], 其实现方式比较直接,就是考虑一个点周围的百分之多少点进行归并。可以在spark下面通过类似于多路归并来实现。

参考资料:

  1. BLONDEL V D, GUILLAUME J-L, LAMBIOTTE R, 等. Fast unfolding of communities in large networks[J]. Journal of Statistical Mechanics: Theory and Experiment, 2008, 2008(10): P10008.
  2. Kirianovskii I , Granichin O , Proskurnikov A . A New Randomized Algorithm for Community Detection in Large Networks**The results of the paper have been obtained at IPME RAS under support of Russian Foundation for Basic Research (RFBR) grant 16-07-00890[J]. IFAC-PapersOnLine, 2016, 49(13):31-35.
  3. AllanSpark, Louvain社区发现算法 https://www.cnblogs.com/allanspark/p/4197980.html
Last Modified: 2019-06-16 21:37
Views: 5.2K

[[total]] comments

Post your comment
  1. [[item.time]]
    [[item.user.username]] [[item.floor]]Floor
  2. Click to load more...
  3. Post your comment