前言
90年代末,搜索引擎业务尚未成熟,来自斯坦福大学的拉里佩奇(Page)和谢尔盖布林捕捉到这个市场潜力后,决定开发一款强大而好用的搜索互联网的工具,他们通过算法来分析网页之间的联系,得出网页的重要性。这种算法后来成为谷歌公司的核心技术。如今,超万亿市值的Google公司背后蕴藏着美妙的代数奇迹。完整版python代码获取:【飞鸟CS】攻主号发送“PageRank”。
似乎有理由想象搜索引擎所做的是保存所有网页的索引,当用户输入查询搜索时,引擎浏览其索引并计算每个网络文件中关键词的出现次数。胜出者是关键词出现次数最多的页面。这些将显示给用户。这在90年代早期是正确的,当时第一个搜索引擎使用基于文本的排名系统来决定哪些页面与给定的查询最相关。然而,假设我们想找到一些信息。我们输入“Baidu”这个词,期望“www.baidu.com”会是与我们查询最相关的网站。然而,假设我们决定编写一个网站“www.baiduloopbillon.com”,其中只包含万亿次次“Baidu”这个词,除此之外什么都没有。如果搜索引擎所做的只是计算查询中给定单词的出现次数,那么我们的搜索引擎能找到期待的网站吗?答案显然是否定的。因此佩奇和布林在当时就构造出了PageRank算法来标记网站的重要程度,其大体思想是如果一个网站被很多网站引用或者链接那么这个网站是十分重要的,同时如果引用或者连接这个网站的网站中有十分重要的网站那么这个网站就更无敌了,重要性大大提升。回到刚才的问题,一旦PageRank提供给我们的网页重要性告诉我们“www.baidu.edu”的重要性远大于“www.baiduloopbillon.com”的重要性,那么返回我们期待的结果“www.baidu.com”将会是可以被期待的事情了。同时还需要说明PageRank的主要贡献在于他能够赋予网络中每个节点的重要度,而不是能够直接通过他来实现搜索引擎的搜索,这需要其他的算法支持。
图和矩阵
图结构是现代计算机科学研究和发展不可避免的一种“语言”。图是由一组非空顶点和一组边组成的对象。在处理现实世界中的图(Graph)时,我们有时将它们称为网络(Network)。顶点通常被称为节点,边缘被称为链接或线。边的集合可能是空的。一个包含4个节点4条边的图如图1所示。

有向图的两个顶点 i 和 j 如果有一条从 i 到 j 或从 j 到 i 的边,那么这两个顶点i和j是连接或相邻的。如果存在这样一条边,则 i 和 j 是它的端点。在图1中,顶点1和2是连接的,因为从1到2有一条边,而顶点1和3没有连接。然而,从节点2到节点1没有边。且任意两个顶点之间不能有超过两条边。图和矩阵之间有很强的关系,假设我们有一个有n个顶点的有向图。然后我们构造一个n × n的邻接矩阵A,如下所示:如果节点i到节点j有一条边,那么我们把矩阵A第i行第j列置为1,否则对应位置置为0。图1对应的邻接矩阵为:
如果一个人可以沿着图的边从节点 i 走到节点 j,那么我们说有一条从 i 到 j 的路径。如果我们走了k条边,那么这条路径的长度是k。对于矩阵,我们用表示矩阵是由A乘以它自己k次得到的。
的第 i 行第 j 列的条目= A·A,对应图中节点i到节点j长度为2的路径个数。邻接矩阵的平方为
意味着节点4->节点2有一路径,这个路径需要走两步。因为
其中k=2。同理,1到3也有一条路径。在图一中也可以看见这种拓扑关系。不难发现图和矩阵的对应关系。
以上是无权图转换为无权矩阵的方法,下面介绍无权图转换为带权矩阵的方法。规定如果从 i 到 j 有一条边顶点i的出界度是di,那么在第i列第j行置1/di,否则置0。此时图1中的图表示为带全矩阵结果为:
PageRank
例如,假设我们有一个小型互联网,由4个网站组成www.page1.com, www.page2.com, www.page3.com, www.page4.com,它们以图中所示的方式相互引用:
按照之前的解释,可以将这四个网页的引用关系轻松的抽象成如下网络

并进一步转换成如下矩阵:
下面以两种思路来解释PageRank:
思路一:动态过程思想:
假设最初的网页重要性均匀分布在图二4个节点(网页)之间,那么每个节点得到¼。那么用记初始的网页重要性向量,动态过程第一步将链接矩阵代表的连接重要性添加到当前四个网页重要性v当中。得到:
动态过程第二步将链接矩阵代表的连接重要性添加到当前四个网页重要性v'当中。得到:
如此往复,以至收敛,如下图所示:
而最终的即为图2四个网站的重要性的值,Page1最重要,Page3次之。需要说明此时的结果还不是PageRank的值,但是十分接近最终的PageRank值,且这个值代表着这四个节点的重要程度。
思路二:线性代数思想
图2中节点一由节点3和节点4所指,节点3传送的重要性为1,节点4传送的重要性为1-2,因此列出等式,类似地可以得到如下转换关系
接下来就需要求解上述方程组,相当于求解,得到解
,同时令重要性向量各元素之和一定为1,解得c=1/31。比较得此时重要性向量与思路一得到得重要性向量向量完全相同。
还不算完。
上述两种思路能够得到PageRank,但是事情还不算完,还有一些特殊情况需要考虑。
特殊情况一:

在图三情况下,
每一页的排名都是0。这是违反实际情况的,因为第3页有2个传入链接,所以它一定有一些重要性。那么问题出在哪了呢?因为网页3是一个只有入度没有初读的节点,因此,重要性传到网页3之后就不会再被传出,这导致了如上计算方法的PageRank失效。幻想一下,如果PageRank仅仅通过上述的方法计算节点的重要性,那么只要有人编写并部署一个没有输出链接的网页,PageRank将立刻失效,这是显然很恐怖的。
特殊情况二:

图4对应的邻接矩阵特征值1对应的特征向量分别为和
,他们都不能同时表示图4中五个节点的重要性。再幻想一下,在巨大的互联网中完全独立的两组网站的情况可能比比皆是,在这种情况下,PageRank也会立刻失效。
如何解决?
两种特殊情况之前的介绍还只是停留在解释为何矩阵左变右变,收敛结果就能够表示对应节点(网页)的重要性。以下才是PageRank的核心部分。针对这两个问题,佩奇和布林提出了PageRank矩阵(也叫谷歌矩阵或者佩奇矩阵),定义如下:
其中A代表对应网络的转移矩阵,n代表网络中节点个数,p代表阻尼系数,通常取0.15左右。对于特殊情况1和2而言,M的第二项相当于每次重要性进行传送的时候,随机挪动“解救”一定的重要性到无法直接到达的节点上。从而解决了特殊情况1和2面临的问题。
回到最初
以下p取0.2
对于图1:
M的20次幂和21次幂误差极小,认为已经收敛,故对应的PageRank值为
对于图2:
经计算,对应的PageRank值为:
#PageRank完
完整版python代码获取:【飞鸟CS】攻主号发送“PageRank”。
参考资料: