程序员必须知道机器学习与数据挖掘十大经典算法:PageRank算法篇

2023-11-03

由于公司架构调整和业务方向的转变,我所在的项目组即将接手一个机器学习和数据挖掘的项目,为了后续更好地开展工作,也为了能提高自己的专业技能,我决定开始学习机器和数据挖掘方面的知识。

1567157206510091.jpg

那么,问题就来了:到底应该从哪里开始学起呢?最开始我也买了一些机器学习相关的入门书籍,跟着听一些网络课程,但是我发现所有的课程都特别偏重理论,虽然机器学习、数据挖掘需要很强的理论基础才能做好,但是我个人更喜欢理论联系实际的学习方式,比如可以在了解某种基本原理的基础上,立刻用代码来实现它。

无意间从同事口中得知机器学习与数据挖掘的十大经典算法,我决定就从十大经典算法开始学习。

下面是我的学习路线:逐个掌握每种经典算法的算法思想、数学模型及Python代码实现,争取各个击破并融汇贯通。

好了,废话不多说了,我们先看第一种经典算法:PageRank算法。

一、PageRank算法的简介

PageRank算法即网页分级排名算法,它的提出者是谷歌的创始人之一拉里·佩奇(Larry Page),所以算法的名字就以Page命名。拉里·佩奇提出该算法时还是一名斯坦福大学的学生,(真是自古英雄出少年啊!)并且该算法曾在2001年9月获得美国国家专利。

PageRank算法是Google算法的重要内容之一,可以说它就是Google算法的降龙十八掌和倚天屠龙剑啊!

二、PageRank算法的核心思想

PageRank根据网站的外部链接和内部链接的数量和质量,衡量网站的价值。PageRank隐含的思想就是:每个到页面的链接都是对该页面的一次投票, 被链接的越多,就意味着被其他网站投票越多。一个网页所获得“投票”越多,说明这个网页越重要,它的被访问的概率越大,自然分级排名就越高,那么搜索结果它就越靠前。这就好比是一篇学术论文,论文被引用的次数越多,论文的影响因子越高,自然论文就越权威啦!

PageRank的核心思想归纳起来就两条:

1.如果一个网页被很多其他网页链接到的话说明这个网页比较重要,也就是PageRank值会相对较高。

2.如果一个PageRank值很高的网页链接到一个其他的网页,那么被链接到的网页的PageRank值会相应地因此而提高。

三、PageRank算法的数学模型

1、相关概念

出链:网页A中附加了网页B的链接,用户浏览A时可以通过点击该链接进入网页B,此时我们称A出链B。

入链:上面通过点击网页A中B-Link进入B,表示由A入链B。如果用户自己在浏览器输入栏输入网页B的URL,然后进入B,表示用户通过输入URL入链B。

无出链:如果一个网页A中没有附加任何的URL,则称A无出链。

只对自己出链:如果一个网页A中没有附加任何其他页面的URL,只有附加自己的URL,则称A只对自己出链。

PR值:就是指一个网站被访问的概率,PR值越高,被访问的概率越高,自然排名就高。

2、简单数学模型(不带a的数学模型)

首先,我们对网络上的所有网页做一个抽象,每个网页代表一个节点,如果从网页A中附加了网页B的链接,则表示从节点A指点节点B的有向边。那么整个WEB就被抽象成一张有向图。现在我们假设世界上只有四个网页,它们之间关系如下图:

1567157206253731.jpg

图 1

之前我们说过PageRank的思想就是,谁被引用的越多,谁的PR值越高。那么我们假设当用户停留在某个页面上时,他跳转到页面上任意一个链接的概率相同。

对任意一个网页我们用I(p)描述其重要性,称之为网页排序值(就是PR值)。假定网页Pj有Lj个链接,其中一个链接指向网页Pi,那么Pj将其重要性的1/Lj分给Pi,即Pi的网页重要性就是所有指向这个网页的其他网页所贡献的重要性之和。公式表示如下:

1567157206933624.jpeg

式中,Bi表示所有链接到Pi的网页集合。

为了方便数学分析,我们定义一个超链矩阵M[Mij]:

1567157207731138.jpeg

其中第i行j列的值Mij表示用户从页面j转到页面i的概率。

按照这个定义,图1的超链矩阵为

1567157207134332.jpeg

设初始时每个页面的rank值为1/N,这里就是1/4。按A—D顺序得到向量 v:v=[1/4,1/4,1/4,1/4]

此时如果做矩阵乘法,使M*v就得到一个新的rank阵v’:M第一行分别是A、B、C和D转移到页面A的概率,而v的第一列分别是A、B、C和D当前的rank,因此用M的第一行乘以v的第一列,所得结果就是页面A最新rank的合理估计,故M*v的结果v’就分别代表A、B、C、D新rank值。

然后用M再乘以这个新的rank向量v’,又会产生一个rank向量。迭代这个过程,可以证明v最终会收敛,即v≈Mv,此时计算停止,最终得到的v’就是rankpage的排序结果:

V’=M*V----------(1)

3、复杂数学模型(带a的数学模型)

但是我们也注意到,要想上述迭代结果最终收敛,必须满足一个条件:图是强连通的,即从任意网页可以到达其他任意网页。假设我们把上面图中C到D的链接丢掉,C变成了一个终止点。再进行迭代,那么迭代的最终结果是v’=[0,0,0,0],显然算法失效了。除了终止点问题外,还有一个陷阱问题,即将图1中D到C的链接删除后,再加一条C指向C自身的链接。那么按上述迭代过程,最终v’=[0,0,1,0],此时算法也是失效的。

1567157207571240.jpg

                              图2 终止点问题

1567157207414567.jpeg 点击添加图片描述(最多60个字)

图3 陷阱问题

为了解决终止点问题和陷阱问题,我们需要对算法进行改进:假设用户在选择下一个跳转的页面时,选择当前页及当前页上的链接的概率为a,选择其他页面的概率为(1-a),选择其他页面中每个页面的概率都相同为1/n,则计算PR值的公式演变为:

v′=αMv+(1?α)(1/n)-----(2)

四、PageRank算法的Python实现

下面我们以图3为例,分别用代码实现公式(1)和公式(2)的排序结果:

