目录
3、PageRank代数推导论证(稍微有点点复杂,看不是很明白可以略过)
“在互联网上,如果一个网页被很多其他网页所链接,就说明它受到普遍的承认和依赖,那么它的排名就很高。”----摘自吴军《数学之美》
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值,可以更准确的判断网页的重要性。
参考
5、《spark快速大数据分析》