PageRank 五实验复盘:幂迭代 77 次收敛到 L1 差 4.92e-11 是什么概念
“PageRank 就是谷歌排序算法”——对,但面试里考的是你能不能用 numpy 从零写出来,并回答三个追问:迭代多少次收敛?阻尼因子怎么选?悬空节点不处理会怎样?本文用五个实验把这三个追问全部量化回答,全部数字来自 numpy 真实运行留档(8 页图小网络到 1 万节点大网络)。
一、五实验总览
| 实验 | 内容 | 实测 |
|---|---|---|
| E1 | 幂迭代 vs 线性代数解 | 77 次收敛,L1 差4.92e-11 |
| E2 | 容差扫描 | tol=1e-04 → 29 次;1e-10 → 77 次 |
| E3 | 阻尼因子扫描 | d=0.5 → 27 次;d=0.95 → 127 次 |
| E4 | spider trap + 悬空节点 | 修正后 138 次收敛,泄漏分值 0.0375 |
| E5 | 1 万节点规模测试 | 建图 0.27s,迭代 91 次26.35s |
二、E1/E2:收敛是"按数量级计价"的
核心实现只有四行:
for_inrange(max_iter):new=d*(M @ rank)+(1-d)/nifnp.linalg.norm(new-rank,1)<tol:breakrank=new容差每收紧两个数量级,迭代次数多 16 次左右(29→45→61→77)——幂迭代按几何速度收敛,每轮把误差乘以大约 d。工程含义:tol=1e-06 对排序场景足够,追求 1e-12 属于给自己买不来的精度。
三、E3:阻尼因子影响的是速度,不是结论
d 从 0.5 扫到 0.95,迭代次数 27 → 127,但Top3 排名全程稳定为 [0, 3, 2]。d 越大"随机跳转"越少、越贴近纯链接结构,收敛越慢。0.85 之所以是经典默认值,是速度与"尊重链接结构"的折中——不是精度魔法。
四、E4:悬空节点不处理,PageRank 直接漏分
4 页环 + 悬空节点的实验:不处理悬空节点(没有任何出链的页面),它的分值会凭空消失,全网 PageRank 和小于 1。修正方式是把悬空节点的分值均匀摊回全图,实测修正后收敛 138 次,悬空节点拿回 0.0375 分值。spider trap(自环环组)则靠 d 的随机跳转稀释——这就是 d 存在的第二层意义。
五、E5:一万节点 26 秒意味着什么
1 万节点随机图:numpy 建图 0.27 秒,幂迭代 91 次收敛 26.35 秒。稠密矩阵乘是 O(n²) 每轮——百万节点级要换稀疏矩阵(scipy.sparse)或图分区并行。但作为理解算法的基准,numpy 版是最诚实的参照系。
六、面试速答模板
- 收敛:幂迭代几何收敛,tol 每紧 2 个数量级多约 16 次(8 页图实测);
- 阻尼:影响速度不影响排序结论(d 扫描 Top3 不变);
- 陷阱:悬空节点摊回全图防泄漏,spider trap 靠 d 稀释。
五个实验的完整源码(pagerank.py 约 150 行注释版)+ 全部运行留档已打包,跑一遍胜过背十遍。
📦配套完整资源已整理上传:点击查看资源包(含 numpy 五实验源码与全部运行留档,开箱即跑)