一、背景知识
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,与结论相符。