简述

PageRank有点被神化了,其实公式很简单。

文章目录

  • 简述
  • 算法
    • 模型定义
    • Flow版本
    • Google Formula
  • 实现

算法

主要是分为两种:

  • The ‘Flow’ formula
  • The Google formula

模型定义

很多个网页,直接存在链路关系,设为G,N*N的矩阵

这里先只考虑有向无权无环图,即边有方向,且权重都一样,且没有自己到自己的边(环)。

  • N为节点数或者是网页数
  • G[i][j] = 1表示,i->j有条边

Flow版本

ri=∑(j=1)and(j−>i)Nrjdjr_i = \sum_{(j=1) and (j -> i)}^N{\frac{r_j}{d_j}}ri​=(j=1)and(j−>i)∑N​dj​rj​​

一个很好是数学写法就是:

r=M∗rr = M * rr=M∗r

  • 如果有i->j, M[j][i] = 1/dj,否者为0

算法流程:

  • 也就是,随机初始化每个点的分数

  • 然后,迭代:

    • 每个点的分数,由所有 指向他的节点的分数 除以 这个节点的出度数 求和所替代
  • Flow版本会出现两个重要的问题;

    • Dead End:例如只有两个点,然后边为A->B,B就是一个Dead END。即到这时候的分数就出不去了。
    • Spider Traps:循环指向,例如A->B->A。那么这个分数就会这之间打转

Google Formula

刚刚说的两个问题在Google Formula上得到很好的改进:

  • 提出了一个叫做Teleport的概念,也称之为意念转移。

很简单,就是说,每个节点有一定的概率发生随机跳转到任意一个点的情况。再结合MapReduce的概念,Google就这样发家了emmmm

ri=β∗∑(j=1)and(j−>i)Nrjdj+(1−β)∗1Nr_i = \beta * \sum_{(j=1) and (j -> i)}^N{\frac{r_j}{d_j}} + (1 - \beta) * \frac{1}{N}ri​=β∗(j=1)and(j−>i)∑N​dj​rj​​+(1−β)∗N1​

直接的数学表达:

r=A∗rA=β∗M+(1−β)∗[1N]N∗Nr = A * r \\ A = \beta * M + (1-\beta) * [\frac{1}{N}]_{N*N}r=A∗rA=β∗M+(1−β)∗[N1​]N∗N​

Google简化后的数学表达:

r=β∗M∗r+[1N]Nr = \beta * M * r + [\frac{1}{N}]_Nr=β∗M∗r+[N1​]N​

  • 如果有i->j, M[j][i] = 1/dj,否者为0

存在的问题:

  • 虽然直接的数学表达会更简洁,但是多出来的A一定会是稠密矩阵使得空间消耗为O(N^2)了,这样的在网站达到数亿的情况下,这个东西就不太现实了。
  • 而Google简化的版本中就只需要记录同样稀疏的M即可,1/N是一个数,只需要让r这个向量的每个元素都加上即可(简单的数学变形,在工业上的产生的价值就很大的不一样了。真的佩服研究数学的哥们)

实现

实现同样做两个不同的版本的:

但有些共同的模型:

导入包:

import numpy as np
import random

创造数据:

def create_data(N, alpha=0.5): # random > alpha, then here is a edge.G = np.zeros((N, N))for i in range(N):for j in range(N):if i == j:continueif random.random() < alpha:G[i][j] = 1return G
G = create_data(10)

GtoM:

def GtoM(G, N):M = np.zeros((N, N))for i in range(N):D_i = sum(G[i])if D_i == 0:continuefor j in range(N):M[j][i] = G[i][j] / D_i # watch out! M_j_i instead of M_i_jreturn M
M = GtoM(G, 10)
  • Flow版本的PageRank
def PageRank(M, N, T=300, eps=1e-6):R = np.ones(N) / Nfor time in range(T):R_new = np.dot(M, R)if np.linalg.norm(R_new - R) < eps:breakR = R_new.copy()return R_new

测试下:

values = PageRank(M, 10, T=2000)
values

输出:

array([0.09972576, 0.09193927, 0.07843151, 0.09125886, 0.08925602,0.10407245, 0.09623654, 0.13851257, 0.13086464, 0.07970237])
  • Google Formula
def PageRank(M, N, T=300, eps=1e-6, beta=0.8):R = np.ones(N) / Nteleport = np.ones(N) / Nfor time in range(T):R_new = beta * np.dot(M, R) + (1-beta)*teleportif np.linalg.norm(R_new - R) < eps:breakR = R_new.copy()return R_new

同样的数据测试下:

测试下:

values = PageRank(M, 10, T=2000)
values

输出:

array([0.09815807, 0.09250429, 0.08376235, 0.09300133, 0.09324628,0.10108776, 0.09855127, 0.13019363, 0.12458992, 0.0849051 ])

