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