基于LSTM及其变体的回归预测

1 所用模型

       代码中用到了以下模型:

      1. LSTM(Long Short-Term Memory):长短时记忆网络,是一种特殊的RNN(循环神经网络),能够解决传统RNN在处理长序列时出现的梯度消失或爆炸的问题。LSTM有门控机制,可以选择性地记住或忘记信息。

       2. FC-LSTM:全连接的LSTM,与传统的LSTM相比,其细胞单元之间采用全连接的方式。

       3. Coupled LSTM:耦合LSTM,是一种特殊的LSTM结构,其中每个LSTM单元被分解为两个交互的子单元。

       4. GRU(Gated Recurrent Unit):门控循环单元,与LSTM类似,但结构更简单,参数更少,通常训练更快,但可能不如LSTM准确。

       5. ConvLSTM:卷积LSTM,将卷积神经网络(CNN)与LSTM结合,可以捕捉时空特征,常用于处理图像和视频数据。

       6. Deep LSTM:深层LSTM,包含多个LSTM层的堆叠,可以捕捉更复杂的模式。

       7. DB-LSTM(Bidirectional LSTM):双向LSTM,有两个方向的LSTM层,一个按时间顺序,一个逆序,可以同时获取过去和未来的信息。

       8. SRU(SimpleRNN):简单循环神经网络,是最基本的RNN形式。

       9. TPA-LSTM:时间感知LSTM,通过改变LSTM的内部计算方式,使其更加关注时间序列的特性。

       10. ConvGRU:卷积GRU,与ConvLSTM类似,但使用GRU代替LSTM。

       这些模型都是用于处理序列数据的深度学习模型,特别适用于时间序列预测、自然语言处理等领域。

2 运行结果

       左边是Epoch=50次的效果,右边是Epoch=15次的效果:

a1e88c48c6f645eea96360f59b239c00.jpg

 图2-1 训练损失

3623cb88b9294ce796d7dbacd244f481.jpg

 图2-2 测试损失

d9ab03d1196542bf9235bafc58288e07.jpg

 图2-3 预测结果

