【经典PageRank 】02/2 算法和线性代数
系列前文:【经典 PageRank 】01/2 PageRank的基本原理-CSDN博客
一、说明
并非所有连接都同样重要!
该算法由 Sergey 和 Lawrence 开发,用于在 Google 搜索中对网页进行排名。基本原则是重要或值得信赖的网页更有可能链接到其他重要网页。例如,来自信誉良好的网站的链接比来自不太知名的博客的链接具有更大的权重。
特征向量在理解 PageRank 算法的理论中发挥着基础作用。PageRank 和特征向量之间的联系可以在马尔可夫链或计算图及其稳态行为的背景下得到最好的理解。
二、特征向量和特征值
对于给定的方阵A和非零向量v,如果向量v满足方程A*v = λ*v ,则它是A的特征向量。这里,λ是称为特征值的标量,对应于特征向量v。从概念上讲,特征向量和特征向量是成对的值,其中特征向量在向量空间的某个基上具有向量变换的方向,特征值描述变换的大小。
2.1 网页排名
让我们将网络视为马尔可夫链,其中网页是节点或状态,页面之间的超链接作为方向边表示从一个页面转到另一页面的概率。当我们将此马尔可夫链表示为矩阵(称为转移矩阵)时,PageRank 算法的目标是找到一个稳态向量,其中概率总和为 1 或者没有进一步变化或收敛。查找页面排名的表达式由下式给出:
其中u:当前网页,d:阻尼因子,PR( v) :页面v的页面排名,N(v) :从v发出的链接数量
在 PageRank 的背景下,主导特征向量(对应于最大特征值的特征向量,在随机矩阵的情况下为 1)代表马尔可夫链的稳态分布。这种稳态分布就是我们试图计算的 PageRank 分数:系统中所有网页的概率分布,其中出现在页面上的概率不再随着进一步的转换而变化。
幂迭代方法涉及将向量(初始 PageRank 分数)重复乘以转移矩阵,本质上近似于该主特征向量。随着时间的推移,这个过程将会收敛,得到的向量将与矩阵的主特征向量成正比,从而给出网页的 PageRank 分数。
收敛背后的原因是,随着每次相乘(或转变),主要特征值的影响会增加,而其他特征值的影响会减小,特别是当引入阻尼因子时。最终,这导致向量与主特征向量成比例。
2.2 执行算法
- 将所有条目的页面排名得分矩阵初始化为 PR = 1/N。
- 表示网页- 如前所述,网络被想象为有向计算图。
- 阻尼因子- 引入来模拟随机网络冲浪者的行为,因为冲浪者大部分时间都会以概率d跟踪链接,但也会以(1-d)的概率移动到随机页面。
- 迭代- 使用上述表达式计算页面排名,直到它们收敛。
- 标准化- 经过几次迭代后,PageRank 值被标准化为总和为 1,以检查最大特征值 1。
def PageRank(transition_matrix, d, max_iterations, conv_thres):'''Arguments:transition_matrix: a matrix or numpy array representing the probabilities of going from one page to anotherd: damping factormax_iterations: number of iterationsconv_thres: convergence thresholdReturn: ranks of each webpage, as columns of the transition matrix'''#total number of web pagesN = transition_matrix.shape[0]#Intializing the transition matrix with equal probabilitiesPR = np.ones(N)/Nfor _ in range(max_iterations):PR_new = (1-d)/N + d*np.matmul(transition_matrix,PR)#normalizing the rank scoresPR_norm = np.linalg.norm(PR_new - PR, 1)#covergence constraintif PR_norm <= conv_thres:return PR_newPR = PR_newreturn PR
现在,让我们编写一个脚本,将转换矩阵可视化为马尔可夫链,其中网页作为状态或节点,超链接作为从一个页面移动到另一页面的概率。
def markov_chain(transition_matrix):# Create a directed graph.G = nx.DiGraph()# Nodes represent pages. Assume node labels are 0, 1, 2, ... for simplicity.num_nodes = transition_matrix.shape[0]G.add_nodes_from(range(num_nodes))# Iterate through the transition matrix to create edges.for i in range(num_nodes):for j in range(num_nodes):if transition_matrix[i, j] > 0: # Add edge if there's a non-zero transition probability.G.add_edge(i, j, weight=transition_matrix[i, j])# Visualize the graph.pos = nx.spring_layout(G)nx.draw_networkx_nodes(G, pos)nx.draw_networkx_labels(G, pos)nx.draw_networkx_edge_labels(G, pos, edge_labels={(u, v): f"{d['weight']:.2f}" for u, v, d in G.edges(data=True)})nx.draw_networkx_edges(G, pos)plt.title("Markov Chain from Transition Matrix")plt.axis("off")plt.show()
三、实验代码
这是 GitHub 存储库链接:ashu1069/PageRank (github.com),由 python 脚本和 Jupyter Notebook 组成。该脚本包含使用自定义输入的驱动程序代码,其余部分在自述文件中进行了解释。
本质上,PageRank 值代表从网络链接结构导出的转换矩阵的主要特征向量。特征向量和特征值的数学为我们提供了计算这些值的理论基础和实用方法(幂迭代)。
import numpy as np
import networkx as nx
import matplotlib.pyplot as pltdef PageRank(transition_matrix, d, max_iterations, conv_thres):'''Arguments:transition_matrix: a matrix or numpy array representing the probabilities of going from one page to anotherd: damping factormax_iterations: number of iterationsconv_thres: convergence thresholdReturn: ranks of each webpage, as columns of the transition matrix'''#total number of web pagesN = transition_matrix.shape[0]#Intializing the transition matrix with equal probabilitiesPR = np.ones(N)/Nfor _ in range(max_iterations):PR_new = (1-d)/N + d*np.matmul(transition_matrix,PR)#normalizing the rank scoresPR_norm = np.linalg.norm(PR_new - PR, 1)#covergence constraintif PR_norm <= conv_thres:return PR_newPR = PR_newreturn PR def markov_chain(transition_matrix):# Create a directed graph.G = nx.DiGraph()# Nodes represent pages. Assume node labels are 0, 1, 2, ... for simplicity.num_nodes = transition_matrix.shape[0]G.add_nodes_from(range(num_nodes))# Iterate through the transition matrix to create edges.for i in range(num_nodes):for j in range(num_nodes):if transition_matrix[i, j] > 0: # Add edge if there's a non-zero transition probability.G.add_edge(i, j, weight=transition_matrix[i, j])# Visualize the graph.pos = nx.spring_layout(G)nx.draw_networkx_nodes(G, pos)nx.draw_networkx_labels(G, pos)nx.draw_networkx_edge_labels(G, pos, edge_labels={(u, v): f"{d['weight']:.2f}" for u, v, d in G.edges(data=True)})nx.draw_networkx_edges(G, pos)plt.title("Markov Chain from Transition Matrix")plt.axis("off")plt.show()if __name__ == '__main__':transition_matrix = np.array([[0.1,0.5,0.4],[0.2,0,0.2],[0,0.3,0.3]])d = 0.85max_iterations = 1000conv_thres = 1e-6PR = PageRank(transition_matrix, d, max_iterations, conv_thres)print(f'PageRanks:{PR}')markov_chain(transition_matrix)
参考资料:
搜索引擎的剖析 (stanford.edu)
阿舒托什·库马尔
相关文章:

