数学建模--PageRank算法的Python实现

1. P a g e R a n k PageRank PageRank算法背景

   P a g e R a n k PageRank PageRank 算法是现代数据科学中用于图链接分析的经典方法,最初由 L a r r y Larry Larry P a g e Page Page S e r g e y Sergey Sergey B r i n Brin Brin 在1996年提出。两位斯坦福大学研究生认为互联网上的链接结构能够反映页面的重要性,与当时基于关键词的搜索方法形成对比。这一独特观点不仅赢得了学术界的认可,也为后来创建的 G o o g l e Google Google搜索引擎奠定了基础。

   P a g e R a n k PageRank PageRank的核心思想基于有向图上的随机游走模型,即一阶马尔可夫链。描述了随机游走者如何沿着图的边随机移动,最终收敛到一个平稳分布。在这分布中,每个节点被访问的概率即为其 P a g e R a n k PageRank PageRank 值,代表节点的重要性。 P a g e R a n k PageRank PageRank是递归定义的,计算需要迭代方法,因为一个页面的值部分取决于链接到它的其他页面的值。尽管最初设计用于互联网页面,但 P a g e R a n k PageRank PageRank 已广泛应用于社会影响力、文本摘要等多个领域,展示了其在图数据上的强大实用性。

2. P a g e R a n k PageRank PageRank算法基础

2.1. P a g e R a n k PageRank PageRank问题描述

   P a g e R a n k PageRank PageRank 算法是互联网早期用于评估网页重要性的方法。其核心概念是将互联网视为一个有向图,其中每个网页是一个节点,超链接是有向边。通过建立一阶马尔可夫链的随机游走模型,模拟虚拟网页浏览者随机跳转,最终形成一个平稳分布。每个网页的 P a g e R a n k PageRank PageRank 值代表其在这个分布中的概率,即重要性。

   举例说明,如下图所示,假设有三个网页 A A A B B B C C C A A A 链接到 B B B C C C B B B 只链接到 C C C,而 C C C 只链接到 A A A。随机游走模型中,从 A A A 出发的浏览者有 50% 的概率跳转到 B B B C C C;从 B B B 出发的浏览者会 100% 跳转到 C C C;从 C C C 出发的浏览者会 100% 跳转到 A A A。经过多次迭代, C C C P a g e R a n k PageRank PageRank 值可能比 A A A B B B 高,因为它接收到了 A A A B B B 的流量。
在这里插入图片描述
   P a g e R a n k PageRank PageRank算法直观上认为,一个网页被指向的超链接越多,随机跳转到该网页的概率越高,其 P a g e R a n k PageRank PageRank值越高,表示网页越重要。反之,指向该网页的 P a g e R a n k PageRank PageRank值越高,该网页 P a g e R a n k PageRank PageRank值也越高,表明其重要性增加。PageRank值依赖于网络拓扑结构,一旦确定, P a g e R a n k PageRank PageRank值也确定。计算通过迭代,在互联网有向图上进行。初始假设一个分布,通过迭代计算所有网页的 P a g e R a n k PageRank PageRank值直至收敛。有向图和随机游走模型定义了 P a g e R a n k PageRank PageRank的基本原理,而基本定义对应于理想情况,一般定义则考虑实际网络中的复杂性。

2.2.有向图模型

  有向图( D i r e c t e d Directed Directed G r a p h Graph Graph)是图论的基本概念,由节点和有向边组成。每条边有起始节点和终止节点,表示方向性。在互联网中,每个网页可看作有向图中的一个节点,超链接则表示有向边。

  以三个网页 A、B 和 C 为例,网页 A 包含指向 B 和 C 的链接,B 包含指向 C 的链接,而 C 包含指向 A 的链接。这构成有向图的边集合,即 E={(A,B),(A,C),(B,C),(C,A)}。

  有向图中的周期性结构可通过路径的长度判断,例如,从节点 A 出发返回 A 需要经过长度为 3 的倍数的路径。这样的有向图被称为周期性图。
在这里插入图片描述

