社区检测算法
April 26, 2019
1 社区检测
先来说说什么是社区发现吧,学术上的说法是:一个社区由一组连接紧密的结点组成,
同时这些结点与社区外部的结点连接稀疏,如下图所示。那么,社区发现就是在复杂网络中
发现这些连接紧密的社区结构。其实,我个人觉得,社区发现就是网络中的节点聚类
社区检测算法总结
2 社区检测与聚类的区别
社团检测通常是指将网络中联系紧密的部分找出来,这些部分就称之为社团,那么也可
以认为社团内部联系稠密,而社团之间联系稀疏 。显而易见,其中有一个非常重要的点,
稠密是如何定义的。不管现在想到的定义是什么,但都包含顶点,边,度,或许还有路径这
些字眼,它们有一个共同的特征–网络的结构。所以,社团检测侧重于找到网络中联系紧密
的部分,而经常忽略节点的属性(attributes)。
聚类,顾名思义是将属于同一类的目标聚在一起,通常在聚类之前我们是不知道目标
有哪些类型,这也是一种典型的无监督学习方法。那么现在来想想我们熟知的聚类方法:kmeans,层次聚类等。其中,最核心的一个部分是计算两个目标之间的距离(或者称为相似
度),距离近则它俩是一类,距离远,那就自成一派,或者去找其它距离近的。当然,距离
近只是其中一种方法,还有距离远或者怎么样,就看自己的判断。判断标准不是讨论的重点,
重点是如何计算距离。欧式距离,曼哈顿距离,余弦相似度等,都是直接用目标特征构成的
向量来计算的,没有考虑目标的边,度。所以,聚类侧重于找到一堆属性相似的目标,从而
忽略了目标与目标之间的联系。
两者之间的关系已经很清楚啦,社团检测和聚类存在区别,但是呢,两者又是可以结合
起来的。比如,我们现在有一个网络,只知道顶点和边的情况,顶点的属性是未知的。那么在
做社团检测的时候,可以将顶点与顶点之间的关系构成一个邻接矩阵,通过一系列变化或者
就这个邻接矩阵而言,将每个行看作一个属性,每个列看作目标,就可以很轻松的转为聚类,
用聚类的方法求解。当邻接矩阵高维时,还可以先做降维处理。所以,两者并没有完全独立,
只是考虑的角度不同,可以结合使用。现在社交网络方向有一个很热门的就是用 attributes
来辅助进行社团检测,是对传统的社团检测和聚类方法的一种改进,两者优势互补。
3 图划分
图划分主要是一分为二的划分方法,代表算法是:K-L 算法和谱二分法
3.1 K-L 算法
3.2 谱二分法
3.3 GN 算法(2002 年)
由定义可知,如果一条边连接两个社区,那么这两个社团节点之间的最短路径通过该边
的次数就会最多,相应的边介数最大。如果删除该边,那么两个社团就会分割开。GN 算就
就是基于此思想反复计算当前网络的最短路径,计算每条边的边介数,删除边介数最大的边。
最后在一定条件下,算法停止,即可得到网络的社区结构。
社区检测算法总结
GN 算法的执行流程。1. 使用最短路径算法求在图 1.a 上求出顶点 1 到顶点 8 的最短路
径(图中红色部分)。2. 反复调用步骤 1,探测网络所有顶点之间的最短路径,统计出所有边
的边介数,如图 1.b 所示。3. 统计出最大边介数,然后删除,得到如图 1.c 所示的社区结构。
4. 重新计算网络中剩下的边的边阶数;5. 重复 1.2.3.4 步骤,直到网络中的任一顶点作为一
个社区为止。GN 算法的缺陷:(1)不知道最后会有多少个社区;(2)在计算边介数的时
候可能会有很对重复计算最短路径的情况,时间复杂度太高;(3)GN 算法不能判断算法终
止位置。为了解决这些问题,Newman 引入了模块度 Q 的概念,它用来一个评价社区结构
划分的质量。网络中的社区结构之间的边数并不是绝对数量上的少,而是应该比期望的边数
要少。
社区检测算法总结
3.4 Newman 快速算法(2003 年)
Modularity(模块度), 这个概念是 2003 年一个叫 Newman 的人提出的。这个人先后发
表了很多关于社区划分的论文,包括 2002 年发表的著名的 Girvan-Newman(G-N) 算法,和
2004 发表的 Fast Newman(F-B) 算法,Modularity 就是 F-B 算法中提出的(03 年提出的概
念,04 年确认发表)。 在 2006 年的时候 Newman 重新定义了 Modularity,实际上只是
对原来的公式做了变换,使其适用于 Spectral Optimization Algorithms。 早期的算法不
能够很好的确认什么样的社区划分是最优的。Modularity 这个概念就是为了定义一个对于
社区划分结果优劣的评判。
社区检测算法总结
社区检测算法总结

模度块参考https://blog.csdn.net/marywbrown/article/details/62059231
GN 算法通过模块度可以准确的划分网络,但它只适用于中小型规模的网络。Newman 提出
一种基于贪心的快速社区发现算法,算法的基本思想是:首先将网络中的每个顶点设为一个
单独社区,然后选出使得模块度 Q 的增值最大的社区对进行如果网络中的顶点属于
同一个社区,则停止合并过程。整个过程是自底向上的过程,且这个过程最终得到一个树图,
即树的叶子节点表示网络中的顶点,树的每一层切分对应着网络的某个具体划分,从树图的
所有层次划分中选择模块度值最大的划分作为网络的有效划分。
社区检测算法总结
3.5 FastUnfolding 算法
3.6 CPM(Cluster Percolation method)派系过滤算法
k-团渗透算法 (CPM) 是第一个能够发现重叠社区的算法,重叠社区指的是结点可以同
时属于多个社区。重叠社区在社交网络中是十分常见的,因为每个人都有着多种多样的社交
关系。
社区检测算法总结
社区检测算法总结
社区检测算法总结
由于 k 是个输入参数值,从而 k 的取值将会影响 CMP 算法的最终社区发现结果,当 k 取
值越小社区将会越大,且社区结构为稀疏。但是实验证明 k 的取值影响不是很大,一般 k 值
为 4 到 6。然而,由于该算法是基于完全子图,因此 CPM 比较适用于完全子图比较多的网
络,即边密集的网络,对于稀疏网络效率将会很低,且该算法还无法分配完全子图外的顶点。
CPM 的效率取决于寻找所有极大完全子图的效率,尽管寻找所有极大完全子图是 NP 完全
问题,但在真实网络上是非常快的。如何寻找极大完全子图?
极大完全子图是不能在扩展的,那么首先随机选取种子节点,然后在种子节点周围扩展
成完全子图,如果这个完全子图不能再被扩展,那么我们就找到了极大完全子图。但是这种
方式可能会将同一个极大完全子图产生多次。
下面给出寻找某个点 a 极大完全子图 Q 的算法,主要思想是如果 x 是在 Q 里,那么它
一定是 a 的邻居。
3.7 NMF
非负矩阵分解 NMF(Non-negative Matrix Factorization) 是一种矩阵分解的方法,在图
像分析、文本聚类、数据挖掘、语音处理等方面得到了广泛应用。
定义:给定非负矩阵 V(m * n) 及正整数 k < minm, n,找到非负矩阵 W(m * k) 和 H(k

  • n), 使得有 V = WH +θ, 其中 θ 为噪声,WH 为 V 的非负矩阵分解。通过矩阵分解,将矩
    阵的维数进行降低,对大量的数据进行压缩
    社区检测算法总结
    3.8 Kernighan-Lin 算法
    Kernighan-Lin 算法是一种试探优化法 [4]。它是一种利用贪婪算法将复杂网络划分为两
    个社团的二分法。该算法引入增益值 P,并将 P 定义两个社团内部的边数减去连接两个社
    团之间的边数,然后再寻找使 P 值最大的划分方法。整个算法可描述如下:
    首先,将网络中的节点随机地划分为已知大小的两个社团。在此基础上,考虑所有可能
    的节点对,其中每个节点对的节点分别来自两个社团。对每个节点对,计算如果交换这两个
    节点可能得到的 P 的增益 ΔP=P 交换后-P 交换前,然后交换最大的 ΔP 对应的节点对,同
    时记录交换以后的 P 值。规定每个节点只能交换一次。重复这个交换过程,直到某个社团内
    所有的节点都被交换一次为止。需要注意的是,在节点对交换的过程中,P 值并不一定是单
    调增加的。不过,即使某一步的交换会使 P 值有所下降,仍然可能在其后的步骤中出现一个
    更大的 P 值。当交换完毕后,便找到上述交换过程中所记录的最大的 P 值。这时对应的社
    团结构就认为是该网络实际的社团结构。
    (2) 基于 Laplace 图特征值的谱二分法
    该算法利用网络结构的 Laplace 矩阵中不为零的特征值所对应的特征向量和同一个社区
    13
    内的节点对应的元素近似值相等的原理对网络社区进行划分。该算法过程如下:
    设图 G 是一个具有 n 个节点的无向图,G 的 Laplace 矩阵 L 是一个 n×n 的对称矩阵。
    L 的对角线元素 Lii 是节点 i 的度,非对角线元素 Lij 表示节点 i 和节点 j 的连接关系,当
    节点 i 和节点 j 之间有边连接时, 则 Lij = -1, 否则为 Lij = 0。容易验证,L 的每一行的和以
    及每一列的和均为 0,因而,向量 I=(1,1,l……1)’ 是 L 相应于特征值 0 的特征向量。
    如果图 G 可以被分解成 g 个互不重叠、互不相连的子图 Gk,则其 Laplace 矩阵 L 就是
    一个分成 g 块的对角矩阵块,每个对角矩阵块就是相应的分支子图的 Laplace 矩阵。显然,
    此时 L 存在 g 个与特征值 0 对应的特征向量 v(k),k=1,2„gGN 算法,当节点 i 属于该社团
    时,vi(k)=1,否则 vi(k)=0。
    如果图 G 可以被分解成 g 个子图,但子图之间存在少量连接时,其相应的 Laplace 矩
    阵 L 就不再是一个分成 g 块的对角阵。此时,对应 0 这个特征值就只有一个特征向量 I。但
    是,在 0 的附近还有 g-1 个比零稍大的特征值,并且这 g-1 个特征值相应的特征向量可以近
    似地看成上述特征向量 v(k) 的线性组合。因此,从理论上来说,只要找到 Laplace 矩阵中
    比零稍大的那些特征值,并且对其特征向量进行线性组合,就可以近似的得到这些子图 [5]。
    考虑一个例子,即将图 G 分割成 2 个子图。由于对称矩阵的任意两个 2 个特征值所对
    应的特征向量相互正交,因此 Laplace 矩阵 L 的任意对应于非零特征值的特征向量均正交于
    向量 I=(1,1,l……1)’,从而所有非零特征值的特征向量必须具有正分量和负分量。如果图 G
    可以分解为 2 个子图使得这 2 个子图之间仅存在很少的连接,则必存在一个特征向量,其特
    征值近似于 0;该特征向量的正分量对应于一个子图,负分量对应于另一个子图。因此,可
    以通过观察最小非零特征值所对应的特征向量,根据特征值元素的正负将一个网络分解成 2
    个社区,该方法称为谱二分法 [6-7] 期刊网。
    14
    3.9 LPA
    社区检测算法总结社区检测算法总结
    3.10 COPRA 算法
    LPA 算法虽然有很多优势,但无法发现重叠社区结构。对此,基于 LPA 算法,引入了
    新的标签结构 (c,b),其中,c 表示社区标识符,b表示节点x在社区 c 中的从属系数,且0
    b 1。顶点 x 的所有从属系数之和等于 1,通过 bt(c,b) 表示迭代次数 t 时的顶点 x 对
    于社区 c 的从属系数,N(x) 表示顶点 x 的邻接顶点集。
    社区检测算法总结
    3.11 LFM 算法
    LFM 算法主要由两个步骤构成:选取种子和拓展种子。
    它随机地选择一个还没有被分配社区的结点作为种子,通过优化 fitness 函数的方法拓
    展它以形成一个社区。
    根据适应度函数判断子社团的邻居节点是否可以加入到当前社团当中。
    迭代这两步直到所有结点都属于至少一个社区为止。

