返回

文章详情

你本可以发明PageRank

Hacker News2026年8月26日 14:29

想象一下,1996年。你发现自己对像AltaVista这样的现有搜索引擎感到沮丧,它主要进行基于内容的搜索(如果你搜索“酒店”,它会给你一篇关于“鸡只酒店”的文章,因为这个词匹配)。肯定有更好的方法,对吧?嗯,事后看来,答案当然是肯定的。谢尔盖·布林和拉里·佩奇提出了这个精准的算法,即PageRank,它是帮助谷歌迅速崛起为家喻户晓的品牌并赚取大量财富的关键算法之一。谢尔盖和拉里都是斯坦福大学的研究生,所以他们想出如此惊人的算法并不令人感到惊讶。然而,问题是,你能否偶然想到同样的算法?我认为可以。PageRank在其核心象征着这些基本属性。每个页面都有一个“排名”或声誉。一个页面通过链接到另一个页面来分享它的“排名”,这有点像给予它一个批准的标记。一个页面的总排名/声誉是某个最小值加上它从邻居(链接它的任何页面)那里获得的所有声誉。就这样。为了通过一个具体的例子来巩固这一点。想象一个页面(比如BBC新闻)有50的声誉,它链接到5个不同的页面。假设它将80%的声誉(40)分配给它的链接页面(其余均匀分配给所有页面)。那么其每个链接页面将从BBC获得总共40/5 = 8分。你可能会编写一个非常简单(而且令人惊讶地可读)的Python程序来实现这一点,如下所示:# incoming[n]包含所有进入节点# outgoing[n]包含n的所有出口节点# 一个页面将其声誉的damping%分配给其邻居。# (1-damping)%均匀分配给所有页面。def pagerank ( incoming , outgoing , damping = .85 , tolerance = 1e-10 ): n = len (incoming) # 总页数 rank = [ 1 / n] * n # 初始排名。全部相等。 minimum_rank = ( 1 - damping) / n # 一个页面至少会从每个其他页面# 得到这个# 因为随机跳跃。 while True : old = rank.copy() for page, neighbors in enumerate (incoming): # 你从链接者那里得到这些(他们在均匀分配# 声誉给所有链接页面)acquired = sum ( old[neighbor] / len (outgoing[neighbor]) for neighbor in neighbors ) rank[page] = minimum_rank + damping * acquired # 直到算法收敛 if max ( abs (a - b) for a, b in zip (rank, old)) < tolerance: return rank 大致就是这样。如果你多次运行这些更新,最终会得到每个页面的排名,基本上告诉你它们的重要性。当然,这里做了一些假设(如没有悬挂节点等),但那些只是记账而已,你现在知道这个算法的核心内容了。祝贺你,如果你有一天回到1996年,你知道该怎么做才能成为亿万富翁!

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