PageRank算法

算法部分首先通过对理想情况的分析,阐述了PageRank算法的流程以及如何利用幂迭代法求解平稳向量,然后指出可能遇到的一些问题以及相应的解决方案。

证明部分主要涉及平稳向量存在性和正确性的证明以及利用幂迭代法求解平稳向量收敛性的证明。


PageRank算法
  1. 简介
  2. 算法
    2.1 理想情况
    2.2 幂迭代法
    2.3 存在的问题
      2.3.1 悬空结点
        问题描述
        解决方案
      2.3.2 幂迭代法不收敛
        问题描述
        解决方案
  3. 证明


1. 简介

PageRank算法是谷歌提出的,用于计算网页的重要性,当使用搜索引擎搜索网页的时候,越重要的网页越靠前显示。其基本思想是将网页抽象为图结点,网页之间的链接关系抽象为有向边,通过定义在这个有向图上的矩阵来计算各个网页之间的相对重要性。这里之所以说相对,是因为重要性的数值并没有实际意义,我们不能说网页A的重要性是2或者网页B的重要性是1,但可以说网页A比网页B重要或者网页A的重要性是网页B的两倍。


2. 算法

2.1 理想情况

如上图,假设图中3个点ABC分别表示3个网页,图中的有向边表示网页的链接关系,点A到点B有一条有向边,其含义是网页A中有一条链接可以跳转到网页B。记某网页,比如网页A,的重要性为I(A),则各个网页的重要性

I(A)=\frac{I(C)}{2}

I(B)=\frac{I(A)}{2} + \frac{I(C)}{2}

I(C)=\frac{I(A)}{2} + \frac{I(B)}{1}

可以看出,某网页的重要性是由链接到该网页的网页所决定的。网页B可以由网页A或网页C跳转过来,所以网页B的重要性由网页A和网页C决定。网页C可以跳转到网页A或网页B,相当于网页C将其重要性平均分给了网页A和网页B。上面三个式子可以写成矩阵乘法的形式,如下式所示

\begin{bmatrix} I(A) \\ I(B) \\ I(C) \end{bmatrix} = \begin{bmatrix} 0 & 0 & \tfrac{1}{2} \\ \tfrac{1}{2} & 0 & \tfrac{1}{2} \\ \tfrac{1}{2} & 1 & 0 \\ \end{bmatrix} \begin{bmatrix} I(A) \\ I(B) \\ I(C) \end{bmatrix} \tag{1}

(1)形如H\vec{x}=1\vec{x},其解为H矩阵特征值为1时候的特征向量\vec{v}=(v_1, \cdots, v_n)^T,称其为平稳向量(stationary vector)。所以各网页的重要性可以用相应的v_i, i \in \{1, 2, \cdots, n \}来衡量。这里需要注意的一点是,我们不加以证明地假设v_i \ge 0, \forall i \in \{1, 2, \cdots, n \}成立,因为一个网页的重要性为负值没有实际意义,若\vec{v}为平稳向量,令\lambda > 0,则\lambda \vec{v}也是平稳向量,也可以用来衡量网页的重要性。所以网页重要性的数值没有什么意义,真正有意义的是各网页之间的相对重要性,这种关系不会因为乘了一个常数而改变,所以方便起见,一般令\begin{matrix} \sum_{i=1}^n v_i = 1 \end{matrix}

综上,PageRank算法大致分为两步,首先根据网页之间的链接关系得到H矩阵,然后计算H矩阵的平稳向量。

2.2 幂迭代法

如前文所述,我们需要计算H_{n \times n}矩阵的平稳向量来得到网页的重要性,实际中,n的值可能非常大,如何快速得到平稳向量呢,我们可以利用幂迭代法解决这个问题。这部分内容主要讲计算流程,关于幂迭代法的相关证明,可见证明部分。

幂迭代法首先选取一个初始向量\vec{v}^{(0)},通过计算\vec{v}^{(1)}=H\vec{v}^{(0)}\vec{v}^{(2)}=H\vec{v}^{(1)},……,\vec{v}^{(k)}=H\vec{v}^{(k-1)},得到一个序列\vec{v}^{(0)}\vec{v}^{(1)}\vec{v}^{(2)},……,\vec{v}^{(k)},当k \rightarrow +\infty\vec{v}^{(k)}会收敛到平稳向量。如图所示,该图的H矩阵