3.12 leaderrank 算法
3.13 K-Shell 算法
K-shell 方法递归地剥离网络中度数小于或等于 k 的节点, 具体划分过程如下: 假设网络
中不存在度数为 0 的孤立节点。从度指标的角度分析, 度数为 1 的节点是网络中最不重要的
节点, 因此首先将度数为 1 的节点及其连边从网络中删除。删除操作进行之后的网络中会出
现新的度数为 1 的节点, 接着将这些新出现的度数为 1 的节点及其连边删除。重复上述操作,
直到网络中不再新出现度数为 1 的节点为止。此时所有被删除的节点构成第一层, 即 1-shell,
节点的 Ks 值等于 1。剩下的网络中, 每个节点的度数至少为 2。继续重复上述删除操作, 得
到 Ks 值等于 2 的第二层, 即 2-shell。依此类推, 直到网络中所有的节点都被赋予 Ks 值。
19
3.14 Louvain 算法
https://www.jianshu.com/p/4ebe42dfa8ec https://www.cnblogs.com/fengfenggirl/
p/louvain.html Louvain 算法
   Louvain 算法的思想很简单:
   1)将图中的每个节点看成一个独立的社区,次数社区的数目与节点个数相同;
   2)对每个节点 i,依次尝试把节点 i 分配到其每个邻居节点所在的社区,计算分配
前与分配后的模块度变化 ΔQ,并记录 ΔQ 最大的那个邻居节点,如果 maxΔQ>0,则把节
点 i 分配 ΔQ 最大的那个邻居节点所在的社区,否则保持不变;
   3)重复 2),直到所有节点的所属社区不再变化;
   4)对图进行压缩,将所有在同一个社区的节点压缩成一个新节点,社区内节点之
间的边的权重转化为新节点的环的权重,社区间的边权重转化为新节点间的边权重;
   5)重复 1)直到整个图的模块度不再发生变化。

由于 k 是个输入参数值,从而 k 的取值将会影响 CMP 算法的最终社区发现结果,当 k 取
值越小社区将会越大,且社区结构为稀疏。但是实验证明 k 的取值影响不是很大,一般 k 值
为 4 到 6。然而,由于该算法是基于完全子图,因此 CPM 比较适用于完全子图比较多的网
络,即边密集的网络,对于稀疏网络效率将会很低,且该算法还无法分配完全子图外的顶点。
CPM 的效率取决于寻找所有极大完全子图的效率,尽管寻找所有极大完全子图是 NP 完全
问题,但在真实网络上是非常快的。如何寻找极大完全子图?
极大完全子图是不能在扩展的,那么首先随机选取种子节点,然后在种子节点周围扩展
成完全子图,如果这个完全子图不能再被扩展,那么我们就找到了极大完全子图。但是这种
方式可能会将同一个极大完全子图产生多次。
下面给出寻找某个点 a 极大完全子图 Q 的算法,主要思想是如果 x 是在 Q 里,那么它
一定是 a 的邻居。
3.16 OCDDP(An Overlapping Community Detection Algorithm Based
on Density Peaks)
3.17 SCAN 算法(A Structural Clustering Algorithm for Networks)
特点:(1)检测离群点和 hub 点(2)时间快
缺点(1)不能识别动态网络(2)不能识别
重叠社区(3)需要设置两个参数、对于每个未分配社团的节点 v ,检查 vv 是否是核节点,
是核节点则将其直接可达节点分配到一个社团中(社团标号记为该节点),并将其 邻居放
进队列中,重复进行 1 步骤(类似于对直接可达节点进行 DFS)。2、若 v 不是核节点则将
其标志为 non-member。3、最后检查所有的 non-menber 节点,若其相邻节点存在于两个及
以上的社团中,则将其标为 hub 节点,否则标为 outlier

相关文章: