一篇文章带你看懂 Google 的 PageRank 算法(2)

PageRank 算法是谷歌创始人拉里·佩奇和谢尔盖·布林开发的一种网页排名算法。通过网络链接结构来确定网页的重要性。这个算法今天看起来有些简单,不过 1996 年 google 可能就靠这个算法起家的吧。

PageRank 背后的基本思想是:一个网页的重要性可以通过链接到该网页的其他网页的数量和质量来衡量。如果一个网页被许多其他重要的网页链接,那么这个网页也被认为是重要的。

转移矩阵

假设有 A、B、C 和 D 网站,用箭头表示他们之间引用关系,也就是 <math xmlns="http://www.w3.org/1998/Math/MathML"> N × N N \times N </math>N×N 矩阵,其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> M [ i ] [ j ] M[i][j] </math>M[i][j] 表示从 j 网页到网页 i 的链接概率

转移概率矩阵/马尔可夫矩阵,从 A 将跳转到 B 或 C 的概率为 1/2,

PageRank 可以用一个有向图来表示,其中每个网页是图中一个节点,每个超链接是图中一条有向边

也可以用一个矩阵来表示网页间的关系,这里矩阵用大写字母 <math xmlns="http://www.w3.org/1998/Math/MathML"> M M </math>M 来表示
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> [ 0 0 1 / 3 1 1 / 2 0 1 / 3 0 1 / 2 0 0 0 0 1 1 / 3 0 ] \begin{bmatrix} 0 & 0 & 1/3 & 1\\ 1/2 & 0 & 1/3 & 0\\ 1/2 & 0 & 0 & 0\\ 0 & 1 & 1/3 & 0\\ \end{bmatrix} </math> 01/21/2000011/31/301/31000

第一列表示 A 到 B、C、D 的概率也就是从 j 到 i 网页链接概率,因为 A (j=0) 有 2 个超链接指向 B 和 C 所以每个到 A 到 B 和 C 概率为 1/2

<math xmlns="http://www.w3.org/1998/Math/MathML"> R t + 1 = M R t R_{t+1} = MR_t </math>Rt+1=MRt
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> R t + 1 = [ 0 0 1 / 3 1 1 / 2 0 1 / 3 0 1 / 2 0 0 0 0 1 1 / 3 0 ] [ 1 / 4 1 / 4 1 / 4 1 / 4 ] = [ 1 / 12 2.5 / 12 4.5 / 12 4 / 12 ] R_{t+1} = \begin{bmatrix} 0 & 0 & 1/3 & 1\\ 1/2 & 0 & 1/3 & 0\\ 1/2 & 0 & 0 & 0\\ 0 & 1 & 1/3 & 0\\ \end{bmatrix} \begin{bmatrix} 1/4 \\ 1/4 \\ 1/4 \\ 1/4 \\ \end{bmatrix} = \begin{bmatrix} 1/12\\ 2.5/12\\ 4.5/12\\ 4/12 \end{bmatrix} </math>Rt+1= 01/21/2000011/31/301/31000 1/41/41/41/4 = 1/122.5/124.5/124/12

随机浏览模型

Dead Ends 问题

随着不断的迭代,整个网络的 PageRank 值会逐渐消失,最终导致所有网页的 PageRank 值都趋向为 0,这是因为 Dead Ends 网页不将任何 PageRank 值传递给其他网页(例如下面的 B 节点)

接下通过一个例子来介绍 Dead Ends 问题 B 没有任何出链(out-links) 这就是 Dead Ends,Dead Ends 会导致网站权重变为 0

1 2 3
A 1/3 0 0
B 1/3 2/3 0
C 1/3 0 0

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> R t + 1 = [ 0 0 0 1 0 1 0 0 0 ] [ 1 / 3 1 / 3 1 / 3 ] = [ 0 2 / 3 0 ] R_{t+1} = \begin{bmatrix} 0 & 0 & 0 \\ 1 & 0 & 1 \\ 0 & 0 & 0 \\ \end{bmatrix} \begin{bmatrix} 1/3 \\ 1/3 \\ 1/3 \\ \end{bmatrix} = \begin{bmatrix} 0 \\ 2/3\\ 0 \end{bmatrix} </math>Rt+1= 010000010 1/31/31/3 = 02/30

teleport 解决方法

调整为
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> M + a T ( e n ) M + a^T (\frac{e}{n}) </math>M+aT(ne)

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> a = [ a 0 , a 1 , ⋯   , a n ] a = [a_0,a_1,\cdots, a_n] </math>a=[a0,a1,⋯,an] 当有一列全为 0 时(即该节点无出链) <math xmlns="http://www.w3.org/1998/Math/MathML"> a i = 1 a_i = 1 </math>ai=1
  • e 为由 1 填满的列矩阵
  • n 为 M 矩阵的行数/列数

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> [ 0 0 0 1 0 1 0 0 0 ] + [ 0 1 / 3 0 0 1 / 3 0 0 1 / 3 0 ] \begin{bmatrix} 0 & 0 & 0\\ 1 & 0 & 1\\ 0 & 0 & 0\\ \end{bmatrix} + \begin{bmatrix} 0 & 1/3 & 0\\ 0 & 1/3 & 0\\ 0 & 1/3 & 0\\ \end{bmatrix} </math> 010000010 + 0001/31/31/3000
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> a 0 = [ 0 , 0 , 0 ] a 1 = [ 1 , 1 , 1 ] a 2 = [ 0 , 0 , 0 ] → a = [ 0 0 0 1 1 1 0 0 0 ] → a T = [ 0 1 0 0 1 0 0 1 0 ] \begin{aligned} a_0 = [0,0,0]\\ a_1 = [1,1,1]\\ a_2 = [0,0,0]\\ \end{aligned} \rightarrow a = \begin{bmatrix} 0 & 0 & 0\\ 1 & 1 & 1\\ 0 & 0 & 0\\ \end{bmatrix} \rightarrow a^T = \begin{bmatrix} 0 & 1 & 0\\ 0 & 1 & 0\\ 0 & 1 & 0\\ \end{bmatrix} </math>a0=[0,0,0]a1=[1,1,1]a2=[0,0,0]→a= 010010010 →aT= 000111000

spider traps 问题

Spider Traps 是指一种特殊的网页结构,其中一组网页相互链接,形成一个闭环。用户(或者说"蜘蛛",即网络爬虫)一旦进入这个环,就会陷入循环,无法跳出。这种结构会对PageRank算法的正常运行造成问题。

首先我们来看一下什么是 spider traps 问题,这里有一个简单模型图,A 节点与其他节点之间无 out-links,也就是 Spider Traps,这将会导致网站权重变为向一个节点偏移。

1 2 3 4 5
A 1/3 2/3 5/6 11/12
B 1/3 1/6 1/12 1/24
C 1/3 1/6 1/12 1/24

当PageRank算法遇到Spider Traps时,算法会不断在这个闭环内分配PageRank值,导致这些网页的PageRank值人为地被提高,而其他不在闭环中的网页的PageRank值则会被不公平地降低。这是因为PageRank算法基于网络链接的结构来分配每个网页的重要性,而在Spider Traps中,链接结构导致算法无法正确评估网页的实际重要性。

Random Teleport

