一篇文章带你看懂 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

相关推荐
Elastic 中国社区官方博客几秒前
如何将数据从 AWS S3 导入到 Elastic Cloud - 第 3 部分:Elastic S3 连接器
大数据·elasticsearch·搜索引擎·云计算·全文检索·可用性测试·aws
AI街潜水的八角9 分钟前
基于C++的决策树C4.5机器学习算法(不调包)
c++·算法·决策树·机器学习
白榆maple34 分钟前
(蓝桥杯C/C++)——基础算法(下)
算法
JSU_曾是此间年少38 分钟前
数据结构——线性表与链表
数据结构·c++·算法
此生只爱蛋2 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
咕咕吖2 小时前
对称二叉树(力扣101)
算法·leetcode·职场和发展
九圣残炎3 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
lulu_gh_yu3 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
丫头,冲鸭!!!3 小时前
B树(B-Tree)和B+树(B+ Tree)
笔记·算法
Re.不晚3 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea