PageRank近来的资料查询总结

---恢复内容开始---

之前我想用手写的文章,后来发现越来越麻烦。。因为我总要引用到一些网页里的知识和贴图所以就放弃了手写。

 

我 发现blog 整理我的思路很有帮助,因为修改很容易,不像文字书写那样,书写错了,那就全盘都要划了。。但是博客写作也有一个问题那就是作者所写的文章内容有些部分不 是正确的,毕竟不是学术论文,不用严格论证每一个地方。这就可能导致博客本来的结论就不正确,但是大牛们不评论指出,菜鸟们也觉的这就篇博客就是我想找的 答案了,那就照搬了,然后导致将错就错。。这也是我经常不想写博客的原因,因为我自己的学识也浅薄,对知识的理解也不能达到学术论文的论证那种程度。。

 

所以说:注意,以下文章是东凑西凑合成的,不一定对,如果想找到标准的,请查看wiki或者问专家。(注意,百科也可能不严谨)。

 

LarryPage的历史:

参考文章

www.loadingnow.com/2007/06/12/what-is-google-pagerank-first-chapter-history-of-pagerank/

 
从 上面这篇文章中我总结到LarryPage在斯坦福攻读博士的时候,做了一个小型的搜索引擎,当时larryPage还是调用着当时搜索引擎的老方法,搜 索引擎的关键字在文本里出现的越多,那么该网页就越往前的方法写的,但是他发现这样的搜索出来的结果太差劲了,于是乎他想到了他的导师的一句话:如果这是 一篇优秀的论文的话,那么他引用的论文也是优秀的。于是乎佩奇就想着能不能也用这种思想到搜索引擎那呢?经过了很多尝试很多失败,他联合了布林一起完成了 这个PageRank算法。
 
那么PageRank是什么呢?
 
参考文章:

http://www.t086.com/good/pagerank_cn.htm   Google 的秘密- PageRank 彻底解说 中文版
 
 
 

http://wenku.baidu.com/view/dd387d111ed9ad51f01df283.html       百度文库里关于pagerank算法的详细的例子

 

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; %选择不断地改变这个精度,居然结果都不同!!!

x=PR;%x的初始化
PR = p'*PR ;%初始化
while ( norm(PR-x) >=sigma)  %当达到了一定的精度    
    x= PR;   
    PR = p'*x;
end
PR

咦,是不是说明我的解释错了呢?基本上不断改变精度都不会稳定到一个值

 

我们来尝试画一个新图来看这个算法是否是成功的

p = [ 0 1/2 1/2 0;  
      0 0 1 0 ;
      1 0 0 0;
      1/3 1/3 1/3 0];
                 

  PR=[100;
      100;
      100;
      100;];
            
                
  sigma = 0.0001;
x=PR; %x的初始化
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;
0 0 0 0;
0 0 0 0]

[n,n]=size(p);%n表示页面数

%{
        
得到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,:)是要/每一行的和。。
%}

 

d = 0.85; %阻尼系数
e = ones(n,1);
A=d*p'+(1-d)*( (e*e')/n); %公式 优化之前的矩阵

sigma = 0.001; %收敛的精度停止值

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的优缺点

 

 

 

完毕!!!

 

posted @ 2015-05-22 12:58  david_way  阅读(335)  评论(0编辑  收藏  举报