LPA算法在GraphX中的实现

LPA:标签传播算法。

Label Propagation,是一种基于图的半监督学习算法(Semi-supervised learning),应用场景为:社区发现(Community detection)。传统意义上的社区指的是网络中的一组节点间具有较大的相似性,从而形成的一种内部连接紧密,而外部稀疏的群体结构,根据各社区节点有无交集,又可分为非重叠型社区和重叠型社区。对给定的网络图寻找其社区结构的过程称为“社区发现”。大体上看,社区发现的过程就是一种聚类的过程。

基本思想:

标签传播算法的应用场景是不重叠社区发现,其基本思想是:将一个节点的邻居节点的标签中数量最多的标签作为该节点自身的标签。给每个节点添加标签(label)以代表它所属的社区,并通过标签的“传播”形成同一标签的“社区”结构。简而言之,你的邻居属于哪个label最多,你就属于哪个label。该算法的有点是收敛周期短,除了迭代次数无需任何先验参数(不需事先指定社区个数和大小),算法执行过程中不需要计算任何社区指标。

时间复杂度:对顶点分配标签的复杂度为O(n),每次迭代时间为O( m),找出所有社区的复杂度为O (n +m),这是一次迭代的时间复杂度,非多次。标签传播算法的计算复杂度十分便宜,但是它不保证收敛,且迭代次数足够多之后,所有联通节点最终收敛为一个社区。

传播过程:

1)初始时,给每个节点一个唯一的标签;

2)每个节点使用其邻居节点的标签中最多的标签来更新自身的标签。

3)反复执行步骤2),直到每个节点的标签都不再发生变化为止。

一次迭代过程中一个节点标签的更新可以分为同步和异步两种。所谓同步更新,即节点z在第t次迭代的label依据于它的邻居节点在第t-1次迭代时所得的label;异步更新,即节点z在第t次迭代的label依据于第t次迭代已经更新过label的节点和第t次迭代未更新过label的节点在第t-1次迭代时的label。很拗口,简言之,同步指所有邻居节点这一轮都还未更新,t 节点是这其中的第一个更新者,异步指t不是其中的第一个更新者,邻居中同时存在此轮已更新和未更新者。

注意事项:

1、迭代次数设定一个阈值,可以防止过度运算;

2、对于二分图等网络结构,同步更新会引起震荡;

//3、类似(“强”社区>)定义的结构(该社区>=);

4、每个顶点在初始的时候赋予唯一的标签,即“重要性”相同,而迭代过程又采用随机序列,会导致同一初始状态不同结果甚至巨型社区的出现;

5、如果能预测“社区中心”点,能有效提高社区发现的准确度,大幅提高效率;

6、同一节点的邻居节点的标签可能存在多种社区最大数目相同的情况,取“随机”一个作为其标签

附录:GraphX github地址:https://github.com/apache/spark/blob/master/graphx/src/main/scala/org/apache/spark/graphx/lib/LabelPropagation.scala

附录GraphX 代码及解读:

LPA算法在GraphX中的实现_第1张图片

lpaGraph,初始化图定点属性,即LPA的标签,开始时每个顶点的标签为顶点id

sendMessage函数,即消息发送函数,给所有相邻节点发送该节点的attr(即顶点label)之用,双向,从源顶点<---->目标定点

mergeMessage函数,消息合并函数,对发送而来的消息进行merge,原理:对发送而来的Map,取Key进行合并,并对相同key的值进行累加操作,此处需要Scala相关知识。

vertexProgram,顶点函数,若消息为空,则保持不变,否则取消息中数量最多的标签,即Map中value最大的key。

initialMessage 初始化消息

Pregel 函数,很复杂,·不说了。

你可能感兴趣的:(LPA算法在GraphX中的实现)