当前位置: 首页 > news >正文

PageRank算法

一.定义-迭代算法

输入:含有 n n n个结点的有向图,转移矩阵 M M M,阻尼因子 d d d,初始向量 R 0 R_0 R0,计算精度 ϵ \epsilon ϵ

输出:有向图的PageRank向量 R R R

(1)令 t = 0 t=0 t=0

(2)计算
R t + 1 = d M R t + 1 − d n 1 R_{t+1} = dMR_t + \frac{ 1 - d }{ n} 1 Rt+1=dMRt+n1d1
(3)如果 R t + 1 R_{t+1} Rt+1 R t R_t Rt充分接近,令 R = R t + 1 R = R_{t+1} R=Rt+1,停止迭代。

(4)否则,令 t = t + 1 , 执行步骤 ( 2 ) t=t+1,执行步骤(2) t=t+1,执行步骤(2)

输入空间

n n n

M = ∣ 1 1 ⋯ 1 n ⋮ ⋮ ⋮ n 1 ⋯ n n ∣ M = \left| \begin{array}{cccc} 1_1 & \cdots & 1_n \\ \vdots & \vdots & \vdots\\ n_1 & \cdots & n_n \end{array} \right| M= 11n11nnn

d d d

R 0 = ∣ 1 1 ⋮ n 1 ∣ R_0 = \left| \begin{array}{cccc} 1_1 \\ \vdots \\ n_1 \end{array} \right| R0= 11n1

ϵ \epsilon ϵ

import numpy as np
n = 7  #有向图中一共有7个节点
M = np.array([[0, 1/4, 1/3, 0, 0, 1/2, 0],[1/4, 0, 0, 1/5, 0, 0, 0],[0, 1/4, 0, 1/5, 1/4, 0, 0],[0, 0, 1/3, 0, 1/4, 0, 0],[1/4, 0, 0, 1/5, 0, 0, 0],[1/4, 1/4, 0, 1/5, 1/4, 0, 0],[1/4, 1/4, 1/3, 1/5, 1/4, 1/2, 0]])  #根据有向图中各节点的连接情况写出转移矩阵
d = 0.85  #阻尼因子根据经验值确定,这里我们随意给一个值
R0 = np.full((7, 1), 1/7)  #设置初始向量R0,R0是一个7*1的列向量,因为有7个节点,我们把R0的每一个值都设为1/7
eps = 0.000001  #设置计算精度
np.shape(M)
np.shape(R0)

PageRank的迭代算法

R t + 1 = d M R t + 1 − d n 1 R_{t+1} = dMR_t + \frac{ 1 - d }{ n} 1 Rt+1=dMRt+n1d1

t = 0  #用来累计迭代次数
R = R0
judge = False  #用来判断是否继续迭代
while not judge:next_R = d * np.matmul(M, R) + (1 - d) / n * np.ones((7, 1))diff = np.linalg.norm(R - next_R)if diff < eps:judge = TrueR = next_Rt += 1
R = R / np.sum(R)
print('iter:', t)
print('PageRank: \n', R)

二.定义-幂法算法

输入:含有 n n n个结点的有向图,有向图的转移矩阵 M M M,系数 d d d,初始向量 x 0 x_0 x0,计算精度 ϵ \epsilon ϵ

输出:有向图的PageRank向量 R R R

(1)令 t = 0 , 选择初始向量 x 0 t=0,选择初始向量x_0 t=0,选择初始向量x0

(2)计算有向图的一般转移矩阵A
A = d M + 1 − d n E A = dM + \frac{ 1 - d }{ n} E A=dM+n1dE
(3)迭代并规范化结果向量

y t + 1 = A x t y_{t+1} = A_{xt} yt+1=Axt
x t + 1 = y t + 1 ∣ ∣ y t + 1 ∣ ∣ x_{t+1} = \frac{ y_{t+1} }{ ||y_{t+1}||} xt+1=∣∣yt+1∣∣yt+1
(4) 当 ∣ ∣ x t + 1 − x t ∣ ∣ < ϵ 时 , 令 R = x t , 停止迭代 当||x_{t+1}-x_t|| < \epsilon时,令R = x_t,停止迭代 ∣∣xt+1xt∣∣<ϵ,R=xt,停止迭代

(5)否则,令 t = t + 1 , 执行步骤 ( 3 ) t = t+1,执行步骤(3) t=t+1,执行步骤(3)

(6)对 R R R进行规范化处理,使其表示概率分布。

输入空间

n n n

