[Datawhale][CS224W]图机器学习(六)

news2024/10/2 12:37:01

目录

    • 一、简介
    • 二、概述
    • 三、算法
    • 四、PageRank的缺点
    • 五、Python实现迭代法
  • 参考文献

一、简介

PageRank,又称网页排名谷歌左侧排名PR,是Google公司所使用的对其搜索引擎搜索结果中的网页进行排名的一种算法。

佩奇排名本质上是一种以网页之间的超链接个数和质量作为主要因素粗略地分析网页的重要性的算法。其基本假设是:更重要的页面往往更多地被其他页面引用(或称其他页面中会更多地加入通向该页面的超链接)。 其将从A页面到B页面的链接解释为“A页面给B页面投票”,并根据投票来源(甚至来源的来源,即链接到A页面的页面)和投票对象的等级来决定被投票页面的等级。简单的说,一个高等级的页面可以提升其他低等级的页面。

二、概述

PageRank是一种链接分析算法,它通过对超链接集合中的元素用数字进行权重赋值,实现“衡量集合范围内某一元素的相关重要性”的目的。该算法可以应用于任何含有元素之间相互引用的情况的集合实体。

PageRank的结果来源于一种基于图论的数学算法。它将万维网上所有的网页视作节点(node),而将超链接视作边(edge),并且考虑到了一些权威的网站,类似CNN。每个节点的权重值表示对应的页面的重要度。通向该网页的超链接称做“对该网页的投票(a vote of support)”。每个网页的权重值大小被递归地定义,依托于所有链接该页面的页面的权重值。例如,一个被很多页面的链接的页面将会拥有较高的权重值(high PageRank)。

三、算法

假设一个由4个网页组成的集合:ABCD。同一页面中多个指向相同的链接视为同一个链接,并且每个页面初始的PageRank值相同,最初的算法将每个网页的初始值设定为1。但是在后来的版本以及下面的示例中,为了满足概率值位于0到1之间的需要,我们假设这个值是0.25。

在每次迭代中,给定页面的PR值(PageRank值)将均分到该页面所链接的页面上。

如果所有页面都只链接至A,那么A的PR值将是BCD的PR值之和,即:

P R ( A ) = P R ( B ) + P R ( C ) + P R ( D ) PR(A)=PR(B)+PR(C)+PR(D) PR(A)=PR(B)+PR(C)+PR(D)

重新假设B链接到ACC链接到A,并且D链接到A,B,C。最初一个页面总共只有一票。所以BA ,C每个页面半票。以此类推,D投出的票只有三分之一加到了A的PR值上:

P R ( A ) = P R ( B ) 2 + P R ( C ) 1 + P R ( D ) 3 PR(A)={\frac {PR(B)}{2}}+{\frac {PR(C)}{1}}+{\frac {PR(D)}{3}} PR(A)=2PR(B)+1PR(C)+3PR(D)

换句话说,算法将根据每个页面连出总数 L ( X ) L(X) L(X)平分该页面的PR值,并将其加到其所指向的页面:

P R ( A ) = P R ( B ) L ( B ) + P R ( C ) L ( C ) + P R ( D ) L ( D ) PR(A)={\frac {PR(B)}{L(B)}}+{\frac {PR(C)}{L(C)}}+{\frac {PR(D)}{L(D)}} PR(A)=L(B)PR(B)+L(C)PR(C)+L(D)PR(D)

或者img

  • PR(A) 是页面A的PR值
  • PR(Ti)是页面Ti的PR值,在这里,页面Ti是指向A的所有页面中的某个页面
  • C(Ti)是页面Ti的出度,也就是Ti指向其他页面的边的个数
  • d 为阻尼系数,其意义是,在任意时刻,用户到达某页面后并继续向后浏览的概率,

该数值是根据上网者使用浏览器书签的平均频率估算而得,通常d=0.85

最后,所有这些PR值被换算成百分比形式再乘上一个修正系数 d d d。由于“没有向外链接的网页”传递出去的PR值会是0,而这会递归地导致指向它的页面的PR值的计算结果同样为零,所以赋给每个页面一个最小值 ( 1 − d ) / N (1-d)/N (1d)/N(N为页面的总数)

P R ( A ) = ( P R ( B ) L ( B ) + P R ( C ) L ( C ) + P R ( D ) L ( D ) +   ⋯   ) d + 1 − d N PR(A)=\left({\frac {PR(B)}{L(B)}}+{\frac {PR(C)}{L(C)}}+{\frac {PR(D)}{L(D)}}+\,\cdots \right)d+{\frac {1-d}{N}} PR(A)=(L(B)PR(B)+L(C)PR(C)+L(D)PR(D)+)d+N1d

  • 需要注意的是,在Sergey Brin和Lawrence Page的1998年原版论文中给每一个页面设定的最小值是 1 − d 1-d 1d,而不是这里的 ( 1 − d ) / N (1-d)/N (1d)/N,这将导致集合中所有网页的PR值之和为N(N为集合中网页的数目)而非所期待的1。

因此,一个页面的PR值直接取决于指向它的的页面。如果在最初给每个网页一个随机且非零的PR值,经过重复计算,这些页面的PR值会趋向于某个定值,也就是处于收敛的状态,即最终结果。这就是搜索引擎使用该算法的原因。

那么什么时候,迭代结束哪?一般要设置收敛条件:比如上次迭代结果与本次迭代结果小于某个误差,我们结束程序运行;比如还可以设置最大循环次数。

四、PageRank的缺点

PageRank算法的主要缺点在于旧的页面的排名往往会比新页面高。因为即使是质量很高的新页面也往往不会有很多外链,除非它是某个已经存在站点的子站点。这也是PageRank需要多项算法结合以保证其结果的准确性的原因。

五、Python实现迭代法

下面仅仅实现迭代法,代码如下,需要用到Python的numpy库用于矩阵乘法:

# 输入为一个*.txt文件,例如
# A B
# B C
# B A
# ...表示前者指向后者
 
import numpy as np
 
 
if __name__ == '__main__':
 
    # 读入有向图,存储边
    f = open('input_1.txt', 'r')
    edges = [line.strip('\n').split(' ') for line in f]
    print(edges)
 
    # 根据边获取节点的集合
    nodes = []
    for edge in edges:
        if edge[0] not in nodes:
            nodes.append(edge[0])
        if edge[1] not in nodes:
            nodes.append(edge[1])
    print(nodes)
 
    N = len(nodes)
 
    # 将节点符号(字母),映射成阿拉伯数字,便于后面生成A矩阵/S矩阵
    i = 0
    node_to_num = {}
    for node in nodes:
        node_to_num[node] = i
        i += 1
    for edge in edges:
        edge[0] = node_to_num[edge[0]]
        edge[1] = node_to_num[edge[1]]
    print(edges)
 
    # 生成初步的S矩阵
    S = np.zeros([N, N])
    for edge in edges:
        S[edge[1], edge[0]] = 1
    print(S)
 
    # 计算比例:即一个网页对其他网页的PageRank值的贡献,即进行列的归一化处理
    for j in range(N):
        sum_of_col = sum(S[:,j])
        for i in range(N):
            S[i, j] /= sum_of_col
    print(S)
 
    # 计算矩阵A
    alpha = 0.85
    A = alpha*S + (1-alpha) / N * np.ones([N, N])
    print(A)
 
    # 生成初始的PageRank值,记录在P_n中,P_n和P_n1均用于迭代
    P_n = np.ones(N) / N
    P_n1 = np.zeros(N)
 
    e = 100000  # 误差初始化
    k = 0   # 记录迭代次数
    print('loop...')
 
    while e > 0.00000001:   # 开始迭代
        P_n1 = np.dot(A, P_n)   # 迭代公式
        e = P_n1-P_n
        e = max(map(abs, e))    # 计算误差
        P_n = P_n1
        k += 1
        print('iteration %s:'%str(k), P_n1)
 
    print('final result:', P_n)

输入的input_1.txt文本内容为:

A B
A C
A D
B D
C E
D E
B E
E A

结果为:

img

最后的一个数组,分别为A, B, C, D, E的PageRank值,其中E最高, A第二高, B和C相同均最低。

参考文献

[1] PageRank算法原理与实现

[2] 数据挖掘十大算法(六):PageRank算法原理与Python实现

[3] PageRank 维基百科,自由的百科全书

[4] 斯坦福CS224W图机器学习、图神经网络、知识图谱【同济子豪兄】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/374323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蒙特卡洛随机模拟

蒙特卡洛随机模拟 简介 蒙特卡洛模拟是在计算机上模拟项目实施了成千上万次,每次输入都随机选择输入值。由于每个输入很多时候本身就是一个估计区间,因此计算机模型会随机选取每个输入的该区间内的任意值,通过大量成千上万甚至百万次的模拟…

笔记本触摸板没反应怎么办?处理方法看这些

触摸板在笔记本电脑中是非常重要的一部分,很多用户都会选择使用触摸板代替鼠标。然而,有时你可能会发现,你的笔记本电脑触摸板没反应,无法正常使用。这对于日常使用来说是非常困扰的,但不用担心,我们将在这…

JavaScript BOM【快速掌握知识点】

目录 Window对象的常用属性 语法: Window对象的常用方法 语法: open()和close()方法 History对象 常用属性和方法 示例 Location对象 常用属性 常用方法 Document对象的常用方法 定时函数 超时调用:setTimeout() 间歇调用&…

插件化框架shadow——腾讯

theme: cyanosis Shadow简介 Shadow是最近腾讯开源的一款插件化框架。原理是使用宿主代理的方式实现组件的生命周期。目前的插件化框架,大部分都是使用hook系统的方式来做的。使用代理的基本上没有成体系的框架,只是一些小demo,Shadow框架的…

