复杂网络实验7:pagerank算法(matlab)

一、什么是pagerank算法?

1.pagerank算法是一种基于随机游走的评价网站估值的算法

为什么?

可以证明:从网络中随机选出一个节点,顺着有向边行走K步之后,位于节点i的概率,

等于运用pagerank算法k步后得到的节点i的PR值。

这个结论很厉害,写在书上的应该错不了,书上也没给出证明,就先把这个结论当个黑箱,当个结论先记下来

2.pagerank算法的基本思想

互联网上一个页面的重要性取决于指向它的其他页面的数量和质量

初始时给一个网络内所有页面分配相等的重要性,如果有N个页面,每个每页的重要性就是1/N

把整个网络抽象成一个有向图,一个页面看成一个顶点,页面中的超链接看成是有向边

如果一个页面中有3个超链接指向其他3个页面,那么这个节点就有三条有向边指向这三个表示相应页面的节点

整个网络经过初始分配后,进入迭代,迭代收敛=迭代前等于迭代后(可以用保留小数的方法)

现在的问题就是:

  • 初始情况应该怎么确定?
  • 迭代怎么迭代?
  • 算法终止条件怎么确定?(后面讨论)

#1.初始情况的确定(基本的PageRank算法)

给定所有节点的初始PageRank值(简称PR值,下方都使用PR值),满足

其中下图部分意思是第0次迭代(初始情况)i节点的PR值

一般初始情况给每个节点分配相同的PR值,四个节点,每个节点的初始PR值都是1/4

#2.迭代方法

每次迭代,都是把上一版本所有节点的PR值进行一次修改

修改方法如下

记每个节点的出度为:

意思是第i个节点的出度

遍历每个节点,把当前节点的PR值平分给该点有向边所指向的那些节点

意思是:当前页面有一个PR值,假如说当前页面有三个超链接指向3个页面,每次迭代就把当前页面的PR值平分给这三个页面

有下方的迭代公式

意思是i节点第K次迭代的PR值等于

所有其他节点,经过平分后,流入该节点的PR值

其中,是邻接矩阵中的值,j节点和i节点之间存在边就是1,不存在就是0

再细细品味就能了解到pagerank的基本思想

二、pagerank算法的未修正实现

针对如下有向图进行分析

(图1,以下实验针对该图)

图中的数字是最后迭代收敛,进入稳态,最终每个节点的PR值。

初始时每个节点的PR值都是1/8

定义基本的Google矩阵

我们可以对有向图每一行除以该点的出度,得到这个Google矩阵

迭代规则可以写成下面这样的形式

其中

是一个n行1列的向量,通过google矩阵的转置对上一次迭代进行修正,等到本次迭代的结果

谷歌矩阵每一行是对相应点的出度进行平分的结果

转置之后,就是每个点经过出度平分,流入该点的PR值比例,不知道能不能理解

你们可以拿着第一个点在脑子里测试一下是不是这个道理

代码思路如下:

1.c=pagerank(A,n)函数,传入初始邻接矩阵和矩阵规模,返回最终的PR值向量放入c中

#1.计算每个点的出度

#2.得到google矩阵

#3.初始化PR向量

#4.进入迭代

2.迭代算法单独拿出来做成一个函数 runpagerrank

c=runpagerank(A1,PR)  传入谷歌矩阵和上个版本的PR值,经过google矩阵修正得到新的PR值

3.c=pagerank(A,n)代码如下:

function c=pagerank(A,n)   %传入邻接图A和网络规模n
%1.计算每个点的出度
outDegree=zeros(n,1);
for i=1:n
    current_outDegree=0;
    for j=1:n
        if A(i,j)>0
            current_outDegree=current_outDegree+1;
        end
    end
    outDegree(i,1)=current_outDegree;
end

%2.基本的pagerank算法,得到的google矩阵A1如下
A1=A;
for i=1:n
    for j=1:n
        if outDegree(i,1)==0                 %如果一个点出度为0,为了防止这个点把整个网路的PR值耗散掉,设定这个点没有链接的情况下,随机跳转到其他网络
            A1(i,j)=1/n;
        else
        A1(i,j)=A1(i,j)/outDegree(i,1);
        end
    end
end
A1
%3.初始化PR向量,使得浏览每个页面的概率相同
PR=zeros(n,1);
for i=1:n
    PR(i,1)=1/n;
end
PR
%4.把谷歌矩阵A1转置,右边乘上PR矩阵,就是一次迭代
%迭代收敛的意思是,这次迭代和下次迭代结果相同,就停止
num=0;
runpagerank(A1,PR)
while 1
    if round(PR,4)==round(runpagerank(A1,PR),4) %这里如果不用估值(前4),一直没法终止算法
        c=PR;
        break;
    else
        PR=runpagerank(A1,PR);
        PR
        num=num+1
    end
end
    

4.runpagerank(A1,PR)代码如下

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