H = \begin{bmatrix} 0 & 0 & \tfrac{1}{2} \\ \tfrac{1}{2} & 0 & \tfrac{1}{2} \\ \tfrac{1}{2} & 1 & 0 \\ \end{bmatrix}

直接计算可得H矩阵的平稳向量为\vec{v}=(0.22, 0.33, 0.44)^T,令\vec{v}^{(0)}=(0.33, 0.33, 0.33)^T,即最开始每个网页具有相同的重要性,记录幂迭代法的计算过程,可以得到下面的表格

\vec{v}^{(0)} \vec{v}^{(1)} \vec{v}^{(2)} \vec{v}^{(3)} \vec{v}^{(4)} \vec{v}^{(5)} \vec{v}^{(6)} \vec{v}^{(7)} \cdots \vec{v}^{(100)}
\begin{pmatrix} 0.33 \\ 0.33 \\ 0.33 \end{pmatrix} \begin{pmatrix} 0.17 \\ 0.33 \\ 0.50 \end{pmatrix} \begin{pmatrix} 0.25 \\ 0.33 \\ 0.42 \end{pmatrix} \begin{pmatrix} 0.21 \\ 0.33 \\ 0.46 \end{pmatrix} \begin{pmatrix} 0.23 \\ 0.33 \\ 0.44 \end{pmatrix} \begin{pmatrix} 0.22 \\ 0.33 \\ 0.45 \end{pmatrix} \begin{pmatrix} 0.22 \\ 0.33 \\ 0.44 \end{pmatrix} \begin{pmatrix} 0.22 \\ 0.33 \\ 0.44 \end{pmatrix} \ldots \begin{pmatrix} 0.22 \\ 0.33 \\ 0.44 \end{pmatrix}

可以看到,该向量序列逐渐向\vec{v}靠拢。

2.3 存在的问题

前面讨论的是理想情况下的PageRank算法,这部分讨论可能存在的问题。

2.3.1 悬空结点

问题描述

悬空结点指的是没有出度的结点,也就是说该网页没有链接到其他网页。如下图,网页D就是一个悬空结点,这时如果采用幂迭代法计算平稳向量就会出现问题。

上图的H矩阵

H= \begin{bmatrix} 0 & 0 & \tfrac{1}{2} & 0 \\ \tfrac{1}{3} & 0 & \tfrac{1}{2} & 0 \\ \tfrac{1}{3} & \tfrac{1}{2} & 0 & 0 \\ \tfrac{1}{3} & \tfrac{1}{2} & 0 & 0 \\ \end{bmatrix}

\vec{v}^{(0)}=(0.25, 0.25, 0.25, 0.25)^T,迭代过程如下

\vec{v}^{(0)} \vec{v}^{(1)} \vec{v}^{(2)} \cdots \vec{v}^{(5)} \cdots \vec{v}^{(10)} \cdots \vec{v}^{(100)}
\begin{pmatrix} 0.250 \\ 0.250 \\ 0.250 \\ 0.250 \end{pmatrix} \begin{pmatrix} 0.125 \\ 0.208 \\ 0.208 \\ 0.208 \end{pmatrix} \begin{pmatrix} 0.104 \\ 0.146 \\ 0.146 \\ 0.146 \end{pmatrix} \cdots \begin{pmatrix} 0.039 \\ 0.057 \\ 0.057 \\ 0.057 \end{pmatrix} \cdots \begin{pmatrix} 0.008 \\ 0.012 \\ 0.012 \\ 0.012 \end{pmatrix} \cdots \begin{pmatrix} 0 \\ 0 \\ 0 \\ 0 \end{pmatrix}

可以看到,向量序列收敛到(0, 0, 0, 0)^T,这显然是不正确的。原因是在每一次的迭代过程中,网页D都会“吸收”一部分重要性,从而使得每一次迭代后,网页整体的重要性都会减少,最后网页整体的重要性会变成0,从而每个网页的重要性都为0

如果给D结点添加一条边,指向其自身,如下图所示,其H矩阵

H= \begin{bmatrix} 0 & 0 & \tfrac{1}{2} & 0 \\ \tfrac{1}{3} & 0 & \tfrac{1}{2} & 0 \\ \tfrac{1}{3} & \tfrac{1}{2} & 0 & 0 \\ \tfrac{1}{3} & \tfrac{1}{2} & 0 & 1 \\ \end{bmatrix}

