A Node Influence Based Label Propagation Algorithm for Community detection in networks 文章算法实现的疑问

这是我最近看到的一篇论文,思路还是很清晰的,就是改进的LPA算法。改进的地方在两个方面:

(1)结合K-shell算法计算量了节点重重要度NI(node importance),标签更新顺序则按照NI由大到小的顺序更新

得到ks值后,载计算一下节点邻居ks值和度值d的比值

(2)当出现次数最多的标签不止一个时,再计算一下标签重要度LI(label importance)

其实就是找到节点相同标签的那些令居计算一个合值,看着也不难啊

(3)最后这个算法使用的是异步传播

下面是我实现的代码

function Labelnew=NIBlpa(A,alpha)
%  A Node Influence Based Label Propagation Algorithm for
% Community Detection in Networks
% [X,Y,Z] = NIBlpa(A,alpha)
%
% Inputs:
% k - clique size
% A - adjacency matrix
%
% Outputs:
% X - detected communities
% Y - all cliques (i.e. complete subgraphs that are not parts of larger
% complete subgraphs)
% Z - k-clique matrix
%
% Author : Yang Yang
% Email : [email protected]
ks=kshell(A);
n=size(A,1);
D=sum(A,2);
NI=ks;
label = 1:size(A,2);
%%
% calculate NI(node importance)
for i=1:n
    Nei=find(A(i,:)==1);
    NI(i,2)=ks(i,2)+alpha*sum(ks(Nei,2)./D(Nei));
end
sequence=sortrows(NI,-2);
%%
% Label propagation
    Label1 = label;
    Labelnew = Label1;

 while(1)
        for i=1:n
            % 找到邻居下标对应的标签
            nb_lables = Labelnew(A(sequence(i,1),:)==1);
          % 只考虑了每个节点至少有一个邻居,如果有孤立节点程序不运行保持原标签
            if size(nb_lables,2)>0
                x = HistRate(nb_lables);
                max_nb_labels = x(x(:,2)==max(x(:,2)),1);
                if size(max_nb_labels)==1
                    Labelnew(sequence(i,1))= max_nb_labels;
                else
                    LI=zeros(length(max_nb_labels),1);
                    for ma=1:length(max_nb_labels)
                        Nei=find(A(sequence(i),:));
                        index=Labelnew(Nei)==max_nb_labels(ma);
                        LI(ma)=sum(NI(Nei(index),2)./D(Nei(index)));
                    end
                   [~,maxx]=max(LI);
                   Labelnew(sequence(i,1))=max_nb_labels(maxx);
                end
            end

       end
        % 收敛条件,预防跳跃
        if Labelnew==Label1
            break;
        else
            Label1 = Labelnew;

        end
 end

  下面是调用K-shell算法的代码

function [kvalue]=kshell(A)
%  A :邻接矩阵
%  A=load(‘cdbBA_4000_5_0_.txt‘);
%
n=size(A,1);
kvalue=zeros(n,2);
kvalue(:,1)=[1:n]‘;
if find(sum(A,2)==0)
    kvalue(sum(A,2)==0,2)=0;
end
a=1;k=1;
% 一层循环主要是叫K-shell中k值,当层层剥掉节点度k的节点后,将这些节点边删除,当网络中不再有小于等于k的节点后,k=k+1
while a
    D=sum(A,2);
    if sum(D)==0
        break;
    end
    b=1;
    %  二层循环主要是找到k层的所有节点
    while b
        index=find(D<=k&D>0);
        if isempty(index)
           b=0;continue;
        else
         A(index,:)=0;
         A(:,index)=0;
         D=sum(A,2);
         kvalue(index,2)=k;
        end
    end
k=k+1;
end
end

  但是后在几个数据集上测试效果都非常不好,例如karate上nmi只有0.2多,但是论文中作者得到的结果却是1,我已经把文章看了几遍还是找不出算法和作者哪里有出入,不过发现改进(2)的公式是错误的源头?抓头???其指教

时间: 2024-12-19 03:05:09

A Node Influence Based Label Propagation Algorithm for Community detection in networks 文章算法实现的疑问的相关文章

LabelRank(A Stabilized Label Propagation Algorithm for Community Detection in Networks)非重叠社区发现