【经典PageRank 】02/2 算法和线性代数
系列前文:【经典 PageRank 】01/2 PageRank的基本原理-CSDN博客 一、说明 并非所有连接都同样重要! 该算法由 Sergey 和 Lawrence 开发,用于在 Google 搜索中对网页进行排名。基本原则是重要或值得信赖的网页更有可能链接到其他重要网页。例…...
【微客云】91优惠话费充值API接口开发功能介绍
话费充值接口文档 接口版本:1.0 ―、引言 文档概述 本文档提供话费充值接口规范说明,提供一整套的完整的接入示例(http 接口)供商户参 考,可以帮助商户开发人员快速完成接口开发与联调,实现与话费充值系统的交易互联。 公司官网…...

Kubernetes - 一键安装部署 K8S(附:Kubernetes Dashboard)
问题描述 不知道大伙是如何安装 K8s,特别还是集群的时候,我上一次安装搭建的时候,那个恶心到我了,真的是一步一个脚印走完整个搭建流程,爬了不少坑。 于是,才有了今天的文章,到底有没有可以一…...
Camera2开发基础知识篇——手机影像参数
1. 2、对焦 对焦指相机将图像清晰聚焦的过程。自动对焦功能可自动调整焦点,确保主体清晰锐利。手动对焦功能允许用户手动选择焦点。 3、焦距 简单理解就是指镜头的视角和放大倍数。实际到物理设备,焦距就是从镜片光学中心到底片、CCD或CMOS等成像平面…...

Unity之ShaderGraph如何实现无贴图水球效果
前言 我们今天来实现一个无贴图水球效果,如下图所示: 主要节点 UVSplit:可以获得UV在RGB三个颜色分别的分量 Remap:重映射节点 基于输入 In 值在输入In Min Max的 x 和 y 分量之间的线性插值,返回输入Out Min Max…...

【C语言】指针错题(类型分析)
题目: #include <stdio.h> int main () {int*p NULL;int arr[10] {0}; return 0; } 选项: A、p arr ; B、 int (* ptr )[10]& arr ; C、 p & arr [ 0 ]; D、 p & arr ; 解析: 1、 p 是一个指针变量,指…...

prosemirror 学习记录(二)创建 apple 节点
apple type 向 schema 中添加 apple type const nodes {apple: {inline: true,attrs: {name: { default: "unknown" },},group: "inline",draggable: true,parseDOM: [{tag: "span[custom-node-typeapple]",getAttrs(dom) {return {name: dom…...
自然语言处理---迁移学习
fasttext介绍 作为NLP工程领域常用的工具包,fasttext有两大作用:进行文本分类、训练词向量。在保持较高精度的情况下,快速的进行训练和预测是fasttext的最大优势。fasttext优势的原因: fasttext工具包中内含的fasttext模型具有十分简单的网络…...
node 第十天 原生node封装一个简易的服务器
原生node封装一个简易的服务器, 把前面几天的知识揉和起来做一个服务器基础实现, 首页访问, 静态资源服务器, 特定接口封装, 404app.js 服务器入口文件 app.js node app.js即可启动服务器 const { start } require(./modules/server); start();require_modules.js 整合模块导…...
php实战案例记录(25)intval函数的用法
在PHP中,intval()函数用于将一个字符串转换为整数。它的语法如下: intval(string $value, int $base 10): int参数说明: $value:要转换的字符串。$base(可选):进制数,默认为10。如…...

laravel框架介绍(二) composer命令下载laravel报错
1.composer命令下载laravel报如下错 : curl error 18 while downloading https://repo.packagist.org/p2/symfony/uid.j son: transfer closed with 3808 bytes remaining to read,具体为 解决方案:执行以下命令切换镜像 >composer con…...

代码签名证书到期了怎么续费?
我们都知道代码签名证书最长期限可以申请3年,但有的首次申请也会申请1年,这种情况下证书到期了就意味着要重新办理,同样的实名验证步骤还需要再走一遍,尤其目前无论是哪种类型的代码签名证书都会有物理硬件,即使交钱实…...
JAVA 同城服务预约家政小程序开发的优势和运营
随着社会节奏的加快,人们对家庭清洁和维护的需求日益增长。为了满足这一需求,JAVA同城服务预约家政小程序应运而生。本文将详细介绍该小程序开发的优势及运营策略,帮助读者更好地了解其价值和潜力。 一、开发优势 方便快捷:用户…...

基于粒子群算法的无人机航迹规划-附代码
基于粒子群算法的无人机航迹规划 文章目录 基于粒子群算法的无人机航迹规划1.粒子群搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用粒子群算法来优化无人机航迹规划。 1.粒子群…...

前端使用qrcodejs2插件实现根据网址生成二维码
实现效果: 实现方法: 1.安装插件 npm install --save qrcodejs2 2.可以全局引入,也可以只在使用的vue文件中引入 import QRCode from qrcodejs2; 3.在vue文件的template中设置放置二维码的div <div id"qrcode"></di…...

A股风格因子看板 (2023.10 第11期)
该因子看板跟踪A股风格因子,该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子,用以分析市场风格切换、组合风格暴露等。 今日为该因子跟踪第11期,指数组合数据截止日2023-09-30,要点如下 近1年A股风格因子检验统…...
anaconda安装python 3.11
最近需要测试gpt researcher项目,gpt researcher项目的环境是3.11,于是用anaconda创建一个虚拟环境,结果报错了: UnsatisfiableError: The following specifications were found to be incompatible with each other:Package xz c…...
问题:EventSource 收不到流数据及 EventSource 的 onmessage 方法为null
文章目录 问题分析问题 在开发时,有用到 EventSource,但是在 new EventSource 的时候,打印 new EventSource 如下: onmessage : null, onerror : null, onopen: f(event)前端...
P2 B+树索引
文章目录 Task1 B树页B树页B树内部结点B树叶子结点 Task2 B树操作Task2 B树插入和搜索的单一值插入单一值搜索单一值 Task2 B树删除 Task3 叶子扫描的迭代器Task4 并行索引 Task1 B树页 B树页 实际上是每个B树页面的标题部分,包含叶子页面和内部页面共享的信息。 …...
爬虫知识之BeautifulSoup库安装及简单介绍
一. 前言 在前面的几篇文章中我介绍了如何通过Python分析源代码来爬取博客、维基百科InfoBox和图片,其文章链接如下: 其中核心代码如下: # coding=utf-8 import urllib import re #下载静态HTML网页 url=http://www.csdn.net/ content = urllib.urlopen(url).read…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...