社区发现算法Louvain Fast unfolding of communities in large networks
一、社区发现
将复杂网络划分为若干个组,组内节点连接稠密,组间节点连接稀疏。这些组称为社区(Community),将复杂网络划分为社区的过程称为社区发现(Community Detection)。
二、社区发现效果度量----模块度(Modularity)
模块度(modularity)用来评估一个网络划分的质量,其取值范围介于-1至1间。在加权网络中,模块度的定义为
其中,表示节点和之间边的权重;表示所有与相连边的权重之和;是顶点所属社区;表示所有边权重之和。
为了简明的介绍模块度的含义,这里对进行一些简单的推断
其中
- 表示在保持所有节点度不变情况下,随机进行边连接后,节点和节点间边的期望数;
- 表示社区内部边权重之和的2倍;(因为和都会被计数进来)
- 表示随机情况下社区内部边权重之和的2倍;
- 表示社区内部边权重占总权重的比例;
- 表示随机情况下社区内部边权重占总权重的比例;
- 模块度的直观理解:“社区内部边的权重比例”减去“随机放置边情况下社区内部边的权重比例”。内部权重比例越高,则表示社区内部的连接越紧密。此外,我们划分的社区越好,则权重占比与随机情况的差距也越大。
三、社区发现算法分类
- 分裂式社区发现算法:从网络中删除边,从而形成社区;
- 递归聚合式社区发现算法:将相似节点进行合并,从而形成社区;
- 目标函数优化式社区发现算法:将社区发现看作是目标函数优化问题;
四、Louvain算法的流程
1. 目的
在Louvain之前的社区发现算法的速度太慢,或者速度快但效果不好。这导致社区发现算法很难应用在规模巨大的网络上。Louvain作者发现许多大型网络天然具有层次结构,并基于这个特性设计了Louvain算法。
2. 步骤
- (1). 将网络中所有的节点看作是独立的社区,此时社区数目与节点数目相等;
- (2). 对图中的每个节点,依次尝试将其分配到相邻节点所在社区,并计算分配前后模块度的变化,并记录下最大的;
- (3). 若最大的,则把节点分配值最大所对应邻居的社区;否则,保持不变;
- (4). 若所有节点的社区均保持稳定,则进入下一步;否则,转至(2);
- (5). 将网络中的每个社区看作是新节点,社区内节点间权重转换为新节点的环权重,社区间权重转换为新节点间边的权重,从而形成新的网络;
- (6). 转至(1),直至模块度不再变化;
为了更加简洁的表示,这里对模块度进行一些符号上的简化
其中,,表示社区内部边权重之和;表示连接至社区的所有权重之和。
那么移动节点至社区带来的模块度变化就可以表示为
其中,表示从节点连接至中节点的权重和。的第一项表示将节点移入社区后的模块度,第二项则表示将节点作为独立社区的模块度。第二项是下面等式的化简结果
3. 优点
- 速度快
- 能发现社区的层次结构