PageRank简单实现中的一个错误
在我的一篇博客PageRank中,在5.1 算法实现中简单实现部分原本是有一个错误的。这个错误也体现出我当时对PageRank算法有理解上的偏差。
这是个什么样的错误呢?是这样的:
简单实现中计算每个网页的PR值时使用的是最原始的方法,即下面的这个公式:
\]
这个公式要求所有网页的PR值之和为1。而我原本的代码中给每个网页赋予的初始PR值的代码为:
page_rank = dict.fromkeys(nodes, 1.0) # 给每个节点赋予初始的PR值
也就是说,我给出的初始PR值之和为5(例子中共有5个网页)。
犯这个错误的原因是我理解错了“与\(P_0\)的选取无关”这句话。正确的理解应该是:“与\(P_0\)的初始概率分布无关”。
然而,我理解错了也还有另一个原因,那就是我原来的程序中不管给出的初始PR值是多少,最终的PR值都是一样的。现分析如下:
按照我原本的程序逻辑,我使用的公式应该是这样的,其中\(G\)为所有网页:
\frac{(1 - \alpha)}{N} \sum_{p_k \in G} PR(p_k)
\]
而我却使用了最原始的公式,造成了:
\Rightarrow 每轮迭代,PR值总和都减少了 (1 - \alpha) * (上轮PR值总和 - 1)
\]
现假设初始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简单实现中的一个错误的更多相关文章
- Spring中的一个错误:使用Resources时报错(The annotation @Resources is disallowed for this location)
在学习Spring的过程中遇到一个错误:在使用注解@resources的时候提示:The annotation @Resources is disallowed for this location 后 ...
- Jenkins. 安装过程中出现一个错误: No such plugin: cloudbees-folder
安装过程中出现一个错误: No such plugin: cloudbees-folder 安装插件,有时候会报类似的错误:An error occurred during installation: ...
- RDP 协议组件 X.224 在协议流中发现一个错误并且中断了客户端连接
如果你的服务器有如下错误: “RDP 协议组件 X.224 在协议流中发现一个错误并且中断了客户端连接.” 可能的有2种: 1:你试试能否能继续远程登陆,有可能你的远程登陆组件出现问题. 2:有人攻击 ...
- 一个SpringMVC简单Demo中出现的错误
最近在学springmvc 一个简答的Springmvc配置包括如下步骤: 1.在 web.xml 文件中配置 DispatcherServlet (该中央控制器相当于 MVC 模式中的 C),还可以 ...
- Visual Studio 2015在.NET Core RC2项目中的一个错误。
更新了.NET Core RC2 之后,VS的Web Tools更新为“Preview 1”了. 这个版本有一个问题,害我折腾了一个下午. 就是在项目界面的“依赖项 - NPM”上面错误地显示了不必要 ...
- C++primer原书中的一个错误(派生类using声明对基类权限的影响)
在C++primer 第4版的 15章 15.2.5中有以下这样一段提示: "注解:派生类能够恢复继承成员的訪问级别,但不能使訪问级别比基类中原来指定的更严格或者更宽松." 在vs ...
- 安装过程中出现一个错误: No such plugin: cloudbees-folder
上面的错误显示是,安装插件cloudbees-folder失败,是因为下载的Jenkins.war里没有cloudbees-folder插件 需要去 https://updates.jenkins-c ...
- 一个超复杂的间接递归——C语言初学者代码中的常见错误与瑕疵(6)
问题: 问题出处见 C语言初学者代码中的常见错误与瑕疵(5) . 在该文的最后,曾提到完成的代码还有进一步改进的余地.本文完成了这个改进.所以本文讨论的并不是初学者代码中的常见错误与瑕疵,而是对我自己 ...
- 在一个另一个文件中 #include一个**dlg.h文件,会发生dlg的资源ID未定义的错误 :
1 在一个另一个文件中 #include一个**dlg.h文件,会发生dlg的资源ID未定义的错误 : dlg1.h(23) : error C2065: 'IDD_DIALOG1' : und ...
随机推荐
- C++拷贝控制
一.拷贝控制操作 当定义一个类时,显示或隐式地指定了此类型的对象在拷贝.赋值和销毁时所执行的操作,通过三个特殊的成员函数来控制这些操作,分别是拷贝构造函数,赋值运算符和析构函数.拷贝构造函数定义了 ...
- 临时关闭Mysql ONLY_FULL_GROUP_BY
/** * @author lcc807@ikoo8.com * * 临时关闭Mysql ONLY_FULL_GROUP_BY */ function closeSqlFullMode(){ DB:: ...
- python有序字典
最近的django开发中用到了有序字典,所以研究了一下,以下. 示例: 有序字典和通常字典类似,只是它可以记录元素插入其中的顺序,而一般字典是会以任意的顺序迭代的. 普通字典: d1={} d1['a ...
- Jenkins之前置替换脚本内容
在执行Jenkins任务前,需要修改执行的工程的某个文件中的内容,在前置步骤中编写脚本进行修改. Pre Steps Windows batch script @echo off CHCP setlo ...
- Bootstrap排版——HTML元素的样式重定义
前面的话 Bootstrap对默认的HTML元素进行了CSS样式定义,使得各种基本结构套用出来的HTML页面更加美观.本文将详细介绍Bootstrap中排版相关的内容 标题 [h] HTML 中的所有 ...
- linux 环境下 firefox乱码问题解决
https://blog.csdn.net/wlwlwlwl015/article/details/51482065
- checkStyle 错误普及
1Type is missing a javadoc commentClass 缺少类型说明 2“{” should be on the previous line“{” 应该位于前一行.解决方法: ...
- Django-website 程序案例系列-2 字典操作
设置一个全局字段: USER_DICT = { 'k1': 'root1', 'k2': 'root2', 'k3': 'root3', } def index(request): return re ...
- aop 记录用户操作(一)
转载: http://www.cnblogs.com/guokai870510826/p/5981015.html 使用标签来设置需要的记录 实例:@ISystemLog() @Controller ...
- 自学Linux Shell13.1-命令行参数
点击返回 自学Linux命令行与Shell脚本之路 Bash shell提供了一些不同的方法来从用户处获得数据,包括以下3中方法: 命令行参数(添加在名利后面的数据) 命令行选项(可修改命令行为的单个 ...