社区发现算法Louvain Fast unfolding of communities in large networks

一、社区发现

将复杂网络划分为若干个组,组内节点连接稠密,组间节点连接稀疏。这些组称为社区(Community),将复杂网络划分为社区的过程称为社区发现(Community Detection)。

二、社区发现效果度量----模块度(Modularity)

模块度(modularity)用来评估一个网络划分的质量,其取值范围介于-1至1间。在加权网络中,模块度的定义为
leiden社区发现算法的python 社区发现算法louvain_Louvain
其中,leiden社区发现算法的python 社区发现算法louvain_leiden社区发现算法的python_02表示节点leiden社区发现算法的python 社区发现算法louvain_leiden社区发现算法的python_03leiden社区发现算法的python 社区发现算法louvain_复杂网络_04之间边的权重;leiden社区发现算法的python 社区发现算法louvain_Louvain_05表示所有与leiden社区发现算法的python 社区发现算法louvain_leiden社区发现算法的python_03相连边的权重之和;leiden社区发现算法的python 社区发现算法louvain_Louvain_07是顶点leiden社区发现算法的python 社区发现算法louvain_leiden社区发现算法的python_03所属社区;leiden社区发现算法的python 社区发现算法louvain_复杂网络_09表示所有边权重之和。

为了简明的介绍模块度的含义,这里对leiden社区发现算法的python 社区发现算法louvain_Louvain_10进行一些简单的推断
leiden社区发现算法的python 社区发现算法louvain_Fast_11
其中

  • leiden社区发现算法的python 社区发现算法louvain_Louvain_12表示在保持所有节点度不变情况下,随机进行边连接后,节点leiden社区发现算法的python 社区发现算法louvain_Fast_13和节点leiden社区发现算法的python 社区发现算法louvain_leiden社区发现算法的python_14间边的期望数;
  • leiden社区发现算法的python 社区发现算法louvain_Louvain_15表示社区内部边权重之和的2倍;(因为leiden社区发现算法的python 社区发现算法louvain_复杂网络_16leiden社区发现算法的python 社区发现算法louvain_leiden社区发现算法的python_17都会被计数进来)
  • leiden社区发现算法的python 社区发现算法louvain_leiden社区发现算法的python_18表示随机情况下社区内部边权重之和的2倍;
  • leiden社区发现算法的python 社区发现算法louvain_复杂网络_19表示社区内部边权重占总权重的比例;
  • leiden社区发现算法的python 社区发现算法louvain_复杂网络_20表示随机情况下社区内部边权重占总权重的比例;
  • 模块度的直观理解:“社区内部边的权重比例”减去“随机放置边情况下社区内部边的权重比例”。内部权重比例越高,则表示社区内部的连接越紧密。此外,我们划分的社区越好,则权重占比与随机情况的差距也越大。

三、社区发现算法分类

  • 分裂式社区发现算法:从网络中删除边,从而形成社区;
  • 递归聚合式社区发现算法:将相似节点进行合并,从而形成社区;
  • 目标函数优化式社区发现算法:将社区发现看作是目标函数优化问题;

四、Louvain算法的流程

1. 目的

在Louvain之前的社区发现算法的速度太慢,或者速度快但效果不好。这导致社区发现算法很难应用在规模巨大的网络上。Louvain作者发现许多大型网络天然具有层次结构,并基于这个特性设计了Louvain算法。

2. 步骤
  • (1). 将网络中所有的节点看作是独立的社区,此时社区数目与节点数目相等;
  • (2). 对图中的每个节点leiden社区发现算法的python 社区发现算法louvain_Fast_13,依次尝试将其分配到相邻节点所在社区,并计算分配前后模块度的变化leiden社区发现算法的python 社区发现算法louvain_Fast_22,并记录下最大的leiden社区发现算法的python 社区发现算法louvain_Fast_22
  • (3). 若最大的leiden社区发现算法的python 社区发现算法louvain_Louvain_24,则把节点leiden社区发现算法的python 社区发现算法louvain_Fast_13分配值最大leiden社区发现算法的python 社区发现算法louvain_Fast_22所对应邻居的社区;否则,保持不变;
  • (4). 若所有节点的社区均保持稳定,则进入下一步;否则,转至(2);
  • (5). 将网络中的每个社区看作是新节点,社区内节点间权重转换为新节点的环权重,社区间权重转换为新节点间边的权重,从而形成新的网络;
  • (6). 转至(1),直至模块度不再变化;

为了更加简洁的表示leiden社区发现算法的python 社区发现算法louvain_社区发现_27,这里对模块度leiden社区发现算法的python 社区发现算法louvain_Louvain_10进行一些符号上的简化
leiden社区发现算法的python 社区发现算法louvain_Fast_29
其中,leiden社区发现算法的python 社区发现算法louvain_Fast_30,表示社区内部边权重之和;leiden社区发现算法的python 社区发现算法louvain_Louvain_31表示连接至社区leiden社区发现算法的python 社区发现算法louvain_社区发现_32的所有权重之和。

那么移动节点leiden社区发现算法的python 社区发现算法louvain_leiden社区发现算法的python_03至社区leiden社区发现算法的python 社区发现算法louvain_社区发现_32带来的模块度变化leiden社区发现算法的python 社区发现算法louvain_社区发现_27就可以表示为
leiden社区发现算法的python 社区发现算法louvain_Fast_36
其中,leiden社区发现算法的python 社区发现算法louvain_复杂网络_37表示从节点leiden社区发现算法的python 社区发现算法louvain_leiden社区发现算法的python_03连接至leiden社区发现算法的python 社区发现算法louvain_社区发现_32中节点的权重和。leiden社区发现算法的python 社区发现算法louvain_社区发现_27的第一项表示将节点leiden社区发现算法的python 社区发现算法louvain_leiden社区发现算法的python_03移入社区leiden社区发现算法的python 社区发现算法louvain_社区发现_32后的模块度,第二项则表示将节点leiden社区发现算法的python 社区发现算法louvain_leiden社区发现算法的python_03作为独立社区的模块度。第二项是下面等式的化简结果
leiden社区发现算法的python 社区发现算法louvain_社区发现_44

3. 优点
  • 速度快
  • 能发现社区的层次结构