LSTM/BiLSTM/GRU时间序列预测程序(纯代码)

最后更新于:2024-04-07 21:48:27

一、代码运行环境

需使用MATLAB2020a及更新版本。

二、程序介绍

注:图标代表该m文件为脚本文件,可以直接运行;图标代表函数文件,在没有输入变量的情况下无法直接运行。更详细的解释可以看这里

1.demo_RNNs_Fore_Mul.m文件

测试Fun_RNNs_Fore_Mul文件的脚本,演示了LSTM/BiLSTM/GRU神经网络做时间序列预测“预测”的程序(多步,全部数据用来训练,预测未来数据)的纯代码实现方法。

运行程序后,将会在命令行窗口输出迭代过程,如下图:

同时会绘制训练过程中的Loss和RMSE曲线:

并绘制多步预测结果图:

2.demo_RNNs_Fore_Mul_TrainAndTest.m文件

测试Fun_RNNs_Fore_Mul_TrainAndTest文件的脚本,演示了LSTM/BiLSTM/GRU神经网络做时间序列预测“预测”的程序(多步,划分训练集/测试集)的纯代码实现方法。

运行程序后,将会在命令行窗口输出迭代过程,如下图:

同时会绘制训练过程中的Loss和RMSE曲线:

并绘制多步预测结果图:

3.demo_RNNs_Fore_Onestep_TrainAndTest.m文件

测试Fun_RNNs_Fore_Onestep_TrainAndTest文件的脚本,演示了LSTM/BiLSTM/GRU神经网络做时间序列预测“预测”的程序(单步)的纯代码实现方法。

1.Fun_RNNs_Fore_Onestep_TrainAndTest.m文件

LSTM/BiLSTM/GRU神经网络做时间序列预测“预测”的程序(单步),部分数据用来训练,剩余数据拿来做对比验证。该函数在图形界面软件中调用,是底层实现函数之一。该文件为函数文件,需调用,不能直接运行。

function [foreDataRe,info,ind,net,YTrainRe,YTestRe,XTrainRe] = Fun_RNNs_Fore_Onestep_TrainAndTest(data,numHU,dropProb,MaxEp,MiniBatch,GraThr,InitLearnRa,Plots,LearnSch,LearnRaDP,LearnRaDF,NorFlag,SeedFlag,rnnName,figflag,rTrain,indNamesCell)
% LSTM/BiLSTM/GRU神经网络做时间序列预测“预测”的程序(单步),部分数据用来训练,剩余数据拿来做对比验证
% 输入:
% data:输入的时间序列数据,类型为cell或者dat
% numHU:即numHiddenUnits,LSTM的隐含单元数。该参数可以设置为数组,表示的是构建多层网络,例如numHU=[16,8],代表构建了两层网络结构,第一层16个隐藏单元,第二层8个隐藏单元
% dropProb:丢弃层的丢弃概率,如果不丢弃,则设置为0,最大为1
% MaxEp:即MaxEpochs,最大迭代次数
% MimiBatch:批尺寸
% GraThr:即GradientThreshold梯度极限(1)
% InitLearnRa:即InitialLearnRate初始化学习速率(0.005)
% Plots:是否画出训练过程,1为是,其他值为否
% LearnSch:即LearnRateSchedule是否在一定迭代次数后学习速率下降,1为使用, LearnSch ='piecewise',其他值为不使用
% LearnRaDP:即LearnRateDropPeriod学习速率下降时的迭代数
% LearnRaDF:即LearnRateDropFactor学习速率下降因子,下降后变为LearnRaDF*InitLearnRa,LearnSch为0时可以赋0
% NorFlag:即Normalization Flag,设置为1时则在程序中进行数据归一化和反归一化操作,否则不进行,建议设置为1
% SeedFlag:随机种子标志,设置为1时启用随机种子
% rnnName:使用的网络名称,可选项包括:'GRU','LSTM','BiLSTM',注意大小写
% figflag:是否画预测结果图,'on'为画图,'off'为不画
% rTrain:训练集比例/数量,rTrain<1时代表训练集比例,>1的整数时代表训练集数量.
% indNamesCell:拟进行预测评价指标名称,该变量为cell类型,其中包含的指标名称为字符串,指标名称在下边列表中:
%   目前支持的指标(2021.8.11):
%   MSE:均方误差(Mean Square Error)
%   RMSE:均方根误差(Root Mean Square Error)
%   MAE:平均绝对误差(Mean Absolute Error)
%   MAPE:平均绝对百分比误差(Mean Absolute Percentage Error)
%   R2:决定系数(R2-R-Square)
%   如果想获取MSE、MAE两个指标,则设置:indNamesCell = {'MSE','MAE'}

% 输出:
% foreDataRe:预测值,对应测试集的Y值
% info:训练过程数据,包括TrainingLoss、TrainingRMSE、BaseLearnRate等
% ind:预测效果评价指标结果数组,其评价指标值顺序与indNamesCell一一对应
% net:训练好的神经网络
% YTrainRe:训练集的Y值
% YTestRe:测试集的Y值

