分享

浅谈PageRank的matlab实现

 复杂网络621 2013-10-04

    越来越发现自己学习太不深入了,什么都只懂点皮毛,对于别人的思想没有理解透彻,看来学习还是要深入的,别人的东西要完全理解才能变成自己的。最近开始研究机器学习的算法,今天心血来潮看了下PageRank,思想还是比较简单的,可是要把思想完全理解并用算法实现,对于我这个菜鸟还是花了点时间的。

1.PageRank思想简介

    互联网中的页面是以页面的PageRank来判断其重要性的,值越大越体现其重要性。而页面之间是相互联系的,一个页面可能被多个页面链接,一个页面也可能指向多个页面,从而形成了一个有向图,页面表示有向图的顶点,有向边表示链接,w(i,j)=1表示页面i存在指向页面j的超链接,否则w(i,j)=0。如果页面A存在指向其他页面的超链接,就将A的PageRank的份额平均地分给其所指向的所有页面,一次类推。虽然PageRank会一直传递,但总的来说PageRank的计算是收敛的,下面给出其迭代公式(1-1):

    PRn(A)=(1-d)+d*(PRn-1(Ti)/C(Ti))(1-1)(页面的初始PageRank均设为1)

    %PRn(A) 表示页面A的n次迭代后的PageRank,PRn-1(Ti) 表示页面Ti的n-1的PageRank。

    %C(Ti) 表示页面Ti的链接数。

    %d 表示阻尼系数(0

算法思想来源 http://wenku.baidu.com/view/e226710e52ea551810a6873d.html

2.PageRank算法描述

    实际应用中可以采用幂法来计算PageRank,假如总共有m个页面,计算如(1-2)所示:

    r=A*x(1-2)其中A=d*P+(1-d)*(e*e'/m)

    %r表示当前迭代后的PageRank,它是一个m行的列向量,x是所有页面的PageRank初始值。

    %P由有向图的邻接矩阵变化而来,P'为邻接矩阵的每个元素除以每行元素之和得到。

    %e是m行的元素都为1的列向量。tyuuyuyfuu

    幂法计算过程如下:

    x<--任意m行列向量;

    r=A*x;

    if(||r-x||

       return r;%r为最终的PageRank

    else

       x=r;goto 2;

3.PageRank算法的maltab实现代码

    %pagerank
    P1=[0 1 1 0;0 0 0 1; 1 0 0 0;1 1 1 0];%链接的有向图的邻接矩阵表示

    P=[];
    [n,n]=size(P1);%n表示页面数
    for i=1:n
       P=[P;P1(i,:)/sum(P1(i,:))];%将M1的数据除以每行数据之和
    end
    d=0.5;%阻尼系数
    sigma=0.0001;%收敛阈值
    e=ones(n,1);
    A=d*P'+(1-d)*((e*e')/n);
    %x=ones(n,1);
    x=rand(n,1) %页面的pagerank初始值
    r=A*x;%pagerank的计算公式
    while(norm(r-x)>=sigma);%判断是否收敛
       x=r;
       r=A*x;
    end
    r %收敛之后得到最后的pagerank,并输出

输出结果:

   x =

    0.7431             
    0.3922
    0.6555
    0.1712
   r =

    0.5568
    0.4640
    0.4640
    0.4773
另一组结果如下:

   x =

    0.7060
    0.0318
    0.2769
    0.0462


   r =

    0.3011
    0.2509
    0.2509
    0.2581

    通过结果发现页面的重要性与PageRank的初始值无关,虽然当x不同时,得到的r的值也不同,但是页面的重要性排序保持不变。

4.总结

    在理解PageRank算法时,对于其中的数学公式我进行了分析,明白了r=A*x的意义,也明白了为什么A的取值是那样的。下面的将自己的理解介绍如下:

    r=A*x=d*P*x+(1-d)*(e*e'/m)*x  (1)

    PRn(A)=(1-d)+d*(PRn-1(Ti)/C(Ti))  (2)

    P1表示有向图的邻接矩阵,P1的第i行中的非零元素表示页面i中链接页面,第j列中的非零元素表示指向页面j的页面,将P1的每个元素除以每行元素之和转置得到P,P的第i行元素表示的就是指向页面i其他页面给页面i的PageRank份额1/C(Ti)。用矩阵表示就是d*P*x,结果也就是(2)的后部分值。而(1)中的后部分表示的是每个页面分出d份额的PageRank之后的PageRank,为了表示成矩阵形式才有了(e*e')/m的表达,这一部分的矩阵表示也就是(2)中的1-d。

    还有一个论文(http://www.cnblogs.com/FengYan/archive/2011/11/12/2246461.html)介绍PageRank,主要思想都差不多,上面的思想用到了阻尼系数d,就相当于这个论文中的C,而论文中的逃脱因子E(E(i)表示第i个网页的逃脱因子)是为了解决Rank sink,我觉得类似与上面的(1-d)*(e*e'/m)*x,对于这一点比较我不是很确定。

    总的来说,对于PageRank还算进行了比较深入的了解。对于海量页面数的相关处理是实际问题的难点,由于我对于分布式处理几乎是0基础,所以还有待好好学习。

   

   

   

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多