基本原理

在互联网上,如果一个网页被很多其他网页所链接,说明它受到普遍的承认和信赖,那么它的排名就高。这就是PageRank的核心思想。

引用来自《数学之美》的简单例子:

网页Y的排名应该来自于所有指向这个网页的其他网页的权重之和,在上图中Y的网页排名就是0.001 + 0.01 + 0.02 + 0.05 = 0.081。

如此,就可以把互联网简化成一个有向图,每个结点就代表一个网页,边就代表网页之间的链接关系。

接下来以具体的例子来介绍如何计算:

令 $PR = \left (PR_{1}\ ,\ PR_{2} \ ,\cdots ,PR_{N}\right )^{T}$为各个网页的排名,上图的网络用邻接矩阵来表示就是:

$S = \begin{pmatrix}
0 & 0& 0& 0& 1\\
1/3 & 0& 0& 0 &0 \\
1/3 & 0& 0& 0& 0\\
1/3 & 1/2& 0& 0 &0 \\
0& 1/2& 1& 1& 0
\end{pmatrix}$

注意,每一列的元素和为1。

需要额外注意的是,该算法要实现的前提之一是图必须是强连通的,所以如果网络中存在没有出链的结点,那么就需要处理一下。处理方法是让该结点对所有其他结点都有出链(包括它自身)。

PageRank算法是通过迭代来实现的,假定$PR_{i}$是第$i$次迭代的结果,那么

$PR_{i} = S\cdot PR_{i-1}$

当经过多次迭代后,最后得到一个稳定的PR值。

现在因为我们一开始不知道网页的初始排名,所以令$PR_{i} = \left (\frac{1}{N}\ ,\ \frac{1}{N} \ ,\cdots ,\frac{1}{N}\right )^{T}$。

上文说到图必须是强连通的,除了存在没有出链的结点,还存在只对自己出链的结点,若是访问了此结点,那就一直在该结点处循环。当然了,我们可不会一直很傻的在该网页停留,在现实中,我们也会通过输入一个新的地址来访问别的网页,这个网页是随机的,和当前网页可以没有关系。

为此引入一个新的变量$\alpha $,表示用户以$\alpha $的概率访问该网页所链接的网页,以$1-\alpha $的概率随机访问图中任意网页。

新的迭代公式就是:

$PR_{i} = \frac{1-\alpha }{N}\cdot e^{T}\cdot e + \alpha *S\cdot PR_{i-1} $

其中$e^{T}$为全1的列向量。

Python算法实现

接下来就用python来计算上面的网页排名,代码如下:

 import numpy as np

 def page_rank(graph, alpha, eps, max_step):
node = graph.shape[0] # 网络中结点个数 pr = []
for i in range(node): # 初始访问概率
pr.append(1/node) pr = np.array(pr)
pr = pr.reshape(pr.shape[0], 1) y = [] # 跳转至任意网页的概率
x = (1.0-alpha)/node
for i in range(node):
y.append(x)
y = np.array(y)
y = y.reshape(y.shape[0], 1) for i in range(max_step):
pre_pr = pr
pr = np.dot(alpha * graph, pr) + y if abs(np.min(pr - pre_pr)) < eps:
print("The algorithm converges to the %dth iteration!" % i)
print(pr)
return print("failed!") if __name__ == '__main__':
graph = np.array([[0, 0, 0, 0, 1],
[1/3, 0, 0, 0, 0],
[1/3, 0, 0, 0, 0],
[1/3, 1/2, 0, 0, 0],
[0, 1/2, 1, 1, 0]])
page_rank(graph, 0.85, 1e-6, 100)

最后的运行结果:

MapReduce实现

这部分我也是用Python代码实现的,想看的可以转至我的另一篇随笔:传送文

参考:

[1] 【机器学习】【PageRank算法-1】PageRank算法原理介绍

[2] PageRank算法--从原理到实现

[3] 吴军. 数学之美. PageRank——Google的民主表决式网页排名技术

