赞
踩
数据在评论区
可以查看这一篇博客有更好的代码和可视化:
单序列:https://blog.csdn.net/m0_62526778/article/details/128996795
- clc;clear
- %LSTM时间序列预测
- D=readmatrix("1维数据预测.xlsx");
- data=D(:,2)';%训练LSTM网络必须是行向量,所以转置
- %序列前2000个用于训练,后191个用于验证神经网络。然后往后预测200个数据
- data_train=data(1:2000);%定义训练数据集,训练前2000个数据
- data_test=data(2001:2191);%该数据用来最后与预测值对比
-
- %数据预处理
- [data_train_n,PS]=mapstd(data_train);
- %训练集数据标准化,可doc mapstd查看函数细则
- %因为经过神经网络的只有训练集,因此无需对测试集标准化
-
- %LSTM神经网络的输入层与输出层
- input_train=data_train_n(1:end-1);%神经网络输入层
- %这里减1意思是根据已知数据预测后1天,
- %如input[1,2,3,4],根据[1,2]来预测[3],再根据[1,2,3]来预测[4],以此类推,反正仅预测后1天;
- output_train=data_train_n(2:end);%神经网络输出层真实值
- %如输入的是[1,2,3],那输出对应着[4],所以是(2:end)
- num_input=1;%输入层是1维向量即一个输入层
- num_output=1;%输出层也是1维向量即一个输入层
- num_hidden=200;%一个隐藏层的神经元个数
-
- %创建LSTM回归神经网络,定义LSTM网络架构
- layers=[sequenceInputLayer(num_input);lstmLayer(num_hidden)
- fullyConnectedLayer(num_output);regressionLayer];
- %sequenceInputLayer为序列输入层,lstmLayer长短期记忆 (LSTM) 层
- %fullyConnectedLayer全连接层,regressionLayer回归输出层(是回归问题而不是分类问题)
-
- %指定初始学习率为0.01,在400轮训练后通过乘以因子0.15来降低学习率
- options=trainingOptions("adam",MaxEpochs=1000,GradientThreshold=1,InitialLearnRate=0.01, ...
- LearnRateSchedule="piecewise",LearnRateDropPeriod=400,LearnRateDropFactor=0.15,Verbose=0,Plots="training-progress");
- %trainingOptions训练深度学习神经网络的选项;adam自适应矩估计求解器;MaxEpochs最大训练次数;GradientThreshold梯度阈值
- % InitialLearnRate— 初始学习率;LearnRateScheduleSettings— 学习率计划;Verbose— 显示训练进度信息的
- % 'training-progress'— 绘制训练进度;这些根据自己数据集的特征去调
- net=trainNetwork(input_train,output_train,layers,options);
- %若RMSE曲线下降太慢,本代码中,需要LearnRateDropPeriod改大
-
- %初始化网络状态
- net=predictAndUpdateState(net ,input_train);
- %predictAndUpdateState使用经过训练的递归神经网络预测响应并更新网络状态
- [net,output_pred]=predictAndUpdateState(net,output_train(end));
- %output的最后一个即预测的第一个,用递归的方法来训练
-
- %进行用于验证神经网络的数据预测,用预测值更新网络状况
- for i=2:291 %从第二步开始,191用于验证的预测值,100为往后预测的值,共291个
- [net,output_pred(:,i)]=predictAndUpdateState(net,output_pred(:,i-1),"ExecutionEnvironment","cpu");
- %一次预测一个值并更新神经网络,递归预测,如第291个预测值由第290个预测值经神经网络返回
- %因为训练集后面的我们不会提供真实值了,只能用预测值来预测下一个
- end
-
- output_pred = mapstd('reverse',output_pred,PS);
- %因为经神经网络输出的值是被标准化后的结果,所以要去标准化与实际数据对比
- RMSE=sqrt(mean((output_pred(1:191)-data_test).^2));%计算均方根误
- subplot(2,1,1);%将figure划分成2行1列,且这个图放第一行
- plot(data_train(1:end));%先画出前2000个,是训练数据
- hold on
- idx=2001:(2000+191);%横坐标标注
- plot(idx,output_pred(1:191),"-");%画出预测值1:191
- hold off %subplot这个第一行图就放这两曲线,下面的在另外一行图里
-
- 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=2001:(2000+291);
- plot(idx,output_pred(1:291),"-");
- hold off
-
- net=resetState(net);
运行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。