社区发现(Community Detection)

转载自:https://blog.csdn.net/itplus/article/details/9286905

Community Detection

社区发现(Community Detection)算法用来发现网络中的社区结构,也可以视为一种广义的聚类算法

研究背景

复杂网络是复制系统的抽象,现实中许多复杂系统都可以用复杂网络的相关特性进行描述和分析。

网络中的节点表示系统中的个体,边表示个体之间的关系。

例如:

  • 社会关系网络
  • 食物链
  • 万维网

对复杂网络的研究一直是许多领域的研究热点,其中社区结构是复杂网络中的一个普遍特征,整个网络是由许多个社区组成的。

社区发现(community detection)是一个复杂而有意义的过程,它对研究复杂网络的特性具有重要作用。近几年,发现及分析复杂网络中的社区结构得到了许多学者的关注,同时也出现了很多社区发现算法。

什么是社区?

社区是一个比较含糊的概念,只给出了一个定性的刻画。

A commuity is a subgraph containing nodes which are more densely linked to each other than to the rest of the graph or equivalently, a graph has a community structure if the number of links into any subgraph is higer than the number of links between those subgraphs.

社区是一个子图,它包含比图的其余部分或更紧密地彼此紧密链接的节点,如果进入任何子图的链接数大于这些子图之间的链接数,则图具有社区结构。

需要注意的是,社区是一个子图,包含顶点和边。

数学描述

设图\(G = G(V,E)\),所谓社区发现是值在图G中确定\(nc (\ge 1)\)个社区

\[c = \{C_1,C_2,...,C_{nc}\} \]

使得各社区的顶点几何构成V的一个覆盖。

若任意两个社区的顶点几何的交集均为空,则称\(C\)为非重叠社区,否则称为重叠社区。

image-20200924164142876

重叠社区:

image-20200924164256840

建模方法

以新浪微博用户对应的网络图为例,来介绍相应的社区发现算法。

微博环境中的可用信息:

  • 微博内容
  • 地理位置
  • 毕业院校
  • 标签
  • 关注、粉丝

image-20200924164356902

基本假设:

如果两个微博用户之间的互动越频繁,那么他们之间的社交关系就越密切,而密切的社交关系往往蕴含着潜在的兴趣关联或较强的线下社交关系。

生成网络图:

  • 用户当节点
  • 相互关注的用户之间建立边

这里在相互关注的用户之间建立连接关系,主要是为了简化模型,此时对应的图为无向图。

当然,我们也可以采用单向关注来建边,此时将对应有向图。

算法介绍

已有算法

image-20200924164652755

质量评估

不同的社区发现算法将得到不同的社区分划结果。

modularity

对于无向图,Newman和Girvan于2004年提出了modularity的概念。

所谓modularity是指网络中连接社区结构内部顶点的边所占的比例与另外一个随机网络中连接社区结构内部顶点的边所占比例的期望值相减得到的差值。

这个定义看起来很拗口,但通过层层推导,可以得到如下的数学表达式。定义中的随机网络也称为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.

到目前为止,所使用的空模型是一个随机图,其具有与原始图相同的节点数,相同的边数和相同的度数分布,但是节点之间的链接是随机放置的。

计算公式:

\[Q = \sum\limits_{c\in c}(\frac{l_c}{m} - (\frac{D_c}{2m})^2) \]

  • \(m\):图中总边数

  • \(l_c\):社区c中所有内部边的条数

  • \(D_c\):社区c中所有顶点的度之和,也可写成

    \[D_c = 2l_c + O_c \]

    其中\(O_c\)是社区c与其他社区之间的边。

对于重叠型社区划分,也可定义相应的modularity。

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

LPA

LPA(Label Propagation Algorithm)由Usha Nandini Raghavan等人于2007年提出。算法描述如下:

  • 用不同的标签初始化节点,例如:\(\forall n \in V: c_n = l_n\).
  • 将每个节点的标签设置为其大多数邻居共享的标签,例如:\(\forall n \in V:c_n = \mathop{argmax}\limits_k \sum\limits_{m\in N^k_n}\delta_{nm}\).
  • 如果未收敛,则继续执行上一步.

标签传播算法(LPA)的做法比较简单:

第一步: 为所有节点指定一个唯一的标签;

第二步: 逐轮刷新所有节点的标签,直到达到收敛要求为止。

对于每一轮刷新,节点标签刷新的规则如下:

对于某一个节点,考察其所有邻居节点的标签,并进行统计,将出现个数最多的那个标签赋给当前节点。当个数最多的标签不唯一时,随机选一个。

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

具体LPA内容可见 链接

SLPA

SLPA(Speaker-listener Label Propagation Algorithm)由 JieruiXie 等人于 2011年提出。

SLPA是一种重叠型社区发现算法,其中涉及一个重要阈值参数r,通过r的适当选取,可将其退化为非重叠型。

image-20200924171530685

SLPA 中引入了 ListenerSpeaker 两个比较形象的概念,可以这么来理解:在刷新节点标签的过程中,任意选取一个节点作为 listener,则其所有邻居节点就是它的 speaker 了,speaker 通常不止一个,一大群 speaker 在七嘴八舌时,listener 到底该听谁的呢?这时我们就需要制定一个规则。

在 LPA 中,我们以出现次数最多的标签来做决断,其实这就是一种规则。只不过在 SLPA 框架里,规则的选取比较多罢了(可以由用户指定)。

当然,与 LPA 相比,SLPA 最大的特点在于:它会记录每一个节点在刷新迭代过程中的历史标签序列(例如迭代 T 次,则每个节点将保存一个长度为 T 的序列,如上图所示),当迭代停止后,对每一个节点历史标签序列中各(互异)标签出现的频率做统计,按照某一给定的阀值过滤掉那些出现频率小的标签,剩下的即为该节点的标签(通常有多个)。

HANP

HANP(Hop Attenuation & Node Preference)算法由lan X.Y. Leung等人于2009年提出的,基本思想是:

  1. 为各标签引入score值来刻画其传播能力,传播能力随着传播距离的增大而减弱。
  2. 一个节点从其邻居接收标签时,综合考虑各标签的传播能力、出现频率、度(对于带权图还可以考虑权)等因素。

接收标签规则:

\[c_n = \mathop{argmax}\limits_{l}\sum\limits_{i\in N_n^l} s_if_i^\alpha w_{ni} \]

score衰减规则:

\[s_n = (\mathop{max}\limits_{i \in N_n^{c_n}}s_i) - \delta \]

其中\(\delta\)为衰减因子,当score的值小于等于0时,标签停止传播。

BMLPA

BMLPA(Balanced Multi-Label Propagation Algorithm)由武志昊等人于2012年提出,其基本思想为:

对每个节点所能归属的community个数不作限制,只要求同一节点的标签具有平衡的归属系数。

image-20200924174144488

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

​ 经过上述四步,列表中的标签即确定为带问号节点的标签。

其他的算法以后再整理。

posted @ 2020-09-28 11:15  码我疯狂的码  阅读(2004)  评论(0编辑  收藏  举报