问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

社区发现算法详解:原理、实现及实验结果

创作时间:
作者:
@小白创作中心

社区发现算法详解:原理、实现及实验结果

引用
CSDN
1.
https://blog.csdn.net/itplus/article/details/9286905

社区发现(Community Detection)算法用来发现网络中的社区结构,也可以视为一种广义的聚类算法。本文将详细介绍社区发现算法的基本概念、原理和具体实现方法。

社区发现算法概述

社区发现算法用于识别网络中的社区结构,可以看作是一种广义的聚类算法。社区是一个比较模糊的概念,通常只给出定性的描述。社区是一个子图,包含顶点和边。

新浪微博用户网络图示例

以新浪微博用户对应的网络图为例,介绍社区发现算法。在相互关注的用户之间建立连接关系,可以简化模型,此时对应的图为无向图。当然,也可以采用单向关注来建边,此时将对应有向图。

数学表达式

通过层层推导,可以得到如下(4.2)的数学表达式。定义中的随机网络也称为Null Model,其构造方法为:the null model used has so far been a random graph with the same number of nodes, the same number of edges and the same degree distribution as in the original graph, but with links among nodes randomly placed。

注意,(4.2) 是针对无向图的,因此这里的 m 表示无向边的条数,即若节点 i 和节点 j 有边相连,则节点 (i, j) 对 m 只贡献一条边。

标签传播算法(LPA)

LPA的做法比较简单:

  1. 为所有节点指定一个唯一的标签;
  2. 逐轮刷新所有节点的标签,直到达到收敛要求为止。对于每一轮刷新,节点标签刷新的规则如下:
  • 对于某一个节点,考察其所有邻居节点的标签,并进行统计,将出现个数最多的那个标签赋给当前节点。当个数最多的标签不唯一时,随机选一个。

注:算法中的记号 N_n^k 表示节点 n 的邻居中标签为 k 的所有节点构成的集合。

SLPA算法

SLPA中引入了Listener和Speaker两个概念。在刷新节点标签的过程中,任意选取一个节点作为listener,则其所有邻居节点就是它的speaker了。在LPA中,我们以出现次数最多的标签来做决断,其实这就是一种规则。只不过在SLPA框架里,规则的选取比较多罢了(可以由用户指定)。

SLPA最大的特点在于:它会记录每一个节点在刷新迭代过程中的历史标签序列。当迭代停止后,对每一个节点历史标签序列中各(互异)标签出现的频率做统计,按照某一给定的阀值过滤掉那些出现频率小的标签,剩下的即为该节点的标签(通常有多个)。

Speaker-Listener Label Propagation Algorithm (SLLPA)

这里对上面的图做个简单介绍:带问号的节点是待确定标签的节点,黑色实心点为其邻居节点,它们的标签是已知的,注意标签均是由二元数对的序列构成的,序列中每一个元素的第一个分量表示其标签,第二个分量表示该节点属于该标签对应社区的可能性(或者说概率,叫做 belonging coefficent),因此对于每个节点,其概率之和等于 1。

我们按照以下步骤来确定带问号节点的标签:

  1. 获取邻居节点中所有的互异(distinct) 标签列表,并累加相应的 belonging coefficent 值。
  2. 对 belonging coefficent 值列表做归一化,即将列表中每个标签的 belonging coefficent 值除以 C1 (C1 为列表中 belonging coefficent 值的最大值)。
  3. 过滤。若列表中归一化后的 belonging coefficent 值(已经介于 0,1 之间)小于某一阀值 p (事先指定的参数),则将对应的二元组从列表中删除。
  4. 再一次做归一化。由于过滤后,剩余列表中的各 belonging coefficent 值之和不一定等于 1,因此,需要将每个 belonging coefficent 值除以 C2 (C2 表示各 belonging coefficent 值之和)。
    经过上述四步,列表中的标签即确定为带问号节点的标签。

Fast Unfolding算法

这里,我们对Fast Unfolding算法做一个简要介绍,它分为以下两个阶段:

  1. 首先将每个节点指定到唯一的一个社区,然后按顺序将节点在这些社区间进行移动。怎么移动呢?以上图中的节点i为例,它有三个邻居节点j1, j2, j3,我们分别尝试将节点i移动到j1, j2, j3所在的社区,并计算相应的modularity变化值,哪个变化值最大就将节点i移动到相应的社区中去(当然,这里我们要求最大的modularity变化值要为正,如果变化值均为负,则节点i保持不动)。按照这个方法反复迭代,直到网络中任何节点的移动都不能再改善总的modularity值为止。
  2. 将第一个阶段得到的社区视为新的“节点”(一个社区对应一个),重新构造子图,两个新“节点”之间边的权值为相应两个社区之间各边的权值的总和。

我们将上述两个阶段合起来称为一个pass,显然,这个pass可以继续下去。

从上述描述我们可以看出,这种算法包含了一种hierarchy结构,正如对一个学校的所有初中生进行聚合一样,首先我们可以将他们按照班级来聚合,进一步还可以在此基础上按照年级来聚合,两次聚合都可以看做是一个社区发现结果,就看你想要聚合到什么层次与程度。

DCLP算法

DCLP算法是LPA的一个变种,它引入了一个参数来限制每一个标签的传播范围,这样可有效控制Monster(非常大的community,远大于其他community)的产生。

实验结果

对比上述两个表格可知:SDCLP算法得到的top 5社区更为均匀。


总结

本文详细介绍了社区发现算法的基本概念、原理和具体实现方法。虽然文章发布于2013年,但社区发现算法的基本原理和方法仍然具有参考价值。需要注意的是,一些算法和工具可能已经过时,读者在实际应用时需要结合最新的研究进展和工具进行选择。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号