【华为OD机试模拟题】用 C++ 实现 - 查找单入口空闲区域(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明查找单入口空闲区域题目输入输出示例一输入输出说明示例二输入输出说明示例三输入输出说明示例

在linux中web服务器的搭建与配置

以下涉及到的linux命令大全查阅 https://www.runoob.com/linux/linux-command-manual.htmlvim命令查阅 https://www.runoob.com/linux/linux-vim.htmlscp命令https://www.runoob.com/linux/linux-comm-scp.html首先要有一个请求的服务地址用ssh 进入到linux系统中ssh 请求的服务…

JavaWeb Servlet Cookie和Session

6、Servlet 6.1、Servlet简介 Servlet就是sun公司开发动态web的一门技术Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤: 编写一个类,实现Servlet接口把开发好的Java类部…

Redis 4种集群方案介绍+优缺点对比

前言在服务开发中,单机都会存在单点故障的问题,即服务部署在一台服务器上,一旦服务器宕机服务就不可用,所以为了让服务高可用,分布式服务就出现了,将同一服务部署到多台机器上,即使其中几台服务…

【LeetCode】剑指 Offer 17. 打印从1到最大的n位数 p114 -- Java Version

题目链接:https://leetcode.cn/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/ 1. 题目介绍(17. 打印从1到最大的n位数) 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直…

<JVM上篇:内存与垃圾回收篇>12 - 垃圾回收相关概念

笔记来源:尚硅谷 JVM 全套教程,百万播放,全网巅峰(宋红康详解 java 虚拟机) 文章目录12.1. System.gc()的理解12.2. 内存溢出与内存泄露内存溢出(OOM)内存泄漏(Memory Leak&#xff…

【Linux驱动开发100问】Linux驱动开发工程师在面试中常被问到的问题汇总

🥇今日学习目标:什么是Kconfig?如何使用Kconfig? 🤵‍♂️ 创作者:JamesBin ⏰预计时间:10分钟 🎉个人主页:嵌入式悦翔园个人主页 🍁专栏介绍:Lin…

针对面试官的盘问-如何回答职场中的一些问题

(点击即可收听)初入职场,面对面试官的提问,如何回答01你为什么从上家公司离职?个人成长不足,不符合自己的预期(关系到个人竞争力,希望找到一份更有挑战,个人提升更大的工作),切忌与面试官倒苦水,说前公司老板的不是业务发展缓慢,上升空间有限(有些不符合…

【华为OD机试模拟题】用 C++ 实现 - 不等式(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明不等式题目输入输出描述示例一输入输出示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD …

正态分布、Q函数、误差函数erf()和互补误差函数erfc()

1、正态分布(高斯分布) 若随机变量 X服从一个位置参数为 μ、尺度参数为 σ 的概率分布,且其概率密度函数为 则这个随机变量就称为正态随机变量,正态随机变量服从的分布就称为正态分布,记作 X∼N(μ,σ2) 。 当μ0,σ…

【Opencv-python】之入门安装

目录 一、安装Python 1. 登录官网https://www.python.org/downloads/ 2. 任选一个版本,下载Python 3. 安装Python 记得勾选下图的Add Python 3.6 PATH, 添加python到环境变量的路径,然后选择Install now​编辑 4. 验证是否安装成功 5.退出 二、安装…

【华为OD机试模拟题】用 C++ 实现 - 路灯照明(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明路灯照明【华为OD机试模拟题】题目输入输出描述示例一输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高…

Redis源码---键值对中字符串的实现,用char*还是结构体

目录 前言 为什么 Redis 不用 char*? char* 的结构设计 操作函数复杂度 SDS 的设计思想 SDS 结构设计 SDS 操作效率 紧凑型字符串结构的编程技巧 小结 前言 对于 Redis 来说,键值对中的键是字符串,值有时也是字符串在 Redis 中写入一…

渗透之信息收集

信息收集 当我们需要渗透某一个网站、服务器。。。。时 我们首先得收集它得相关信息 比如: 域名、ip、端口、web cms指纹、目录扫描、网络空间测绘。。。。等等等等手段尽可能的去收集它的信息。 收集越多信息,相对于我们越有利,让我们有更多手段去对…

计算机组成原理(1)--计算机系统概论

一、计算机系统简介1.计算机系统软硬件概念计算机系统由“硬件”和“软件”两大部分组成。所谓“硬件”,是指计算机的实体部分,它由看得见摸得着的各种电子元器件,各类光、电、机设备的实物组成,如主机、外部设备等。所谓“软件”…

【华为OD机试模拟题】用 C++ 实现 - 某公司组织招聘(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明招聘 | 某公司组织题目输入输出示例一输入输出说明示例二输入输出说明示例三输入输出说明