每天学一个算法--PageRank

📘 教案 21:PageRank(完整数学与算法机制)


一、问题背景

在一个包含大量网页的网络中,每个网页之间通过超链接相互连接。问题是:

如何评价一个网页的重要性?


直观但错误的思路

最简单的方法:

  • 被链接次数越多 → 越重要

但问题是:

  • 垃圾网页互相链接
  • 权重无法区分

核心改进思想

一个网页的重要性,取决于"指向它的网页的重要性"


二、图模型表示


将网页系统抽象为有向图:

G = (V, E)

  • 节点:网页
  • 边:超链接(A → B)

定义

设:

PR(v) = \\text{节点 v 的重要性}


三、PageRank 基本公式


核心递推关系:

PR(v) = \\sum_{u \\in In(v)} \\frac{PR(u)}{L(u)}


含义

  • (In(v)):所有指向 v 的节点
  • (L(u)):节点 u 的出度(它指向多少个页面)

解释

每个页面将自己的"权重"平均分给它指向的页面


四、随机游走模型(关键理解)


PageRank 可以解释为:

一个"随机用户"在网页之间不断点击链接


规则:

  • 在当前页面,随机选择一个链接跳转
  • 不断重复

那么:

页面被访问的概率 = PageRank 值


五、问题:收敛性与死循环


存在问题:


1️⃣ 无出边节点(Dead End)

例如:

text 复制代码
A → B
B → (无)

👉 权重会消失


2️⃣ 小圈子(Spider Trap)

text 复制代码
A → B → C → A

👉 权重被困住


六、引入阻尼因子(Damping Factor)


改进公式:

PR(v) = \\frac{1-d}{N} + d \\sum_{u \\in In(v)} \\frac{PR(u)}{L(u)}


参数说明

  • (d):阻尼系数(通常 0.85)
  • (N):节点总数

含义

用户行为:

  • 85%:点击链接
  • 15%:随机跳转

👉 解决:

  • 死节点
  • 小圈子

七、矩阵形式(严格表达)


设:

PR = M \\cdot PR

其中:

  • (M):转移矩阵

加入阻尼后:

PR = d M PR + \\frac{1-d}{N} \\mathbf{1}


👉 本质:

求一个"稳定分布"(特征向量问题)


八、求解方法(迭代法)


初始化:

PR\^{(0)} = \\left\[\\frac{1}{N}, \\dots, \\frac{1}{N}\\right

]


迭代:

PR\^{(k+1)} = d M PR\^{(k)} + \\frac{1-d}{N}


直到:

\|\|PR\^{(k+1)} - PR\^{(k)}\|\| \< \\epsilon


九、算法复杂度


每轮计算:

O(E)


总复杂度:

O(E \\cdot k)

(k 为迭代次数)


十、核心性质


1. 全局依赖

每个节点的值依赖全图


2. 递归定义

类似:

text 复制代码
重要性 = 别人对你的评价

3. 收敛性

在阻尼因子存在时:

必然收敛


十一、工程实现关键点


1️⃣ 稀疏矩阵优化

图通常很稀疏:

👉 用邻接表存储


2️⃣ 并行计算

每轮更新独立:

👉 可分布式计算


3️⃣ MapReduce / Spark 实现


十二、与其他算法的关系


算法 类型
BFS 局部搜索
Dijkstra 最短路径
PageRank 全局评分

👉 PageRank 是:

图上的"全局迭代优化算法"


十三、本质总结(严肃表达)


PageRank 通过构建随机游走模型,将网页重要性转化为稳态概率分布问题,并通过迭代计算得到全局一致的节点评分。


🔥 这一节的层级非常重要

你现在已经进入:

text 复制代码
图算法 → 概率模型 → 线性代数 → 工程计算
相关推荐
05Kevin3 小时前
lk每日冒险题--数据结构6.27
算法
To_OC14 小时前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安19 小时前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者21 小时前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
kisshyshy1 天前
从递归到迭代,一文吃透二叉树的核心知识与 JavaScript 实现
javascript·算法·代码规范
To_OC2 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
用户938515635072 天前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法