PageRank算法实现的更多相关文章

  1. 【原创】机器学习之PageRank算法应用与C#实现(2)球队排名应用与C#代码

    在上一篇文章:机器学习之PageRank算法应用与C#实现(1)算法介绍 中,对PageRank算法的原理和过程进行了详细的介绍,并通过一个很简单的例子对过程进行了讲解.从上一篇文章可以很快的了解Pa ...

  2. 【原创】机器学习之PageRank算法应用与C#实现(1)算法介绍

    考虑到知识的复杂性,连续性,将本算法及应用分为3篇文章,请关注,将在本月逐步发表. 1.机器学习之PageRank算法应用与C#实现(1)算法介绍 2.机器学习之PageRank算法应用与C#实现(2 ...

  3. 张洋:浅析PageRank算法

    本文引自http://blog.jobbole.com/23286/ 很早就对Google的PageRank算法很感兴趣,但一直没有深究,只有个轮廓性的概念.前几天趁团队outing的机会,在动车上看 ...

  4. PageRank算法简介及Map-Reduce实现

    PageRank对网页排名的算法,曾是Google发家致富的法宝.以前虽然有实验过,但理解还是不透彻,这几天又看了一下,这里总结一下PageRank算法的基本原理. 一.什么是pagerank Pag ...

  5. PageRank算法

    PageRank,网页排名,又称网页级别,传说中是PageRank算法拯救了谷歌,它是根据页面之间的超链接计算的技术,作为网页排名的要素之一.它通过网络浩瀚的超链接关系来确定一个页面的等级.Googl ...

  6. [转]PageRank算法

    原文引自: 原文引自: http://blog.csdn.net/hguisu/article/details/7996185 感谢 1. PageRank算法概述 PageRank,即网页排名,又称 ...

  7. Hadoop应用开发实战(flume应用开发、搜索引擎算法、Pipes、集群、PageRank算法)

    Hadoop是2013年最热门的技术之一,通过北风网robby老师<深入浅出Hadoop实战开发>.<Hadoop应用开发实战>两套课程的学习,普通Java开发人员可以在最快的 ...

  8. 关于pagerank算法的一点点总结

    1. PageRank算法每个顶点收敛的值与每个点的初值是没有关系的,每个点随便赋初值. 2.像q=0.8这样的阻尼系数已经解决了PageRank中处在的孤立点问题.黑洞效应问题. 3.当有那个点进行 ...

  9. 浅析PageRank算法

    很早就对Google的PageRank算法很感兴趣,但一直没有深究,只有个轮廓性的概念.前几天趁团队outing的机会,在动车上看了一些相关的资料(PS:在动车上看看书真是一种享受),趁热打铁,将所看 ...

  10. PageRank算法第一篇

    摘要by crazyhacking: 一 搜索引擎的核心问题就是3个:1.建立资料库,通过爬虫系统实现:2.建立一种数据结构,可以根据关键词找到含有这个词的页面.通过索引系统(倒排索引)实现.3排序系 ...

随机推荐

  1. Java学习--抽象类和接口

    https://www.cnblogs.com/dolphin0520/p/3811437.html 抽象类 先了解一下[抽象方法]—一种特殊的方法,只有声明,没有具体的实现  abstract vo ...

  2. 【转】mysql保存图片技术决定:保存二进制文件还是只保存图片相对路径,图片放在硬盘上面?

    最近遇到上面这个问题,一开始我就果断否决了数据库保存图片的策略,主要是太蠢!事实上我的决定是正确的,我仅仅理解为mysql读写性能提高的境界,具体为什么可以提高?很模糊,知道我看到了这里: 大佬做的实 ...

  3. MVC模式笔记

    参见:https://martinfowler.com/eaaCatalog/modelViewController.html 企业应用架构模式(P of EAA)第14章Web表现模式第一节MVC笔 ...

  4. PHP字符串格式化特点和漏洞利用点

    转载至: https://www.anquanke.com/post/id/170850 PHP中的格式化字符串函数 在PHP中存在多个字符串格式化函数,分别是printf().sprintf().v ...

  5. 关于asp.net中链接数据库的问题

    学习了asp.net 有web服务器控件和C#代码两部分 那么在做页面时候,需要用到数据库和asp.net的链接 课本上只是说明了和SQL server的链接,本文介绍如何在.net中链接 Acces ...

  6. JavaIO流——简单对文件的写入及读取(一)

    IO,即Input(输入)和Output(输出)的首字母缩写. 在编程语言的I/O类库中常使用流这个抽象概念.它代表任何有能力产出数据的数据源对象或者是与能力接收数据的接收端对象.“流”屏蔽了实际的I ...

  7. PHP 以最快的方式判断字符串是否以某给定字符串开始

    好久没搞代码了,最近找工作,重操旧业,在整理以前写的框架的时候发现,之前的自动加载部分执行速度上还是有可优化空间的,就是如果类名是以 risen\ 开始的(我的框架中的类都在此命名空间下),那么可直接 ...

  8. .NetCore技术研究-EntityFramework Core 3.0 Preview

    前段时间.Net Core 3.0 发布了,Entity Framework Core 3.0 也发布了Preview版.假期用了一上午大致研究了一遍,同时又体验了一把Visual Studio 20 ...

  9. React(上)

    一.React基础 1.React模板 凡是使用JSX的地方,要加上type="text/babel".引用三个库react.js是React的核心库,react-dom.js提供 ...

  10. highcharts 大数据 String+,StringBuilder,String.format运行效率比较

    实现String字符串相加的方法有很多,常见的有直接相加,StringBuilder.append和String.format,这三者的运行效率是有差异的,String是final类型的,每次相加都会 ...