PageRank算法及基于Spark的实现

1 篇文章 0 订阅
1 篇文章 0 订阅

目录

1、PageRank概述

2、PageRank原理

3、PageRank代数推导论证(稍微有点点复杂,看不是很明白可以略过)

4、PageRank分布式实现(Spark)

5、PageRank优缺点

6、改进


“在互联网上,如果一个网页被很多其他网页所链接,就说明它受到普遍的承认和依赖,那么它的排名就很高。”----摘自吴军《数学之美》


1、PageRank概述

PageRank, 即网页排名,又称网页级别、Google左侧排名、佩奇排名。

PageRank算法是谷歌构建早期的搜索系统原型时提出的链接分析算法,通过分析所有网页的入链,入链更多和入链质量越高的网页重要性越高,如同一篇论文,被引用次数越多,说明该论文越重要,被越重要的论文引用,说明该论文越重要。

早期,谷歌搜索引擎也因为该算法获得空前的商业成功。


2、PageRank原理

PageRank基本思想,对于某个互联网网页A来说:

链接到该网页的链接数量越多,该网页排名得分越高,即PageRank值越高

链接到该网页的链接质量越高,该网页排名得分越高,即PageRank值越高

根据以上两个思想,可以预先赋予每个网页相同的PageRank分,通过每个网页的入链,迭代计算每个网页的PageRank分,根据数学证明,该分数在多次迭代后,最终会趋于稳定(收敛)。

 

假设一个由只有4个页面组成的集合:A,B,C和D。如果所有页面都链向A,那么A的PR(PageRank)值将是B,C及D的和。

其现实意义是,假设用户浏览网页时,只能根据链接来访问下一个页面,那么当用户停留在页面B,C,D时,用户只能往下访问A页面,所以用户访问 A页面的概率=B页面的概率+C页面概率+D页面

继续假设B也有链接到C,并且D也有链接到包括A的3个页面。一个页面不能投票2次。所以B给每个页面半票。以同样的逻辑,D投出的票只有三分之一算到了A的PageRank

其现实意义是,用户浏览网页B时,只有一半的概率下一个页面访问A,浏览C网页时,用户下一个页面访问A的概率为1,浏览D网页时,用户下一个页面访问A的概率为1/3,所以用户访问 A页面的概率=B页面的概率/2+C页面概率/1+D页面概率/3。

换句话说,根据出链总数平分一个页面的PR值。

其中,L(B),L(C),L(D)代表页面的出链总数

例,下图描述了部分网页PageRank的计算过程

以上推导都是基于一个假设:用户浏览网页时,只能根据链接来访问下一个页面

但现实是,用户除了根据链接来访问下一个页面,还能通过浏览器地址栏随机访问下一个页面。

通常,用户通过地址栏随机访问下一个页面的概率我们可以取0.15(经验值),用户通过点击链接访问下一个页面的概率 q= 1-0.15=0.85,q叫阻尼系数。那么A页面的PR值如下:

其中,N代表页面的总数,在这里N=4,表示用户通过地址栏随机输入一个url,某个页面被访问到的概率=(1-q)/N


3、PageRank代数推导论证(稍微有点点复杂,看不是很明白可以略过)

根据上面推导,我们可以知道,页面pi的PageRank完整公式为

其中,N为网页总数量,Mp是所有链接到pi的网页集合,PR(pi)是网页pi的PR值,L(pj)是网页pj的出链,q是阻尼系数

 

用一个矩阵来表示所有页面的PR值:

R的迭代公式如下

其中,如果网页j有m个指向网页i的链接,则 il(pi,pj) = m/sum,没有则 il(pi,pj) = 0,sum为矩阵第j列的总和,sum表示网页j的外链总数

令S等于如上矩阵,则

取e为所有分量都为1的N*N的矩阵

令A表示如下矩阵(这一步是关键),由公式可知,A是不变的

所以,R的迭代公式可以表示如下,可知,PR值计算过程是一个马尔可夫过程。

马尔可夫过程的收敛性

马尔可夫过程收敛值与初始值R0的取值无关

此处不做证明,请自行查阅马尔科夫过程相关资料。

至此,PageRank算法的收敛性和初始值无关性已经证明,下面用代码实现该算法。


4、PageRank分布式实现(Spark)

通常PageRank算法需要对全量数据进行计算,且一般全量数据都很大,单机难以计算,所以此处采用spark作分布式实现

核心实现代码如下

val conf = new SparkConf().setAppName("test").setMaster("local")
val sc = new SparkContext(conf)
val links = sc.parallelize(Array(("A",ListBuffer("B","C")),("B",ListBuffer("A","C")),("C",ListBuffer("A","B","D")),("D",ListBuffer("C"))))
  .partitionBy(new HashPartitioner(10))

var ranks = links.mapValues(v=>1.0)
for(i<- 0 until 10){
  val contributions = links.leftOuterJoin(ranks).flatMap{
    case (pageId,(links,rank))=>
      links.map(dest=>(dest,rank.getOrElse(0.15)/links.size))
  }
  ranks = contributions.reduceByKey((x,y)=>x+y).mapValues(v=>0.15+0.85*v)
}


第六行,mapValues方法给定每个页面初始PR值为1第四行,HashPartitioner(10),对数据采用Hash分区策略,相同的url的数据落在同一个区,后续对相同key的数据进行聚合,可以减少网络传输

第十行,leftOuterJoin方法,求每个入链对网页的PR的贡献值,然后在第十二行,对网页的所有入链PR贡献值求和,并使用公式0.15+0.85*v

该实现静态迭代十次,通常PageRank迭代十次后就会收敛到一定范围。


5、PageRank优缺点

优点:

1.其自身的作用

2.与查询无关的静态算法,所有网页的PageRank值通过离线计算获得;有效减少在线查询时的计算量,极大降低了查询响应时间。

缺点:

1.没有区分站内导航链接。

2.没有过滤广告链接。


6、改进

针对PageRank算法没有过滤广告链接的缺点,2004年斯坦福大学和雅虎联合提出TrustRank算法:先人工识别一批高质量页面(即种子页面),那么离“种子”页面越近的页面,其质量越高,反之,网页质量越低。

TrustRank算法,通过人工识别优质页面,有效降低了垃圾网页的质量度(TR值)。

通过PageRank的PR值结合TrustRunk的TR值,可以更准确的判断网页的重要性。

 

参考

1、PageRank算法

2、 PageRank算法--从原理到实现

3、PageRank论文

4、《谷歌背后的数学》

5、《spark快速大数据分析》

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值