PageRank算法 -- 图算法

article/2025/9/25 23:25:05

一、简述:

PageRank算法是一个迭代求解算法,可以处理网页排名(根据网页的重要性进行排序)、社会影响力分析、文本摘要 等问题。

        PageRank算法在1996年由Page和Brin提出

        PageRank适用于解决用有向图表示的图数据


二、各节点重要性的迭代计算公式:

PageRank算法是在图上执行一个随机游走模型,根据随机游走者 在有向图上 通过对 节点访问次数或访问概率 的高低 来判断有向图上各个节点的重要程度

首先给出算法的迭代公式,而后用一个实例对该迭代公式的各个部分的意义进行解释:

对于各个节点,其重要程度(其被访问概率)可以按以下公式迭代计算得出: 

(以节点X为例)

PR(X)=(1-d)/N +\ d[ \, PR(T_{1})/C(T_{1}) \, + \, PR(T_{2})/C(T_{2}) + \cdots \, + PR(T_{n})/C(T_{n}) \, ]

其中:

PR(X)表示节点的PR值,即节点 X 被访问到的概率,当迭代结束后,PR(X)则代表节点X的重要程度

表示 阻尼系数,指用户达到了当前节点后,愿意沿图上的出边情况 挑选任一节点 继续向后游走的概率

T_{i} 表示 在图上指向节点X的节点

C(T_{i}) 表示 T_{i}节点的出度


三、用一个实例来解释公式的各个部分:        

最初的PageRank算法是用于对网页的重要程度进行排名,那么我们就以网页排名作为该算法的一个实际例子对迭代公式的各部分进行解释:

        在我们访问网页的时候,网页A可能会链接到其他网页上,比如链接到网页B和网页C。如果将这种网页间的链接关系体现在图结构数据上的话:那么,在图数据中,网页A、B、C均作为节点出现,且由于网页A可以链接到网页B和网页C,那么,在图上节点A应有两条出边,分别指向节点B和节点C。

        现在有如下的网页间的链接关系:

        如图1示,有ABCD四个网页,网页间的链接关系有:A链接到BCD;B链接到AD;C链接到A;D链接到C

        PageRank算法的核心思想就是:假设有一个随机游走者,在图上进行随机游走。随机游走者经过多次游走后,对不同的节点有着不同的访问次数。显然,随机游走者访问次数多的节点有着更高的重要性。算法就是在模拟随机游走者在图上的随机游走过程,所以每次算法对各个节点PR值的迭代更新都对应着随机游走者在图上的一次随机游走

PS:随机游走者的"游走"体现为:如图 1 示若随机游走者当前所处位置为节点A,那么,随机游走者可以向BCD三个节点进行下一步的游走;随机游走者的"随机"体现在:随机游走者可以按照概率去随机选择下一个要游走到的节点

(一)常规情况:

        直观来感受,若当前随机游走者在网页B上,由于网页B有两条出边分别链接到网页A和D,那么,它有1/2的概率跳转到网页A,有1/2的概率跳转到网页D。由于网页B没有对网页C的跳转链接,所以图数据上BC两节点间没有边,所以由网页B跳转到网页C的概率为0

        因此,PageRank算法定义,对于一个网页,若它可以跳转到k个其他网页上去(即,它在图上有k条出边),那么它跳转到这k个网页的概率都是 1/k

        以图1为例,先初始化每个网页的被访问概率值PR=1,

        即:PR(A)=PR(B)=PR(C)=PR(D)=1

然后,对各个节点进行随机游走分析:

        如果随机游走者想访问到网页A,那么要分别从:网页B以1/2的概率链接到节点A;从网页C以1/1的概率链接到节点A;从网页D以0的概率链接到节点A。然后分别代入访问网页BCD的访问概率值 与 对应各个网页链接到网页A的概率相乘,将上述三种情况发生的概率加和 得到 最终可以访问网页A的访问概率。

