在我的一篇博客PageRank中,在5.1 算法实现中简单实现部分原本是有一个错误的。这个错误也体现出我当时对PageRank算法有理解上的偏差。


这是个什么样的错误呢?是这样的:

简单实现中计算每个网页的PR值时使用的是最原始的方法,即下面的这个公式:

\[PR(p_{i}) = \alpha \sum_{p_{j} \in M_{p_{i}}} \frac{PR(p_{j})}{L(p_{j})} + \frac{(1 - \alpha)}{N}
\]

这个公式要求所有网页的PR值之和为1。而我原本的代码中给每个网页赋予的初始PR值的代码为:

page_rank = dict.fromkeys(nodes, 1.0)  # 给每个节点赋予初始的PR值

也就是说,我给出的初始PR值之和为5(例子中共有5个网页)。

犯这个错误的原因是我理解错了“与\(P_0\)的选取无关”这句话。正确的理解应该是:“与\(P_0\)的初始概率分布无关”。


然而,我理解错了也还有另一个原因,那就是我原来的程序中不管给出的初始PR值是多少,最终的PR值都是一样的。现分析如下:

按照我原本的程序逻辑,我使用的公式应该是这样的,其中\(G\)为所有网页:

\[PR(p_{i}) = \alpha \sum_{p_{j} \in M_{p_{i}}} \frac{PR(p_{j})}{L(p_{j})} +
\frac{(1 - \alpha)}{N} \sum_{p_k \in G} PR(p_k)
\]

而我却使用了最原始的公式,造成了:

\[每轮迭代,每个页面的PR值都减少了 \frac{(1 - \alpha)}{N} * (上轮PR值总和 - 1) \\
\Rightarrow 每轮迭代,PR值总和都减少了 (1 - \alpha) * (上轮PR值总和 - 1)
\]

现假设初始PR值总和为 \(A_0\),则有:

\[最开始,PR值总和为:A_0 \\
第一轮迭代之后,PR值总和为:A_1 = A_0 - (1 - \alpha) (A_0 - 1) = \alpha A_0 + 1 - \alpha \\
以此类推,则有 \\
A_{n} = \alpha A_{n-1} + 1 - \alpha \\
\Rightarrow A_{n} - 1 = \alpha (A_{n-1} - 1) \\
\Rightarrow A_{n} - 1 = \alpha^{n} (A_{0} - 1) \\
\Rightarrow A_{n} = \alpha^{n} (A_{0} - 1) + 1\\
\because \alpha < 1 \\
\therefore \lim_{n \rightarrow \infty} A_n = 1
\]

即不管初始PR值为多少,最终其和都将趋于1(若初始值之和小于1,用相似的方法可以证明)。也就是说,最终结果是一样的(因为最终趋于1之后就相当于以“PR值总和为1”的情况又开始了计算)。这一点在代码中也有体现:当PR值设置得很大的时候,需要迭代的次数也相应增大。


总结:应该使用最上面的公式,同时初始PR值总和应该设置为1。

