一、什么是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结果
可以看到结果大差不差,但是迭代速度那就快很多了。