M = ∣ 1 1 ⋯ 1 n ⋮ ⋮ ⋮ n 1 ⋯ n n ∣ M = \left| \begin{array}{cccc} 1_1 & \cdots & 1_n \\ \vdots & \vdots & \vdots\\ n_1 & \cdots & n_n \end{array} \right| M= 11n11nnn

d d d

x 0 = ∣ 1 1 ⋮ n 1 ∣ x_0 = \left| \begin{array}{cccc} 1_1 \\ \vdots \\ n_1 \end{array} \right| x0= 11n1

ϵ \epsilon ϵ

n = 7  #有向图中一共有7个节点
M = np.array([[0, 1/4, 1/3, 0, 0, 1/2, 0],[1/4, 0, 0, 1/5, 0, 0, 0],[0, 1/4, 0, 1/5, 1/4, 0, 0],[0, 0, 1/3, 0, 1/4, 0, 0],[1/4, 0, 0, 1/5, 0, 0, 0],[1/4, 1/4, 0, 1/5, 1/4, 0, 0],[1/4, 1/4, 1/3, 1/5, 1/4, 1/2, 0]])  #根据有向图中各节点的连接情况写出转移矩阵
d = 0.85  #阻尼因子根据经验值确定,这里我们随意给一个值
x_0 = np.full((7, 1), 1/7) #对x向量进行初始化
eps = 0.000001  #设置计算精度
np.shape(M)
np.shape(x_0)

PageRank的幂法算法

A = d M + 1 − d n E A = dM + \frac{ 1 - d }{ n} E A=dM+n1dE
y t + 1 = A x t y_{t+1} = A_{xt} yt+1=Axt
x t + 1 = y t + 1 ∣ ∣ y t + 1 ∣ ∣ x_{t+1} = \frac{ y_{t+1} }{ ||y_{t+1}||} xt+1=∣∣yt+1∣∣yt+1

t = 0  #用来累计迭代次数
judge = False  #用来判断是否继续迭代
A = d * M + (1 - d) / n * np.eye(n)  #计算A矩阵,其中np.eye(n)用来创建n阶单位阵E
while not judge:next_y = np.matmul(A, x_0)  #计算新的y向量next_x = next_y / np.linalg.norm(next_y)  #对新的y向量规范化得到新的x向量diff = np.linalg.norm(x_0 - next_x)  #计算新的x向量与之前的x向量之间的距离,这里采用的是欧氏距离if diff < eps:  #若两向量之间的距离足够小judge = True  #则停止迭代R = x_0  #得到R向量x_0 = next_x  #更新x向量t += 1  #迭代次数加一
R = R / np.sum(R)  #对R向量进行规范化,保证其总和为1,表示各节点的概率分布
print('iter:', t)
print('PageRank: \n', R)
http://www.lryc.cn/news/436888.html

相关文章:

  • YOLOv8改进 | 模块缝合 | C2f 融合Self-Calibrated Convolutions丰富特征图【CVPR2020】
  • 跨境反向代购淘宝京东商品系统的商品价格详情等数据如何轻松自动化获取?
  • 初始爬虫5
  • 深度盘点:2024年企业最喜欢用的WMS仓库管理系统有哪些?
  • qt如何通过特定字符将字符串拆分写入输入?
  • 结构体实现位段
  • 刷题DAY35
  • LVS--负载均衡调度器
  • windows@共享网络共享打印机@局域网内远程调用打印机打印
  • sql格式化工具
  • [Python办公]常用Python数据采集爬虫技术对比
  • 相机光学(三十七)——自动对焦原理
  • Go语言现代web开发05 指针和结构体
  • Postgresql 删除数组中的元素
  • docker 多服务只暴露一个客户端
  • DFS算法专题(二)——穷举vs暴搜vs深搜vs回溯vs剪枝【OF决策树】
  • Spring Security 快速开始
  • Lua5.3 参考手册
  • Centos如何配置阿里云的yum仓库作为yum源?
  • 力扣139-单词拆分(Java详细题解)
  • CSS —— display属性
  • BTC ETF资金流入暴涨400%,市场下一步将如何发展?
  • 视频监控管理平台LntonAIServer视频智能分析抖动检测算法应用场景
  • 初识php库管理工具composer的体验【爽】使用phpword模板功能替换里面的字符串文本
  • 每日一问:C++ 如何实现继承、封装和多态
  • STM32常用数据采集滤波算法
  • 二分系列(二分查找)9/12
  • 如何通过可视化大屏,助力智慧城市的“城市微脑”建设?
  • 何时空仓库
  • 美创获评CNVD年度原创漏洞发现贡献单位!