每天学一个算法--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 复制代码
图算法 → 概率模型 → 线性代数 → 工程计算
相关推荐
QXWZ_IA7 小时前
1库1图1批是什么?千寻位置公安地图数据体系详解
科技·算法·能源·媒体·交通物流·政务
c238568 小时前
Bug 猎手入门指南
c++·算法·bug
Reart9 小时前
Leetcode 213.打家劫舍2(内含闲谈,打劫真是技术活,好题,716)
后端·算法
Reart9 小时前
Leetcode 198.打家劫舍(716)
后端·算法
Jerry10 小时前
LeetCode 110. 平衡二叉树
算法
玖玥拾10 小时前
C++ 数据结构 八大基础排序算法专题
数据结构·c++·算法·排序算法
Tim_1010 小时前
【C++】017、new/delete与malloc/free的区别
java·数据结构·算法
从零开始的代码生活_11 小时前
C++ list 原理与实践:双向链表、迭代器与简化实现
开发语言·c++·后端·学习·算法·链表·list
ttod_qzstudio12 小时前
【软考算法】软件设计师下午第四题之动态规划:0-1 背包与最长公共子序列的“填表艺术“
算法·动态规划·软考