PageRank算法以及Python实现(简洁版)相关推荐

  1. FCM算法实现Python(简洁版)

    FCM算法 关于聚类的所有项目都放到了这个上面 https://github.com/Sean16SYSU/MachineLearningImplement/tree/master/Clusterin ...

  2. PageRank算法及Python实现

    目录 PageRank概念 PageRank的核心思想 PageRank算法的python实现 如何提高自身网站的PageRank PageRank概念        佩奇排名(PageRank),又 ...

  3. PageRank算法的Python实现

    五个节点的链接关系如下图: 代码: # -*- coding: utf-8 -*- """ Created on Sat Sep 12 10:36:10 2020@aut ...

  4. 《Python程序设计与算法基础教程(第二版)》江红 余青松 全部章节的课后习题,上机实践,课后答案,案例研究

    (还在更新中-) 这篇博客花费了我的大量时间和精力,从创作到维护:若认可本篇博客,希望给一个点赞.收藏 并且,遇到了什么问题,请在评论区留言,我会及时回复的 这本书对Python的知识点的描述很详细, ...

  5. 各省新高考等级赋分算法实现——python版

    各省新高考等级赋分算法实现--python版 一.前言 新高考从2014年启动,目前已经有14个地区(省.市)实行了新高考改革分别是:浙江.上海.北京.山东.天津.海南.湖南.广东.江苏.重庆.河北. ...

  6. 数据挖掘十大算法(六):PageRank算法原理与Python实现

    参考 .PageRank算法--从原理到实现 零. PageRank算法简介 PageRank算法,即网页排名算法,由Google创始人Larry Page在斯坦福上学的时候提出来的.该算法用于对网页 ...

  7. 《Python程序设计与算法基础教程(第二版)》江红 余青松,第九章课后习题答案

    推荐阅读 <Python程序设计与算法基础教程(第二版)>江红 余青松 全部章节的课后习题,上机实践,课后答案,案例研究 文章目录 例9.1~例9.53 填空题:2 思考题:3~11 上机 ...

  8. 翻译: 网页排名PageRank算法的来龙去脉 以及 Python实现

    PageRank ( PR ) 是Google 搜索用来在其搜索引擎结果中对网页进行排名的算法.它以"网页"一词和联合创始人拉里佩奇的名字命名.PageRank 是衡量网站页面重要 ...

  9. 《Python程序设计与算法基础教程(第二版)》江红 余青松,第十章课后习题答案

    推荐阅读 <Python程序设计与算法基础教程(第二版)>江红 余青松 全部章节的课后习题,上机实践,课后答案,案例研究 文章目录 上机实践:2~4 案例研究:基于模块的库存管理系统 上机 ...

最新文章

  1. 从李开复的Google看管理的文化和背景
  2. div 隐藏_注入WordPress网站的隐藏垃圾邮件链接
  3. WPF中使用Hashtable剔除重复字符串(比如电话号码)
  4. ML之PLiR之Glmnet:利用Glmnet算法求解ElasticNet回归类型问题(实数值评分预测)
  5. 【温故知新】CSS学习笔记(外边距合并)
  6. 【问链财经-区块链基础知识系列】 第三十九课 EOS与ETH体系结构比较全解析
  7. BZOJ4520:[CQOI2016]K远点对(K-D Tree)
  8. 判断是否是质数 c++java
  9. 搭建eova开发环境
  10. php多个语言包,thinkphp实现多语言功能(语言包)
  11. 局域网,城域网,广域网和互联网
  12. php 外包 上海,== | php外包与php技术服务商
  13. aip通用文档 服务器,为 Rights Management 连接器配置服务器 - AIP | Microsoft Docs
  14. 高级篇Docker复杂安装详说
  15. Day 24 - 设定开发帐号 HBuilder X - DCloud 注册
  16. Python修改路由器WIFI账号
  17. wireshark 笔记
  18. 数据处理取对数的作用
  19. k8s实践6:从解决报错开始入门RBAC
  20. Windows10 alt+table 错乱问题修复

热门文章

  1. 关于耳机的国标和美标的区分
  2. linux 查看文件中数据类型,Linux下使用file命令确定文件中数据的类型-文件类型...
  3. mysql 平均日营业额_一条SQL语句中算日销售额和月销售额
  4. 新学Node-JS的一点总结
  5. shell 练习题01:列出使用最多的命令是哪些并且将这些命令输入到chy1.txt中
  6. 安装Eclipse插件
  7. WPF路径动画(动态逆向动画)
  8. 什么是关键字驱动框架(自动化测试)
  9. loss和accuracy的关系
  10. 深度学习笔记4:Self-Taught Learning and Unsupervised Feature Learning