数值分析大作业-PageRank

题目

互联网的使用已经深入人们的日常生活中,其巨大的信息量和强大的功能给人们的生产、生活带来了很大使利。随着网络信息量越来越庞大,如何有效地搜索出用户真正需要的信息变得十分重要。互联网巨头Google公司的核心技术就是通过PageRank 技术对海量的网页进行重要性分析。该技术利用网页相互链接的关系对网页进行组织,确定出每个网页的重要级别(PageRank)。当用户进行搜索时,Google找出符合搜索要求的网页,并按它们的PageRank 大小依次列出。这样,用户一般在显示结果的第一页或者前几页就能找到真正有用的结果。形象地解释,PageRank 技术的基本原理是:如果网页A 链接到网页B ,则认为“网页A投了网页B”一票,而且如果网页A 是级别高的网页,则网页B 的级别也相应地高。

假设 nn是 Internet 中所有可访问网页的数目,此数值非常大,2010 年已接近 100亿。定义n×nn\times n 的网页链接矩阵 G=(gij)Rn×nG=(g_{ij})\in\mathbb{R}^n\times n,若网页 jj 有一个链接到网页 ii,则 gij=1g_{ij}=1,否则 gij=0g_{ij}=0GG 矩阵有如下特点。

  1. GG 矩阵是大规模稀疏矩阵

  2. jj 列非零元素的位置表示了从网页 jj 链接出去的所有网页。

  3. ii行非零元素的位置表示了所有链接到网页ii 的网页。

  4. GG 矩阵中非零元的数目为整个Internet 中存在的超链接的数量

  5. GG 矩阵行元素之和 ri=igijr_i=\sum_ig_{ij},它表示第 ii 个网页的“入度”。

  6. GG 矩阵列元素之和 cj=igijc_j=\sum_ig_{ij},它表示第 jj 个网页的“出度”。

要计算 PageRank,可假设一个随机上网“冲浪”的过程,即每次看完当前网页后,有两种选择。

  • 在当前网页中随机选一个超链接进入下一个网页。
  • 随机新开一个网页。

这在数学上称为马尔可夫过程(Markov process)。若这样的随机“冲浪”一直进行下去,某个网页被访问到的极限概率就是它的 PageRank。

pp 为选择当前网页上链接的概率(如 p=0.85p=0.85),则 1p1-p 为不选当前网页的链接而随机打开一个网页的概率。若当前网页是网页 jj,则如何计算下一步浏览到达网页 ii 的概率(网页 jjii 的转移概率)? 它有两种可能性。

  • 若网页 ii 在网页 jj 的链接上,则其概率为 p×1/cj+(1p)×1/np\times1/c_j+(1-p)\times1/n
  • 若网页 ii 不在网页 jj 的链接上,则其概率为 (1p)×1/n.(1-p)\times1/n.

由于网页 ii 是否在网页 jj 的链接上由 gijg_{ij} 决定,因此网页 jjii 的转移概率为

aij=gij[p×1cj+(1p)×1n]+(1gij)[(1p)×1n]=pgijcj+1pna_{ij}=g_{ij}\left[p\times\frac1{c_j}+(1-p)\times\frac1n\right]+(1-g_{ij})\left[(1-p)\times\frac1n\right]=\frac{pg_{ij}}{c_j}+\frac{1-p}n

应注意的是,若 cj=0c_j=0 意味着 gij=0g_{ij}=0,上式改为 aij=1/na_{ij}=1/n 。任意两个网页之间的转移概率形成一个转移矩阵 A=(aij)n×nA=(a_{ij})_{n\times n}。设矩阵 DD 为各个网页出度的倒数(若没有出度,设为 1)构成的 nn 阶对角矩阵,ee 为全是1的 nn 维向量,则

A=pGD+efTA=pGD+ef^\mathrm{T}

其中向量 ff 的元素为