import numpy as np

  M = [[0,1/2,0,1/2], [1/3,0,0,1/2], [1/3,1/2,1,0],[1/3,0,0,0]

  U = [1/4,1/4,1/4,1/4]

  U0 = np.array(U)

  U_past_none_alpha = []

  while True:

  U = np.dot(M,U)

  if str(U) == str(U_past_none_alpha):

  Break

  U_past_none_alpha = U

  print('公式1的结果:',U)

  U_past_has_alpha = []

  while True:

  U = 0.8*(np.dot(M,U))+0.2*U0

  if str(U) == str(U_past_has_alpha):

  Break

  U_past_has_alpha = U

  print('公式2的结果:',U)

输出结果如下:

C:\Users\1009\PycharmProjects\20190329\venv\Include\Include\Scripts\Python.exe C:/Users/1009/PycharmProjects/20190329/pagerank.py

公式1的结果:[0. 0. 1. 0.]

公式2的结果:[0.13172043 0.11917563 0.6639785  0.08512545]

Process finished with exit code 0

显然,公式(2)的结果更加科学准确!

五、后记:

PageRank算法就介绍到这里了,我的感觉就是按公式编码实现其实并不难,难的在于公式背后的数学逻辑思维。通过和做算法开发的同事交流,我才知道原来算法最最重要的就是思维,没有思维的算法就如同没有灵魂的躯体一样,完全不能适应复杂的现实场景的需求。谨以此文为开端,开始我的算法之旅,希望与广大测试同行一起进步!

加官方微信:sy51testing 回复关键词“学习”领取限量软件测试学习资料哦~~


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31407649/viewspace-2655593/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31407649/viewspace-2655593/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序员必须知道机器学习与数据挖掘十大经典算法:PageRank算法篇 的相关文章

  • 在 python 中 pickling 数据时出现内存错误

    我正在尝试使用 python 中提供的 dump 命令将字典转储为 pickle 格式 字典的文件大小约为 150 mb 但仅转储 115 mb 的文件时会出现异常 例外情况是 Traceback most recent call last
  • 使用 Selenium 选择具有特定内容的锚点

    我有一个 HTML 元素 如下所示 a class country href es co Columbia a 如何根据内容 Columbia 选择该锚元素 我不能使用find element by class css selector因为
  • 打乱列表并返回副本

    我想对数组进行洗牌 但我找到的只是类似的方法random shuffle x from 在 Python 中随机化字符串列表的最佳方法 https stackoverflow com questions 1022141 best way t
  • 如何获取Python对象父级?

    所以 我试图获取自定义对象 内部 的对象 这是一个例子 假设 o 是一个对象 无论是什么类型 它都可以存储变量 o Object class Test def init self self parent o This is where I
  • 执行不区分大小写的“in”检查并检索原始元素的最简单方法?

    假设 a 有一个字符串列表和一个特定字符串 particular string latitude list Id PRICE LATitude longitude 我想要实现的是执行不区分大小写的检查特定字符串是否在列表中 所以现在我可以这
  • 字符串中数字的连续相加

    我是一名正在学习 python 的新程序员 并且在如何完成此任务方面遇到了困难 所以本质上我有一个从文件导入的数字字符串需要读取 并且需要将第一个数字的总和添加到第二个数字并将其转换为正确的 ascii 字符 因此 例如 如果我正在读取字符
  • python解释器自动重启而不返回答案

    调用递归函数时 python解释器会自动重新启动吗 我正在编写一个快速排序算法 并尝试对一个大的数字数组 顺序 10 4 进行排序 但是当我尝试对整个数组进行排序时 python 正在重新启动 即给我 重新启动 并且存储在内存中的所有值 函
  • xlwt 可以在单元格中创建一个包含标题和链接变量的超链接吗?

    例如 如何更改以下行 使 test 为变量 T 且 http google com http google com 是变量L ws write 0 0 xlwt Formula test HYPERLINK http google com
  • 组内条件计数

    我想在之后进行条件计数groupby 例如 按列的值分组A 然后计算每组中值出现的频率5出现在列中B 如果我整个过程都这样做DataFrame 只是len df df B 5 所以我希望我能做到df groupby A df B 5 siz
  • [matplotlib]:理解“set_ydata”方法

    我试图了解如何使用 set ydata 方法 我在 matplotlib 网页上找到了很多示例 但我只找到了 set ydata 被 淹没 在大型且难以理解的代码中的代码 我想要一个简短且易于理解的代码来帮助我理解 set ydata 的工
  • 获取每行最后 150 行中所有正值的计数 - pandas

    我有以下数据集 其中有列Date and Values对于每一行 它两者都有 ve and ve价值观 我必须计算最后 150 行的所有正值 在每一行 因此前 150 行将具有空值 然后 以下行将具有最后 150 行的计数 ve行 类似地
  • Django 模板:输出带有所有小数位的浮点数

    我如何在 django 模板中输出这个数字 小数位数是可变的 我事先不知道 x 0 000015 1 x 输出是 1 5e 05 2 x stringformat f 输出是 0 000015 这不是本地化的 应该有逗号 我需要对输出进行本
  • 在Python中将数组的元素从科学记数法转换为十进制记数法

    我有一个 numpy 数组 其元素采用科学格式 我想将它们转换为十进制格式 我的 numpy 数组如下所示 array 93495052 96955582 98555123 06146193 array 1 00097681e 09 9 9
  • Spyder 内联绘图

    设置 Anaconda 2 0 0 Win 64 Spyder Anaconda 附带的 2 3 0rc 我配置图形 工具 gt 首选项 gt iPython 控制台 gt 图形 gt 图形后端 gt 内联 但无论我做什么 图形总是在单独的
  • Django Rest框架Json解析

    我想解析传入的POSTdjangoviews py 文件中的数据 发布数据 number 17386372 data banana apple grapes 这是我尝试读取上述传入数据的方法request views py class Fr
  • 禁用或限制 /o/applications(django rest 框架、oauth2)

    我目前正在使用 Django Rest 框架编写 REST API 并使用 oauth2 进行身份验证 使用 django oauth toolkit 我对他们俩都很满意 他们做的正是我想要的 然而 我有一个担忧 我正在将我的应用程序传递到
  • 2D 矩阵上的 Numpy where()

    我有一个像这样的矩阵 t np array 1 2 3 foo 2 3 4 bar 5 6 7 hello 8 9 1 bar 我想获取行包含字符串 bar 的索引 在一维数组中 rows np where t bar 应该给我索引 0 3
  • 如何使用 python 在 XML 声明后添加注释

    import xml etree ElementTree as ET def addCommentInXml fileXml C Users Documents config xml tree ET parse fileXml root t
  • 仅将唯一行插入 SQLite (python)

    我在用着cursor executemany将 CSV 文件中的批量行插入到 SQLite 表中 根据主键字段 其中一些行预计会重复 当我执行该命令时 可以预见的是 我会收到完整性错误 并且不会插入任何内容 如何有选择地仅插入非重复行 而无
  • XGBoostError:[10:10:03] /workspace/src/tree/updater_gpu_hist.cu:1407:gpu_hist 中的异常:NCCL 失败

    PROJECT Nvidia 开发者项目 https developer nvidia com blog gradient boosting decision trees xgboost cuda 在 Google Colab 环境中 MY

随机推荐

  • 【DateFormat】DateFormat用于实现日期的格式化

    DateFormat 创建实例 getDateInstance 返回一个日期格式器 getTimeInstance 返回一个时间格式器 getDateTimeInstance 返回一个日期时间格式器 上述方法均可传入参数指定日期样式和地区
  • 链表OJ练习(2)

    一 分割链表 题目介绍 思路 创建两个链表 ghead尾插大于x的节点 lhead尾插小于x的节点 先遍历链表 最后将ghead尾插到lhead后面 将大小链表链接 我们需要在创建两个链表指针 指向两个链表的头节点 用这两个指针标记lhea
  • c# 本机IP修改

    校园网总是要修改ip 去实验室也要修改ip 想着编一个IP修改的软件比较方便 我用的是 using System Management 报错的话记得在项目的引用中添加 右击 引用 添加引用 System Management private
  • 怎么把wsl1 变成wsl2

    Ensure the distribution runs in WSL 2 mode WSL can run distributions in both v1 or v2 mode To check the WSL mode run wsl
  • 宝塔安装,创建WordPress

    宝塔安装 1 进入宝塔官网 官网地址 https www bt cn new index html 2 安装Linux面板7 9 4 2 1选择 下载安装 这里我们在CentOS7 4上安装所以选择 Linux面板7 9 4 安装脚本 2
  • 清华镜像源下载pytorch及Torchvision

    conda config add channels https mirrors tuna tsinghua edu cn anaconda pkgs free conda config add channels https mirrors
  • 挖掘机铲斗关于是否用最小二乘法

    根源应该在连接杆P3P4那里 它绕P4的旋转 使得P5P3旋转 并产生一定位移 绕液压杆伸缩 同时 P3P1位移 或者旋转 或者先旋转一定角度再位移 此时P2P1运动 这里P2P1的值发生了变化 可能要拟合 铲斗再绕着P2P1的新向量旋转
  • 无人机rtmp推流直播解决方案

    无人机直播的需求 无人机直播是航拍的价值延伸 在无人机进行现场航拍 监控成为行业的基本需求后 将航拍视频实时回传到指挥大厅和业务平台进行远程观看和分析 将会带来更新颖的应用效果和价值 客户需要独立部署的流媒体服务器 尽管不少品牌的无人机可以
  • Pytorch快速入门系列---(三)pytorch中的数据操作和预处理

    目录 1 高维数组 1 1 回归数据准备 1 2 分类数据准备 2 图像数据 1 torchv
  • Vuex从了解到实际运用,彻底搞懂什么是Vuex(一)

    什么是Vuex全局状态管理 一句话来说 Vuex全局状态管理是任意组件之间的通信的解决方案 Vuex实现原理 借助于Vuex提供的单例 可供任意组件的调度 它里面提供了一些对应的状态和方法 比如 state getter mutation
  • php页面添加计数器

    index php 1 4 5 6 7 8 9 10 11
  • 一个好玩的网络空间测绘站(fofa)

    无意间发现了一个好玩的网络空间测绘站 https fofa info 可以轻松嗅探公网资源 而且官方还提供搜索语法说明 上手容易 适合信安学习 也适合相关从业人员 ps 禁止干违法的事情哟
  • 计算机科学和Python编程导论(一) 计算机相关理论

    基本概念 1 计算机基础知识 陈述性知识 关于事实的描述 如果满足y y x 那么x的平方根就是数值y 程序性知识 说明 如何做 描述的是信息演绎的过程 算法 是一个有穷指令序列 它在给定的输入集合中执行时 会按照一系列定义明确的状态进行
  • RedisUtil工具类

    package com test util import java util ArrayList import java util List import java util Map import java util Set import
  • 提升树算法

    这篇博文主要参考了李航 统计学习方法 与论文 GREEDY FUNCTION APPROXIMATION A GRADIENT BOOSTING MACHINE 这里简单记录下对提升树的简单理解 1 梯度提升算法 有关梯度提升算法的细节请参
  • 处理Mybatis返回的结果集为Map类型

    最有用到mybatis返回一个map结果集 然后就针对性的在网上找了一些相关大牛的总结 1 https www cnblogs com jwdd p 10046270 html2 https www codercto com a 33475
  • Xshell连接时显示“服务器发送了一个意外的数据包。received:3,expected:20“问题的解决方法

    一 问题描述 最近在大数据服务器上安装了openbsd6 7版本 安装完后通过xshell连接 弹出一个错误对话框 提示 服务器发送了一个意外的数据包 received 3 expected 20 的错误信息 检查sshd服务是正常开启的
  • OSI七层模型及对应的数据包格式

    我接触网络协议也比较久了 不过一直都只懂个皮毛 最近比较深入研究之后终于有点豁然开朗的感觉 也因为网络上各种协议的资料太多但是都比较分散杂乱 所以在这里做点总结 给大家提供一些资料也备自己以后查阅 鉴于有些朋友没有耐心完全看完整篇文章 所以
  • 如何快速将WPS表格或者excel数据将表格转化为json

    目录 简介 一 在表格数据的前后插入列 加上双引号 分号 逗号 二 利用表格的公式合并内容 1 在表格合并的项行后面选择或插入新的一列或一行 然后在第一个空格输入 号 2 然后用鼠标点击要合并的第一行的第一个内容格 即相对应等号的那一列 在
  • 程序员必须知道机器学习与数据挖掘十大经典算法:PageRank算法篇

    由于公司架构调整和业务方向的转变 我所在的项目组即将接手一个机器学习和数据挖掘的项目 为了后续更好地开展工作 也为了能提高自己的专业技能 我决定开始学习机器和数据挖掘方面的知识 那么 问题就来了 到底应该从哪里开始学起呢 最开始我也买了一些