Label Propagation Algorithm LPA 标签传播算法解析及matlab代码实现
转载请注明出处:http://www.cnblogs.com/bethansy/p/6953625.html
LPA算法的思路:
首先每个节点有一个自己特有的标签,节点会选择自己邻居中出现次数最多的标签,如果每个标签出现次数一样多,那么就随机选择一个标签替换自己原始的标签,如此往复,直到每个节点标签不再发生变化,那么持有相同标签的节点就归为一个社区。
算法优点:思路简单,时间复杂度低,适合大型复杂网络。
算法缺点:众所周知,划分结果不稳定,随机性强是这个算法致命的缺点。
体现在:(1)更新顺序。节点标签更新顺序随机,但是很明显,越重要的节点越早更新会加速收敛过程
(2)随机选择。如果一个节点的出现次数最大的邻居标签不止一个时,随机选择一个标签作为自己标签。很明显,在标签重复次数相同的情况下,与本节点相似度更高或对本节点影响力越大的邻居节点的标签有更大的概率被节点选中
但是这些缺点并没有妨碍LPA经常作为论文的benchmark对比算法,而且这个思路可以用在机器学习领域
此处应该有一个小案例支撑,先看一个别人有的
这也是篇好文章,偏机器学习 http://blog.csdn.net/u013378306/article/details/52550805
代码实现:
第一步:先给每个节点分配对应标签,即节点1对应标签1,节点i对应标签i;(有的话直接用,没有就生成)
第二步:遍历N个节点(for i=1:N),找到对应节点邻居,获取此节点邻居标签,找到出现次数最大标签,若出现次数最多标签不止一个,则随机选择一个标签替换成此节点标签;
第三步:若节点标签不再变化,则迭代停止,否则重复第二步
最下面是做了一个收敛条件,由于存在二部网络震荡收敛(具体参见上文别人博客介绍),所以本次标签和上一次标签有可能永远不收敛,于是需要再引入一个上上次标签;
Labelnew是每次更新后的每个节点对应标签,Label1存储Labelnew上一次标签记录,Label2存储上上次的标签记录。当其中有一对相同的时候,收敛停止
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | function [ Labelnew ] = LPA( adjacent_matrix,label ) if nargin <2 label = 1: size (adjacent_matrix,2); end N = size (adjacent_matrix,2); Label1 = label; Label2 = Label1; Labelnew = Label1; flag=1; while (1) for i =1:N nb_lables = Labelnew(adjacent_matrix( i ,:)==1); %找到邻居下标对应的标签 if size (nb_lables,2)>0 x = tabulate(nb_lables); max_nb_labels = x(x(:,2)== max (x(:,2)),1); Labelnew( i ) = max_nb_labels( randi ( length (max_nb_labels))); end end % 收敛条件,预防跳跃 if all (Labelnew==Label1)|| all (Labelnew==Label2) break ; else if flag==1 Label1 = Labelnew; flag=0; else Label2 = Labelnew; flag=1; end end end end |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!