图算法之PageRank

  PageRank是以谷歌联合创始人拉里•佩奇(Larry Page)的名字命名的,用于在谷歌的搜索结果中对网站进行排名。由Sergey Brin与Larry Page于1998年在WWW7会议上提出来的,用来解决链接分析中网页排名的问题。PageRank及其变种在谷歌搜索的网页排序功能中大显身手,也奠定了现代搜索引擎算法的基础。由于不同的网页之间互相存在连接,因此每个网页的重要性排序十分重要,由此PageRank的基于很简单的假设,即:

  • 当一个网页被更多网页所链接时,其重要性很高,故而排名会越靠前;
  • 排名高的网页应具有更大的表决权,即当一个网页被排名高的网页所链接时,该网页的重要性也相应较高。

基于以上两点,我们可以知道,任何一个网页的重要性,取决于连接到该网页的其他网页的重要性的加权之和。这里,我们将这种重要性定义为。那么对于任意一个网页,其重要性可以表示为:
其中称之为阻尼系数,常置为0与1之间的一个常数,默认是0.85,表示网页指向网页,表示第个网页的PageRank值,用以衡量每一个网页的排名;若排名越高,则其PageRank值越大。网页之间的链接关系可以表示成一个有向图,边代表了网页链接到了网页;为网页的出度,也可看作网页的外链数。
  假定为维PageRank值向量,为有向图所对应的转移矩阵,那么原公式可以改写为:
于是计算PR值的过程就变成了一个 Markov 过程,那么PageRank算法的证明也就转为证明 Markov 过程的收敛性证明:如果这个 Markov 过程收敛,那么存在,且与的选取无关 。

PR值计算方法

幂迭代法(power iteration)

  首先给每个页面赋予随机的初始值,然后通过不断地迭代值。当收敛于后迭代结束,获得所有页面的值。

示例

  以下是PageRank在neo4j中的实现示例。分别是有向无权图和有向有权图上的运行结果。

有向无权图
图算法之PageRank_第1张图片
image.png

代码如下:

CALL algo.pageRank.stream('Page', 'LINKS', {iterations:20, dampingFactor:0.85})
YIELD nodeId, score 
RETURN algo.asNode(nodeId).name AS page,score ORDER BY score DESC

结果如下:
图算法之PageRank_第2张图片
image.png
有向有权图
图算法之PageRank_第3张图片
image.png

代码如下:

CALL algo.pageRank.stream('Page', 'LINKS', {
  iterations:20, dampingFactor:0.85, weightProperty: "weight"
})YIELD nodeId, score  
RETURN algo.asNode(nodeId).name AS page,score ORDER BY score DESC

结果如下:
图算法之PageRank_第4张图片
image.png

参考:

  1. https://www.cnblogs.com/en-heng/p/6124526.html
  2. https://neo4j.com/docs/graph-algorithms/current/algorithms/page-rank/

你可能感兴趣的:(图算法之PageRank)