复杂网络实验8:LeaderRank算法(matlab)

一、背景知识

https://blog.csdn.net/ylf12341/article/details/90668391

相关内容在我上一篇pagerank算法中提到了,可以查看。

二、LeaderRank算法介绍

在基本的pagerank算法基础上,增加一个背景节点与所有节点进行双向连接。这个新的网络成了一个强连通网络,修复了基本的pagerank算法的一些问题。

刚开始所有页面的LR值都是1,背景节点g的LR值为0。

有如下的迭代公式:

第一个公式就是基础的pagerank算法的迭代公式。

第二个公式意思是,在每次迭代时,都把背景节点的LR值平分给每个节点。

这里面存在一个问题:

每次迭代都把背景节点LR值分给各个节点,还是在收敛之后再把背景节点的PR值平分给这个网络。

按照上面的公式的意思,应该是每次迭代计算n+1个节点的LR值,然后n个节点平分背景节点的LR值,作为一次迭代,下次迭代前背景节点的LR也变成了0。

经过实验发现,每次背景节点把自己的LR值平摊给其他节点的方法会导致算法收敛不了,所以讲道理,应该是先收敛,最后一步再平摊,而不是一边迭代一边平摊。

三、算法实现

两个文件,一个leaderrank.m 一个runpagerank.m

1.leaderrank.m

function c=leaderrank(A,n)
%1.初始化邻接矩阵,增加背景节点g作为n+1个节点
for i=1:n
    A(i,n+1)=1;
    A(n+1,i)=1;
end
%2.计算每个点的出度,保存在outdegree向量中
outdegree=zeros(n+1,1);
for i=1:n+1
    current_degree=0;
    for j=1:n+1
        if A(i,j)>0
            current_degree=current_degree+1;
        end
    end
    outdegree(i,1)=current_degree;
end
outdegree
%3.初始化LR值向量,原来网路的节点都是1,背景节点为0
LR=ones(n+1,1);
LR(n+1,1)=0;
%4.初始化google矩阵
A1=A
for i=1:n+1
    for j=1:n+1
        A1(i,j)=A1(i,j)/outdegree(i,1);
    end
end
A1
%5.进行版本迭代
num=0;
while 1
    if round(LR,4)==round(runpagerank(A1,LR),4)
        for i=1:n
            LR(i,1)=LR(i,1)+LR(n+1,1)/n;
        end
        LR(n+1,1)=0;
        c=LR;
        break;
    else
        LR=runpagerank(A1,LR);
        LR
        num=num+1
    end
end

2.runpagerank.m

function c=runpagerank(A1,PR)
c=A1'*PR;

为什么是runpagerank,因为和之前实验是一样的。

四、小结

我针对的有向图是这个:

基本的pagerank算法要72步收敛,经过改进的PageRank算法迭代步数为28,而LeadRank算法的迭代步数为17,与结论相符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值