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 ...
随机推荐
- Mybatis复杂嵌套关联一例
Mybatis three entity relation:association in collection PatentMapper.xml <resultMap id="Bas ...
- (String)强制转换、toString()和String.valueOf()的区别
String:毫无疑问,这种就是强转形式,简单方便,效率高.java程序员可能看到效率高或许有些激动,但是它有他的不好,那就是局限性.在java的世界里没有什么东西是没有缺点的,总有一些好的方面同时也 ...
- js運算符
運算符算術運算符.邏輯運算符.賦值運算符.比較運算符.條件運算符 字符串的合併,用+,如果是字符串和數字用+連接,則當做字符串合併. 條件運算符:if(條件)?語句1,語句2:
- linux 环境下 firefox乱码问题解决
https://blog.csdn.net/wlwlwlwl015/article/details/51482065
- python----内置函数2与匿名函数
1.迭代器生成器相关 range:创建一个可迭代对象,一般与for混合使用,可设置步长. for i in range(0,10,2): #步长2范围为0-10不包括10 print(i) # 0 2 ...
- 13函数式编程&Stream流
13.1常用的函数式接口总结 接口名称 方法名称 抽象/默认 延迟/终结 方法描述 Supplier get 抽象 终结 供给型接口,无参有返回值,主要用于 Consumer accept 抽象 ...
- 看完让你彻底理解 WebSocket 原理,附完整的实战代码(包含前端和后端)
1.前言 最近有同学问我有没有做过在线咨询功能.同时,公司也刚好让我接手一个 IM 项目.所以今天抽时间记录一下最近学习的内容.本文主要剖析了 WebSocket 的原理,以及附上一个完整的聊天室实战 ...
- day11 高阶函数 函数式编程
高阶函数,满足 接收函数作为参数或者返回有函数 函数可以当做参数传递给另一个函数 def foo(n): print(n) def bar(name): print("my name is ...
- MT【68】一边柯西一边舍弃
求$\sqrt{x-5}+\sqrt{24-3x}$的最值. 通常考试时会考你求最大值,常见的方式有三角代换,这里给如下做法: 证明:$\sqrt{x-5}+\sqrt{24-3x}=\sqrt{x- ...
- Python的栈和队列实现
栈 class Node: def __init__(self, data=None): self.next = None self.data = data class Stack: def __in ...