2.3.随机游走模型

  给定一个含有 n n n个结点的有向图,在有向图上定义随机游走( R a n d o m Random Random W a l k Walk Walk)模型,即一阶马尔可夫链,其中结点表示状态,有向边表示状态之间的转移,假设从一个结点到通过有向边相连的所有结点的转移概率相等。具体地,转移矩阵是一个 n n n阶矩阵。
M = [ m i j ] n × n M=[m_{ij}]_{n\times n} M=[mij]n×n

  第 i i i行第 j j j列的元素 m i j m_{ij} mij取值规则如下:如果结点 j j j有有 k k k个有向边连出,并且结点 i i i是其连出的一个结点则 m i j = 1 k m_{ij}=\frac{1}{k} mij=k1,否则 m i j = 0 m_{ij}=0 mij=0.
注意转移矩阵 M M M具有如下约束条件:
m i j ≥ 0 m_{ij}\geq0 mij0
∑ i = 1 n m i j = 1 \sum_{i=1}^nm_{ij}=1 i=1nmij=1
  即每个元素非负,每列元素之和为1即矩阵 M M M为随机矩阵( s t o c h a s t i c stochastic stochastic m a t r i x matrix matrix)。
  在有向图上的随机游走形成马尔可夫链。也就是说,随机游走者每经过一个单位时间转移一个状态。如果当前时刻在第 i i i 个结点(状态),那么下一个时刻在第 j j j 个结点(状态)的概率是 P i j P_{ij} Pij。这一概率只依赖于当前的状态,与过去无关,具有马尔可夫性。

3. P a g e R a n k PageRank PageRank算法定义

3.1. P a g e R a n k PageRank PageRank算法基本定义

  给定一个包含 n n n 个结点的强连通且非周期性的有向图,在其基础上定义随机游走模型。假设转移矩阵为 M M M,在时刻 0 , 1 , 2 , … , t , … 0, 1, 2, \dots, t, \dots 0,1,2,,t,,访问各个结点的概率分布为 p 0 , p 1 , p 2 , … , p t , … \mathbf{p}_0, \mathbf{p}_1, \mathbf{p}_2, \dots, \mathbf{p}_t, \dots p0,p1,p2,,pt,。其中, v 0 \mathbf{v}_0 v0 是初始概率分布。

p 0 = v 0 , p t + 1 = p t ⋅ M \mathbf{p}_0 = \mathbf{v}_0, \quad \mathbf{p}_{t+1} = \mathbf{p}_t \cdot M p0=v0,pt+1=ptM

  则极限为:
lim ⁡ t → ∞ M t R 0 = R \lim_{t\to\infty}M^tR_0=R tlimMtR0=R
  存在极限向量 R R R表示马尔可夫链的平稳分布,满足:
M R = R MR=R MR=R
  平稳分布 R R R称为这个有向图的 P a g e R a n k PageRank PageRank R R R的各个分量称为各个结点的 P a g e R a n k PageRank PageRank值。
R = [ P R ( v 1 ) P R ( v 2 ) ⋮ P R ( v n ) ] \left.R=\left[\begin{array}{c}PR\left(v_1\right)\\PR\left(v_2\right)\\\vdots\\PR\left(v_n\right)\end{array}\right.\right] R= PR(v1)PR(v2)PR(vn)

  其中
P R ( v i ) = ∑ v j ∈ M ( v i ) P R ( v j ) L ( v j ) , i = 1 , 2 , ⋯ , n PR\left(v_i\right)=\sum_{v_j\in M\left(v_i\right)}\frac{PR\left(v_j\right)}{L\left(v_j\right)},\quad i=1,2,\cdots,n PR(vi)=vjM(vi)L(vj)PR(vj),i=1,2,,n

  这里 M ( v i ) M(v_i) M(vi) 表示指向结点 v i v_i vi的结点集合, L ( v j ) L(v_j) L(vj) 表示结点 v j v_j vj 连出的有向边的个数。

3.2. P a g e R a n k PageRank PageRank算法一般定义

  为了考虑到用户不仅会通过点击链接来浏览网页,还可能随机选择一个网页。因此需要在基本定义的基础上导入平滑项阻尼因子。阻尼因子 d d d 取值由经验决定,例如 d = 0.85 d=0.85 d=0.85。当 d d d 接近1时,随机游走主要依照转移矩阵 M M M 进行;当 d d d 接近0时,随机游走主要以等概率随机访问各个结点。
R = ( d M + 1 − d n E ) R = d M R + 1 − d n 1 \begin{aligned}R&=(dM+\frac{1-d}n\mathbf{E})R\\&=dMR+\frac{1-d}n1\end{aligned} R=(dM+n1dE)R=dMR+n1d1

  相当于:
P R ( v i ) = d ( ∑ v j ∈ M ( v i ) P R ( v j ) L ( v j ) ) + 1 − d n , i = 1 , 2 , ⋯ , n PR\left(v_i\right)=d\left(\sum_{v_j\in M\left(v_i\right)}\frac{PR\left(v_j\right)}{L\left(v_j\right)}\right)+\frac{1-d}n,\quad i=1,2,\cdots,n PR(vi)=d vjM(vi)L(vj)PR(vj) +n1d,i=1,2,,n

4. P a g e R a n k PageRank PageRank算法计算

4.1.幂迭代法

  首先给每个页面赋予随机的PR值,然后通过 P n + 1 = A ⋅ P n P_{n+1} = A \cdot P_n Pn+1=APn 不断地迭代 P R PR PR值。当满足下面的不等式后迭代结束,获得所有页面的 P R PR PR值:

∣ P n + 1 − P n ∣ < ϵ |P_{n+1}-P_n|<\epsilon Pn+1Pn<ϵ

  其中, ϵ \epsilon ϵ是预先定义的小正数。

4.2.特征值法

  特征值法是一种用于求解线性代数问题的方法,其中之一就是求解矩阵的特征值和特征向量。在上述描述中,特征值法用于分析 M a r k o v Markov Markov 链的收敛行为。

  具体来说,对于一个方阵 A A A,其特征值( e i g e n v a l u e s eigenvalues eigenvalues λ \lambda λ 和对应的特征向量( e i g e n v e c t o r s eigenvectors eigenvectors v \mathbf{v} v满足以下方程:

A ⋅ v = λ ⋅ v A \cdot \mathbf{v} = \lambda \cdot \mathbf{v} Av=λv

  这个方程可以重写为 ( A − λ ⋅ I ) ⋅ v = 0 (A - \lambda \cdot I) \cdot \mathbf{v} = \mathbf{0} (AλI)v=0,其中 I I I 是单位矩阵。

  对于 M a r k o v Markov Markov 链的情况,我们考虑转移矩阵 A A A。特征值法告诉我们,当 A A A 的特征值中存在一个值为 1 时,对应的特征向量可以用来表示 Markov 链的收敛状态。这个特征向量的所有分量均为正,而且是唯一的。

  在 P a g e R a n k PageRank PageRank 算法中,我们通过不断迭代

P n + 1 = A ⋅ P n P_{n+1} = A \cdot P_n Pn+1=APn

  来逼近这个特征向量,直到收敛。这就是特征值法在 P a g e R a n k PageRank PageRank 算法中的应用。

4.3.代数法

  相似的,当上面提到的 M a r k o v Markov Markov链收敛时,必有:
P = A P ⇒ P = ( α S + ( 1 − α ) N e e T ) P 方量都为 1 的列向量, P 的所有分量之和为 1 ⇒ P = α S P + ( 1 − α ) N e ⇒ ( e e T − α S ) P = ( 1 − α ) N e ⇒ P = ( e e T − α S ) − 1 ( 1 − α ) N e \begin{gathered} P=AP \\ \Rightarrow P=(\alpha S+\frac{(1-\alpha)}Nee^T)P \\ \text{方量都为}1\text{的列向量,}P\text{的所有分量之和为}1 \\ \Rightarrow P=\alpha SP+\frac{(1-\alpha)}Ne \\ \Rightarrow(ee^T-\alpha S)P=\frac{(1-\alpha)}Ne \\ \Rightarrow P=(ee^T-\alpha S)^{-1}\frac{(1-\alpha)}Ne \end{gathered} P=APP=(αS+N(1α)eeT)P方量都为1的列向量,P的所有分量之和为1P=αSP+N(1α)e(eeTαS)P=N(1α)eP=(eeTαS)1N(1α)e

5. P a g e R a n k PageRank PageRank算法计算实例

  利用 P a g e R a n k PageRank PageRank算法计算下图每一个结点对应的 P R PR PR
在这里插入图片描述
  迭代过程与最后结果如下所示:

IterationABCDE
10.20.0870.0870.12350.2455
20.23870.097620.097620.13910.2727
30.26180.10420.10420.14850.289
40.27570.10810.10810.1540.2988
50.283960.110450.110450.15740.3046
60.288920.111860.111860.15940.3081
70.29190.11270.11270.16060.3102
80.293680.113210.113210.16130.3115
90.294750.113510.113510.16180.3122
100.295390.113690.113690.1620.3127
110.295770.11380.11380.16220.3129
120.2960.113870.113870.16230.3131
13
210.2960.1130.1130.1620.313
Final0.2960.1130.1130.1620.313

6.算法工作源代码

6.1.绘制图网络代码

#绘制有向图
import networkx as nx
import matplotlib.pyplot as plt
G = nx.DiGraph()
nodes = ["A", "B", "C", "D", "E"]
G.add_nodes_from(nodes)
edges = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "D"), ("C", "E"), ("D", "E"), ("B", "E"), ("E", "A")]
G.add_edges_from(edges)
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True, node_size=700, node_color='skyblue', font_size=10, font_color='black',font_weight='bold', arrowsize=20, connectionstyle='arc3,rad=0.1')
#plt.savefig("Graph.png")#随机的图像
plt.show()

6.2. P a g e R a n k PageRank PageRank算法Python代码实现

from pygraph.classes.digraph import digraph
import networkx as nx
import matplotlib.pyplot as plt
class PRIterator:"""计算一张图中的PR值"""def __init__(self, dg):self.damping_factor = 0.85  # 阻尼系数,即αself.max_iterations = 100  # 最大迭代次数self.min_delta = 0.00001  # 确定迭代是否结束的参数,即ϵself.graph = dgdef page_rank(self):#  先将图中没有出链的节点改为对所有节点都有出链for node in self.graph.nodes():if len(self.graph.neighbors(node)) == 0:for node2 in self.graph.nodes():dg.add_edge((node, node2))nodes = self.graph.nodes()graph_size = len(nodes)if graph_size == 0:return {}page_rank = dict.fromkeys(nodes, 1.0 / graph_size)  # 给每个节点赋予初始的PR值damping_value = (1.0 - self.damping_factor) / graph_size  # 公式中的(1−α)/N部分flag = Falsefor i in range(self.max_iterations):change = 0for node in nodes:rank = 0for incident_page in self.graph.incidents(node):  # 遍历所有“入射”的页面rank += self.damping_factor * (page_rank[incident_page] / len(self.graph.neighbors(incident_page)))rank += damping_valuechange += abs(page_rank[node] - rank)  # 绝对值page_rank[node] = rankprint("This is NO.%s iteration" % (i + 1))print(page_rank)if change < self.min_delta:flag = Truebreakif flag:print("finished in %s iterations!" % (i + 1))else:print("finished out of 100 iterations!")return page_rank#%%
if __name__ == '__main__':dg = digraph()dg.add_nodes(["A", "B", "C", "D", "E"])dg.add_edge(("A", "B"))dg.add_edge(("A", "C"))dg.add_edge(("A", "D"))dg.add_edge(("B", "D"))dg.add_edge(("C", "E"))dg.add_edge(("D", "E"))dg.add_edge(("B", "E"))dg.add_edge(("E", "A"))pr = PRIterator(dg)page_ranks = pr.page_rank()print("The final page rank is\n", page_ranks)

7.参考资料

[1].https://zhuanlan.zhihu.com/p/137561088
[2].https://zhuanlan.zhihu.com/p/133233438
[3].https://www.mlpod.com/36.html
[4].https://www.cnblogs.com/rubinorth/p/5799848.html
[5].https://zhuanlan.zhihu.com/p/197877312
[6].https://blog.csdn.net/qq_36159768/article/details/108791236

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

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

相关文章

GD32接收不定长数据包

接收不定长数据 Cubemx生成代码过程忽略 首先在main函数中创建接收缓存区 并在main.h中定义 接下来就是重写串口的中断函数中的内容&#xff0c;把原有内容注释掉 main中创建一个记录接收数据长度的变量和标志位 然后再在主函数中添加一个验证代码&#xff0c;这样MCU收到数据…

Cesium叠加超图二维服务、三维场景模型

前言 Cesium作为开源的库要加超图的服务则需要适配层去桥接超图与Cesium的数据格式。这个工作iClient系列已经做好&#xff0c;相比用过超图二维的道友们可以理解&#xff1a;要用Openlayer加载超图二维&#xff0c;那就用iClient for Openlayer库去加载&#xff1b;同样的要用…

Git与GitHub零基础教学

大家好&#xff0c;我是星恒&#xff0c;这个帖子给大家分享的是git和github的全套教程&#xff0c;包含github初始&#xff0c;git常用命令以及基本使用&#xff0c;git的ssh链接github&#xff0c;github使用token登录&#xff0c;github和idea的配合&#xff0c;一些平时常用…

Flink编程——基础环境搭建

基础环境搭建 文章目录 基础环境搭建准备环境搭建源码环境搭建克隆代码编译导入IDEA 集群环境搭建本地模式安装步骤 1&#xff1a;下载步骤 2&#xff1a;启动集群步骤 3&#xff1a;提交作业&#xff08;Job&#xff09;步骤 4&#xff1a;停止集群 总结 准备环境搭建 我们先…

web3d-three.js场景设计器-天空包围盒-TWEEN.js

THREE.JS 实现场景天空包围盒&#xff0c;为了让场景背景更具体&#xff0c;而不是呆板的纯色&#xff0c;可以给厂家添加围绕的包围盒。 这里使用球体来实现&#xff0c;球体中央则是场景给球体添加天空的渐变色加入场景 代码如下 function createSky( hemiLight) { const …

学习笔记——克里金插值

有一篇大神的文章写得非常的具体&#xff0c; https://xg1990.com/blog/archives/222 下面写下一些学习笔记&#xff1a; 1、关于克里金插值的基本原理 克里金插值来源于地理学&#xff0c;它的前提是地理学第一定律&#xff1a;所有事物都与其他事务相关&#xff0c;但是近…

应用层—HTTP详解(抓包工具、报文格式、构造http等……)

文章目录 HTTP1. 抓包工具的使用1.1 配置信息1.2 观察数据 2. 分析 https 抓包结果3. HTTP请求详解3.1 认识 URL3.1.1 URL 基本格式3.1.2 查询字符串 (query string)3.1.3 关于 URL Encode 3.2 认识 http 方法3.2.1 [经典问题] Get 和 Post 主要的区别是什么&#xff1f;&#…

Java多线程并发篇----第二十九篇

系列文章目录 文章目录 系列文章目录前言一、什么是不可变对象,它对写并发应用有什么帮助二、Java 中用到的线程调度算法是什么?三、什么是线程组,为什么在 Java 中不推荐使用?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点…

C++11手撕线程池 call_once 单例模式 Singleton / condition_variable 与其使用场景

一、call_once 单例模式 Singleton 大家可以先看这篇文章&#xff1a;https://zh.cppreference.com/w/cpp/thread/call_once /*std::call_oncevoid call_once( std::once_flag& flag, Callable&& f, Args&&... args ); */ #include <iostream> #i…

DT浏览器的人工智能是如何学习知识的

DT浏览器的人工智能是如何学习知识的&#xff0c;DT浏览器的人工智能通过大量的数据和算法来实现知识学习的。这是一些学习知识的方式&#xff1a; 1. 数据驱动学习&#xff1a;通过处理和分析大量的文本数据来学习语言知识和语言模式。这些数据可以来自各种来源&#xff0c;如…