PageRank简单实现中的一个错误的更多相关文章

  1. Spring中的一个错误:使用Resources时报错(The annotation @Resources is disallowed for this location)

    在学习Spring的过程中遇到一个错误:在使用注解@resources的时候提示:The annotation @Resources is disallowed for this location 后 ...

  2. Jenkins. 安装过程中出现一个错误: No such plugin: cloudbees-folder

    安装过程中出现一个错误: No such plugin: cloudbees-folder 安装插件,有时候会报类似的错误:An error occurred during installation: ...

  3. RDP 协议组件 X.224 在协议流中发现一个错误并且中断了客户端连接

    如果你的服务器有如下错误: “RDP 协议组件 X.224 在协议流中发现一个错误并且中断了客户端连接.” 可能的有2种: 1:你试试能否能继续远程登陆,有可能你的远程登陆组件出现问题. 2:有人攻击 ...

  4. 一个SpringMVC简单Demo中出现的错误

    最近在学springmvc 一个简答的Springmvc配置包括如下步骤: 1.在 web.xml 文件中配置 DispatcherServlet (该中央控制器相当于 MVC 模式中的 C),还可以 ...

  5. Visual Studio 2015在.NET Core RC2项目中的一个错误。

    更新了.NET Core RC2 之后,VS的Web Tools更新为“Preview 1”了. 这个版本有一个问题,害我折腾了一个下午. 就是在项目界面的“依赖项 - NPM”上面错误地显示了不必要 ...

  6. C++primer原书中的一个错误(派生类using声明对基类权限的影响)

    在C++primer 第4版的 15章 15.2.5中有以下这样一段提示: "注解:派生类能够恢复继承成员的訪问级别,但不能使訪问级别比基类中原来指定的更严格或者更宽松." 在vs ...

  7. 安装过程中出现一个错误: No such plugin: cloudbees-folder

    上面的错误显示是,安装插件cloudbees-folder失败,是因为下载的Jenkins.war里没有cloudbees-folder插件 需要去 https://updates.jenkins-c ...

  8. 一个超复杂的间接递归——C语言初学者代码中的常见错误与瑕疵(6)

    问题: 问题出处见 C语言初学者代码中的常见错误与瑕疵(5) . 在该文的最后,曾提到完成的代码还有进一步改进的余地.本文完成了这个改进.所以本文讨论的并不是初学者代码中的常见错误与瑕疵,而是对我自己 ...

  9. 在一个另一个文件中 #include一个**dlg.h文件,会发生dlg的资源ID未定义的错误 :

    1    在一个另一个文件中 #include一个**dlg.h文件,会发生dlg的资源ID未定义的错误 : dlg1.h(23) : error C2065: 'IDD_DIALOG1' : und ...

随机推荐

  1. C++拷贝控制

    一.拷贝控制操作 ​ 当定义一个类时,显示或隐式地指定了此类型的对象在拷贝.赋值和销毁时所执行的操作,通过三个特殊的成员函数来控制这些操作,分别是拷贝构造函数,赋值运算符和析构函数.拷贝构造函数定义了 ...

  2. 临时关闭Mysql ONLY_FULL_GROUP_BY

    /** * @author lcc807@ikoo8.com * * 临时关闭Mysql ONLY_FULL_GROUP_BY */ function closeSqlFullMode(){ DB:: ...

  3. python有序字典

    最近的django开发中用到了有序字典,所以研究了一下,以下. 示例: 有序字典和通常字典类似,只是它可以记录元素插入其中的顺序,而一般字典是会以任意的顺序迭代的. 普通字典: d1={} d1['a ...

  4. Jenkins之前置替换脚本内容

    在执行Jenkins任务前,需要修改执行的工程的某个文件中的内容,在前置步骤中编写脚本进行修改. Pre Steps Windows batch script @echo off CHCP setlo ...

  5. Bootstrap排版——HTML元素的样式重定义

    前面的话 Bootstrap对默认的HTML元素进行了CSS样式定义,使得各种基本结构套用出来的HTML页面更加美观.本文将详细介绍Bootstrap中排版相关的内容 标题 [h] HTML 中的所有 ...

  6. linux 环境下 firefox乱码问题解决

    https://blog.csdn.net/wlwlwlwl015/article/details/51482065

  7. checkStyle 错误普及

    1Type is missing a javadoc commentClass  缺少类型说明 2“{” should be on the previous line“{” 应该位于前一行.解决方法: ...

  8. Django-website 程序案例系列-2 字典操作

    设置一个全局字段: USER_DICT = { 'k1': 'root1', 'k2': 'root2', 'k3': 'root3', } def index(request): return re ...

  9. aop 记录用户操作(一)

    转载: http://www.cnblogs.com/guokai870510826/p/5981015.html 使用标签来设置需要的记录 实例:@ISystemLog() @Controller ...

  10. 自学Linux Shell13.1-命令行参数

    点击返回 自学Linux命令行与Shell脚本之路 Bash shell提供了一些不同的方法来从用户处获得数据,包括以下3中方法: 命令行参数(添加在名利后面的数据) 命令行选项(可修改命令行为的单个 ...