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

python基于GCN(图卷积神经网络模型)和LSTM(长短期记忆神经网络模型)开发构建污染物时间序列预测模型

在以往的时间序列预测建模中广泛使用的是回归类算法模型和RNN类的算法模型,相对来说技术栈会更稳定一些,最近有一个实际业务场景的需求,在建模的过程中要综合考虑其余点位的影响依赖,这时候我想到了之前做过的交通流量和速度预测相关的项目,在那里采用的就是图相关的算法模型,所以这里也想对标来开发。

GCN(Graph Convolutional Network)是一种用于处理图结构数据的卷积神经网络模型。它的构建原理是基于图卷积操作,通过在图上进行局部的卷积运算来提取节点的特征表示。

具体来说,GCN通过邻居节点的信息聚合来更新每个节点的表示。GCN的每一层都可以表示为以下的公式:

H^{(l+1)} = σ(D^{-0.5}AD^{-0.5}H^{(l)}W^{(l)})

其中,H^{(l)}表示第l层的节点表示矩阵,A表示节点之间的邻接矩阵,D是度矩阵,W^{(l)}表示第l层的权重矩阵,σ表示激活函数。

GCN的优点主要体现在以下几个方面:

  1. 考虑了节点的邻居信息:GCN通过聚合节点的邻居信息来更新节点的表示,能够捕捉到节点的局部结构信息,适用于处理图结构数据。
  2. 具有共享权重的卷积:GCN通过共享权重矩阵来进行卷积操作,减少了需要学习的参数数量,降低了模型的复杂度。
  3. 良好的泛化能力:GCN能够将节点的特征向量传递给邻居节点,从而在整个图上进行信息传播,有助于节点的特征表示学习。

然而,GCN也存在一些缺点:

  1. 无法处理动态图:GCN对于静态图结构的处理效果较好,但对于动态图的处理存在一定的困难,因为动态图的结构会随着时间的推移而变化。
  2. 局部邻居信息的限制:GCN只考虑节点的一阶邻居信息,对于高阶邻居信息的利用能力有限。
  3. 对大规模图的计算开销较大:GCN的计算复杂度与图的规模相关,对于大规模图的处理需要较高的计算资源。

GCN作为一种处理图结构数据的卷积神经网络模型,具有考虑邻居信息、共享权重、泛化能力强等优点,但对动态图的处理存在限制,并且对大规模图的计算开销较大。

LSTM(Long Short-Term Memory)是一种用于处理序列数据的循环神经网络模型。它的构建原理是通过引入门控机制来解决传统RNN存在的梯度消失和梯度爆炸问题,从而能够更好地捕捉长期依赖关系。

具体来说,LSTM通过三个门控单元(输入门、遗忘门和输出门)来控制信息的流动和记忆的更新。它的计算过程可以表示为以下公式:

输入门:i_t = σ(W_{xi}x_t + W_{hi}h_{t-1} + b_i)
遗忘门:f_t = σ(W_{xf}x_t + W_{hf}h_{t-1} + b_f)
输出门:o_t = σ(W_{xo}x_t + W_{ho}h_{t-1} + b_o)
新的记忆:\tilde{c}t = tanh(W{xc}x_t + W_{hc}h_{t-1} + b_c)
细胞状态更新:c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t
隐藏状态更新:h_t = o_t \odot tanh(c_t)

其中,i_t、f_t和o_t分别表示输入门、遗忘门和输出门的输出,\tilde{c}_t表示新的记忆,c_t表示细胞状态,h_t表示隐藏状态,x_t表示当前时刻的输入。

LSTM的优点主要体现在以下几个方面:

  1. 解决了梯度消失和梯度爆炸问题:通过门控机制,LSTM能够有效地捕捉长期依赖关系,解决了传统RNN在处理长序列时产生的梯度问题。
  2. 长期记忆能力强:LSTM能够在细胞状态中长期存储信息,有助于模型记住对当前任务有用的信息。
  3. 能够处理不定长的序列:LSTM可以处理不定长的序列数据,适用于多种应用场景,如自然语言处理、语音识别等。

