PageRank原理分析
pagerank是将众多网页看成一个有向图,每个页面就是有向图中的节点。计算每个节点的出度和入度。如果一个网站被大量其他的网页引用,那么他就会有更高的pr分数。
原理
对于所有与节点i相连的节点,用他们的pr值除以他们的出度(一个节点可以给多个节点投票,但是投票的权重会被平摊)
计算转移矩阵。第一列表示A的所有出度 (A->A, A->B, A->C, A->D)
,第一行表示A的所有入度 (A->A, B->A, C->A, D->A)
。
0 & 0 & \frac{1}{2} & 1 \\
\frac{1}{2} & 0 & 0 & 0 \\
\frac{1}{2} & 1 & 0 & 0 \\
0 & 0 & \frac{1}{2} & 0
\end{array}\right]
\]
用矩阵计算来更新pr值:
\]
\]
0 & 0 & \frac{1}{2} & 1 \\
\frac{1}{2} & 0 & 0 & 0 \\
\frac{1}{2} & 1 & 0 & 0 \\
0 & 0 & \frac{1}{2} & 0
\end{array}\right] \cdot\left[\begin{array}{c}
\frac{1}{4} \\
\frac{1}{4} \\
\frac{1}{4} \\
\frac{1}{4}
\end{array}\right]=\left[\begin{array}{c}
\frac{3}{8} \\
\frac{1}{8} \\
\frac{3}{8} \\
\frac{1}{4}
\end{array}\right]
\]
\(P\)是它们的pr得分, \(L\)是节点的出度。计算下一层pr的方法就是,把相连的节点的pr都拿过来,但是要同时除以他们的出度。pr的默认值就是\(\frac{1}{n}\)
\(0 * \frac{1}{4} + 0 * \frac{1}{4} + \frac{1}{2} * \frac{1}{4} + 1 * \frac{1}{4} = \frac{3}{8}\)
DeadEnds
当一个节点只有入度没有出度,那么他就是DeadEnds。这个节点会导致整个网页的pagerank值趋于0。
他的转移矩阵M如下,由于他的某一列全为0,导致所有结果都会变成0
0 & 0 & 0 \\
0 & 0 & 0 \\
1 & 1 & 0 \\
\end{array}\right]
\]
可以看到两轮后就为0了
for i in range(3):
item = a.dot(item)
print(item)
# [0. 0. 0.66666667]
# [0. 0. 0.]
# [0. 0. 0.]
修正的方法就是在全为0的那一列加上一个平均值。他的含义就是如果一个页面不链接到任何其他网页,他们他就有可能转换到任何页面。
\]
- M 是转移矩阵
- a 是
n * n
的向量,如果第i个节点的出度为0,那么a的第i列就全为1,否则就全为0. - e 是全1的
n * 1
的向量 - 点乘操作(而不是矩阵运算)
其实就是在对应一列加上一个平均值
0 & 0 & \frac{1}{3} \\
0 & 0 & \frac{1}{3} \\
1 & 1 & \frac{1}{3} \\
\end{array}\right]
\]
SpiderTraps
一个节点只有指向自己的链接,这种节点的权重在迭代的过程中会变成1,而其他的节点会趋于0.
这种节点的转移矩阵如下:
1 & \frac{1}{2} & \frac{1}{2} \\
0 & 0 & \frac{1}{2} \\
0 & \frac{1}{2} & 0 \\
\end{array}\right]
\]
由于这个节点的对角线元素是1,所以他的pagerank值会不断增加。他的解决方法就是引入一个概率\(\beta\),用户会有\(\beta\)的概率停留在这个节点,有\(1-\beta\)的概率跳转到其他任何网页。
\]
- \(\beta\)是用户留在网页的概率
- e是全一的
n * 1
向量,\(ee^T\)就是全一的n * n
矩阵
这样的话,完整的公式如下所示:
\]
networkx实现
import networkx as nx
import matplotlib.pyplot as plt
import random
graph = nx.DiGraph()
graph.add_nodes_from(range(0, 100))
for i in range(200):
m = random.randint(0, 100)
n = random.randint(0, 100)
graph.add_edge(m,n)
nx.draw(graph, with_labels=True)
plt.show()
pr = nx.pagerank(graph, max_iter=100, alpha=0.01)
print(pr)
PageRank原理分析的更多相关文章
- Handler系列之原理分析
上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...
- Java NIO使用及原理分析(1-4)(转)
转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...
- 原子类java.util.concurrent.atomic.*原理分析
原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...
- Android中Input型输入设备驱动原理分析(一)
转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...
- 转载:AbstractQueuedSynchronizer的介绍和原理分析
简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...
- Camel运行原理分析
Camel运行原理分析 以一个简单的例子说明一下camel的运行原理,例子本身很简单,目的就是将一个目录下的文件搬运到另一个文件夹,处理器只是将文件(限于文本文件)的内容打印到控制台,首先代码如下: ...
- NOR Flash擦写和原理分析
NOR Flash擦写和原理分析 1. NOR FLASH 的简单介绍 NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直 ...
- 使用AsyncTask异步更新UI界面及原理分析
概述: AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类.AsyncTask的内部实现是一个线程池,所有提交的异步任务都会在这个线程池中的工作线 ...
- (转)Android 系统 root 破解原理分析
现在Android系统的root破解基本上成为大家的必备技能!网上也有很多中一键破解的软件,使root破解越来越容易.但是你思考过root破解的 原理吗?root破解的本质是什么呢?难道是利用了Lin ...
随机推荐
- Postman如何做接口测试,那些不得不知道的技巧
Postman如何做接口测试1:如何导入 swagger 接口文档 在使用 postman 做接口测试过程中,测试工程师会往界面中填入非常多的参数,包括 url 地址,请求方法,消息头和消息体等一系列 ...
- postgresql用户与权限管理
pg使用角色的概念管理数据库访问权限,角色是一系列相关权限的集合.为了管理方便,通常把一系列先关的权限赋予给一个角色,如果哪个用户需要这些权限,就把这些角色赋予给响应的用户. 由于用户也拥有一系列的相 ...
- PerfView专题 (第七篇):如何洞察触发 GC 的 C# 代码?
一:背景 上一篇我们聊到了如何用 PerfView 洞察 GC 的变化,但总感觉还缺了点什么? 对,就是要跟踪到底是什么代码触发了 GC,这对我们分析由于 GC 导致的 CPU 爆高有非常大的参考价值 ...
- 国家都给NISP证书的补贴了!关于NISP考试的政策有哪些?
NISP证书由中国信息安全测评中心依据中编办赋予"信息安全服务和信息安全专业人员的能力评估与资质审核"的职能而推出的证书,是中国信息安全测评中心代表国家实施的信息安全人员能力评定证 ...
- C++11实现的数据库连接池
它什么是? 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:类似的还有线程池. 为什么要用? 一个数据库连接对象均对应一个物理数据库连接, ...
- Android的Handler线程切换原理
Handler是我们在开发中经常会接触到的类,因为在Android中,子线程一般是不能更新UI的. 所以我们会使用Handler切换到主线程来更新UI,那Handler是如何做到实现不同线程之间的切换 ...
- 如何用 refcursor 返回结果集
可以通过返回 Refcursor 类型的函数,或者out 类型的函数或 procedure 返回结果集. 一.返回refcursor 类型的函数 create or replace function ...
- KingbaseES R3 受限dba影响集群切换
一.受限dba功能说明(参考自官方文档) 受限DBA 受限DBA可以对当前DBA的权限进行一定限制.当功能开启后DBA将不能更改以下对象: Table Database Function(by n ...
- K8S_删除Pod总结
K8S 不能直接删除Pod,直接删除Pod,会被Deployment重启 删除前,必须先删除对应的Deployment 例子: // 查出Pod [root@k8s-master ~]# kubect ...
- Macos下用pycharm运行django项目死活安装不上mysqlclient怎么办!!??
花了我三天时间,佛了 我刚从win过渡到mac,想着把代码迁移一下. 然后看到依赖里面有一个mysqlclient,然后pip3 install死活装不上 解决方案: 在这里写上这个 然后就好,死了