fj={(1p)/n,cj01/n,cj=0,j=1,2,,nf_j=\begin{cases}(1-p)/n,&c_j\neq0\\[2ex]1/n,&c_j=0\end{cases},\quad j=1,2,\cdots,n

xi(k),i=1,2,,nx_i^{(k)},i=1,2,\cdots,n 表示某时刻 kk 浏览网页 ii 的概率 (ixi(k)=1)(\sum_ix_i^(k)=1) ,向量 x(k)\mathbf{x}^{(k)} 表示当前时刻浏览各网页的概率分布,那么下一时刻浏览到网页 ii 的概率为 j=1n=aijxj(k)\sum_{j=1}^n=a_{ij}x_j^{(k)},此时浏览各网页的概率分布为 x(k+1)=Ax(k)x^{(k+1)}=\mathrm{Ax}^{(k)}

当这个过程无限进行下去,达到极限情况,即网页访问概率 x(k)\mathbf{x}^{(k)} 收敛到一个极限值,这个极限向量 xx 为各网页的 PageRank,它满足Ax=x\mathbf{Ax}=\mathbf{x},且 i=1nxi=1\sum_i=1^nx_i=1

使用幂法计算 PageRank。给定 n×nn\times n 的网页链接矩阵 GG,以及选择当前网页链接的概率 pp ,计算特征值 1 对应的特征向量 xx

{Ax=xi=1nxi=1\begin{cases}\mathrm{Ax}=\mathrm{x}\\\\\sum_{i=1}^nx_i=1\end{cases}

易知A1=1\parallel A\parallel_1=1,所以 ρ(A)1\rho(A)\leqslant1。又考虑矩阵 L=IA\mathcal{L}=I-A,容易验证它的各列元素和均为 0,则为奇异矩阵,所以 det(IA)=0\det(\boldsymbol{I}-\boldsymbol{A})=011A\boldsymbol{A} 的特征值、主特征值。更进一步,用圆盘定理考查矩阵 ATA^\mathrm{T} 的特征值分布,图3显示了第 jj 个圆盘 Dj,(j=1,2,,n)D_j,(j=1,2,\cdots,n) ,显然其圆心 ajj>0a_{jj}>0,半径 rjr_j 满足 ajj+rj=1a_{jj}+r_j=1,因此除了 1 这一点,圆盘上任何一点到圆心的距离(即复数的模)都小于1。这就说明,1是矩阵 ATA^\mathrm{T}AA 的唯一主特征值。对于实际的大规模稀疏矩阵 AA ,幂法是求其主特征向量的可靠的、唯一的选择。

网页的 PageRank 完全由所有网页的超链接结构决定,隔一段时间重新算一次PageRank,以反映 Internet 的发展变化,此时将上一次计算的结果作为幂法的送代初值可提高收敛速度。由于迭代向量以及矩阵 AA 的物理意义,使用幂法时并不需要对向量进行规格化,而且不需要形成矩阵 AA ,通过遍历整个网页的数据库, 根据网页间的超链接关系即可得到 Ax(k)Ax^{(k)} 的结果。

以一个只有6个网页的微型网络作为例子,其网页链接关系如图4所示,利用幂法计算该网络的PageRank。

分析

数学建模

  • 定义 网页链接矩阵 G=(gij)n×nG=(g_{ij})*{n \times n},其中 gij=1g*{ij}=1 表示网页 jj 链接到网页 ii,否则 gij=0g_{ij}=0

  • 转移概率矩阵

    A=(aij)n×nA=(a_{ij})_{n \times n}

    • 若网页 jj 有出链(cj>0c_j > 0),aij=pgijcj+1pna_{ij} = \frac{pg_{ij}}{c_j} + \frac{1-p}{n}
    • 若网页 jj 无出链(cj=0c_j = 0),aij=1na_{ij} = \frac{1}{n}
  • 使用 马尔可夫过程 模拟用户的浏览行为:

    • 随机点击超链接。
    • 随机打开新网页。

问题目标

  • 求解极限概率分布向量 x\mathbf{x},即网页的 PageRank 值,满足:

Ax=x,i=1nxi=1\mathbf{Ax} = \mathbf{x}, \quad \sum_{i=1}^n x_i = 1

  • 该向量反映了长期浏览过程中网页被访问的概率。

所用算法分析

为什么采用幂法?

幂法是一种高效、可靠的算法,特别适用于 PageRank 的需求:

  1. 矩阵 AA 的性质
    • AA 是列随机矩阵(每列元素和为 1)。
    • 具有主特征值 λ=1\lambda=1,且 ρ(A)=1\rho(A) = 1
  2. 大规模稀疏矩阵的特点
    • GG 是一个非常稀疏的矩阵(大多数元素为 0)。
    • 幂法不需要显式存储 AA,只需基于超链接关系逐列计算 AxAx,节省内存和计算资源。
  3. 唯一性与收敛性
    • AA 的主特征值 1 唯一,幂法能稳定收敛到其对应的特征向量。
    • 对于初始值的选取,算法具有鲁棒性,且可以利用之前的计算结果加速收敛。
  4. 物理意义
    • 矩阵 AA 的元素直接反映网页跳转概率。
    • 幂法的迭代形式对应于模拟用户浏览过程的多次重复。

幂法的优势:

  • 高效处理大规模数据。
  • 利用稀疏性减少计算量。
  • 可随时间更新 PageRank,以反映互联网结构的动态变化。

思路

要计算这个微型网络的 PageRank,我们需要构建转移矩阵 $ A $,并使用幂法迭代以求得特征值 1 对应的特征向量。下面是具体步骤:

构建链接矩阵 GG

根据图中的链接关系,构建 $ G $:

G=[000000100000010000101000001000001010]G = \begin{bmatrix} 0 & 0 & 0 & 0 & 0 & 0 \\ 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 & 0 \\ 1 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 1 & 0 \\ \end{bmatrix}

出度向量 cc 和对角矩阵 DD

计算每个网页的出度 cjc_j 并构造对角矩阵 DD

  • c=[2,1,3,1,1,2]c = [2, 1, 3, 1, 1, 2]
  • D=diag(1/2,1,1/3,1,1,1/2)D = \text{diag}(1/2, 1, 1/3, 1, 1, 1/2)

构造转移矩阵 AA

转移矩阵 $$ A $$的公式为:

A=pGD+efT,A = pGD + e f^\mathrm{T},

其中:

  • p=0.85p = 0.85(选择当前网页上链接的概率),
  • ee是全 1 的列向量,
  • fj=1pnf_j = \frac{1-p}{n}cj0c_j \neq 0,或 fj=1nf_j = \frac{1}{n}cj=0c_j = 0

对于 n=6n = 61p=0.151-p = 0.15

fj={0.156,若 cj0,16,若 cj=0.f_j = \begin{cases} \frac{0.15}{6}, & \text{若 } c_j \neq 0,\\ \frac{1}{6}, & \text{若 } c_j = 0. \end{cases}

计算得到:

f=[0.1560.1560.1560.1560.15616]T.f = \begin{bmatrix} \frac{0.15}{6} & \frac{0.15}{6} & \frac{0.15}{6} & \frac{0.15}{6} & \frac{0.15}{6} & \frac{1}{6} \end{bmatrix}^\mathrm{T}.

然后计算 AA

A=0.85GD+efT.A = 0.85 G D + e f^\mathrm{T}.

用幂法计算 PageRank

初始概率分布 x(0)x^{(0)}为均匀分布:

x(0)=[161616161616]T.x^{(0)} = \begin{bmatrix} \frac{1}{6} & \frac{1}{6} & \frac{1}{6} & \frac{1}{6} & \frac{1}{6} & \frac{1}{6} \end{bmatrix}^\mathrm{T}.

通过迭代公式:

x(k+1)=Ax(k),x^{(k+1)} = Ax^{(k)},

不断更新 xx,直到 x(k+1)x^{(k+1)}x(k)x^{(k)}的差异收敛到一个非常小的值。

算法设计及其详细描述

输入

  • 网页链接矩阵 GG
  • 阻尼因子 pp(通常 p=0.85p=0.85)。
  • 停止阈值 ϵ\epsilon(判断收敛的误差)。

输出

各网页的 PageRank 值向量 x\mathbf{x}

步骤

  1. 初始化
    • 构造初始概率分布向量 x(0)\mathbf{x}^{(0)},通常设为均匀分布:xi(0)=1nx_i^{(0)} = \frac{1}{n}
  2. 构造转移矩阵
    • 根据 GG 和网页出度构造稀疏矩阵 AA
      • cj>0c_j > 0aij=pgijcj+1pna_{ij} = \frac{pg_{ij}}{c_j} + \frac{1-p}{n}
      • cj=0c_j = 0aij=1na_{ij} = \frac{1}{n}
  3. 迭代更新
    • 使用公式 x(k+1)=Ax(k)\mathbf{x}^{(k+1)} = \mathbf{A} \mathbf{x}^{(k)} 进行迭代。
    • 可以直接用超链接关系计算 Ax(k)\mathbf{Ax}^{(k)},而不显式存储矩阵 AA
  4. 收敛判断
    • 若满足 x(k+1)x(k)1<ϵ|\mathbf{x}^{(k+1)} - \mathbf{x}^{(k)}|_1 < \epsilon,则停止迭代。
  5. 归一化
    • 确保最终向量 x\mathbf{x} 的元素和为 1。
  6. 输出结果
    • x\mathbf{x} 为各网页的 PageRank 值。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import numpy as np


def pagerank(G, p=0.85, tol=1.0e-6, max_iter=1000):
n = G.shape[0]
# 计算每个节点的出度
c = np.sum(G, axis=0)
# 创建对角矩阵 D
D = np.diag(1 / np.where(c != 0, c, 1))

# 创建向量 f
f = np.where(c != 0, (1 - p) / n, 1 / n)

# 构造转移矩阵 A
A = p * G @ D + np.outer(np.ones(n), f)

# 初始化 PageRank 向量
x = np.ones(n) / n

# 幂法迭代
for _ in range(max_iter):
x_new = A @ x
if np.linalg.norm(x_new - x, 1) < tol:
break
x = x_new

return x


# 图像中的示例网络
G = np.array([
[0, 0, 0, 1, 0, 1], # alpha
[1, 0, 0, 0, 0, 0], # beta
[0, 1, 0, 0, 0, 0], # gamma
[0, 1, 1, 0, 0, 0], # delta
[0, 0, 1, 0, 0, 0], # rho
[0, 0, 1, 0, 1, 0], # sigma
], dtype=np.float64)

pagerank_values = pagerank(G)
print("PageRank 值:", pagerank_values)

PageRank 值: [0.26752787 0.25239904 0.13226969 0.16974598 0.06247629 0.11558113]

参考代码来源:

  • 《Introduction to Algorithms》(算法导论)中的 Markov Chain 相关章节。
  • Python 机器学习库 networkx 的 PageRank 实现。

可能的改进方向

  1. 稀疏矩阵优化
    • 使用 scipy.sparse 或其他稀疏矩阵工具对 GGAA 进行稀疏存储和计算。
    • 利用稀疏矩阵的特性(非零元素远小于总数),通过稀疏矩阵乘法显著减少计算时间和内存需求。
  2. 引入非均匀随机跳转
    • 改进随机跳转向量 ff 的构造,结合网页的先验信息(如流量统计、内容质量)设置非均匀分布。
  3. 优化幂法
    • 使用加速收敛方法,如:
      • 加速幂法(Accelerated Power Method):通过动态调整步长加速收敛。
      • Arnoldi 方法Lanczos 方法:适用于求解大规模稀疏矩阵的特征向量。
    • 对幂法的初始值选择,使用历史 PageRank 结果作为初值以减少迭代次数。
  4. 并行化与分布式计算
    • 对大规模数据集,使用并行处理(如 GPU、CUDA)或分布式框架(如 Apache Spark)。
    • 将矩阵分块,结合分布式存储与计算进行大规模矩阵运算。
  5. 孤立节点处理
    • 对孤立节点加入动态权重分配模型,而不是固定的均匀分布 1/n1/n
    • 结合网络图的聚类算法,为孤立节点分配更合理的跳转概率。
  6. 高效存储与更新机制
    • 对于动态变化的互联网结构,使用增量计算方法,仅更新发生变化的部分网页链接。
    • 引入 动态 PageRank 算法,减少全局重新计算的频率。
  7. 结合用户行为数据
    • 将实际用户点击流数据引入模型(如用户访问的统计概率)。
    • 改进 Markov 转移矩阵 AA,提高实际应用中的搜索排序效果。