文章目录
- Community detection:团伙挖掘/社团发现
- Modularity:模块度
- Louvain算法
Community detection:团伙挖掘/社团发现
利用图拓扑结构中蕴藏的信息,从复杂网络中解析出存在密切联系的节点(团伙)。
Modularity:模块度
度量社区划分优劣的指标,直观上表示某社团划分状态下,社团内部连边数量与该划分下随机连边数量的差值。
计算公式如下:
Q=12m∑i,j[Aij−kikj2m]δ(ci,cj)=12m∑i,jAijδ(ci,cj)−∑i,jkikj2mδ(ci,cj)Q=\frac{1}{2m}\sum_{i,j}[A_{ij}-\frac{k_ik_j}{2m}]\delta(c_i,c_j)=\frac{1}{2m}\sum_{i,j}A_{ij}\delta(c_i,c_j)-\sum_{i,j}\frac{k_ik_j}{2m}\delta(c_i,c_j)Q=2m1i,j∑[Aij−2mkikj]δ(ci,cj)=2m1i,j∑Aijδ(ci,cj)−i,j∑2mkikjδ(ci,cj)
δ(ci,cj)\delta(c_i,c_j)δ(ci,cj):i, j在同一社团内部取1,否则取0
∑i,jAijδ(ci,cj)\sum_{i,j}A_{ij}\delta(c_i,c_j)∑i,jAijδ(ci,cj):社团内部连边数量之和
kj2mδ(ci,cj)\frac{k_j}{2m}\delta(c_i,c_j)2mkjδ(ci,cj):社团内部随机连边,连到节点j 的概率,kikj2mδ(ci,cj)\frac{k_ik_j}{2m}\delta(c_i,c_j)2mkikjδ(ci,cj):随机连边,i, j之间连接的边数,∑i,jkikj2mδ(ci,cj)\sum_{i,j}\frac{k_ik_j}{2m}\delta(c_i,c_j)∑i,j2mkikjδ(ci,cj):随机连边,社团内部连边总数
因此,两项差值越大,证明社团内部联系相对越紧密,社团划分的效果越好。
注:分母是2m而非m的原因:知乎_无向图louvain讲解
模块度增益
ΔQ=Q′−(Qi+Q2)\Delta Q=Q'-(Q_i+Q_2)ΔQ=Q′−(Qi+Q2)
即合并后的社团模块度减去合并前两社团模块度之和
Louvain算法
遍历每一种社团划分方法显然是不现实的。
Louvain算法是一种启发式迭代算法:
1)将图中的每个节点看成一个独立的社区,社区的数目与节点个数相同;
2)对每个节点i,依次尝试把节点i分配到其每个邻居节点所在的社区,计算分配前与分配后的模块度变化Δ𝑄,并记录Δ𝑄最大的那个邻居节点,如果𝑚𝑎𝑥Δ𝑄>0,则把节点i分配Δ𝑄最大的那个邻居节点所在的社区,否则保持不变;
3)重复2),直到所有节点的所属社区不再变化;
4)对图进行压缩,将所有在同一个社区的节点压缩成一个新节点,社区内节点之间的边的权重转化为新节点的环的权重,社区间的边权重转化为新节点间的边权重;
5)重复1)直到整个图的模块度不再发生变化。
参考文章:
博客园_模块度与Louvain社区发现算法