初步理解pagerank算法

第一次写不是课程要求的博客,可能有不严谨的地方,如果有写错的希望能在评论区指出。

算法思想

pagerank算法用于网页排序,根据给网页的重要程度给各个网页打分,根据分数高低进行排序。而怎么判断网页的重要程度?该算法认为,若是对于某个网页A,引用(链接到)网页A的网页越多,重要度越强(即引用网页A的网页也被好多网页引用),那么网页A本身的重要度越强

算法描述

下面说说如何量化。我们需要知道所有被排名网页的引用关系。计网页wi的重要度为PR(wi),采用如下方式计算最终的重要度。

初始化每个网页的PR值。

设定PR值在0到1之间(为了和概率挂上联系)。首先,等值初始化所有网页的PR值,即若网页总数为n,则所有网页网页wi的初始PR(wi)=1/n。
可以证明,所有随机初始化(不能全是0)得到的PR值向量在后续的迭代计算中会收敛到一个定值。

迭代得到最终的PR值

利用迭代法得到最终的PR值。为了利用到上面“算法思想”的想法,跟自然的想到,可以将所有引用的wi的网页的PR值加和表示wi的新的PR。但这样就会出现个问题:
1.若是某网页wk引用的网页数量多于wj引用的网页,而二者都引用了wi,那么wj对wi的PR的贡献度很有可能比wk要高。
因此,pagerank算法使用所有引用的wi的网页的PR值的加权求和表示wi的新的PR。各个引用wi的网页(使用wj表示)的“转移权值”使用1/n(wj),其中nj是网页wj的引用网页总数。,即PR的迭代公式如下:
PR(wi)=Σwj∈M(wi)PR(wi)n(wj)PR(w_i)=\Sigma_{w_j \in M(w_i)} \frac{ PR(w_i)}{n(w_j)} PR(wi​)=Σwj​∈M(wi​)​n(wj​)PR(wi​)​
其中M(wi)表示引用了网页wi的所有网页的集合。
后面的举例会更清楚的说明这些步。

矩阵形式描述:

计所有的PR值构成的向量为P
根据每个网页的引用与被引用关系,可以得到个有向图G(这里用邻接矩阵表示,不知道邻接矩阵的请自行百度),其中节点数即为网页的总数,节点i指向节点j表示网页wj引用了网页wi
Gij若不为0,则表示网页wj引用了网页wi,其值即上面讲的wj对wi的“转移权值”,所以,G的每一列的所有非0元素都相等,且都为1/n(wj)。G每一列的加和结果是1(除非wj一个其他网页都不引用,则该列所有元素为0)。
迭代计算的公式为:
Pnew=GPold\textbf{P}_{new} = \textbf{G}\textbf{P}_{old} Pnew​=GPold​

举个例子

下图表示,总共4个网页需要排序。其中A、B互相引用;B引用了C;D引用了B和C。

首先,初始化PR值,即P=(0.25, 0.25, 0.25, 0.25)。

迭代法:

重复计算下式直到收敛(即P中各个元素不再变化或者在一个很小的阈值之内变化)
PRA=12PRBPR_A=\frac{1}{2}PR_B PRA​=21​PRB​
PRB=PRA+12PRDPR_B=PR_A+\frac{1}{2}PR_D PRB​=PRA​+21​PRD​
PRC=12PRB+12PRDPR_C=\frac{1}{2}PR_B+\frac{1}{2}PR_D PRC​=21​PRB​+21​PRD​
PRD=0PR_D=0 PRD​=0
代码:
(引用了numpy库,graph是我自己写的一个类的对象,graph包含一个字典,长度是图的节点数量,键是节点,值是与该节点邻接的所有节点与边上权值构成的小字典。代码写的比较烂,还没有运行对不对):

 @staticmethoddef pagerank_v1(graph, d=0.85,threshold=1e-5, iteror=100):'''迭代'''i = 0error = 2**32num = len(graph.nodes)PR = []pr = []for k in range(num):PR.append(1/num)pr.append(1/num)PR = np.asarray(PR)pr = np.asarray(pr)while (i <= iteror) & (error > threshold):for k in range(num):pr[k] = Graph.add(graph.nodes[k], PR[k])error = max(np.sqrt(PR - pr))for k in range(num):PR[k] = pr[k]i += 1return PR@staticmethoddef add(node_edge, A):result = 0for i in node_edge:result += A * node_edge[i]return result

矩阵法:

构造图的邻接矩阵G,如下:

迭代计算
Pnew=GPold\textbf{P}_{new} = \textbf{G}\textbf{P}_{old} Pnew​=GPold​
直到P收敛。
注意,若是P能够收敛(设收敛时为Pfinal),则有Pfinal=G Pfinal,即PfinalG特征值为1时候的特征向量,可以利用已有的计算矩阵特征值的工具进行计算。
代码:

 import numpy as np@staticmethoddef pagerank_v2(graph, d=0.85):'''特征值'''m1 = Graph.get_graph_from_matrix(graph)m1 = np.matrix(m1)eigenvalue,featurevector=np.linalg.eig(m1)return featurevector[0]

几点说明:

可以证明,若G的所有列之和为1,G必有特征值为1的特征向量。简要说一下证明,G的转置左乘元素全是1的列向量,结果还是元素全是1的列向量,故G的转置有1特征值,故G有值为1的特征值。

特征值1是G的最大特征值。简要说一下证明,设r是G的特征值,x是G对应的特征向量,||G||为G的1范数,则||rx||=||Gx||。而|r|·||x||=||rx||,||G||·||x||>=||Gx||,故|r|<=||G||。而由于G的每列加和为1,故||G||=1。即|r|<=1。

