PageRank遇到无出链页面:漏掉的概率去了哪里
PageRank实现里有一种故障很隐蔽:每个节点都算出了正数,排行榜也正常出现,但所有分数之和逐轮缩小。问题常出在没有出链的节点上。流入它的概率下一轮应怎样分配,必须是模型的一部分,不能等计算结束才凭感觉补救。
AI生成概念示意图:圆环和回流路径表示概率重新分配,不是本文三节点图的精确连边或流量。
先固定方向和两个分布
构造三个页面A、B、C,只存在A→B、B→C两条边,C没有任何出链,称为悬挂节点。设沿链接移动的概率α=0.85,随机重启概率为0.15。重启分布v=(1/3,1/3,1/3),悬挂质量也按同一分布q=v重新分配。
这里使用行向量r表示节点概率,P的第i行表示从节点i出发的下一步分布。A行是(0,1,0),B行是(0,0,1),C行则补成(1/3,1/3,1/3)。包括留在C自己的可能性,每行之和都是1。迭代为r新=αrP+(1-α)v。
另一种等价写法是保留C的零行矩阵P₀,再单独计算悬挂质量d=rC,使用r新=αrP₀+αdq+(1-α)v。两种写法不要同时使用,否则会把悬挂质量补两遍。NetworkX官方实现采用单独累加悬挂质量的思路,并默认让q采用个性化分布。
第一步就能看见丢失
从均匀初值r₀=(1/3,1/3,1/3)出发,每个节点获得重启贡献0.05;C携带的1/3又乘上0.85,均分后给每个节点约0.094444。于是r₁≈(0.144444,0.427778,0.427778),总和仍为1。
若把C的出链循环直接跳过,同时又漏掉单独分配,第一步得到(0.05,0.333333,0.333333),总和只有0.716667。差的0.283333恰好是αr₀,C。这个差额关系比“数值看着不太对”更好用:每轮缺失量应直接对应上一轮悬挂节点的总概率乘以α。
重启项不会自动补满这个漏洞。它在本例里每轮只注入固定总量0.15,负责表达重新选择起点的行为;悬挂分配负责把原有概率继续送出去。两者承担不同角色,只有同时按已声明的模型处理,概率解释才完整。
用稳态方程独立验算
正确模型继续迭代,第二步约为(0.171204,0.293981,0.534815),第三步约为(0.201531,0.347054,0.451415)。分量可以来回变化,不应要求每个节点分数都单调上升或下降;应检查非负、总和与收敛残差。
稳态满足A=0.05+0.85C/3,B=0.05+0.85(A+C/3),C=0.05+0.85(B+C/3)。直接解方程,得到A=400/2169,B=740/2169,C=1029/2169,约为(0.184417,0.341171,0.474412)。三者相加正好为1。
C最高并不矛盾。它持续接收B的流入,又可以通过悬挂规则重新出发。没有普通出链,不等于不重要,也不等于应从图中删掉。节点是否存在、边是否缺失和应如何处理缺失,需要由数据含义决定;爬虫没有抓到出链,也不一定代表页面真的没有出链。
每轮除以总和,修成了另一个模型
一种常见修补是:先按漏项公式算出三个数,再除以它们的总和。它保证显示出来的总和为1,却改变了链接贡献与重启贡献的相对强度。本例反复这样做,会趋向约(0.103751,0.286745,0.609504),与正确稳态明显不同。
但也不能笼统宣称“一切事后归一化都错”。若先完整求出漏项线性方程z=αzP₀+(1-α)v的解,本例得到z=(0.05,0.0925,0.128625),总和0.271125。最后只归一化一次,恰好得到正确稳态。原因在于本例q=v,这种特定构造可以把丢失质量重新解释为同方向的注入。
这条等价性并不替每轮粗暴归一化背书,也不能随意推广到q与v不同的设置。验证时必须说清“在哪一步归一化”,以及悬挂分布是否与重启分布一致。只比较最后排行榜,甚至可能看不出概率模型已经改变,因为不同数值偶尔仍有相同顺序。
收敛要检验方程,不只检验循环结束
对固定的行随机矩阵P,且0≤α<1,映射r→αrP+(1-α)v在一范数下具有压缩性质,所以可以控制误差。若稳态残差为e=||r-αrP-(1-α)v||₁,到唯一固定点的误差不超过e/(1-α)。α越接近1,相同残差对应的误差界就越松。
本例α=0.85,因此残差界会放大约6.67倍。实现还应记录迭代次数、停止阈值和是否触及最大次数;“循环跑完”不等于已经达到所需精度。若改为α=1,这个压缩保证消失,周期结构与多个封闭分量便需要另外分析。
所有边权都应非负,并在同一出发节点内归一化。所谓无出链,不仅包括边数为零,也可能包括出边权重总和为零。若使用个性化v或单独指定q,要先检查它们非负且总和为1;不要一处用节点顺序,另一处却沿用了不同的字典或矩阵排序。
一个实用的测试集合不应只有普通链图。还应包含所有节点都没有出链的图、没有任何悬挂节点的环,以及带自环和非均匀边权的小图。所有节点都悬挂且两种分布相同时,一轮后就应回到该分布;这个边界能很快抓出悬挂质量重复乘阻尼系数的错误。
对于带权出边,分配依据应是权重比例。若一个节点连向两个目标,权重一大一小,却仍各分一半,就实现了另一张图。重复边是否合并也会影响这些比例。把图转换步骤纳入测试,可以避免数学迭代正确、输入语义却在预处理阶段悄悄改变的情况。
此外,概率质量守恒只是必要检查,并不是充分验证。把所有节点的分数一直设成均匀分布,同样非负且总和为一,却通常不满足稳态方程。应让归一化检查、方程残差检查与已知小图的精确答案同时存在;它们针对的是不同类型的错误,彼此不能代替。
如果最终只展示排名,也建议保留原始分数与计算版本。两个节点非常接近时,容差、边权舍入或图增量都可能交换顺序。是否需要把这种小差别解释给业务读者,应结合用途决定,而不是把每一次名次变化都叙述成重要性发生了显著改变。
本地验算分别使用有理数线性方程与逐节点迭代,并核对正确向量残差约为机器精度。用于业务排序时,还要记住分数描述的是当前图与跳转规则下的访问权重,不能直接当作页面内容可信度。图遗漏、边定义或个性化设置变化,都可能改变排名。
资料核对日期:2026年10月3日。三节点图和所有对照数值均为原创教学设定,已本地复算,未使用真实网站访问数据。
参考资料
NetworkX官方:PageRank实现、dangling分布与幂迭代