最近在研究基于标签传播的社区分类,LabelRank算法基于标签传播和马尔科夫随机游走思路上改装的算法,引用率较高,打算将代码实现,便于加深理解. 一.概念 相关概念不再累述,详情见前两篇文章 二.算法思路 (1)Propagation (2)Inflation (3)Cut off (4)Explicit Conditional Update (5)Stop Criterion 三.A Stabilized Label Propagation Algorithm for Community D

Label Propagation Algorithm LPA 标签传播算法解析及matlab代码实现

LPA算法的思路: 首先每个节点有一个自己特有的标签,节点会选择自己邻居中出现次数最多的标签,如果每个标签出现次数一样多,那么就随机选择一个标签替换自己原始的标签,如此往复,直到每个节点标签不再发生变化,那么持有相同标签的节点就归为一个社区. 算法优点:思路简单,时间复杂度低,适合大型复杂网络. 算法缺点:众所周知,划分结果不稳定,随机性强是这个算法致命的缺点. 体现在:(1)更新顺序.节点标签更新顺序随机,但是很明显,越重要的节点越早更新会加速收敛过程 (2)随机选择.如果一个节点的出现次数最

Affinity Propagation Algorithm

The principle of Affinity Propagation Algorithm is discribed at above. It is widly applied in many fields.

论文笔记之:Dynamic Label Propagation for Semi-supervised Multi-class Multi-label Classification ICCV 2013

Dynamic Label Propagation for Semi-supervised Multi-class Multi-label Classification ICCV 2013  在基于Graph的半监督学习方法中,分类的精度高度依赖于可用的有标签数据 和 相似性度量的精度.此处,本文提出一种半监督的 multi-class and multi-label 分类机制,Dynamic Label Propagation(DLP),是在一个动态的过程中传递,执行 transductive

基于Node.js的强大爬虫 能直接发布抓取的文章哦

基于Node.js的强大爬虫 能直接发布抓取的文章哦 基于Node.js的强大爬虫能直接发布抓取的文章哦!本爬虫源码基于WTFPL协议,感兴趣的小伙伴们可以参考一下 一.环境配置 1)搞一台服务器,什么linux都行,我用的是CentOS 6.5: 2)装个mysql数据库,5.5或5.6均可,图省事可以直接用lnmp或lamp来装,回头还能直接在浏览器看日志: 3)先安个node.js环境,我用的是0.12.7,更靠后的版本没试过: 4)执行npm -g install forever,安装f

Node.js 创建HTTP服务器(经过测试,这篇文章是靠谱的T_T)

Node.js 创建HTTP服务器 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个"接收 HTTP 请求并提供 Web 页面"的需求根本不需 要 PHP 来处理. 不过对 Node.js 来说,概念完全不一样了.使用 Node.js 时,我们不仅仅 在实现一个应用,同时还实现了整个 HTTP 服务器.事实上,我们的 Web 应用以及对应的 Web 服务器基本上是一样的.

[js高手之路]Node.js实现简易的爬虫-抓取博客所有文章列表信息

抓取目标:就是我自己的博客:http://www.cnblogs.com/ghostwu/ 需要实现的功能: 抓取博客所有的文章标题,超链接,文章摘要,发布时间 需要用到的库: node.js自带的http库 第三方库:cheerio,这个库就是用来处理dom节点的,他的用法几乎跟jquery用法一模一样,所以有了这个利器,写一个爬虫就非常简单 准备工作: 1,npm init --yes 初始化package.json 2,安装cheerio:npm install cheerio --sav

Louvain algorithm for community detection

主要理解Louvain 算法中对于模块度的定义:模块度是评估一个社区网络划分好坏的度量方法,它的物理含义是社区内节点的连边数与随机情况下的边数只差,它的取值范围是 [?1/2,1).可以简单地理解为社区内部所有边权重和减去与社区相连的边权重和. https://blog.csdn.net/qq_40438165/article/details/83374304 https://www.cnblogs.com/allanspark/p/4197980.html 原文地址:https://www.c

标签传播算法

参考文献:http://blog.csdn.net/cleverlzc/article/details/39494957Gephi 是一款网络分析领域的可视化处理软件,可以用于数据分析,链接分析,社交网络分析等.标签传播算法LPA(Label Propagation Algorithm)最早是针对社区发现问题提出时的一种解决方案.主要优点有:时间复杂度(近似线性),不需要事先知道社区数量.主要算法流程:首先为每个节点设置唯一标签,接着迭代依次更新各个节点,针对每个节点,通过统计节点邻居的标签,选