5.实验结果

在外面构造一个图一的邻接矩阵A

调用pagerank(A,size(A,1))即可

验证1节点4/13=?

得到的结果是正确的

三、pagerank算法未修正实现有哪些问题?

1.悬挂节点(Dangling node)

导致pagerank算法若干次迭代之后整个网络所有节点PR值为0

如果图中有一个点的出度为0,也就是该页面没有任何超链接指向其他页面

在使用PR算法进行一次迭代时,这个点的PR值将被耗散掉

就是说,整个网络每次迭代都会传递给这个出度为0的点一些PR值,而这个出度为0的点没有可以把自身PR值回馈给整个网络的途径,每次迭代都耗散一点,最后完全gg思密达。

2.出部导致算法的PR值最后全部被出部所吸收

像上图这样一个小系统(6号节点和7号节点组成的系统)组成的出部,也没有把PR值回馈给系统的途径整个出部只会向系统索取,而不会反哺系统,简直人渣,最后也会导致若干次迭代后出部吸收了系统所有的PR值,系统其它部分PR值都为0。

3.环装网络导致算法不停循环而无法收敛

在上图基础上,如果初始PR值为

(为什么初始PR值不都设成一样?这里只是想说明这个不断循环的过程

如果全部设成一样,下一次迭代大家也都是1/5,马上就误判成收敛,不就很捞了?)

那么PR值迭代过程如下表:

(忽略右上角的马赛克)

最后就不断循环,无法收敛,我算法里的收敛条件是RP值前四位 迭代前和迭代后一样,最后返回迭代前的PR值向量

四、pagerank算法的修正实现

修正的随机冲浪者模型:

假设有一个网上的随机冲浪者,他从一个随机选择的页面开始浏览。

如果当前页面的出度大于零,那么以概率s(0<s<1)在当前页面上随机点击某个超文本连接,进入下一个页面,

同时会以概率1-s在整个WWW上完全随机选择一个页面作为下一步要浏览的页面。(看成是重新输入网址浏览)

如果当前页面的出度为零,那么完全随机地选择一个页面作为下一步要浏览的页面。(看成是当前页面没有超链接指向其他页面,那么只能在地址栏键入网址,进行下一步浏览)

1.经过修正的模型的迭代规则

意思是第K步迭代i节点的PR值,以s的概率按照之前的方式执行,以(1-s)的概率进行随机浏览

这里的表示如下:

意思是出度大于0,不变

出度等于0,那么随机浏览

2.s值的大小确定

可以想象,s值的大小是控制模型按照之前模式浏览还是随机浏览的一个滑动值

如果s=0,那么公式前面一半为0,后面就是1/N

意思就是所有页面都不点自身的超链接,都选择在网址栏键入网址的方式进行浏览。

如果s=1,公式后面一半为0,就完全按照未修正模型进行PR的计算。

Page和Brin当初提出PageRank算法时,建议取s=0.85。

这个0.85的结果也不知道他们做了多少工作才得出的,也不知道他们最后怎么就建议成0.85

反正现在就用0.85来玩吧....

3.算法实现

只要把之前算法的google矩阵逻辑稍微改一下就好了

就是在第二部分稍微改一下

function c=pagerank1(A,n)   %传入邻接图A和网络规模n
%1.计算每个点的出度
outDegree=zeros(n,1);
for i=1:n
    current_outDegree=0;
    for j=1:n
        if A(i,j)>0
            current_outDegree=current_outDegree+1;
        end
    end
    outDegree(i,1)=current_outDegree;
end

%2.经过修正的pagerank算法,得到的google矩阵A1如下
A1=A;
for i=1:n
    for j=1:n
        if outDegree(i,1)==0                 %如果一个点出度为0,为了防止这个点把整个网路的PR值耗散掉,设定这个点没有链接的情况下,随机跳转到其他网络
            A1(i,j)=1/n;
        else
        A1(i,j)=A1(i,j)/outDegree(i,1);
        end
    end
end
A1=0.85*A1+0.15*1/n*ones(n)  %修正google矩阵
%3.初始化PR向量,使得浏览每个页面的概率相同
PR=zeros(n,1);
for i=1:n
    PR(i,1)=1/n;
end
PR
%4.把谷歌矩阵A1转置,右边乘上PR矩阵,就是一次迭代
%迭代收敛的意思是,这次迭代和下次迭代结果相同,就停止
num=0;
runpagerank(A1,PR)
while 1
    if round(PR,4)==round(runpagerank(A1,PR),4)
        c=PR;
        break;
    else
        PR=runpagerank(A1,PR);
        PR
        num=num+1
    end
    if num==73
        break;
    end
end
    

五.小结

左图为修正pagerank结果,右图为未修正的pagerank结果

可以看到结果大差不差,但是迭代速度那就快很多了。

 

 

 

  • 26
    点赞
  • 121
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值