3 代码

     

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense, LSTM, GRU, SimpleRNN, Bidirectional, TimeDistributed, Conv1D, Attention
from keras.layers import Flatten, Dropout, BatchNormalization
from keras.optimizers import Adam
from keras.callbacks import EarlyStopping
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from tensorflow.keras.layers import Conv1D
# 读取数据
data = pd.read_excel('A.xlsx')
data=data.dropna()
data = data['A'].values.reshape(-1, 1)
# 数据预处理
scaler = MinMaxScaler()
data = scaler.fit_transform(data)# 划分训练集和测试集
train_size = int(len(data) * 0.8)
train, test = data[:train_size], data[train_size:]# 转换数据格式以适应LSTM输入
def create_dataset(dataset, look_back=1):X, Y = [], []for i in range(len(dataset) - look_back - 1):X.append(dataset[i:(i + look_back), 0])Y.append(dataset[i + look_back, 0])return np.array(X), np.array(Y)look_back = 1
X_train, y_train = create_dataset(train, look_back)
X_test, y_test = create_dataset(test, look_back)# 重塑输入数据的维度以适应LSTM模型
X_train = np.reshape(X_train, (X_train.shape[0], 1, X_train.shape[1]))
X_test = np.reshape(X_test, (X_test.shape[0], 1, X_test.shape[1]))
# 定义模型函数
def create_model(name):model = Sequential()if name == 'LSTM':model.add(LSTM(50, activation='relu', input_shape=(1, 1)))elif name == 'FC-LSTM':model.add(LSTM(50, activation='relu', input_shape=(1, 1), recurrent_activation='sigmoid'))elif name == 'Coupled LSTM':model.add(LSTM(50, activation='relu', input_shape=(1, 1), implementation=2))elif name == 'GRU':model.add(GRU(50, activation='relu', input_shape=(1, 1)))elif name == 'ConvLSTM':model.add(Conv1D(filters=64, kernel_size=1, activation='relu', input_shape=(1, 1)))model.add(LSTM(50, activation='relu'))elif name == 'Deep LSTM':model.add(LSTM(50, return_sequences=True, activation='relu', input_shape=(1, 1)))model.add(LSTM(50, activation='relu'))elif name == 'DB-LSTM':model.add(Bidirectional(LSTM(50, activation='relu'), input_shape=(1, 1)))elif name == 'SRU':model.add(SimpleRNN(50, activation='relu', input_shape=(1, 1)))elif name == 'TPA-LSTM':model.add(LSTM(50, activation='relu', input_shape=(1, 1), unroll=True))elif name == 'ConvGRU':model.add(Conv1D(filters=64, kernel_size=1, activation='relu', input_shape=(1, 1)))model.add(GRU(50, activation='relu'))model.add(Dense(1))model.compile(optimizer=Adam(), loss='mse')return model# 训练模型并绘制损失图
names = ['LSTM', 'FC-LSTM', 'Coupled LSTM', 'GRU', 'ConvLSTM', 'Deep LSTM', 'DB-LSTM','SRU', 'TPA-LSTM', 'ConvGRU']
train_losses = []
test_losses = []
predictions = []for name in names:model = create_model(name)history = model.fit(train, train, epochs=15, batch_size=32, validation_data=(test, test), verbose=0)train_losses.append(history.history['loss'])test_losses.append(history.history['val_loss'])pred = model.predict(test)predictions.append(pred)import matplotlib.pyplot as plt# 设置不同的marker
markers = ['o', '.', '_', '^', '*', '>', '+', '1', 'p', '_', '8']
linestyles = ['-', '--', '--', ':', '-', '-.', '-.', ':', '-', '--']
# 绘制训练损失图
plt.figure(figsize=(16, 20))
for i, loss in enumerate(train_losses):plt.plot(loss, color='black',label=names[i], marker=markers[i], linestyle=linestyles[i])
plt.title('Train Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend(fontsize=8,loc='best')
plt.show()
# 绘制测试损失图
for i, loss in enumerate(test_losses):plt.plot(loss, color='black',label=names[i], marker=markers[i], linestyle=linestyles[i])
plt.title('Test Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend(fontsize=8,loc='best')
plt.show()
# 绘制预测结果折线图
for i, pred in enumerate(predictions):plt.plot(pred, color='black',label=names[i], marker=markers[i], linestyle=linestyles[i])
# 绘制真实值折线图
plt.plot(y_test, color='black', label='True Value')
plt.title('Predictions and True Values')
plt.xlabel('x')
plt.ylabel('value')
plt.legend(fontsize=8, loc='best')
# 显示图像
plt.show()

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD算法题汇总

60、计算网络信号 题目 网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。注意:网络信号可以绕过阻隔物 array[m][n],二维数组代表网格地图 array[i][j]0,代表i行j列是空旷位置 a…

基于STM32的智能晾衣设计

1.简介 本设计的目的是开发一种湿度传感智能衣物干燥杆系统,这是一个由单片机控制芯片控制的实时检测系统。该系统使用 DHT11温湿度传感器,检测大气的温度和湿度,然后处理信息,控制电机,完成衣物的收集和干燥工作。  …

相控阵雷达原理详解

相控阵,即相位控制阵列,通过控制阵列各个单元的馈电相位来改变波束指向。 相控阵雷达的原理可以清晰地归纳为以下几点: 1. 基本构成: - 相控阵雷达,即相位控制电子扫描阵列雷达(Phased Array Radar, PAR&a…

脚本新手必看!一文掌握${}在Shell脚本中的神操作!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 变量引用与默认值📝 字符串操作📝 数组与索引📝 参数扩展与模式匹配⚓️ 相关链接 ⚓️📖 介绍 📖 在编程的广阔世界里,隐藏着无数小巧而强大的工具,它们如同魔法般简化着复杂的操作。今天,我将…

抖音换地方IP会马上更新地址吗?解析抖音IP地址变化的真相

随着移动互联网的飞速发展,短视频平台如抖音已深入人心,成为大众生活中不可或缺的一部分。其中,IP地址作为用户在互联网世界的“身份证”,不仅关系到用户的隐私安全,也直接影响着平台内容推送的精准性。当我们跨越地域…

【Neural signal processing and analysis zero to hero】- 1

The basics of neural signal processing course from youtube: 传送地址 Possible preprocessing steps Signal artifacts (not) to worry about doing visual based artifact rejection so that means that before you start analyzing, you can identify those data epic…

Python数据结构之实现自定义栈与队列详解

概要 在计算机科学中,栈(Stack)和队列(Queue)是两种常见的数据结构。它们在算法和数据处理方面有着广泛的应用。本文将详细介绍如何在Python中实现自定义的栈与队列,并包含详细的示例代码,帮助深入理解这两种数据结构的工作原理和使用方法。 栈(Stack) 什么是栈 栈…

i5 13490F比13400F性能强多少?13490F和i5 13400F性能对比评测

英特尔再一次带来了13代全新的中国特供版的小黑盒,即酷睿i5-13490F和i7-13790F这两款型号,这两款CPU相当于i5 13400F和i7 13700F升级版,拥有更高的频率和三级缓存,以获得更好的游戏性能。我们知道,i5 13490F是用作替代…

LLM 应用开发平台特训

引言 随着人工智能技术的飞速发展,大型语言模型(LLM)如 GPT 系列已成为构建智能应用的重要基础。LLMOps(Large Language Model Operations)作为管理 LLM 支持的应用程序生命周期的工具和最佳实践,正逐渐受到…

【 香橙派 AIpro评测】烧系统运行部署LLMS大模型跑开源yolov5物体检测并体验Jupyter Lab AI 应用样例(新手入门)

文章目录 一、引言⭐1.1下载镜像烧系统⭐1.2开发板初始化系统配置远程登陆💖 远程ssh💖查看ubuntu桌面💖 远程向日葵 二、部署LLMS大模型&yolov5物体检测⭐2.1 快速启动LLMS大模型💖拉取代码💖下载mode数据&#x…

C++树(二)【直径,中心】

目录: 树的直径: 树的直径的性质: 性质1:直径的端点一定是叶子节点 性质2:任意点的最长链端点一定是直径端点。 性质3:如果一棵树有多条直径,那么它们必然相交,且有极长连…

.NET MAUI开源架构_1.学习资源分享

最近需要开发Android的App,想预研下使用.NET开源架构.NET MAUI来开发App程序。因此网上搜索了下相关资料,现在把我查询的结果记录下,方便后面学习。 1.官方文档 1.1MAUI官方学习网站 .NET Multi-Platform App UI 文档 - .NET MAUI | Micro…

Python实战MySQL之数据库操作全流程详解

概要 MySQL是一种广泛使用的关系型数据库管理系统,Python可以通过多种方式与MySQL进行交互。本文将详细介绍如何使用Python操作MySQL数据库,包括安装必要的库、连接数据库、执行基本的CRUD(创建、读取、更新、删除)操作,并包含具体的示例代码,帮助全面掌握这一过程。 准…

CodeSouler:AI赋能,编程效率的革命性飞跃!

🔥 功能大揭秘,让你的代码飞起来!🔥 01 添加代码注释 📝 告别繁琐,一键添加精准注释!提升代码清晰度,让后续维护不再是难题。 02 生成单元测试 🧪 智能分析,自…

C1W4.LAB.Vector manipulation+Hash functions and multiplanes

理论课:C1W4.Machine Translation and Document Search 文章目录 Python 中的矢量操作Transforming vectorsExample 1Example 2 Frobenius Norm Hash functions and multiplanesBasic Hash tablesPlanesHash Function with multiple planesRandom PlanesDocument v…

苹果x怎么录屏?手把手教你操作

随着社交媒体和视频平台的兴起,人们越来越习惯于通过视频来分享生活点滴、传播信息。苹果X手机凭借其出色的性能和高清屏幕,成为了许多用户录制屏幕视频的首选设备。可苹果x怎么录屏呢?本文将详细介绍苹果x手机的内置录屏方法,通过…

Blender使用(二)点线面基本操作

Blender使用之点线面 1.编辑模式 tab键进行切换,为了方便菜单调出,可以设置键位映射为拖动时的饼菜单。 设置好后,按住tab键移动鼠标(注意不要点击鼠标),即可弹出编辑菜单。 默认是点模式,在左上角可进行点线面的切换…

【linux高级IO(三)】初识epoll

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 Linux高级IO 1. 前言2. 初识e…

帕金森营养宝典,守护你的健康每一天!

👋 嗨,亲爱的小伙伴们!今天我们来聊聊一个有点“严肃”但超级重要的话题——帕金森患者应该补充哪些营养?🤔 💪 首先,我们要知道,帕金森是一种常见的神经系统疾病,它可能…

自制一个指定容量缓存,并实现最近使用的最后删除

需求 实现一个缓存key-value结构,并设定容量最大值,当put进去的时候,如果超过最大容量,则将最早放进去的删除当get的时候,返回key值,并将key放到后面(表示最近使用过,最后删除&…