标签:
---恢复内容开始---
之前我想用手写的文章,后来发现越来越麻烦。。因为我总要引用到一些网页里的知识和贴图所以就放弃了手写。
我 发现blog 整理我的思路很有帮助,因为修改很容易,不像文字书写那样,书写错了,那就全盘都要划了。。但是博客写作也有一个问题那就是作者所写的文章内容有些部分不 是正确的,毕竟不是学术论文,不用严格论证每一个地方。这就可能导致博客本来的结论就不正确,但是大牛们不评论指出,菜鸟们也觉的这就篇博客就是我想找的 答案了,那就照搬了,然后导致将错就错。。这也是我经常不想写博客的原因,因为我自己的学识也浅薄,对知识的理解也不能达到学术论文的论证那种程度。。
所以说:注意,以下文章是东凑西凑合成的,不一定对,如果想找到标准的,请查看wiki或者问专家。(注意,百科也可能不严谨)。
LarryPage的历史:
参考文章
www.loadingnow.com/2007/06/12/what-is-google-pagerank-first-chapter-history-of-pagerank/
http://wenku.baidu.com/view/dd387d111ed9ad51f01df283.html
PageRank的基本思想:
网页A链接给网页B,则可以认为A觉的B有价值,是比较重要的网页。
所以网页被指向的次数越多,则它的重要性越高,越是重要的网页,所连接的网页重要性也就越高
在这个图里A的PageRank是这样算的
假设每个 网页的PageRank的值是100(注意,投票给另一个网站后,它本来的票数不变);
C给A投了一票 100分给了A
B给C投了一票,但是B又给A投了一票,因为B的总数票是100,所以A只能得到50票
D给A投了一票,但是D还有两个票,所以A得到了33.3票
所以A的总票数是 100 + 50+33.3=183.3
这样子算,那么C得到了B的50票,D和B没有得到也没有失去
所以 C有150票,B有100,D也有100票
所以A排名第一,有183.3张票 C第二,B和D第三
这样我们就可以推广了
我们来用matlab来实现一下这个例子
%第一步,我们需要知道他的链出矩阵
p = [ 0 0 0 0; %A的链出是0
1/2 1/2 0 0 ; %B有链出C和A
1 0 0 0 ; %C有链出A
1/3 1/3 1/3 0];%D有链出A和其他
%A,B,C,D的初始PR值
PR=[100;
100;
100;
100;]
;%保存结果
result = p‘*PR;
%{
结果就是100 * 0+ 100/2* +100+100/3; 和A的刚才不是用这个方法计算PR(A)的值是一样的
最后生成的PR矩阵也是
PR(A) = 求和公式
PR(B) = 求和公式
PR(C) = 求和公式
PR(D)....
%}
result
算法的基本思想是这样了,但我百度了一下关于pagerank算法的真正实现,发现都要进行迭代相乘才能获取的结果,对于这个结论我是这么想的,注意是我是这么想的,不是答案。。网络每天刷新和更新的,我们不可能每时每刻去看到更新了一个网页,改变了PageRank的值,我们又要人工运行程序手算一篇,再更新,搜索引擎再把他得到的结果再重新排名,所以需要不断的相乘得到了一个PR稳定的值,我们来看看上面这个例子得出的结果
p = [ 0 0 0 0;
1/2 1/2 0 0 ;
1 0 0 0 ;
1/3 1/3 1/3 0];
PR=[100;
100;
100;
100;]
result = p‘*PR;
%添加了这下面的代码来试试,
sigma = 0.00000001; %选择不断地改变这个精度,居然结果都不同!!!
PR = p‘*PR ;%初始化
while ( norm(PR-x) >=sigma) %当达到了一定的精度
x= PR;
PR = p‘*x;
end
PR
咦,是不是说明我的解释错了呢?基本上不断改变精度都不会稳定到一个值
我们来尝试画一个新图来看这个算法是否是成功的
他确实恒定在一个值了。
其实之前的PR值全0是这个简单的算法所面对的一个大的问题,我们注意到A网页没有链出,当一个网页没有链出的时候,他就像黑洞一样去吞噬其他网页的PR值。
还有一个问题
经过了更多的研究后,为了更好的解决上面两个问题,发表一个随机模型
嘛,这是在参考文章里面的三页PPT,为什么直接贴PPT。。。因为我也不知道怎么解释。。。
最终得到了一个网上算PageRank算法用到的公式,在这公式里经常用幂乘法
G = qS + (1-q)eeT/N
q是阻尼系数
在matlab里面,这条公式表现形式
p1 = [0 1 0 1; %原始矩阵 0 0 1 0; 0 1 0 0; 1 0 1 0;] p=[] [n,n]=size(p1);%n表示页面数 for i=1:n p = [ p ; p1(i,:)/sum(p1(i,:) )]; % %{
得到p [1/2 0 0 1/2; 0 0 1 0; 0 0 0 1; 0 1 0 0] 也就是我们之前的矩阵
注意这里不能运用在
包括 0 0 0 0;行的矩阵,如果有这样的矩阵需要自己输入
为什么?因为for循环里面的/sum(p1(i,:)是要/每一行的和。。 %} end
d = 0.85; %阻尼系数 e = ones(n,1); %e矩阵 A=d*p‘+(1-d)*( (e*e‘)/n); %公式
最后我们来验证一下之前的吞
p=[ 0 0 0 0;
1/2 0 1/2 0;
1 0 0 0 ;
1 0 0 0 ]
d = 0.85; %阻尼系数
e = ones(n,1);
A=d*p‘+(1-d)*( (e*e‘)/n); %公式 优化之前的矩阵
sigma = 0.0000001; %收敛的精度停止值
x =[100;
100;
100;
100;]%pagerank的初始值
r = A*x; %重复我们之前的运算
while ( norm(r-x) >=sigma)
x= r;
r = A*x;
end
r %收敛之后的pagerank的值
我们通过改变sigma的精度发现他还是无法收敛。。。(是不是我理解错了,还是上面这个程序的原作者是做错了?求大神求助)
但是至少不是全0,在要求的精度上还是可以得到较好的比较。。
最后小结一下pagerank的优缺点
完毕!!!
标签:
原文地址:http://www.cnblogs.com/davidway/p/4522048.html