LPA:标签传播算法 label propagation algorithm
秒懂
简要介绍
- LPA算法是一种非常简单的社区发现算法
- 在算法开始之前为每个节点打上不同的标签,每一个轮次随机找到一个节点,查看其邻居节点的标签,找到出现次数最多的标签,随后将该节点改成该标签。
- 当相邻两次迭代后社区数量不变或社区内节点数量不变时则停止迭代
图解过程
- 初始化
- 一轮迭代:随机挑选一个节点(如c),发现其相邻节点有abe,三者出现次数相同,故随机选一个(如a)
- 又一轮迭代:随机挑选一个节点(如b),发现其相邻节点均为a,故将b换成a,重复数次,最终的结果如图所示
时间复杂度
由于每次只需要更新一个节点,故复杂度为O(m)
算法优劣
- 优势:
- 思想简单,实现容易,时间复杂度低
- 劣势:
- 随机选取节点,导致算法收敛后的结果不稳定
- 没有考虑到迭代过程中社区的偏移情况,例如上文初始图中如果按照badcefghi的顺序迭代,甚至有可能最终收敛时所有节点都在一个社区。
- 不适用于重叠社区算法
拓展
- 为了解决LPA算法的不足,诞生了下列几种算法
HANP算法(Hop Attenuation & Node Preference)
- 为每条路径指定一个传播系数δ,每轮迭代时计算不同标签的传播能力,例如在a–b-----c中,由于ab之间的距离比bc更短,则δab>δbc,也就是说在为b确定标签时,更倾向于a。
- 当δ为0时,阻止该路径上的传播
- 除了δ之外,还综合考虑了标签出现次数、节点的度等因素
SLPA算法(speaker-listener label propagation)
- 新增参数ρ,用于划分重叠社区。ρ=1时算法退化成非重叠社区算法。
- 记录每个节点的历史迭代标签,若节点X的历史迭代标签为[a,b,c,a,a,b,b,a,a,b],当ρ=1时,尽管最后一轮迭代标签是b,由于a出现的次数比b多,最终确定的标签还是a。当ρ=2时,X将被划分在ab两个社区。
BMLPA算法(平衡多标签传播balance multi-label propagation)
- 核心是平衡,同时也是个可重叠社区算法。
- 新增参数p,当节点被分到A社区的概率小于p时,算法将直接认定该节点不会被分到A社区。
- 在每一个节点内部维护一个标签的概率分布,例如节点a(A:1/2;B:1/2)、b(A:1/2;B:1/6;C:1/3)、c(C:1) ,也就是说a节点被分配到AB两个社区的概率均为50%,bc节点类似。
- 现在假设d节点与abc相邻,那么首先我们需要给d节点计算分配到ABC三个社区的概率加和
- A=1/2+1/2=1
- B=1/2+1/6=2/3
- C=1+1/3=4/3
- 显然C的值最大,将4/3作为分母进行归一化
- A=3/4 ,B=1/2,C=1 ,设置阈值p=0.6,则舍弃B保留A和C
- 再一次把A和C进行直接归一化,得到A=3/7,C=4/7,所以当前点X的标签是d(A:3/7;C:4/7)
DCLP算法(距离控制标签传播distance control label propagation)
- 由HANP简化而来,每次只考虑标签传播过程中的衰减因素,使用距离dis_allowed代替δ,通过该参数可以有效控制标签的传播范围。
- 例如当dis_allowed=2时,表示每个标签只允许被传递两次,即在a–a--a–b--c中,b节点只能选择和c同一个社区。
AM-DCLP算法(adaptive multi-DCLP)
- 对原图进行DCLP算法运算,但得到的某些社区规模较大时,则将它们对应的子图再继续执行DCLP算法。
- 新增maxC-allowed、break_down_allowed两个参数
- maxC-allowed表示允许的最大社区大小,当有社区大小超过其值时,需要对子图执行DCLP
- break_down_allowed表示允许的最大递归次数,也就是说不能无限制的对子图执行DCLP(对子图的子图进行DCLP…)
SDCLP算法
- 每次DCLP算法迭代后,对所有的社区进行检测,若社区的规模足够大,则不允许该社区继续扩张,否则继续迭代。