2.Fun_RNNs_Fore_Mul_TrainAndTest.m文件

LSTM/BiLSTM/GRU神经网络做时间序列预测“预测”的程序(多步),部分数据用来训练,剩余数据拿来做对比验证。该函数在图形界面软件中调用,是底层实现函数之二。该文件为函数文件,需调用,不能直接运行。

function [foreDataRe,info,ind,net,YTrainRe,YTestRe,XTrainRe] = Fun_RNNs_Fore_Mul_TrainAndTest(data,numHU,dropProb,MaxEp,MiniBatch,GraThr,InitLearnRa,Plots,LearnSch,LearnRaDP,LearnRaDF,NorFlag,SeedFlag,rnnName,figflag,rTrain,indNamesCell)
% LSTM/BiLSTM/GRU神经网络做时间序列预测“预测”的程序(多步),部分数据用来训练,剩余数据拿来做对比验证
% 输入:
% data:输入的时间序列数据,类型为cell或者dat
% numHU:即numHiddenUnits,LSTM的隐含单元数
% dropProb:丢弃层的丢弃概率,如果不丢弃,则设置为0,最大为1
% MaxEp:即MaxEpochs,最大迭代次数
% MimiBatch:批尺寸
% GraThr:即GradientThreshold梯度极限(1)
% InitLearnRa:即InitialLearnRate初始化学习速率(0.005)
% Plots:是否画出训练过程,1为是,其他值为否
% LearnSch:即LearnRateSchedule是否在一定迭代次数后学习速率下降,1为使用, LearnSch ='piecewise',其他值为不使用
% LearnRaDP:即LearnRateDropPeriod学习速率下降时的迭代数
% LearnRaDF:即LearnRateDropFactor学习速率下降因子,下降后变为LearnRaDF*InitLearnRa,LearnSch为0时可以赋0
% NorFlag:即Normalization Flag,设置为1时则在程序中进行数据归一化和反归一化操作,否则不进行,建议设置为1
% SeedFlag:随机种子标志,设置为1时启用随机种子
% rnnName:使用的网络名称,可选项包括:'GRU','LSTM','BiLSTM',注意大小写
% figflag:是否画预测结果图,'on'为画图,'off'为不画
% rTrain:训练集比例/数量,rTrain<1时代表训练集比例,>1的整数时代表训练集数量.
% indNamesCell:拟进行预测评价指标名称,该变量为cell类型,其中包含的指标名称为字符串,指标名称在下边列表中:
%   目前支持的指标(2021.8.11):
%   MSE:均方误差(Mean Square Error)
%   RMSE:均方根误差(Root Mean Square Error)
%   MAE:平均绝对误差(Mean Absolute Error)
%   MAPE:平均绝对百分比误差(Mean Absolute Percentage Error)
%   R2:决定系数(R2-R-Square)
%   如果想获取MSE、MAE两个指标,则设置:indNamesCell = {'MSE','MAE'}

% 输出:
% foreDataRe:预测值,对应测试集的Y值
% info:训练过程数据,包括TrainingLoss、TrainingRMSE、BaseLearnRate等
% ind:预测效果评价指标结果数组,其评价指标值顺序与indNamesCell一一对应
% net:训练好的神经网络
% YTrainRe:训练集的Y值
% YTestRe:测试集的Y值

3.Fun_RNNs_Fore_Mul.m文件

LSTM/BiLSTM/GRU神经网络做时间序列预测“预测”的程序(多步),全部数据用来训练,预测未来数据。该函数在图形界面软件中调用,是底层实现函数之三。该文件为函数文件,需调用,不能直接运行。

function [foreDataRe,info,net] = Fun_RNNs_Fore_Mul(data,PredNum,numHU,dropProb,MaxEp,MiniBatch,GraThr,InitLearnRa,Plots,LearnSch,LearnRaDP,LearnRaDF,NorFlag,SeedFlag,rnnName,figflag)
% LSTM/BiLSTM/GRU神经网络做时间序列预测“预测”的程序(多步),全部数据用来训练,预测未来数据
% 输入:
% data:输入的时间序列数据,类型为cell或者dat
% PredNum:要进行预测的步数,步长即训练用的数据的步长。
% numHU:即numHiddenUnits,LSTM的隐含单元数
% dropProb:丢弃层的丢弃概率,如果不丢弃,则设置为0,最大为1
% MaxEp:即MaxEpochs,最大迭代次数
% MimiBatch:批尺寸
% GraThr:即GradientThreshold梯度极限(1)
% InitLearnRa:即InitialLearnRate初始化学习速率(0.005)
% Plots:是否画出训练过程,1为是,其他值为否
% LearnSch:即LearnRateSchedule是否在一定迭代次数后学习速率下降,1为使用, LearnSch ='piecewise',其他值为不使用
% LearnRaDP:即LearnRateDropPeriod学习速率下降时的迭代数
% LearnRaDF:即LearnRateDropFactor学习速率下降因子,下降后变为LearnRaDF*InitLearnRa,LearnSch为0时可以赋0
% NorFlag:即Normalization Flag,设置为1时则在程序中进行数据归一化和反归一化操作,否则不进行,建议设置为1
% SeedFlag:随机种子标志,设置为1时启用随机种子
% rnnName:使用的网络名称,可选项包括:'GRU','LSTM','BiLSTM',注意大小写
% figflag:是否画预测结果图,'on'为画图,'off'为不画