为了解决这个问题,PageRank算法进行了调整,引入了一个随机浏览者模型。这个模型假设即使用户当前浏览的是一个Dead End网页,他们仍然有一定概率随机跳转到网络中的任何其他网页。这种随机跳转的概率通常由一个参数α(通常取值0.85)来控制。

  • 将节点图转换为概率矩阵
  • 修正 M

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> [ 1 1 / 2 1 / 2 0 0 1 / 2 0 1 / 2 0 ] \begin{bmatrix} 1 & 1/2 & 1/2 \\ 0 & 0 & 1/2 \\ 0 & 1/2 & 0 \end{bmatrix} </math> 1001/201/21/21/20
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> P R ( p i ) = 1 − α N + α ∑ p j ∈ M ( p i ) P R ( p j ) L ( p j ) PR(p_i) = \frac{1-\alpha}{N} + \alpha \sum_{p_j \in M(p_i)} \frac{PR(p_j)}{L(p_j)} </math>PR(pi)=N1−α+αpj∈M(pi)∑L(pj)PR(pj)

  • <math xmlns="http://www.w3.org/1998/Math/MathML"> P R ( p i ) PR(p_i) </math>PR(pi) 是网页 <math xmlns="http://www.w3.org/1998/Math/MathML"> p i p_i </math>pi 的 PageRa
  • N 是网络中的网页总数
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> α \alpha </math>α 是一个常数,通常为 0.85,
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> M ( p i ) M(p_i) </math>M(pi) 是链接到网页 <math xmlns="http://www.w3.org/1998/Math/MathML"> p i p_i </math>pi 的所有网页的集合
  • <math xmlns="http://www.w3.org/1998/Math/MathML"> L ( p j ) L(p_j) </math>L(pj) 表示网页 <math xmlns="http://www.w3.org/1998/Math/MathML"> p j p_j </math>pj 的出链接数(out-links)

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> M = α [ 1 1 / 2 1 / 2 0 0 1 / 2 0 1 / 2 0 ] + ( 1 − α ) [ 1 / 3 1 / 3 1 / 3 1 / 3 1 / 3 1 / 3 1 / 3 1 / 3 1 / 3 ] M = \alpha \begin{bmatrix} 1 & 1/2 & 1/2 \\ 0 & 0 & 1/2 \\ 0 & 1/2 & 0 \\ \end{bmatrix} + (1 - \alpha) \begin{bmatrix} 1/3 & 1/3 & 1/3 \\ 1/3 & 1/3 & 1/3 \\ 1/3 & 1/3 & 1/3 \\ \end{bmatrix} </math>M=α 1001/201/21/21/20 +(1−α) 1/31/31/31/31/31/31/31/31/3
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> M = 0.85 [ 1 1 / 2 1 / 2 0 0 1 / 2 0 1 / 2 0 ] + 0.25 [ 1 / 3 1 / 3 1 / 3 1 / 3 1 / 3 1 / 3 1 / 3 1 / 3 1 / 3 ] = [ 0.85 0.425 0.425 0 0 0.425 0 0.425 0 ] + [ 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 ] M = 0.85 \begin{bmatrix} 1 & 1/2 & 1/2 \\ 0 & 0 & 1/2 \\ 0 & 1/2 & 0 \\ \end{bmatrix} + 0.25 \begin{bmatrix} 1/3 & 1/3 & 1/3 \\ 1/3 & 1/3 & 1/3 \\ 1/3 & 1/3 & 1/3 \\ \end{bmatrix} = \begin{bmatrix} 0.85 & 0.425 & 0.425\\ 0 & 0 & 0.425\\ 0 & 0.425 & 0 \end{bmatrix} + \begin{bmatrix} 0.05 & 0.05 & 0.05 \\ 0.05 & 0.05 & 0.05 \\ 0.05 & 0.05 & 0.05 \end{bmatrix} </math>M=0.85 1001/201/21/21/20 +0.25 1/31/31/31/31/31/31/31/31/3 = 0.85000.42500.4250.4250.4250 + 0.050.050.050.050.050.050.050.050.05
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> M = [ 0.9 0.43 0.43 0.05 0.05 0.43 0.05 0.43 0.05 ] M = \begin{bmatrix} 0.9 & 0.43 & 0.43\\ 0.05 & 0.05 & 0.43\\ 0.05 & 0.43 & 0.05 \end{bmatrix} </math>M= 0.90.050.050.430.050.430.430.430.05

相关推荐
野風_199602013 分钟前
代码随想录第59天
算法
HappyAcmen10 分钟前
青训营-豆包MarsCode技术训练营试题解析四十八
开发语言·python·算法
码农老起17 分钟前
插入排序解析:时间复杂度、空间复杂度与优化策略
数据结构·算法·排序算法
俎树振29 分钟前
深入理解与优化Java二维数组:从定义到性能提升的全面指南
java·算法
DARLING Zero two♡37 分钟前
【优选算法】Sliding-Chakra:滑动窗口的算法流(上)
java·开发语言·数据结构·c++·算法
❦丿多像灬笑话、℡39 分钟前
leetcode 热题100(208. 实现 Trie (前缀树))数组模拟c++
算法·leetcode·c#
hjxxlsx40 分钟前
二维数组综合
c++·算法
ylfmsn1 小时前
线性回归背后的数学
算法·回归·线性回归
无名之逆1 小时前
lombok-macros
开发语言·windows·后端·算法·面试·rust·大学期末
yuanbenshidiaos1 小时前
C++-----图
开发语言·c++·算法