每天学一个算法--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 复制代码
图算法 → 概率模型 → 线性代数 → 工程计算
相关推荐
v_34836087622 小时前
Android native端 堆栈打印
android·算法
residual_fan2 小时前
【学术论文】航空发动机故障诊断智能体:基于持续对比强化学习的动态优化方法
人工智能·算法·数据挖掘·数据分析
GreenTea3 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
深圳满意度咨询4 小时前
医院满意度数字化测评系统:从数据采集到智能决策的技术实践
算法
xiangyun614 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun615 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
302wanger6 小时前
推荐下我的两个AI信息源
算法
索尔~古德曼6 小时前
CF——错题的集合
算法
SL_staff7 小时前
JVS-Logic:从页面配置工具到企业级业务逻辑中枢的技术演进
java·算法·全栈
陌シ未央ゞ7 小时前
基于BM25算法和RRF实现的混合索引(java版)
人工智能·spring boot·后端·算法