% 输出:
% foreDataRe:预测值,对应测试集的Y值
% info:训练过程数据,包括TrainingLoss、TrainingRMSE、BaseLearnRate等
% net:训练好的神经网络

4.EvaForeEffect.m文件

用于评价时间序列预测效果各个量化指标的通用函数。该文件为函数文件,需调用,不能直接运行。

function ind = EvaForeEffect(realData,foreData,indNamesCell)
% 用于评价时间序列预测效果各个量化指标的通用函数
% 输入:
% realData:真实值
% foreData:预测值
% indNamesCell:拟进行预测评价指标名称,该变量为cell类型,其中包含的指标名称为字符串,指标名称在下边列表中:
% 目前支持的指标(2021.12.5):
% MSE:均方误差(Mean Square Error)
% RMSE:均方根误差(Root Mean Square Error)
% MAE:平均绝对误差(Mean Absolute Error)
% MAPE:平均绝对百分比误差(Mean Absolute Percentage Error)
% R2:决定系数(R2-R-Square)
% R:相关系数
% 如果想获取MSE、MAE两个指标,则设置:indNamesCell = {'MSE','MAE'}
% 输出:
% ind:预测效果评价指标结果数组,其评价指标值顺序与indNamesCell一一对应

8.chickenpox.mat文件

演示案例中使用的测试数据,这是一个时间序列数据集,记录了一段时间内在某一地区每月报告的水痘病例数。

三、快速开始

1.运行测试脚本

先在MATLAB里打开下载好的文件夹,然后运行demo_RNNs_Fore_Mul.m、demo_RNNs_Fore_Mul_TrainAndTest.m、demo_RNNs_Fore_Onestep_TrainAndTest程序,程序运行完毕后如果没报错,且正常画出预测结果图像,则说明运行环境正常,程序正确。

2.修改仿真数据/导入数据

全部数据用于预测为例,此方法在demo_RNNs_Fore_Mul.m中演示:

复制一个demo_RNNs_Fore_Mul.m的文件副本,在这个副本里做如下修改:

(1)第一种情况,你可能想要对你自己要研究的仿真数据进行滤波测试,此时你需要对 demo_RNNs_Fore_Mul.m 脚本文件中的第1小节内容进行修改替换即可。需要注意的是,请最好保持变量名的一致,即将待预测数据命名为data,data应该是一维数据。此时数据替换完成。

(2)第二种情况,你可能是想对一段真实的数据进行滤波,此时需要根据你的文件类型的不同(excel,txt,csv等),将数据导入MATLAB的方法有所不同。同学们可以看博主针对常用文件的导入方法的这个教程,教程上未包含的数据类型,大家可以再参考这个文档导入完成后请将这个数据命名为data

3.实现预测

参照 demo_RNNs_Fore_Mul.m文件中第二步,根据需要调整相关参数

运行程序即可。

四、关于完整版与试用版代码

功能完整版试用版
数据导入、参数设置、模型训练与可视化结果展示
软件全部源码×
可导出预测结果数据、训练好的网络net、训练过程数据等×
分析数据data的数据长度无限制500以内
预测图无水印×
预测步数/训练集比例预测序列长度不大于20,比例为固定值0.9

五、获取公开版程序(需使用电脑浏览器打开)

LSTM/BiLSTM/GRU时间序列预测公开版代码(纯代码版)

注:公开版代码需使用MATLAB2022a及以上版本

六、获取完整版程序(使用电脑浏览器或者手机浏览器打开)

获取通道一(淘宝):点击此处获取完整版程序

获取通道二(本页面):点击下面“立即支付”按钮,付款后获取完整版代码下载链接和售后联系方式~本通道处于测试阶段,使用该通道可以额外优惠(仅需88元)。付款完成后刷新一下本页面即可看到下载链接。

(注意支付跳转失败的话,请使用浏览器打开本页面)

您需要先支付 88元 才能查看此处内容!立即支付

七、完整版代码重要更新

20230601 完成初版代码

八、常见问题

问题1.运行代码提示下图警告是怎么回事?

回答1:这个警告是由于你的CUDA驱动需要重新编译GPU库,因为你的设备比库更新,那么你可能需要等待这个重新编译过程完成,这个过程通常需要5-10分钟,待库编译完成后,再运行代码就不会等这么久了。但是关掉MATLAB重新运行程序,第一次还是要等待这么久。解决这个问题的办法就是使用新版本的MATLAB,比如2022或者2023版就不会有这个问题了。