数学建模--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.rhkb.cn/news/243528.html

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

相关文章

不想要网页默认的右键菜单栏,怎么封装一个可以自定义的右键菜单组件?

说在前面 &#x1f388;网页的功能和用途可能各不相同&#xff0c;在传统右键菜单栏中无法满足每个用户的个性化需求。通过自定义右键菜单栏&#xff0c;用户可以根据自己的需求添加、调整和删除菜单选项&#xff0c;以实现个性化定制。通过自定义右键菜单栏&#xff0c;可以为…

Mapbox加载浙江省天地图服务和数据处理

1. 加载影像服务 通过浙江省天地图官网申请所需服务&#xff0c;使用token获取服务数据 由于浙江省天地图使用的坐标系是 cgcs2000&#xff0c;需要使用 的框架对应为 cgcs2000/mapbox-gl&#xff0c;通过cdn引入或npm下载 影像服务地址为&#xff1a; ‘https://ditu.zjzw…

Web安全漏洞专项靶场—SQL注入—docker环境—sqli-labs靶场—详细通关指南

SQL注入—sqli-labs靶场 零、前言一、环境搭建①、VirtualBox②、Kali Linux③、Docker 二、闯关开始1、Less-1——union2、Less-2—数字型—union3、Less-3—)—union4、Less-4—")—union5、Less-5——布尔盲注6、Less-6—"—布尔盲注7、Less-7—))7.1—布尔盲注7.…

Xcode查看APP文件目录

一、连接真机到MAC电脑上 二、打开Devices 点击window -> Devices and Simulatores 三、选中设备、选择app 四、选择下载内容 五、查看文件内容 得到的文件 右键显示包内容&#xff0c;获得APP内数据 六、分发证书无法下载 使用分发的证书无法下载文件内容&#xf…

x-cmd pkg | hurl - HTTP 请求处理工具

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 Hurl 是 HTTP 请求处理工具&#xff0c;支持使用简单的纯文本格式定义的 HTTP 请求。它的用途非常广泛&#xff0c;既可以用于获取数据&#xff0c;也可以用于测试HTTP会话。 它可以链式处理请求&#xff0c;捕获数值…

LeetCode 670 最大交换数

周一&#xff0c;非常冷&#xff0c;大风呼呼的&#xff0c;上班路都走不动。 好消息&#xff0c;马上要过年了。大风吹&#xff0c;天气好。 过年过年&#xff0c;回家过年~ 学生时代的迷茫是不应该存在的&#xff0c;最好的时光应该尽情享受&#xff0c;而不应该自己给加层…

GO 的那些 IDE

文章目录 支持哪些功能快捷键代码高亮代码格式化代码提示导航跳转代码调试构建编译其他功能 GO有哪些IDEGolandVS CodeVim GOSublime TextAtomLiteIDEEclipse 总结 “程序员为什么要使用 IDE”&#xff0c;在一些社区论坛&#xff0c;经常可以看到这样的提问。关于是否应该使用…

有效的括号

有效的括号 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/valid-parentheses/…

Go语言学习笔记:基础语法和类型

Go语言学习笔记&#xff1a;基础语法和类型 目录 Go语言学习笔记&#xff1a;基础语法和类型学习路线前言变量声明常量数据类型布尔型&#xff08;Boolean&#xff09;整型&#xff08;Integer&#xff09;浮点型&#xff08;Floating point&#xff09;复数型&#xff08;Comp…

LoadRunner从零开始之接触LoadRunner

LoadRunner 是Mercury Interactive 公司开发的一款成熟的性能测试工具&#xff0c;LoadRuner 作为性能测试的实现者&#xff0c;涉及了性能测试流程、性能测试技术和软件 体系架构等众多方面的知识点&#xff0c;可以说&#xff0c;学习LoadRuner 是理解和学习性能测试 的非常好…

elastic search入门

