当前位置:   article > 正文

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

matlab lstm

 数据在评论区

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

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

单序列:https://blog.csdn.net/m0_62526778/article/details/128996795

  1. clc;clear
  2. %LSTM时间序列预测
  3. D=readmatrix("1维数据预测.xlsx");
  4. data=D(:,2)';%训练LSTM网络必须是行向量,所以转置
  5. %序列前2000个用于训练,后191个用于验证神经网络。然后往后预测200个数据
  6. data_train=data(1:2000);%定义训练数据集,训练前2000个数据
  7. data_test=data(2001:2191);%该数据用来最后与预测值对比
  8. %数据预处理
  9. [data_train_n,PS]=mapstd(data_train);
  10. %训练集数据标准化,可doc mapstd查看函数细则
  11. %因为经过神经网络的只有训练集,因此无需对测试集标准化
  12. %LSTM神经网络的输入层与输出层
  13. input_train=data_train_n(1:end-1);%神经网络输入层
  14. %这里减1意思是根据已知数据预测后1天,
  15. %如input[1,2,3,4],根据[1,2]来预测[3],再根据[1,2,3]来预测[4],以此类推,反正仅预测后1天;
  16. output_train=data_train_n(2:end);%神经网络输出层真实值
  17. %如输入的是[1,2,3],那输出对应着[4],所以是(2:end)
  18. num_input=1;%输入层是1维向量即一个输入层
  19. num_output=1;%输出层也是1维向量即一个输入层
  20. num_hidden=200;%一个隐藏层的神经元个数
  21. %创建LSTM回归神经网络,定义LSTM网络架构
  22. layers=[sequenceInputLayer(num_input);lstmLayer(num_hidden)
  23. fullyConnectedLayer(num_output);regressionLayer];
  24. %sequenceInputLayer为序列输入层,lstmLayer长短期记忆 (LSTM) 层
  25. %fullyConnectedLayer全连接层,regressionLayer回归输出层(是回归问题而不是分类问题)
  26. %指定初始学习率为0.01,在400轮训练后通过乘以因子0.15来降低学习率
  27. options=trainingOptions("adam",MaxEpochs=1000,GradientThreshold=1,InitialLearnRate=0.01, ...
  28. LearnRateSchedule="piecewise",LearnRateDropPeriod=400,LearnRateDropFactor=0.15,Verbose=0,Plots="training-progress");
  29. %trainingOptions训练深度学习神经网络的选项;adam自适应矩估计求解器;MaxEpochs最大训练次数;GradientThreshold梯度阈值
  30. % InitialLearnRate— 初始学习率;LearnRateScheduleSettings— 学习率计划;Verbose— 显示训练进度信息的
  31. % 'training-progress'— 绘制训练进度;这些根据自己数据集的特征去调
  32. net=trainNetwork(input_train,output_train,layers,options);
  33. %若RMSE曲线下降太慢,本代码中,需要LearnRateDropPeriod改大
  34. %初始化网络状态
  35. net=predictAndUpdateState(net ,input_train);
  36. %predictAndUpdateState使用经过训练的递归神经网络预测响应并更新网络状态
  37. [net,output_pred]=predictAndUpdateState(net,output_train(end));
  38. %output的最后一个即预测的第一个,用递归的方法来训练
  39. %进行用于验证神经网络的数据预测,用预测值更新网络状况
  40. for i=2:291 %从第二步开始,191用于验证的预测值,100为往后预测的值,共291个
  41. [net,output_pred(:,i)]=predictAndUpdateState(net,output_pred(:,i-1),"ExecutionEnvironment","cpu");
  42. %一次预测一个值并更新神经网络,递归预测,如第291个预测值由第290个预测值经神经网络返回
  43. %因为训练集后面的我们不会提供真实值了,只能用预测值来预测下一个
  44. end
  45. output_pred = mapstd('reverse',output_pred,PS);
  46. %因为经神经网络输出的值是被标准化后的结果,所以要去标准化与实际数据对比
  47. RMSE=sqrt(mean((output_pred(1:191)-data_test).^2));%计算均方根误
  48. subplot(2,1,1);%将figure划分成2行1列,且这个图放第一行
  49. plot(data_train(1:end));%先画出前2000个,是训练数据
  50. hold on
  51. idx=2001:(2000+191);%横坐标标注
  52. plot(idx,output_pred(1:191),"-");%画出预测值1:191
  53. hold off %subplot这个第一行图就放这两曲线,下面的在另外一行图里
  54. xlabel("Time")
  55. ylabel("Case")
  56. title("Forecast")
  57. legend(["Observed" "Forecast"])
  58. subplot(2,1,2)
  59. plot(data)
  60. xlabel("Time")
  61. ylabel("Case")
  62. title("Dataset")
  63. %往后预测2023年的数据
  64. figure(2)
  65. idx=2001:(2000+291);
  66. plot(idx,output_pred(1:291),"-");
  67. hold off
  68. net=resetState(net);

运行结果:afdd8c4c11be472fbbc156e50530fdc7.png

be5c977fcc8d4940913098a064ac640b.bmp

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/97243
推荐阅读
相关标签
  

闽ICP备14008679号