Label Propagation Algorithm LPA 标签传播算法解析及matlab代码实现
Posted bethansy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Label Propagation Algorithm LPA 标签传播算法解析及matlab代码实现相关的知识,希望对你有一定的参考价值。
LPA算法的思路:
首先每个节点有一个自己特有的标签,节点会选择自己邻居中出现次数最多的标签,如果每个标签出现次数一样多,那么就随机选择一个标签替换自己原始的标签,如此往复,直到每个节点标签不再发生变化,那么持有相同标签的节点就归为一个社区。
算法优点:思路简单,时间复杂度低,适合大型复杂网络。
算法缺点:众所周知,划分结果不稳定,随机性强是这个算法致命的缺点。
体现在:(1)更新顺序。节点标签更新顺序随机,但是很明显,越重要的节点越早更新会加速收敛过程
(2)随机选择。如果一个节点的出现次数最大的邻居标签不止一个时,随机选择一个标签作为自己标签。很明显,在标签重复次数相同的情况下,与本节点相似度更高或对本节点影响力越大的邻居节点的标签有更大的概率被节点选中
但是这些缺点并没有妨碍LPA经常作为论文的benchmark对比算法,而且这个思路可以用在机器学习领域
此处应该有一个小案例支撑,先看一个别人有的
重点来了,main函数中需要加载一个我们常用的足球俱乐部的经典数据,很遗憾这里不能附件,后期我会写一个关于数据收集大全的博客
%clc; clear; close all; load(‘FootBallClub.mat‘); newlabels = LPA(FootBallClub); community = {}; class_labels = unique(newlabels); class_size = size(class_labels,2); for i=1:class_size community{i} = find(newlabels==class_labels(i)); end fprintf(‘共有%d个社区\n‘,class_size) for i=1:class_size if(isempty(community{i}) == 0) fprintf(‘第%d个社区含有点:‘,i) fprintf(‘%d ‘,community{i}) fprintf(‘\n‘) end end
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
以上是关于Label Propagation Algorithm LPA 标签传播算法解析及matlab代码实现的主要内容,如果未能解决你的问题,请参考以下文章
论文笔记之:Dynamic Label Propagation for Semi-supervised Multi-class Multi-label Classification ICCV 201
Label Propagation Algorithm LPA 标签传播算法解析及matlab代码实现
何时使用 Spring @Transactional (propagation = Propagation.SUPPORTS)?
@Transactional (readOnly = false, propagation = Propagation.REQUIRED) 正在抛出异常
当 Spring Propagation.REQUIRES_NEW 嵌套在 Propagation.NESTED 中时的行为
使用@Transactional(propagation = Propagation.SUPPORTS)和不加@Transactional 有什么区别?