算法的改进:

从上面给出的例子不难看出,PR(D)最终为0,从而其他的PR值也逐渐变成0。事实上,上述算法会产生以下问题:排名不唯一问题(即G特征值为1的特征向量不止一个)。
为了改进这些问题,加上一个平滑参数d(通常取0.85),将迭代公式修改为:
PR(wi)=1−dN+d⋅Σwj∈M(wi)PR(wi)n(wj)PR(w_i)=\frac{1-d}{N} +d· \Sigma_{w_j \in M(w_i)} \frac{ PR(w_i)}{n(w_j)} PR(wi​)=N1−d​+d⋅Σwj​∈M(wi​)​n(wj​)PR(wi​)​
矩阵形式修改为:
Pnew=d⋅GPold+1−dN\textbf{P}_{new} =d· \textbf{G}\textbf{P}_{old} + \frac{\textbf1-\textbf d}{N} Pnew​=d⋅GPold​+N1−d​
其中,N为总节点数量。
此外,上面例子还有一个悬挂节点的问题,即有些网页不会引用其他网页,造成G某一列和不为1,从而使1可能不是G的特征值。但我们仍然可以使用该算法为每个网页打分。

算法证明:

可以参照下面其他博主的链接,写的非常详细
证明
证明
证明
或者论文
THE $25,000,000,000∗ EIGENVECTOR
THE LINEAR ALGEBRA BEHIND GOOGLE

初步理解pagerank算法相关推荐

  1. 【转】深入浅出PageRank算法

    原文链接 http://segmentfault.com/a/1190000000711128 PageRank算法 PageRank算法是谷歌曾经独步天下的"倚天剑",该算法由L ...

  2. 在微博中应用PageRank算法

    这个想法很早就有了,因为我是做搜索引擎背景的,能够深刻的理解PageRank算法在搜索引擎中的重要性,绝对的核心技术之一.不过,这篇博客,并不打算介绍PageRank算法的原理,而是,让我们来看看,这 ...

  3. Adaboost算法的初步理解

    菜鸟初次接触Adaboost,虽然算法流程比较清晰简单,但对于其中的理论,存在着不少疑惑之处,如下所示: 1)如何训练得到的弱分类器,我们需要训练出多少个弱分类器进行后续的计算?对若分类器有什么要求吗 ...

  4. PageRank 算法初步了解

    前言 因为想做一下文本自动摘要,文本自动摘要是NLP的重要应用,搜了一下,有一种TextRank的算法,可以做文本自动摘要.其算法思想来源于Google的PageRank,所以先把PageRank给了 ...

  5. Hamiltonian Monte Carlo抽样算法的初步理解

    Hamiltonian Monte Carlo抽样算法的初步理解 接受拒绝采样算法 MCMC回顾 Hamiltonian dynamics 拉格朗日方程 从牛顿方程出发推导拉格朗日方程 勒让德变换 哈 ...

  6. hadoop上的pageRank算法

    简单的pageRank实现参考:http://wlh0706-163-com.iteye.com/blog/1397694 较为复杂的PR值计算以及在hadoop上的实现:http://deathsp ...

  7. 张洋:浅析PageRank算法

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

  8. PageRank算法--从原理到实现

    本文将介绍PageRank算法的相关内容,具体如下: 1.算法来源 2.算法原理 3.算法证明 4.PR值计算方法 4.1 幂迭代法 4.2 特征值法 4.3 代数法 5.算法实现 5.1 基于迭代法 ...

  9. 【白话机器学习】算法理论+实战之PageRank算法

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Ad ...

最新文章

  1. NYOJ 453 小珂的烦恼 模拟
  2. python监控web扩张时间脚本
  3. centos7添加运行终端快键键
  4. 基于FPGA的电机控制设计(PWM)
  5. ***ECharts图表入门和最佳实践
  6. 如何利用计算机实现非线性转换,2013《数字信号处理》期末复习(填空选择判断)真题解析...
  7. linux系统怎样写单片机程序,单片机知识是Linux驱动开发的基础之一以及如何学单片机...
  8. C++语言基础 —— 数组
  9. PAT乙级 1086 就不告诉你 (附测试点1,2排查及用例)
  10. iOS Crash文件的解析(一)
  11. ios mysql注册登录界面_iOS学习2:创建属于自己的页面,自定义初始界面
  12. Caffe学习3:Layer
  13. 网站性能常用指标与优化方法
  14. 软考——系统架构设计师工作日志
  15. 快速上手efficient(keras)
  16. 死锁预防之银行家算法
  17. 如何将音乐复制到您的Android手机
  18. 计算机模拟人脑的智能行为叫,模拟人脑结构方可实现强人工智能目标
  19. 符合FDA标准的邮件安全证书(S/MIME)有哪些?
  20. GeckoFX 在winform中的简单应用

热门文章

  1. 由Finalizer和SocksSocketImpl引起的Fullgc问题盘点
  2. 3年Android开发工程师面试经验分享,先收藏了
  3. python抢购茅台抢购描述
  4. 辉太郎看前端(for...in和for...of)
  5. R语言实现数据按照行排序
  6. Ubuntu 录制视频并制作成gif图
  7. 细说——sqlmap
  8. 苏索轰世界波 米兰2:0热那亚重返意甲前四
  9. 记录python开发第一个app,实现word转html的桌面应用
  10. 2020阿里实习生校招笔试题