解决 pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。

执行下面命令进行安装pnpm安装后 npm install -g pnpm 然后执行pnpm 报错 解决办法&#xff1a; 以管理员身份运行 Windows PowerShell &#xff0c; 在命令行输入以下命令后按回车&#xff0c; set-ExecutionPolicy RemoteSigned 再输入Y 回车即可。 再回到控制台输入p…

k8s---包管理器helm

内容预知 目录 内容预知 helm相关知识 Helm的简介与了解 helm的三个重要概念 helm的安装和使用 将软件包拖入master01上 使用 helm 安装 Chart 对chart的基本使用 查看chart信息 安装chart 对chart的基本管理 helm自定义模板 在镜像仓库中拉取chart&#xff0c;查…

大路灯和台灯哪个对眼睛好?学生备考大灯推荐

最近家长圈里开始流行这么一句话&#xff1a;鸡娃的尽头&#xff0c;是鸡眼。曾经绘画课、科学课、乐高课、思维课一样没落下&#xff0c;讲绘本、学英语也是每天的日常&#xff0c;周一到周日孩子的行程排得满满当当。可没想到有一天带着孩子去医院体检视力的时候&#xff0c;…

python 正则表达式学习(1)

正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与某种模式匹配。 1. 特殊符号 1.1 符号含义 模式描述^匹配字符串的开头$匹配字符串的末尾.匹配任意字符&#xff0c;除了换行符&#xff0c;当re.DOTALL标记被指定时&#xff0c;则可以匹配包…

LangChain实战:老喻干货店社交网络Agent一

LangChain实战&#xff1a;老喻干货店社交网络Agent一 如果您也在准备AIGC前端全栈&#xff0c;LangChain是最成熟的AI应用开发框架。欢迎点赞收藏&#xff0c;一起学习AI。 LangChain 一 hello LLM LangChain 二 模型 LangChain 三 Data Connections LangChain 四 Prompts Lan…

大模型学习与实践笔记(十一)

一、使用OpenCompass 对模型进行测评 1.环境安装&#xff1a; git clone https://github.com/open-compass/opencompass cd opencompass pip install -e . 当github超时无法访问时&#xff0c;可以在原命令基础上加上地址&#xff1a; https://mirror.ghproxy.com git clon…

司铭宇老师:房地产中介销售培训课程:如何打消购房者买房疑虑

房地产中介销售培训课程&#xff1a;如何打消购房者买房疑虑 购房是一项重大的人生决定&#xff0c;它不仅涉及到巨大的经济投入&#xff0c;还关系到购房者未来的生活品质。因此&#xff0c;购房者在做出购买决定前往往会有许多疑虑和担忧。作为房地产销售人员&#xff0c;能够…

VS2022联合Qt5开发学习9(QT5.12.3鼠标按下、释放、移动事件以及Qt上取标注点)

在研究医学图像可视化的时候&#xff0c;鼠标响应这里一直都有问题。研究了几天VTK的取点&#xff0c;还是会和Qt冲突。所以现在试试Qt的方式取点&#xff0c;看看能不能实现我的功能。 查了很多资料&#xff0c;这篇博文里的实例有部分参考了祥知道-CSDN博客这位博主的博客[Q…

超级菜鸟怎么学习数据分析?

如果你有python入门基础&#xff0c;在考虑数据分析岗&#xff0c;这篇文章将带你了解&#xff1a;数据分析人才的薪资水平&#xff0c;数据人应该掌握的技术栈。 首先来看看&#xff0c;我在搜索数据分析招聘时&#xff0c;各大厂开出的薪资&#xff1a; 那各大厂在数据领域…

DC电源模块的特点及应用案例分享

BOSHIDA DC电源模块的特点及应用案例分享 DC电源模块是一种可以将交流电转换为直流电的设备&#xff0c;具有以下特点&#xff1a; 1.高效稳定&#xff1a;DC电源模块采用高效稳定的电源转换技术&#xff0c;可以将输入的交流电转换为输出的稳定直流电&#xff0c;并且具有高…