聚类——Newman系列算法
- 模块度QQQ
- 模块度增量 ΔQ\ \Delta Q ΔQ
- Fast Newman
- CNM
- Fast Unfolding
Newman系列算法本质上是一种贪心的聚类算法,以最优化模块度QQQ为目标进行聚类,在具体实现上有些类似于层次聚类(hierarchical clustering)。该系列算法在处理大型社群网络时具有较高的效率。本文将介绍这个系列中的三种:Fast Newman算法(fast algorithm for community structure in networks),CNM(clauset-newman-moore)算法(Finding community structure in very large networks. ),Fast Unfolding算法(Fast unfolding of communities in large networks)。CNM算法是在Fast Newman算法基础上用堆数据结构来计算并更新模块度的一种改进。
模块度QQQ
模块度QQQ是一种衡量社群网络结构强度的指标,是社群内部关联性的度量方式之一,其值越接近1,表示网络划分出的社区结构的强度越强,也就是划分质量越好。模块度的基本思想是把划分后的网络与划分后的随机网络进行比较,以度量社团划分的质量。可以公式化的定义为:
模块度Q=(落在同一组内的边的比例)−(划分后的随机网络中落在同一组的边的比例) 模块度Q=(落在同一组内的边的比例)-(划分后的随机网络中落在同一组的边的比例)模块度Q=(落在同一组内的边的比例)−(划分后的随机网络中落在同一组的边的比例)
这里我们考虑一种简单的网络结构——无向无加权网络。假设网络中有nnn个节点,mmm条边,则可以用 An×n\ A^{n \times n} An×n的邻接矩阵表示这个网络,且满足 Aij=Aji\ A_{ij}= A_{ji} Aij=Aji;当节点 i\ i i和节点 j\ j j之间有边连接时 Aij=1\ A_{ij}=1 Aij=1,当节点 i\ i i和节点 j\ j j之间没有边连接时 Aij=0\ A_{ij}=0 Aij=0。
落在同一组内的边的比例=(落在同一组内边的数量)÷(边的总数)\ 落在同一组内的边的比例=(落在同一组内边的数量)\div(边的总数) 落在同一组内的边的比例=(落在同一组内边的数量)÷(边的总数)。落在同一组内边的数量等价于事件(某两个节点间存在一条边,且这条两个节点处于同一社群)的数量。这里我们引入一个变量 δij\ \delta_{ij} δij表示iii节点与jjj节点是否处于同一社群中,当iii节点与jjj节点在同一社群中时 δij=1\ \delta_{ij}=1 δij=1,不在同一社群中时 δij=0\ \delta_{ij}=0 δij=0。则结合邻接矩阵AAA可以得到 落在同一组内边的数量=12Σ(Aijδij)\ 落在同一组内边的数量=\frac{1}{2}\Sigma(A_{ij}\delta_{ij}) 落在同一组内边的数量=21Σ(Aijδij)由于在无向图的邻接矩阵中每条边实际会被计算两次,所以需要乘以 12\ \frac{1}{2} 21。进而我们可以得到 落在同一组内的边的比例=Σ(Aijδij)2m\ 落在同一组内的边的比例=\frac{\Sigma(A_{ij}\delta_{ij})}{2m} 落在同一组内的边的比例=2mΣ(Aijδij)
为了使度量具有可操作性,这里要求随机网络中的节点和原网络中的节点具有相同的度。由此,可以设想以下场景:将原有的mmm条边从中间切开,每个节点持有原先边的一半(即半边),我们可以得到 2m\ 2m 2m条半边,将这些半边随机两两重新连接(不包括自身),允许节点自环、两个节点间存在多条边等特殊情况,则得到的随机网络中每个节点必定具有和原来相同的度。在这个场景下,若节点 i\ i i原先度为 ki\ k_{i} ki,则它会有 ki\ k_{i} ki条半边,它的每一条半边和任意另一条半边连接的概率为 12m−1\ \frac{1}{2m-1} 2m−11,假设节点jjj具有 kj\ k_{j} kj条半边,则节点iii的某一条半边和节点jjj的一条半边相连的概率为 kj2m−1\ \frac{k_{j}}{2m-1} 2m−1kj,节点iii和节点jjj间存在一条边的期望为 kikj2m−1\ \frac{k_{i}k_{j}}{2m-1} 2m−1kikj,当mmm很大时,期望可近似为 kikj2m\ \frac{k_{i}k_{j}}{2m} 2mkikj,故我们可以得到划分后的随机网络中落在同一组的边的比例=Σ(kikj2mδij)2m 划分后的随机网络中落在同一组的边的比例=\frac{\Sigma(\frac{k_{i}k_{j}}{2m}\delta_{ij})}{2m}划分后的随机网络中落在同一组的边的比例=2mΣ(2mkikjδij)因此Q=12mΣ(Aij−kikj2m)δij Q=\frac{1}{2m}\Sigma(A_{ij}-\frac{k_{i}k_{j}}{2m})\delta_{ij}Q=2m1Σ(Aij−2mkikj)δij
而社群是由节点组成的,如果一个网络被分为了kkk个社群,且所有社群都不重叠,则我们可以用一个矩阵 ek×k\ e^{k\times k} ek×k表示社群划分情况,其中 evv\ e_{vv} evv表示社群vvv内部边的比例, evw\ e_{vw} evw表示社群vvv和社群jjj之间边的比例,结合上文所述可以表示为evw=ΣAijδ(v,Ci)δ(w,Cj)2m e_{vw}=\frac{\Sigma A_{ij}\delta(v,C_{i})\delta(w,C_{j})}{2m}evw=2mΣAijδ(v,Ci)δ(w,Cj)进一步我们可以定义 av\ a_{v} av表示社群vvv所有边的比例(包括社群内部和社群之间)av=12mΣikiδ(v,Ci)=kv2m=Σwevw a_{v}=\frac{1}{2m}\Sigma_{i}k_{i}\delta(v,C_{i})=\frac{k_{v}}{2m}=\Sigma_{w} e_{vw}av=2m1Σikiδ(v,Ci)=2mkv=Σwevw注意到δij=δ(Ci,v)δ(Cj,v) \delta_{ij}=\delta(C_{i},v)\delta(C_{j},v)δij=δ(Ci,v)δ(Cj,v)
因此模块度也可以表示为Q=12mΣijAijδij−12mΣijkikj2mδij=Σv(12mΣijAijδ(Ci,v)δ(Cj,v)−12mΣikiδ(Ci,v)12mΣjkjδ(Cj,v))=Σv(evv−av2)
\begin{aligned}
Q&=\frac{1}{2m}\Sigma_{ij} A_{ij}\delta_{ij}-\frac{1}{2m}\Sigma_{ij}\frac{k_{i}k_{j}}{2m}\delta_{ij}\\&=\Sigma_{v}(\frac{1}{2m}\Sigma_{ij}A_{ij}\delta(C_{i},v)\delta(C_{j},v)-\frac{1}{2m}\Sigma_{i}k_{i}\delta(C_{i},v)\frac{1}{2m}\Sigma_{j}k_{j}\delta(C_{j},v))\\ &=\Sigma_{v}(e_{vv}-a_{v}^{2})
\end{aligned}\\
Q=2m1ΣijAijδij−2m1Σij2mkikjδij=Σv(2m1ΣijAijδ(Ci,v)δ(Cj,v)−2m1Σikiδ(Ci,v)2m1Σjkjδ(Cj,v))=Σv(evv−av2)
模块度增量 ΔQ\ \Delta Q ΔQ
ΔQ\ \Delta Q ΔQ表示合并两个社群后对模块度的贡献。对于社群矩阵eee,合并社群vvv和社群www得到新社群uuu,社群uuu满足 euu=evv+eww+evw+ewv\ e_{uu}=e_{vv}+e_{ww}+e_{vw}+e_{wv} euu=evv+eww+evw+ewv, au=av+aw\ a_{u}=a_{v}+a_{w} au=av+aw,社群uuu与社群kkk之间满足 euk=evk+ewk\ e_{uk}=e_{vk}+e_{wk} euk=evk+ewk。根据上文所述可以得到ΔQvw=euu−evv−eww+au2−av2−aw2=evw+ewv−2avaw \Delta Q_{vw}=e_{uu}-e_{vv}-e_{ww}+a_u^{2}-a_v^{2}-a_w^{2}=e_{vw}+e_{wv}-2a_{v}a_{w}ΔQvw=euu−evv−eww+au2−av2−aw2=evw+ewv−2avaw
Fast Newman
Fast Newman算法通过每次选择最大 ΔQvw\ \Delta Q_{vw} ΔQvw进行社群合并,达到最优化QQQ的目标。具体流程为
- 先将每个节点视为一个独立的社群,初始化eee和aaa,计算社群与其相邻社群融合的 ΔQvw\ \Delta Q_{vw} ΔQvw
- 选择argmax(ΔQvw)argmax(\Delta Q_{vw})argmax(ΔQvw),融合这两个社群,更新eee和aaa,重新计算 ΔQvw\ \Delta Q_{vw} ΔQvw
- 重复步骤2,直到所有节点在同一个社群或者QQQ不再增加
CNM
CNM算法沿用了Fast Newman算法的思路,在性能上作出了改进。一方面使用堆结构来维护 ΔQvw\ \Delta Q_{vw} ΔQvw,另一方面给出了每次社群合并后 ΔQvw\ \Delta Q_{vw} ΔQvw的递推关系ΔQuk={ΔQvk+ΔQwk,社群k与社群v、社群w都有连接ΔQvk−2awak,社群k只与社群v有连接ΔQwk−2avak,社群k只与社群w有连接0,社群k与社群v、社群w均没有连接 \Delta Q_{uk}=\begin {cases} \Delta Q_{vk}+ \Delta Q_{wk},&社群k与社群v、社群w都有连接\\ \Delta Q_{vk}-2a_{w}a_{k}, &社群k只与社群v有连接\\ \Delta Q_{wk}-2a_{v}a_{k}, &社群k只与社群w有连接\\ 0, &社群k与社群v、社群w均没有连接\end{cases}ΔQuk=⎩⎪⎪⎪⎨⎪⎪⎪⎧ΔQvk+ΔQwk,ΔQvk−2awak,ΔQwk−2avak,0,社群k与社群v、社群w都有连接社群k只与社群v有连接社群k只与社群w有连接社群k与社群v、社群w均没有连接 根据上面提到的 ΔQ\ \Delta Q ΔQ推导过程,将 ΔQuk\ \Delta Q_{uk} ΔQuk展开即可得到该递推关系,这里就不进行详细推导了。
Fast Unfolding
Fast Unfolding算法与Fast Newman算法过程上非常相似,都是通过对 ΔQ\ \Delta Q ΔQ贪心求取最优化QQQ;不同之处在于Fast Unfolding算法在每次迭代中将所有为正的 ΔQ\ \Delta Q ΔQ都进行融合,而Fast Newman算法每次只选择最大 ΔQ\ \Delta Q ΔQ进行融合。具体流程如下
- 先将每个节点视为一个独立的社群,初始化eee和aaa,计算社群与其相邻社群融合的 ΔQvw\ \Delta Q_{vw} ΔQvw
- 判断ΔQvw\Delta Q_{vw}ΔQvw是否为正,若为正则融合这两个社群,否则不进行融合(计算顺序不影响融合)
- 更新eee和aaa,重新计算 ΔQvw\ \Delta Q_{vw} ΔQvw
- 重复步骤2和3,直到社群划分不再改变



1300

被折叠的 条评论
为什么被折叠?