重复上述的迭代过程,会有一个很有意思的结果,向量序列收敛到(0, 0, 0, 1)^T。直观来讲,在每一次的迭代过程中,其他网页的重要性会流向网页D,而网页D的重要性则只流向其自身,最后所有的重要性都会集中在网页D上。

解决方案

如上图所示,其H矩阵

H= \begin{bmatrix} 0 & 0 & \tfrac{1}{2} & 0 \\ \tfrac{1}{3} & 0 & \tfrac{1}{2} & 0 \\ \tfrac{1}{3} & \tfrac{1}{2} & 0 & 0 \\ \tfrac{1}{3} & \tfrac{1}{2} & 0 & 0 \\ \end{bmatrix}

从概率的角度来看H矩阵,其元素H_{ji}表示从网页i跳转到网页j的概率,以第一列为例,H_{21}=H_{31}=H_{41}=\tfrac{1}{3},说明在浏览网页A的时候,等可能地会跳转到网页BC或者D,这也和图相符。对于悬空结点,其不能跳转到任何网页,所以H矩阵第四列元素全部为0。所以H矩阵有个性质,非悬空结点对应的列所有元素加起来等于1

问题在于,假如进入了网页D,则不会再跳转到其他网页了,在这实际中是不可能的。所以,对于悬空节点,假定其可以跳转到任意网页,包括自身,并且跳转到这些网页的概率是相等的,则这一列元素可以全部用\tfrac{1}{n}代替,那么修正后的矩阵

S=H+A= \begin{bmatrix} 0 & 0 & \tfrac{1}{2} & \tfrac{1}{4} \\ \tfrac{1}{3} & 0 & \tfrac{1}{2} & \tfrac{1}{4} \\ \tfrac{1}{3} & \tfrac{1}{2} & 0 & \tfrac{1}{4} \\ \tfrac{1}{3} & \tfrac{1}{2} & 0 & \tfrac{1}{4} \\ \end{bmatrix}

其中

A= \begin{bmatrix} 0 & 0 & 0 & \tfrac{1}{4} \\ 0 & 0 & 0 & \tfrac{1}{4} \\ 0 & 0 & 0 & \tfrac{1}{4} \\ 0 & 0 & 0 & \tfrac{1}{4} \\ \end{bmatrix}

我们这样定义A矩阵,悬空结点对应的那一列,矩阵元素全部为\tfrac{1}{n},其余结点对应的列元素全部为0。这样得到的S矩阵是一个列随机矩阵,即\sum_i S_{ij} = 1, \forall j

2.3.2 幂迭代法不收敛

问题描述

上图的H矩阵

H= \begin{bmatrix} 0 & 0 & 0 & 1 \\ 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix}

\vec{v}^{(0)}=(0.1, 0.2, 0.3, 0.4)^T,迭代过程如下,可以看出,向量序列并不收敛,其呈现一种周期性。

\vec{v}^{(0)} \vec{v}^{(1)} \vec{v}^{(2)} \vec{v}^{(3)} \vec{v}^{(4)}
\begin{pmatrix} 0.1 \\ 0.2 \\ 0.3 \\ 0.4 \end{pmatrix} \begin{pmatrix} 0.4 \\ 0.1 \\ 0.2 \\ 0.3 \end{pmatrix} \begin{pmatrix} 0.3 \\ 0.4 \\ 0.1 \\ 0.2 \end{pmatrix} \begin{pmatrix} 0.2 \\ 0.3 \\ 0.4 \\ 0.1 \end{pmatrix} \begin{pmatrix} 0.1 \\ 0.2 \\ 0.3 \\ 0.4 \end{pmatrix}

解决方案

假设现在有\alpha的概率以S_{n \times n}矩阵进行网页之间的跳转,有1-\alpha的概率随机选择一个网页进行浏览,则修正后的矩阵为

M_{n \times n}= \alpha S_{n \times n} + (1 - \alpha) \tfrac{1}{n}1

其中\alpha \in [0,1) ,一般取\alpha=0.85。我们可以证明,对M矩阵采用幂迭代法一定能收敛到其平稳向量。


3. 证明

未完待续

推荐阅读更多精彩内容