参考1&#xff1a;Elastic Search 入门 - 知乎 参考2&#xff1a;Ubuntu上安装ElasticSearch_ubuntu elasticsearch-CSDN博客 1、ElasticSearch安装 1.1安装JDK&#xff0c;省略&#xff0c;之前已安装过 1.2创建ES用户 创建用户&#xff1a;sudo useradd esuser 设置密码&…

大模型相关学习资料整理

1. 核心2框架 1. semantic-kernel【微软】 https://learn.microsoft.com/en-us/semantic-kernel/overview/ 2. LangChain https://www.langchain.asia/ https://python.langchain.com/docs/get_started/introduction 2. 技术点 1. Function Call https://platform.opena…

mac安装node多环境

安装node node安装包 查询node环境 一般都是最新稳定版本 切换node环境 一般有些项目需要老的node版本支持&#xff0c;但是新的项目老的版本又不支持&#xff0c;这个时候需要切换node版本来运行各个项目 这个时候需要一个npm包 n来管理这些node环境包 sudo npm i -g n注…

Linux与windows互相传输文件之rzsz命令

文章目录 关于rzsz安装软件使用命令方法一&#xff1a;直接拖拽方法二&#xff1a;直接在终端输入rz 关于rzsz 这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件 安装完毕之后可以通过拖拽的方式将文件上传过去 首先看一下我们的机器可以使用网络吗&#xff…

导出 MySQL 数据库表结构、数据字典word设计文档

一、第一种 &#xff1a;利用sql语句查询 需要说明的是该方法应该适用很多工具&#xff0c;博主用的是navicat SELECT TABLE_NAME 表名,( i : i 1 ) AS 序号,COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHARACTER_MAXIMUM_LENGTH 长度, IS_NULLABLE…

linux性能优化-磁盘I_O优化

1.文件系统 1.1.文件系统的工作原理 文件系统是在磁盘的基础上&#xff0c;提供了一个用来管理文件的树状结构。 接下来我们就看看Linux 文件系统的工作原理。 1.1.1索引节点和目录项 在 Linux 中一切皆文件 ,文件系统,本身是对存储设备上的文件&#xff0c;进行组织管理的…

安裝火狐和穀歌流覽器插件FoxyProxy管理海外動態IP代理

代理生態系統擁有大量有用的實用程式&#xff0c;使海外代理IP代理設置的使用變得簡單起來。其中一種類型叫做代理管理工具&#xff0c;像FoxyProxy就是該工具集比較受歡迎的。 本文將全面解析FoxyProxy擴展的功能和特性、Foxyproxy怎麼下載、以及如何在穀歌流覽器和火狐流覽器…

[小程序]Http网络请求

一、数据请求限制 出于安全性(bushi)考虑&#xff0c;小程序请求的数据接口必须具备以下两个条件&#xff1a; ①只能请求Https类型 ②必须将接口域名添加到信任列表中 1.配置request合法域名 配置步骤如下&#xff1a;小程序管理后台->开发->开发设置->服务器域名-&g…

【GitHub项目推荐--12306 抢票助手 python】【转载】

这个项目名很干脆&#xff0c;不知道以为是 12306 网站的源码&#xff0c;其实不是这是全 GitHub最德高望重的抢票小助手&#xff0c;功能一直在更新&#xff0c;且现已支持 Python 3.6 以上版本。 开源地址&#xff1a;https://github.com/testerSunshine/12306

开源项目CuteSqlite开发笔记(八):Windows 64位/32位使用GetWindowLongPtr钩子函数

需求描述 在开发CuteSqlite的时候&#xff0c; 有一个功能需要实现&#xff0c;鼠标移到WTL::CStatic上后&#xff0c;发送消息通知CToolTipCtrl弹出。 遇到问题 WTL::CStatic控件没有相应 WM_MOUSEMOVE 消息&#xff0c;需要返回一个HTCLIENT消息来让窗口处理函数执行 WM_MO…