因此,各个节点的PR值迭代公式应为 :PR(X)= PR(T_{1})/C(T_{1}) \, + \, PR(T_{2})/C(T_{2}) + \cdots \, + PR(T_{n})/C(T_{n}) \,

其中:

 PR(X)表示 节点的PR值,即节点X被访问到的概率,当迭代结束后,PR(X)则代表节点X的重要程度

T_{i} 表示 在图上指向节点 X 的节点

C(T_{i}) 表示 T_{i} 节点的出度

        每次迭代时,由于图结构不变,所以计算各节点的访问概率时,只有对应链接到该节点的对应节点PR值在变动,所以,为了加速计算,很自然的想到用矩阵来存储图的链接结构,我们称该矩阵为转移矩阵M

若拓扑图上有n各个节点,那么转移矩阵M的大小应该为n*n的方阵。

如果网页 j 有 k 个出链,那么对于每一个出链所指向的网页 i ,其 M[i][j] = 1/k

                                               对于没有被出链指向的网页 t , 其 M[t][j] = 0

 那么,对于本图结构,矩阵M为:

M=\begin{bmatrix} 0& 1/2& 1& 0\\ 1/3& 0& 0& 0 \\ 1/3& 0& 0& 1 \\ 1/3& 1/2& 0& 0 \end{bmatrix}

第一次迭代可以计算为: PR_{1} = M \otimes PR_{0}

PR_{i} 表示第 i 次迭代后的各个节点的访问概率;

“ \cdot  ” 表示数值的点乘;\otimes表示矩阵乘法

初始时,

PR_{0}=\begin{bmatrix} 1 \\ 1 \\ 1 \\ 1 \end{bmatrix}

那么经过一次迭代后,

PR_{1}=M \otimes PR_{1} =\begin{bmatrix} 0& 1/2& 1& 0\\ 1/3& 0& 0& 0 \\ 1/3& 0& 0& 1 \\ 1/3& 1/2& 0& 0 \end{bmatrix} \otimes \begin{bmatrix}1\\1\\ 1\\1\end{bmatrix} =\begin{bmatrix}3/2\\1/3\\4/3\\5/6\end{bmatrix}

按这种方式迭代10次,各节点的PR值变化如下:

迭代1000次,各点的PR值分别为:

PR(A)=1.494391 PR(B)=0.498127 PR(C)=1.245322 PR(D)=0.747192

对应代码如下:

#include <iostream>
using namespace std;int main()
{double matrix[4][4]={0,0.5,1,0 , 0.33333,0,0,0 , 0.33333,0,0,1 , 0.33333,0.5,0,0  };double PR[4]={1,1,1,1};double PRtt[4]={0,0,0,0};/*for(int i=0;i<4;i++)for(int j=0;j<4;j++){printf("%f ",matrix[i][j]);}*/for(int num=0;num<1000;num++){for(int i=0;i<4;i++){double tt=0;for(int j=0;j<4;j++){tt += matrix[i][j]*PR[j];}PRtt[i]=tt;}PR[0]=PRtt[0];PR[1]=PRtt[1];PR[2]=PRtt[2];PR[3]=PRtt[3];			//printf("PR(A)=%f PR(B)=%f PR(C)=%f PR(D)=%f\n",PR[0],PR[1],PR[2],PR[3]);}printf("PR(A)=%f PR(B)=%f PR(C)=%f PR(D)=%f\n",PR[0],PR[1],PR[2],PR[3]);return 0;	
}

注意:

“每一轮迭代”的意思是,对节点ABCD的PR值都进行了一次更新。

        在上述的这种迭代方式中,对于第 i 轮的迭代:对每个节点的PR值进行更新的时候,都是用的上一轮(即 i-1 轮次)中各个节点的PR值进行计算的。即:在第i轮迭代中,虽然对于节点B来说,新的PR值已经计算完了,但是,在计算CD节点的PR值时,仍旧采用的是B节点在 i-1 轮次的旧PR值。

        那么,读者可能会有疑惑,如果实时更新,在同一轮中,用最新的节点PR值对接下来的其他节点进行更新会产生与上述方法有什么不同么?

我们还是采用图 1 对应的图结构进行数值上的对比。只不过在这次的更新方式上,即使在同一轮,PR(A)的值计算结束,接下来计算PR(B)的值时选择用刚刚得到的 更新后的 新的 PR(A)的值。对同一轮的其它节点的计算方法同理。

那么,代码如下:

#include <iostream>
using namespace std;int main()
{double matrix[4][4]={0,0.5,1,0 , 0.33333,0,0,0 , 0.33333,0,0,1 , 0.33333,0.5,0,0 };double PR[4]={1,1,1,1};/*for(int i=0;i<4;i++)for(int j=0;j<4;j++){printf("%f ",matrix[i][j]);}*/for(int num=0;num<10;num++){for(int i=0;i<4;i++){double tt=0;for(int j=0;j<4;j++){tt += matrix[i][j]*PR[j];}PR[i]=tt;}			printf("PR(A)=%f PR(B)=%f PR(C)=%f PR(D)=%f\n",PR[0],PR[1],PR[2],PR[3]);}//printf("PR(A)=%f PR(B)=%f PR(C)=%f PR(D)=%f\n",PR[0],PR[1],PR[2],PR[3]);return 0;	
}

按这种方式迭代10次,各节点的PR值变化如下:

迭代1000次,各点的PR值分别为:

PR(A)=1.655606 PR(B)=0.551863 PR(C)=1.379663 PR(D)=0.827795

这样一对比,虽然最终对于这四个节点计算得来的PR值不同,但是迭代后得出的网页节点排名是相同的:A>C>D>B。同时,对于收敛速度来看,仅对该图1对应的例子来说,是第一种方法收敛速度更快。

        但,直觉上,我还是会觉得采用第二种方式来更新各个节点的PR值更好一些,所以接下来的演示会采用第二种方式。

(二)非常规情况:终止点问题   

上述的PageRank算法可以收敛,需要满足一个条件:

        · 处理的图是强连通图,即,从任意节点可以到达其他的节点        

但是显然网页节点间的相互链接组成的图,或者其他现实生活中产生的拓扑图是不一定满足这种强连接性的。总有一些网页不指向任何其他的网页节点,即,该网页节点在拓扑图上没有任何的出边。

        此时,如果仍旧按照上述的PageRank算法,那么,随机游走者到达这样的网页节点后就会走投无路,随着一次又一次的迭代,随机游走者不断地到达这个不指向任何其他网页节点的 “终止点网页” ,这就会导致在迭代过程中,前面累积的转移概率越变越小,最终变为0。
        我们对图 1 进行修改,将节点C →节点A的边去掉,得到图 2 。观察图 2 我们会发现此时的节点C就是一个“终止点”,在拓扑图上,节点C没有任何的出边。

那么 ,此时的转移矩阵M为:

M=\begin{bmatrix} 0& 1/2& 0& 0\\ 1/3& 0& 0& 0\\ 1/3& 0& 0& 1\\ 1/3& 1/2& 0& 0 \end{bmatrix}

按这种方式迭代10次,各节点的PR值变化如下:

可以很明显的看出来,各点的PR值都在逐渐地变为0

(三)非常规情况:陷阱问题

网页间的链接情况除了上述的终止点问题以外,还有一种情况就是,某个节点只存在一条唯一的出边,并且这条出边指向自己。如下图3所示:

        如图3所示的这种情况下,随机游走者到达节点 C 后就无法进入其他的网页节点,相当于被困在了网页节点 C 处。 所以,随着迭代的进行,转移概率会全部集中到节点 C 对应的网页上。这样会使得网页排名无效。

按照上述的PageRank算法,图三所示的转移矩阵M应为:

M=\begin{bmatrix} 0& 1/2& 0& 0\\ 1/3& 0& 0& 0\\ 1/3& 0& 1& 1\\ 1/3& 1/2& 0& 0 \end{bmatrix}

按这种方式迭代10次,各节点的PR值变化如下:

 可以明显的看出来,除了陷阱节点C以外,其他节点的PR值都显著的变为了0。

(四)解决终止点和陷阱点问题

        上面过程中,我们认为随机游走者是一个盲目的,只按照节点的出边情况进行盲目游走的游走者

        但是,真实情况下的上网者并不会如此盲目

        所以,我们用随机游走者模拟上网者时,当它游走到一个终止点的网页时,它可以选择重新在浏览器搜索栏中输入一个新的网址再次进行游走;当它游走到一个陷阱节点时,它同样可以采用向浏览器中搜索栏中输入一个新网址的方式跳出陷阱再次进行游走。

        当然,向浏览器中输入的新网址可以是导致当前游走终止的终止点网页或导致游走陷入循环的陷阱点网页,但也有可能是 让游走者进入新的网页,从而跳出终止或者陷阱情况的新网络节点。

为了达到这样的目标,对 “(一)常规情况 ”中提出的节点PR值的迭代计算公式进行更新:

        假设拓扑图上的网页节点有N个,那么游走者通过在搜索栏中输入网址到达某个网页节点的概率为 1/N

        同时,假设游走者每一步游走时查看当前网页(或者说,按照当前网页给出的链接进一步访问后面的网页)的概率为 d,那么,他拒绝查看当前网页(或者说,拒绝按照当前网页所给出的链接进一步访问后面网页,而是选择从浏览器搜索栏中随机输入某一网页地址进行访问)的概率为 (1-d) 

那么,各个节点的PR值迭代计算公式由原来的:PR(X)= PR(T_{1})/C(T_{1}) \, + \, PR(T_{2})/C(T_{2}) + \cdots \, + PR(T_{n})/C(T_{n}) \,

变为:

PR(X)=(1-d)/N +\ d[ \, PR(T_{1})/C(T_{1}) \, + \, PR(T_{2})/C(T_{2}) + \cdots \, + PR(T_{n})/C(T_{n}) \, ]

        所以,很明显,当随机游走者拒绝按照当前网页所给出的链接进一步访问后面网页,而是选择从浏览器搜索栏中随机输入某一网页地址进行访问,那么拓扑图中网页节点的数目为n,那么,进入某任一网页节点的概率自然就是:(1-d)/N

        而由于 按照当前网页给出的链接进一步访问后面的网页 的概率为 d,所以,原来的PR值迭代公式前面需要再一同乘上参数d。

那对于更新过的PR值结算迭代公式,其代码如下: 

#include <iostream>
using namespace std;int main()
{double matrix[4][4]={0,0.5,0,0 , 0.33333,0,0,0 , 0.33333,0,1,1 , 0.33333,0.5,0,0 };double PR[4]={1,1,1,1};double d=0.85; //阻尼系数int N=4;  //节点个数/*for(int i=0;i<4;i++)for(int j=0;j<4;j++){printf("%f ",matrix[i][j]);}*/for(int num=0;num<10;num++){for(int i=0;i<4;i++){double tt=0;for(int j=0;j<4;j++){tt += matrix[i][j]*PR[j];}PR[i]=tt*d + (1-d)/ N ;}			printf("PR(A)=%f PR(B)=%f PR(C)=%f PR(D)=%f\n",PR[0],PR[1],PR[2],PR[3]);}//printf("PR(A)=%f PR(B)=%f PR(C)=%f PR(D)=%f\n",PR[0],PR[1],PR[2],PR[3]);return 0;	
}

按这种方式迭代10次,各节点的PR值变化如下:

迭代1000次后的结果如下: 

所以,这四个网页间的重要性排名为:C>D>A>B

 

参考链接:https://blog.csdn.net/gamer_gyt/article/details/47443877


http://chatgpt.dhexx.cn/article/70xS4JBs.shtml

相关文章

PageRank算法

一、算法原理&#xff1a; 1、如果一个网页被很多其他网页链接到的话说明这个网页比较重要&#xff0c;也就是PageRank值会相对较高 2、如果一个PageRank值很高的网页链接到一个其他的网页&#xff0c;那么被链接到的网页PageRank值也会相应提高。 例子&#xff1a; 如果一…

pagerank算法详解

目录 一、pagerank简介两个重要假设 二、pagerank算法公式定义计算演示矩阵化计算 三、存在的两个问题问题1.Dead Ends问题2.Spider Traps 一、pagerank简介 PageRank算法的基本想法是在有向图上定义一个随机游走模型&#xff0c;即一阶马尔可夫链&#xff0c;描述随机游走者沿…

整车CAN网络拓扑图

什么是智能硬件与ECU ? 何为智能硬件, 就是包含智能控制单元的硬件, 比如发动机, 发动机上有一块儿专门负责控制发动机进气量, 喷油量, 排气量的控制单元, 这块单元相当于发动机的大脑. 他具有信号发送, 信号接收, 参数存储等基本功能, 这个控制单元就是ECU. ECU(Electronic …

如何利用CANoe在两路CAN通道之间创建网关(gateway)

1 目的 利用CANoe在两路CAN通道之间创建一个网关&#xff0c;通过CAPL实现CAN1、CAN2通道间的报文转发&#xff0c;并进行故障注入测试&#xff08;通过改变某些信号的值&#xff09;。 &#xff08;本实例仅用于博主学习记录&#xff09; 2 步骤 创建一个两路通道&#xf…

CANoe-如何模拟CAN总线网关通信(满满都是细节)

网络上有不少的文章介绍使用canoe工具模拟网关把can1总线上的报文转发到can2上,那我为什么要写这篇文章呢?大家知道,我的文章不可能完全照搬别人的内容,肯定要夹带私货,有自己的理解的。所以我会从网关在can总线中的工作方式到所起的作用进行分析,学习如何在canoe中实现模…

CAN/CANopen转PROFINET网关TCO-151

型号&#xff1a;TCO-151 基本说明&#xff1a;TCO-151可实现 PROFINET网络与CANopen或CAN网络之间的数据通信。网关在PROFINET网络作为从站&#xff0c;CANopen端既可以做主站也可以做从站&#xff0c;CAN端支持CAN2.0A/CAN2.0B协议&#xff0c;支持对CAN帧进行过滤处理。 特…

CAN总线网关设备

南京来可电子科有限公司 CAN总线网关设备

嘴哥有料系列-can教程2:CAN网关及CAN信号转发机制

原文章&#xff1a;https://mp.weixin.qq.com/s/qbUcZngSDClx9Ll5aKvlLg 上节课, 我们讲到了CAN网关, 其实准确的说不能叫CAN网关, 应该叫网关或者汽车网关, 因为网关不仅处理CAN网络, 还处理LIN网络. 主要是为了配合本系列教程及区分于以太网网关, 所以才取名叫CAN网关. CAN…

CAN总线车联网透传云网关简介

车联网透传云网关 CANIOT-222W/G车联网透传云网关 功能说明 透传功能&#xff1a;串口透传、网口透传、CAN口透传 云端功能&#xff1a;设备管理、OTA升级、远程调试、远程监控 云平台 主要通过互联网&#xff08;2G/3G/4G&#xff09;将不同区域的车辆或工程机械接入共有…

CAN网关远程OTA升级方案详解(工程机械控制器远程升级)

CAN网关远程OTA升级方案详解 背景&#xff1b; 现今中国基建全面开花&#xff0c;工程车辆的需求量越来越大&#xff0c;工作环境也越来越复杂。工程车辆配置升级需求也越来越多&#xff0c;所需要的的工程师数量也越来越多&#xff0c;导致工程师数量严重不做&#xff0c;影响…

CAN云网关透传CANIOTCAN物联网云网关系列基本介绍

来可电子的CANIOT透传网关可以实现串口&#xff0c;网口和CAN口的远程数据传输。 CANIOT透传网关 实现的原理为网关通过4g或者WiFi连接到服务器&#xff0c;再由服务器将接收到的网关数据转发到网关配套的客户端上&#xff0c;客户端再通过对应的上位机软件将接收到的数据显示出…

【N32G457 】基于RT-Thread和N32G457的CAN网关

本文是RT-Thread用户xiere 原创发布&#xff0c;是用于参加RT-Thread与国民技术联手推出N32G457 RT-Thread设计大赛&#xff0c;原文&#xff1a;https://club.rt-thread.org/ask/article/3422.html 基于RT-Thread系统和N32G457开发板开发的一款CAN网关&#xff1b;硬件部分由…

S32G CAN网关测试

canutils 使用 ./cansend can0 -e 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88发送默认ID为0x1的can标准帧&#xff0c;数据为0x11 22 33 44 55 66 77 88, 每次最大8个byte ./cansend can0 -i 0x800 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 -e-e 表示扩展帧&#xff0c;CAN_ID最…

汽车网络安全之——CAN网关测试

测试内容 本部分为网关测试标准整理而来。 1 硬件信息安全测试 网关硬件信息安全测试应按照下列流程及要求依次进行&#xff1a; a) 拆解被测样件设备外壳&#xff0c;取出PCB板&#xff0c;通过5倍率以上的光学放大镜&#xff0c;观察网关PCB板&#xff0c;检查PCB 板硬件是否…

can网关 candtu CANIOT系列车联网透传云网关

can网关 candtu CANIOT系列车联网透传云网关的功能介绍 1&#xff0c;主要功能&#xff1a;云端监控、远程调试及配置、程序上下载4G、WiFi、 以太网联网 CAN口、串口和网口透传 云平台私有化部署服务虚拟CAN口适配广泛。 2&#xff0c;应用介绍 透传网关支持串口/网口/CAN口同…

CAN网关/CAN信号转发机制/案例解析

其实准确的说不能叫CAN网关, 应该叫网关或者汽车网关, 因为网关不仅处理CAN网络, 还处理LIN网络. 主要是为了配合本系列教程及区分于以太网网关, 所以才取名叫CAN网关. CAN网关的外形结构 大概外形如上, 偶有差异, 大小如香烟烟盒, 有60,70多个PIN脚组成. 每个接线pin脚都有严…

can网关 IFM控制器OTA远程升级

远程给IFM控制器升级现场接线图 CAN总线远程升级设备

CAN网关通过4G网关给CAN车载控制器升级程序

CANIOT网关通过4G网关给CAN车载控制器升级程序 CAN总线的优势 CAN(Controller Area Network)为控制器局域网络&#xff0c;CAN总线规范已经被国际标准化组织制订为国际标准ISO11898&#xff0c;并得到众多半导体器件厂商的支持&#xff0c;推出各种集成有CAN协议的产品。CAN属…

使用CANoe搭建CAN网关

Vector公司的CANoe是一款强大的总线仿真工具&#xff0c;通过CANoe搭建出来的总线模型可以模拟真实的汽车总线&#xff0c;并且通过CAPL语言可以对节点上的ECU进行编程。这样不仅能够模拟总线上的报文发送&#xff0c;还可以模拟ECU的内部逻辑&#xff0c;理论上可以完全模拟出…

CAN 4G的远程CAN网关与TBOX的区别

随着市场的发展&#xff0c;智能化一直是车企需要解决的难点。特别是在现有市场中&#xff0c;工程机械、特种车辆、环卫车等车辆管理主要靠工程师带着笔记本跑现场调试&#xff0c;即浪费人力出差成本也高。而且现在疫情频发&#xff0c;出差成本更高&#xff0c;出差风险也大…