LSTM时间序列预测代码超通俗解释(MATLAB)

 数据在评论区

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

多序列: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

 

 

 

  • 20
    点赞
  • 255
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
以下是一个简单的LSTM时间序列预测MATLAB代码示例: ```matlab % 加载数据 data = csvread('data.csv'); % 划分训练集和测试集 train_data = data(1:800,:); test_data = data(801:end,:); % 定义LSTM网络结构和参数 input_size = 1; % 输入维度 hidden_size = 10; % 隐藏层维度 output_size = 1; % 输出维度 num_layers = 2; % LSTM层数 learning_rate = 0.001; % 学习率 num_epochs = 100; % 训练轮数 % 定义LSTM模型 net = lstm(input_size, hidden_size, output_size, num_layers); % 定义损失函数和优化器 criterion = mse; optimizer = adam(net.parameters(), learning_rate); % 训练LSTM模型 for epoch = 1:num_epochs % 将训练数据拆分成输入和输出 train_input = train_data(1:end-1,:); train_output = train_data(2:end,:); % 将数据转换为LSTM网络输入格式 train_input = reshape(train_input', 1, input_size, []); train_output = reshape(train_output', 1, output_size, []); % 前向传播和计算损失 [outputs, states] = net.forward(train_input); loss = criterion(outputs, train_output); % 反向传播和更新参数 net.zero_grad(); loss.backward(); optimizer.step(); % 打印损失 disp(['Epoch ', num2str(epoch), ' Loss: ', num2str(gather(loss.data))]); end % 测试LSTM模型 test_input = test_data(1:end-1,:); test_output = test_data(2:end,:); test_input = reshape(test_input', 1, input_size, []); test_output = reshape(test_output', 1, output_size, []); test_outputs = net.forward(test_input); % 绘制预测结果和实际结果 figure; plot(test_outputs.data, 'r'); hold on; plot(test_output.data, 'b'); legend('Prediction', 'Actual'); xlabel('Time'); ylabel('Value'); ``` 其中,`lstm`函数是自定义的LSTM网络函数,`mse`是均方误差损失函数,`adam`是Adam优化器函数。在训练和测试过程中,需要将数据转换为LSTM网络的输入格式,并使用`forward`函数计算输出。最后,使用`plot`函数绘制预测结果和实际结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PlatinumA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值