然而,LSTM也存在一些缺点:

  1. 计算复杂度较高:LSTM中引入了多个门控单元和记忆单元,导致模型的计算复杂度较高,对计算资源要求较大。
  2. 可能存在过拟合:LSTM的参数数量较多,模型容易过拟合,需要采取一些正则化方法来缓解这个问题。
  3. 难以并行化:LSTM的计算过程涉及到门控单元的计算,导致模型难以进行有效的并行化,限制了其在大规模数据上的应用。

LSTM作为一种用于处理序列数据的循环神经网络模型,具有解决梯度问题、长期记忆能力强等优点,但计算复杂度较高、难以并行化等缺点。

这里本文的核心思想是想要基于GCN+LSTM来实现图网络和时序网络的融合,开发构建更加适合业务需求的时间序列预测模型。

首先是数据集加载,如下所示:

with open("distance.json") as f:route_distances = json.load(f)
with open("nodedata.json") as f:speeds_array = json.load(f)
route_distances = np.array(route_distances)
speeds_array = np.array(speeds_array)
print(f"route_distances shape={route_distances.shape}")
print(f"speeds_array shape={speeds_array.shape}")

结果输出如下所示:

route_distances shape=(23, 23)
speeds_array shape=(1056, 23)

共包含了23个节点。

之后是创建邻接矩阵,如下:

num_routes = route_distances.shape[0]
route_distances = route_distances / 10000
w2, w_mask = (route_distances * route_distances,np.ones([num_routes, num_routes]) - np.identity(num_routes),
)
adjacency_matrix = (np.exp(-w2 / sigma2) >= epsilon) * w_mask

结果输出如下所示:

一个简单的GCN+LSTM实现如下所示:

def gcn_layer(adj_matrix, input_features, output_dim):# GCN层的实现adj_normalized = normalize_adj(adj_matrix) # 对邻接矩阵进行归一化处理output = Dense(output_dim)(adj_normalized @ input_features) # GCN的公式实现output = Activation('relu')(output)return output# 构建GCN+LSTM模型
def build_gcn_lstm_model(adj_matrix, input_dim, hidden_dim, output_dim):# 输入层inputs = Input(shape=(None, input_dim))# GCN层gcn_output = gcn_layer(adj_matrix, inputs, hidden_dim)# LSTM层lstm_output = LSTM(hidden_dim)(gcn_output)# 输出层outputs = Dense(output_dim, activation='softmax')(lstm_output)model = Model(inputs=inputs, outputs=outputs)model.compile(optimizer=Adam(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy'])return model

也可以自己定义新的layer都是可以的,如下:

class GCNLSTM(layers.Layer):def __init__(**kwargs):super().__init__(**kwargs)self.graph_conv = gcnLayer(in_feat, out_feat, graph_info, **graph_conv_params)self.lstm = layers.LSTM(lstm_units, activation="relu")self.dense = layers.Dense(output_seq_len)self.input_seq_len, self.output_seq_len = input_seq_len, output_seq_lendef get_config(self):config = super().get_config().copy()return configdef call(self, inputs):inputs = tf.transpose(inputs, [2, 0, 1, 3])gcn_out = self.graph_conv(inputs) shape = tf.shape(gcn_out)gcn_out = tf.reshape(gcn_out, (batch_size * num_nodes, input_seq_len, out_feat))lstm_out = self.lstm(gcn_out) dense_output = self.dense(lstm_out) output = tf.reshape(dense_output, (num_nodes, batch_size, self.output_seq_len))return tf.transpose(output, [1, 2, 0]) 

之后就可以进行模型的训练了如下:

history=model.fit(X_train,y_train,validation_data=(X_test,y_test),epochs=200)
model.save("model.h5")
plotLoss(history.history["loss"],history.history["val_loss"],"loss.png")

loss可视化如下所示:

这里我们随机选取了几个node对其数据进行可视化,如下所示:

node之间的热力图如下所示:

对测试集进行测试评估,对比曲线可视化结果如下所示:

这里对不同node未来时刻进行持续预测,分别展示,如下所示:

这是一种比较新的建模方式,在实际应用中可以更多捕捉到不同节点的依赖性,这个是比较有用的一点,后续会在实际应用过程中继续挖掘。

相关文章:

python基于GCN(图卷积神经网络模型)和LSTM(长短期记忆神经网络模型)开发构建污染物时间序列预测模型

在以往的时间序列预测建模中广泛使用的是回归类算法模型和RNN类的算法模型,相对来说技术栈会更稳定一些,最近有一个实际业务场景的需求,在建模的过程中要综合考虑其余点位的影响依赖,这时候我想到了之前做过的交通流量和速度预测相…...

SpringMVC问题

文章目录 SpringMVC运行流程MVC的概念与请求在MVC中的执行路径,ResponsBody注解的用途SpringMVC启动流程 SpringMVC运行流程 • 客户端(浏览器)发送请求,直接请求到 DispatcherServlet 。 • DispatcherServlet 根据请求信息调用 …...

【Linux】Linux的常用基本指令

Linux常用基本指令 Linux指令的历史背景前言说明一、 ls 列出文件中的所有内容常用选项 二、pwd 显示当前所在目录进程三、cd 将当前工作目录改变到指定的目录下常用样例 四、touch 1. 更改文档或目录的日期时间 2. 新建一个不存在的文件常用选项 四、mkdir 1. 更改文档或目录的…...

气候变化和人类活动对中国植被固碳的贡献量化数据月度合成产品

简介: 气候变化和人类活动对中国植被固碳的贡献量化数据月度合成产品包括中国2001~2018年地表短波波段反照率、植被光合有效辐射吸收比、叶面积指数、森林覆盖度和非森林植被覆盖度、地表温度、地表净辐射、地表蒸散发、地上部分自养呼吸、地下部分自养呼吸、总初级…...

定位鼠标悬浮才出现的元素

第一步:按F12进入开发者模式 第二步:点击Sources. 第三步:鼠标进入,触发悬浮框弹出,然后鼠标停止不要移动。 第四步:按F8 或者(Ctrl\),正常情况下,此时页…...

【css/vue】使用css变量,在同一个页面根据不同情况改变字号等样式

解决方法是&#xff1a;将 css 的属性使用 v-bind 与 Vue 组件的属性绑定&#xff0c;当组件的属性变化时&#xff0c;css 对应的属性值也就会随之变化&#xff1b; 具体实现代码&#xff1a; <template><div><span class"navTitle">标题名</s…...

在springboot中实现WebSocket协议通信

前面介绍了使用netty实现websocket通信&#xff0c;有些时候&#xff0c;如果我们的服务并不复杂或者连接数并不高&#xff0c;单独搭建一个websocket服务端有些浪费资源&#xff0c;这时候我们就可以在web服务内提供简单的websocket连接支持。其实springboot已经支持了websock…...

云原生Docker系列 | Docker私有镜像仓库公有镜像仓库使用

云原生Docker系列 | Docker私有镜像仓库&公有镜像仓库使用 1. 使用公有云镜像仓库1.1. 阿里云镜像仓库1.2. 华为云镜像仓库1.3. 腾讯云镜像仓库2. 使用Docker Hub镜像仓库3. 使用Harbor构建私有镜像仓库4. 搭建本地Registry镜像仓库1. 使用公有云镜像仓库 1.1. 阿里云镜像…...

用于 syslog 收集的协议:TCP、UDP、RELP

系统日志是从 Linux/Unix 设备和其他网络设备&#xff08;如交换机、路由器和防火墙&#xff09;生成的日志 可以通过将 syslog 聚合到称为 syslog 服务器、syslog 守护程序或 syslogd 的服务器来集中 syslog。在TCP、UDP和RELP协议的帮助下&#xff0c;系统日志从设备传输到系…...

OpenAI创始人山姆·阿尔特曼重返公司;LLM持续学习

&#x1f989; AI新闻 &#x1f680; OpenAI创始人山姆阿尔特曼重返公司并与微软建立合作伙伴关系 摘要&#xff1a;OpenAI创始人山姆阿尔特曼回归OpenAI&#xff0c;担任首席执行官&#xff0c;并与微软建立牢固的合作伙伴关系。这解决了近期的争论&#xff0c;微软对OpenAI…...

Ant Design Pro生产环境部署

Ant Design Pro是通过URL路径前缀/api访问后端服务器&#xff0c;因此在nginx配置以下代理即可。 location / {index.html } location /api {proxy_pass: api.mydomain.com }...

Altium Designer学习笔记10

再次根据图纸进行布局走线&#xff1a; 这个MT2492 建议的布局走线。 那我这边应该是尽量按照该图进行布局&#xff1a; 其中我看到C1的电容的封装使用的是电感的封装&#xff0c;需要进行更换处理&#xff1a; 执行Validate Changes和Execute Changes操作&#xff0c;更新&a…...

ubuntu cutecom串口调试工具使用方法(图形界面)

文章目录 Ubuntu下使用CuteCom进行串口调试使用指南什么是CuteCom&#xff1f;主要特点 安装CuteCom使用APT包管理器从源码编译安装 配置串口CuteCom界面解析&#xff08;启动cutecom&#xff09;使用CuteCom进行数据发送和接收配置串口参数数据接收数据发送 高级功能和技巧流控…...

flink 1.17.1的pom.xml模板

flink 1.17.1的pom.xml模板 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apa…...

MySql的数据类型和隐式转换

文章目录 一、数据类型1、数值类型1.1、整数类型1.2、浮点1.3、定点DECIMAL 2、时间类型2.1、日期和时间类型占用的存储空间2.2、日期和时间类型表示的范围2.3、日期和时间类型的零值表示 3、文本类型 二、隐式转换参考文章 一、数据类型 1、数值类型 1.1、整数类型 整数名称…...

【开源】基于JAVA的在线课程教学系统

项目编号&#xff1a; S 014 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S014&#xff0c;文末获取源码。} 项目编号&#xff1a;S014&#xff0c;文末获取源码。 目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2…...

【Linux】权限理解【文件权限以及目录权限详解、以及umsk程序掩码知识详解】

权限理解 一、Linux权限的概念二、su [用户名] &#xff1a; 切换用户三、Linux权限管理文件&#xff08;一&#xff09;文件访问者的分类&#xff08;人&#xff09;&#xff08;二&#xff09;文件类型和访问权限&#xff08;事物属性&#xff09;&#xff08;1&#xff09;第…...

Leetcode—1410.HTML实体解析器【中等】

2023每日刷题&#xff08;三十八&#xff09; Leetcode—1410.HTML实体解析器 算法思想 实现代码 typedef struct entityChar {char* entity;char rechar; }entity;entity matches[] {{"&quot;", "},{"&apos;", \},{"&amp;"…...

golang指针学习

package mainimport "fmt"func main() {name:"飞雪无情"nameP:&name//取地址fmt.Println("name变量的内存地址为:",&name)fmt.Println("name变量的值为:",name)fmt.Println("name变量的内存地址为:",nameP)fmt.Prin…...

c语言:用迭代法解决递归问题

题目&#xff1a; 解释&#xff1a;题目的意思就是用迭代法的空间和时间复杂的太高了&#xff0c;需要我们减小空间与时间的复杂度&#xff0c;我就想到了迭代法&#xff0c;思路和代码如下&#xff1a; #include <stdio.h> //这里是递归法转迭代法 int main() {int x,i…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...