pagerank js实现
Pagerank算法简介
Pagerank是一种用于衡量网页重要性的算法,基于链接结构分析。核心思想是:被更多高质量网页链接的网页具有更高权重。算法通过迭代计算每个页面的PR值,公式如下:
$$
PR(A) = (1 - d) + d \sum_{i=1}^{n} \frac{PR(T_i)}{C(T_i)}
$$
其中:

- $PR(A)$ 是页面A的Pagerank值
- $d$ 是阻尼因子(通常取0.85)
- $T_i$ 是链接到A的页面
- $C(T_i)$ 是页面$T_i$的出链数量
JavaScript实现步骤
初始化参数
定义页面链接关系图(邻接表)、阻尼因子$d$(默认0.85)、初始PR值(均匀分布)和收敛阈值。
const graph = {
'A': ['B', 'C'],
'B': ['C'],
'C': ['A'],
'D': ['C']
};
const d = 0.85;
const threshold = 0.0001;
初始化PR值
为每个页面分配初始PR值(总和为1)。

let pr = {};
const numPages = Object.keys(graph).length;
const initialValue = 1 / numPages;
for (const page in graph) {
pr[page] = initialValue;
}
迭代计算PR值
重复计算PR值直至收敛(变化小于阈值)。
function calculatePagerank() {
let delta = Infinity;
while (delta >= threshold) {
const newPr = {};
let totalChange = 0;
// 计算每个页面的新PR值
for (const page in graph) {
let sum = 0;
// 遍历所有页面,找到链接到当前页面的页面
for (const incomingPage in graph) {
if (graph[incomingPage].includes(page)) {
sum += pr[incomingPage] / graph[incomingPage].length;
}
}
newPr[page] = (1 - d) / numPages + d * sum;
totalChange += Math.abs(newPr[page] - pr[page]);
}
delta = totalChange;
pr = newPr;
}
return pr;
}
处理无出链的页面(陷阱问题)
若页面无出链,其PR值会被均匀分配到所有页面。
// 在迭代前检查并处理无出链的页面
for (const page in graph) {
if (graph[page].length === 0) {
graph[page] = Object.keys(graph); // 链接到所有页面
}
}
完整代码示例
function pagerank(graph, d = 0.85, threshold = 0.0001) {
const pages = Object.keys(graph);
const numPages = pages.length;
let pr = {};
pages.forEach(page => pr[page] = 1 / numPages);
// 处理无出链的页面
for (const page in graph) {
if (graph[page].length === 0) {
graph[page] = [...pages];
}
}
let delta = Infinity;
while (delta >= threshold) {
const newPr = {};
let totalChange = 0;
pages.forEach(page => {
let sum = 0;
pages.forEach(incomingPage => {
if (graph[incomingPage].includes(page)) {
sum += pr[incomingPage] / graph[incomingPage].length;
}
});
newPr[page] = (1 - d) / numPages + d * sum;
totalChange += Math.abs(newPr[page] - pr[page]);
});
delta = totalChange;
pr = newPr;
}
return pr;
}
注意事项
- 实际应用中需处理大规模数据,可通过稀疏矩阵优化性能。
- 阻尼因子$d$影响收敛速度,通常取0.85。
- 对于复杂场景(如动态网页),需结合其他排名因素。






