数据在评论区

可以查看这一篇博客有更好的代码和可视化:

多序列:http://t.csdn.cn/a4pM0

单序列: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);

运行结果:afdd8c4c11be472fbbc156e50530fdc7.png

be5c977fcc8d4940913098a064ac640b.bmp

 

 

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