louvain算法_复杂网络社团划分算法

简介

一个基于模块度优化的启发式算法,用于发现大型网络的社团结构。


相关定义

模块度(第二版)

在一个(有权)网络中,模块度被定义为:

Q=\frac{1}{2 m} \sum_{i, j}\left[A_{i j}-\frac{K_{i} K_{j}}{2 m}\right] \ \delta \left(c_{i}, c_{j}\right)

其中A_{i j}表示节点i和节点j之间的边权值;K_{i}表示与节点i相连的边的权值之和(无权网络中为度);c_{i}表示i所属的社团;若节点i和节点j属同一社团,则\delta (c_{i}, c_{j})为1,否则为0;m表示网络中节点的边数量,若网络为有权网络则表示边权重和。

模块度(第一版)

Q=\sum_{i}\left(e_{i i}-a_{i}^{2}\right)=\operatorname{Tre} \left\|\mathbf{e}^{2}\right\|

基本思想

算主分为迭代重复计算的两个阶段:1.节点社团归属确定;2.社团合并。

step0:在算法开始,为网络中的每一个节点分配为一个不同的社团。

step1:确定节点社团归属

对于节点i,依次考虑将其加入其邻居节点j所属的社团C,此步骤带来的模块度增益\Delta Q为:

加入后的整体模块度 - 加入前整体的模块度

模块度(第一版)

Q=\sum_{i}\left(e_{i i}-a_{i}^{2}\right)=\operatorname{Tre} \left\|\mathbf{e}^{2}\right\|

对于社团c,若记sigma_in为社团c内所有边权重和的2倍,sigm_tot为连接到社团c中节点的连边和,则社团c的模块度为:

Q_{c_}=\frac{\sum_{in}}{2m}-(\frac{\sum_{tot}}{2m})^{2}

节点i加入后的社团c模块度为: 

Q_{c_{add}}=\frac{\sum_{in} + 2k_{i,in}}{2m}-(\frac{\sum_{tot+k_{i}}}{2m})^{2}

其中k_{i,in}为节点i连接到社团c中边的权重和,k_{i}表示节点i的度;


若节点i为孤立节点,即其所属社团a仅有一个节点,则移出前,社团a的模块度为:

Q_{a}=0-\left(\frac{k_{i}}{2 m}\right)^{2}

移出后,社团a的模块度为:

Q_{a_{rem}}=0

因此可以得到此时模块度增益为:

\Delta Q = (Q_{c_{add}} - Q_{c})+(Q_{a_{rem}}-Q_{a})=Q_{1}+Q_{2}

\Delta Q=\left[\frac{\sum_{\mathrm{in}}+2 k_{i, \text { in }}}{2 m}-\left(\frac{\sum_{\mathrm{tot}}+k_{i}}{2 m}\right)^{2}\right]-\left[\frac{\sum_{\mathrm{in}}}{2 m}-\left(\frac{\sum_{\mathrm{tot}}}{2 m}\right)^{2}-\left(\frac{k_{i}}{2 m}\right)^{2}\right]

网络上很多翻译、博客将此公式译为模块度增益公式,是不正确的!该公式仅给出了对于孤立节点的加入社团c带来的模块度增益,论文中也有对应说明。


若节点i未非孤立节点,则需要计算Q_{a_{rem}}

此时社团a的模块度为:

Q_{a}=\frac{\sum_{i n}}{2 m}-\left(\frac{\sum_{t o t}}{2 m}\right)^{2}

移出节点i后,社团a的模块度为:

 Q_{a_{rem}}=\frac{\sum_{in}-2k_{i,in}}{2 m}-\left(\frac{\sum_{t o t}-k_{i}}{2 m}\right)^{2}

其中k_{i,in}为节点i连接到社团a中边的权重和,k_{i}表示节点i的度;

step2:合并社团

社团划分算法复杂网络分析中的一个重要问题,它可以将网络分割成多个子图,每个子图内部具有较高的连接度,而不同的子图之间则具有较低的连接度。这种分割可以帮助我们更好地理解网络中节点之间的关系,有助于寻找节点的聚类规律和功能分区。 下面是几种常见的社团划分算法的源码: 1. GN算法:GN算法是一种基于网络模块度的社团划分算法,它通过不断地删除网络中连接度较低的边,并将节点分割成较大的子图,直到无法再分割为止。GN算法的Python实现可以在networkx库中找到。 2. Louvain算法Louvain算法是一种基于贪心的社团划分算法,它通过不断地将节点从一个社团移到另一个社团,以最大化网络的模块度。Louvain算法的Python实现可以在python-louvain库中找到。 3. Label Propagation算法:Label Propagation算法是一种基于标签传播的社团划分算法,它通过不断地将节点的标签更新为周围节点的标签来实现社团划分。Label Propagation算法的Python实现可以在networkx库中找到。 4. Infomap算法:Infomap算法是一种基于信息流的社团划分算法,它通过最小化信息流的长度来实现节点的分割,从而得到社团划分结果。Infomap算法的Python实现可以在infomap库中找到。 以上算法的源码可以在GitHub上找到。同时,也可以使用Python的复杂网络分析库networkx来实现这些算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值