社区发现community detection(CS224W)

Community的定义

Communities社区:Sets of nodes with lots of internal connections and few external ones (to the rest of the network)。社区内的点连接很紧密(strong ties,high ovelap),而与该社区外的点连接不紧密。
为了衡量网络被划分为社区后的好坏程度,定义Modularity Q
假设将网络G划分为多个不相交的groups $s \in S$,
$$\begin{equation}Q\propto\sum_{s\in S}[(\# edges\quad within\quad group \quad s)-(expected\#edges\quad within\quad group \quad s)]\tag{1}\end{equation}$$
对于式(1)的第一部分,可以直接根据real network G得到。而第二项则需要用到a null model。即构建与原图G具有相同度序列的随即图$G^{'}$,但是图$G^{'}$的边是随机连接的。假设原图G有n个顶点和m条边,则图$G^{'}$中从顶点i到顶点j的边的期望为$\frac{k_i k_j}{2m}$(注意$\sum_{i=1}^nk_i=2m$)。
对于图$G$,将其划分为多个社区$S$后,Modularity Q的计算方式为,
$$\begin{equation}Q(G,S)=\frac{1}{2m}\sum_{s\in S}\sum_{i\in s}\sum_{j\in s}(A_{i,j}-\frac{k_ik_j}{2m})\tag{2}\end{equation}$$
其中,A为邻接矩阵,Q的范围为[-1,1],Q值越大,则说明划分的community越好。
式(2)可写为,
$$\begin{equation}Q(G,S)=\frac{1}{2m}\sum_{i,j}(A_{i,j}-\frac{k_i k_j}{2m})\delta(c_i,c_j)\tag{3}\end{equation}$$
其中,A为图G的邻接矩阵,$k_i$为顶点i的度,$c_i$表示顶点i所属的community,$\delta()$为indicator function。

社区发现Community detection

Louvain算法

Louvain是一种社区发现算法,原论文为《Fast unfolding of communities in large networks》。Louvain算法支持加权图(weighted graph),能够提供层次的社区结构,且运行时间短,收敛速度快,扩展性好,适用于大图的社区发现。
Louvain算法是一种贪心算法,通过不断的极大化modularity,最终输出最好的community。Lonvain算法分为两个phase,

Phase 1:local changes to optimize modularity

在最开始,每个顶点都被看作是一个独立的社区,社区内的连边权重为0。
对每一个顶点i,
1.计算将顶点i移动到其邻居j所在的社区后,modularity的变化$\Delta Q$,只考虑其邻居顶点的community,是因为顶点i与community之间必须要有边,否则没有意义;
2.根据1的计算结果,选择增益最大的$\Delta Q$,移动顶点i
重复执行,直到移动任何一个顶点i,都不能获得modularity的增益。
将顶点i(顶点i为一个单独的community)移入community C,$\Delta Q(i\rightarrow C)$的计算方式为,
$$\begin{equation}\Delta(i\rightarrow C)=[\frac{\sum_{in}+k_{i,in}}{2m}-(\frac{\sum_{tot}+k_i}{2m})^2]-[\frac{\sum_{in}}{2m}-(\frac{\sum_{tot}}{2m})^2-[0-(\frac{k_i}{2m})^2]\tag{4}\end{equation}$$
其中,$\sum_{in}$表示community C中,所有的顶点之间的边权值和;$\sum_{tot}$表示community C中,所有顶点的边权之和;$k_{i,in}$表示顶点i和community C之间,所有的边权(degree)之和;$k_i$表示顶点i的所有边权之和(degree)。注意$\sum_{in}$和$\sum_{tot}$的区别。如下图,$\sum_{in}$为$(b+d+e)$,$\sum_{tot}$为$(a+b+d)+(b+c+e)+(d+e+f)$。
in_tot.png

式(4)的第一项为将i移动到community C后,community C的Q,第二项为未移入顶点i时,C的Q,第三项为顶点i作为单独的community时的Q。

最终的$\Delta Q$为将i加入community C的增益与将i移除community D(顶点i所在的community)的增益之和。
$$\begin{equation}\begin{aligned}\Delta Q&=\Delta Q(i\rightarrow C)+\Delta Q(D\rightarrow i)\\&=[\frac{\sum_{in,C}+k_{i,in,C}}{2m}-(\frac{\sum_{tot,C}+k_i}{2m})^2]-[\frac{\sum_{in,C}}{2m}-(\frac{\sum_{tot,C}}{2m})^2-[0-(\frac{k_i}{2m})^2]\\&+[\frac{\sum_{in,D}+k_{i,in,D}}{2m}-(\frac{\sum_{tot,D}+k_i}{2m})^2]-[\frac{\sum_{in,D}}{2m}-(\frac{\sum_{tot,D}}{2m})^2-[0-(\frac{k_i}{2m})^2]\\&=\frac{1}{2m}[(k_{i,in,C}-\frac{\sum_{tot,C}k_i}{m})-(k_{i,in,D}-\frac{\sum_{tot,D}k_i}{m})]\end{aligned}\tag{5}\end{equation}$$

Phase 2:aggregate identified commuties into supper nodes

将每一个已经被划分出的社区,聚合成一个super node,构成新的图。构成的新图需满足如下两点,

  1. 如果communities之间有边连接,则其对应的super nodes有边连接;
  2. super nodes的边权为其对应的communities之间的边权之和(每一个super node具有self-edge weight,为$\sum_{in}$)

重复Phase 1和Phase 2的过程,直到modularity不再增加。

实际中往往不需要迭代到每一个顶点都不发生变化,当满足整个图中有一定比例的顶点不再发生变化就退出。
Louvain算法的完整流程为,
Louvain示意图.png

overlap

有的时候,图中的顶点并不会只属于一个community,例如在现实生活中,一个人可以加入多个社团。这时社区与社区之间就会出现重叠(overlap)现象。overlap指的是同一个顶点属于多个community。
Louvain算法无法解决重叠社区的检测问题。

AGM

AGM算法可以用来解决重叠社区的检测问题,原论文《Community-Affiliation Graph Model for Overlapping Network Community Detection》
核心思想是,根据一个affiliation graph $B(V,C,M)$,生成图$G^{'}$,使得$G^{'}$与真实的图$G$越相似越好。如下图所示,图中的左侧为affiliation graph,右侧为生成的图$G^{'}$。
affiliation graph.png
其中,$V$表示顶点集合,与真实图$G$中的点对应;$C$表示划分的community集合;每一个community $c\in C$对应一个概率$p_c$,表示如果u和v都属于社区c,则u和v相连接的概率为$p_c$。$M$表示顶点与社区的关系,$M_u$表示顶点u所属的社区集合。因为存在overlap,顶点u和v可能同时属于多个community,所以u和v之间有边连接的概率为
$$\begin{equation}p(u,v)=1-\Pi_{c\in M_u \cap M_v}(1-p_c)\tag{6}\end{equation}$$
如果顶点u和v没有公共的community,则p(u,v)=0,使用极大似然估计时,连乘结果会为0。为了解决这一问题,论文中为每一个顶点都增加了一个community $\epsilon$,顶点u和顶点v间连边的概率至少为$p_{\epsilon}$。
通过极大似然估计求解$B$和$\{p_c\}$,$\arg\max_{B,\{p_c\}}L(B,\{p_c\})$,目标函数为
$$\begin{equation}L(B,\{p_c\})=\mathop\Pi\limits_{(u,v)\in E}p(u,v)\mathop{\Pi}\limits_{(u,v)\notin E}(1-p(u,v))\tag{7}\end{equation}$$
论文中,使用coordinate ascent strategy迭代地更新$B$和$\{p_c\}$。最开始,初始化affiliation graph $B$,需要借助于configuration graph。即根据原图$G$的度序列,生成一个随机图$G^{'}$,参考论文《A critical point for random graphs
with a given degree sequence》。
然后分两步优化参数。第一步,固定$B$更新$\{p_k\}$;第二步,固定$\{p_c\}$更新$B$。

BIGCLAM

BIGCLAM(Cluster Affiliation Model for Big Networks)算法可以用来解决重叠社区的检测问题,原论文为《Overlapping Community Detection at Scale: A Nonnegative Matrix Factorization Approach》
BIGCLAM对AGM进行了改进,是一种"relaxing" AGM。BIGCLAM不再规定顶点只能属于某些community,而不属于某些community。BIGCLAM引入了membership strength。$F_{u,A}$表示顶点u关于community $A$的embership strength,$F_{u,A}$越大,则表示u与社区A的联系越紧密(顶点u越可能属于社区A)。顶点u关于所有的community都会有一个权重用以衡量membership strength,构成的权重向量用$F_u$表示。
BIGCLAM定义顶点u和顶点v之间有边的概率为
$$\begin{equation}p(u,v)=1-exp(-F_u\cdot F_v^T)\tag{8}\end{equation}$$
可见,Prob. of nodes u,v linking is proportional to the strength of shared memberships
最小化目标函数,
$$\begin{equation}l(F)=\sum_{(u,v)\in E}log(1-exp(-F_u\cdot F_v^T))-\sum_{(u,v)\notin E}F_u\cdot F_v^T\tag{9}\end{equation}$$
最初时,初始化F,F必须是非负的。在更新$F_{u,C}$时,需要固定除u外的所有F。求解F的过程与非负矩阵分解(NMF)很相似。

参考

  1. Fast unfolding of communities in large networks
  2. Overlapping Community Detection at Scale: A Nonnegative Matrix Factorization Approach
  3. Community-Affiliation Graph Model for Overlapping Network Community Detection
  4. http://web.stanford.edu/class...

你可能感兴趣的:(图,机器学习)