MATLAB实现LSTM时间序列预测
创作时间:
作者:
@小白创作中心
MATLAB实现LSTM时间序列预测
引用
CSDN
1.
https://blog.csdn.net/weixin_58438203/article/details/136085238
LSTM(长短期记忆网络)是一种特殊的循环神经网络(RNN),特别适合处理和预测时间序列数据。它通过引入输入门、遗忘门和输出门,有效解决了传统RNN在处理长序列数据时容易出现的梯度消失和梯度爆炸问题。本文将详细介绍如何使用MATLAB实现LSTM进行时间序列预测,并通过具体代码和实例展示预测过程和结果。
LSTM模型可以在一定程度上学习和预测非平稳的时间序列,其具有强大的记忆和非线性建模能力,可以捕捉到时间序列中的复杂模式和趋势[4]。在这种情况下,LSTM模型可能会自动学习到时间序列的非平稳性,并在预测中进行适当的调整。其作为循环神经网络(RNN)的特殊形式,继承了循环神经网络的优点。首先,利用记忆机制,可以有效提取时间序列数据的时间依赖性。其次,在模型训练时,学习到的权重参数在时间步骤之间是共享的,故对长时间序列的训练具有一定的可拓展性,而且比起传统的神经网络模型,它所需参数数量较少,降低了模型的复杂度。最后,它也具有LSTM神经网络特有的优势,对训练时权重变化不稳定而产生梯度消失和梯度爆炸问题有着不错的改善效果。LSTM单元的主要结构由3个门控制器和记忆细胞组成。其中,输入门控制特征的流向信息,输出门控制特征的输出信息,遗忘门控制特征的去除与遗忘,记忆细胞负责存储细胞状态信息。通过不同功能门的控制,从而解决RNN存在的长期依赖问题[5]。LSTM单元内的计算过程为:
下面是使用MATLAB实现LSTM时间序列预测的具体代码:
clc
clear
load('data.mat')
data=RTS'
%% 序列的前485个用于训练,后10个用于验证神经网络,然后往后预测10个数据。
dataTrain = data(1:485); %定义训练集
dataTest = data(486:495); %该数据是用来在最后与预测值进行对比的
%% 数据预处理
mu = mean(dataTrain); %求均值
sig = std(dataTrain); %求均差
dataTrainStandardized = (dataTrain - mu) / sig;
%% 输入的每个时间步,LSTM网络学习预测下一个时间步,这里交错一个时间步效果最好。
XTrain = dataTrainStandardized(1:end-1);
YTrain = dataTrainStandardized(2:end);
%% 一维特征lstm网络训练
numFeatures = 1; %特征为一维
numResponses = 1; %输出也是一维
numHiddenUnits = 200; %创建LSTM回归网络,指定LSTM层的隐含单元个数200。可调
layers = [ ...
sequenceInputLayer(numFeatures) %输入层
lstmLayer(numHiddenUnits) % lstm层,如果是构建多层的LSTM模型,可以修改。
fullyConnectedLayer(numResponses) %为全连接层,是输出的维数。
regressionLayer]; %其计算回归问题的半均方误差模块 。即说明这不是在进行分类问题。
%指定训练选项,求解器设置为adam, 1000轮训练。
%梯度阈值设置为 1。指定初始学习率 0.01,在 125 轮训练后通过乘以因子 0.2 来降低学习率。
options = trainingOptions('adam', ...
'MaxEpochs',1000, ...
'GradientThreshold',1, ...
'InitialLearnRate',0.01, ...
'LearnRateSchedule','piecewise', ...%每当经过一定数量的时期时,学习率就会乘以一个系数。
'LearnRateDropPeriod',400, ... %乘法之间的纪元数由“ LearnRateDropPeriod”控制。可调
'LearnRateDropFactor',0.15, ... %乘法因子由参“ LearnRateDropFactor”控制,可调
'Verbose',0, ... %如果将其设置为true,则有关训练进度的信息将被打印到命令窗口中。默认值为true。
'Plots','training-progress'); %构建曲线图 将'training-progress'替换为none
net = trainNetwork(XTrain,YTrain,layers,options);
net = predictAndUpdateState(net,XTrain); %将新的XTrain数据用在网络上进行初始化网络状态
[net,YPred] = predictAndUpdateState(net,YTrain(end)); %用训练的最后一步来进行预测第一个预测值,给定一个初始值。这是用预测值更新网络状态特有的。
%% 进行用于验证神经网络的数据预测(用预测值更新网络状态)
for i = 2:20 %从第二步开始,这里进行20次单步预测(10为用于验证的预测值,10为往后预测的值。一共20个)
[net,YPred(:,i)] = predictAndUpdateState(net,YPred(:,i-1),'ExecutionEnvironment','cpu'); %predictAndUpdateState函数是一次预测一个值并更新网络状态
end
%% 验证神经网络
YPred = sig*YPred + mu; %使用先前计算的参数对预测去标准化。
rmse = sqrt(mean((YPred(1:10)-dataTest).^2)) ; %计算均方根误差 (RMSE)。
subplot(2,1,1)
plot(dataTrain(1:end)) %先画出前面485个数据,是训练数据。
hold on
idx = 486:(485+20); %为横坐标
plot(idx,YPred(1:20),'.-') %显示预测值
hold off
xlabel("Time")
ylabel("Case")
title("Forecast")
legend(["Observed" "Forecast"])
subplot(2,1,2)
plot(data)
xlabel("Time")
ylabel("Case")
title("Dataset")
%% 继续往后预测2023年的数据
figure(2)
idx = 486:(485+20); %为横坐标
plot(idx,YPred(1:20),'.-') %显示预测值
hold off
net = resetState(net);
MATLAB运行结果如下:
热门推荐
如何通过加强制度建设来提升企业的规范管理水平?
租楼 vs 买房:置业背后的理财策略
上海最好玩的免费景区,入冬3日游攻略 冬日里的魔都探秘
杨斌教授在中山眼科有哪些研究成果?
今年全球电影票房下滑,但中国市场保持增长
银川市持续深化社会救助工作 为困难群众幸福生活“升温加码”
女性健身专业人士的11项日常减脂运动
流感后咳嗽不止,清肺是关键!养阴清肺丸、通宣理肺丸、清肺抑火丸怎么选?
【人工智能】机器与市场:AI 接管金融 | 观点
看杭州街拍才明白:冬天别裹那么严实,“小露肤”的穿搭更洋气
怒江抗日史:英勇抵抗的辉煌篇章
道家成仙思想:中国古代哲学中的独特追求
《自然》:中国如何创建 AI 模型 DeepSeek 并震惊世界
脑筋急转弯的知识博弯_脑筋急转弯大全
广州男篮引援策略:郭艾伦、丁彦雨航能否助力球队重返季后赛?
北京正中堂中医医院程发峰主任:《养生堂》特邀专家教您中医食疗养好胃!
美味下饭,干煸豆角做法简单!
魅力中国吸引五洲来客
一文搞懂深度学习:神经网络基础
建筑高度-典型争议(14问),建筑防火解析!
不了解荣格,你测什么MBTI!|《荣格的心灵地图》
床垫厚度怎么选?这份全面指南请收好!
开心果——一种健康美味的坚果(来源、营养、功效和食用方法)
COP29:全球气候行动的新篇章与未来展望
为何僵尸穿的都是清朝官服?原来宋朝就有“僵尸”,清朝迎来鼎盛
新媒体标题文案拟定技巧(附7种常见的文案标题写作方法)
印尼购买法国先进潜艇,“买买买”欲打造东南亚海上劲旅
尼古丁盐为新一代电子烟主要成分 我国相关专利数量不断增加
怎样知道书是不是正版?看完涨知识了!建议收藏
生肖猴与什么相冲