小言_互联网的博客

深度学习--Matlab使用LSTM长短期记忆网络对负荷进行预测

2110人阅读  评论(0)

一、LSTM描述

长短期记忆网络(LSTM,Long Short-Term Memory)是一种时间循环神经网络,是为了解决一般的RNN(循环神经网络)存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层。[概念参考:百度百科]

LSTM网络结构如下图:[图片来源:OPEN-OPEN]

单个LSTM主要包括以下四个步骤。

(1)遗忘门

(2)更新输入信息

(3)更新网络状态

 

(4)网络输出信息

更详细的分析,此处不再描述,本文着重实现和解决问题。

 

二、问题描述

已有一个月的电力负荷数据,该负荷数据为每15分钟一个数据点,要求通过对该数据进行学习,对未来的负荷数据进行预测。

采用单向LSTM长短期记忆网络进行深度学习,采用MATLAB平台实现。

 

三、MATLAB实现

3.1 加载原始数据

原始数据需要构建为行向量,即时间序列值。


  
  1. %%
  2. %加载数据,重构为行向量
  3. datayears = load(' RPD_data.mat');
  4. datayears = datayears. Prpd;
  5. data = datayears(length(datayears)-96*(31):end);
  6. data = data';
  7. %很多人问我这个datayears是什么,这里解释一下,以上代码是加载数据
  8. %把你的负荷数据赋值给 data变量就可以了。
  9. % data是行向量。要是还不明白,就留言吧。
  10. figure
  11. plot( data)
  12. xlabel( "Days")
  13. ylabel( "Loads")
  14. title( "Daily load")

运行结果如下:

3.2 数据预处理


  
  1. %%
  2. %序列的前 90% 用于训练,后 10% 用于测试
  3. numTimeStepsTrain = floor(0.9*numel(data));
  4. dataTrain = data(1:numTimeStepsTrain+1);
  5. dataTest = data(numTimeStepsTrain+1:end);
  6. %数据预处理,将训练数据标准化为具有零均值和单位方差。
  7. mu = mean(dataTrain);
  8. sig = std(dataTrain);
  9. dataTrainStandardized = (dataTrain - mu) / sig;
  10. %输入LSTM的时间序列交替一个时间步
  11. XTrain = dataTrainStandardized(1:end-1);
  12. YTrain = dataTrainStandardized(2:end);

3.3 创建LSTM网络


  
  1. %%
  2. %创建LSTM回归网络,指定LSTM层的隐含单元个数 96* 3
  3. %序列预测,因此,输入一维,输出一维
  4. numFeatures = 1;
  5. numResponses = 1;
  6. numHiddenUnits = 96* 3;
  7. layers = [ ...
  8. sequenceInputLayer(numFeatures)
  9. lstmLayer(numHiddenUnits)
  10. fullyConnectedLayer(numResponses)
  11. regressionLayer];
  12. %指定训练选项,求解器设置为adam, 250 轮训练。
  13. %梯度阈值设置为 1。指定初始学习率 0.005,在 125 轮训练后通过乘以因子 0.2 来降低学习率。
  14. options = trainingOptions( 'adam', ...
  15. 'MaxEpochs', 250, ...
  16. 'GradientThreshold', 1, ...
  17. 'InitialLearnRate', 0.005, ...
  18. 'LearnRateSchedule', 'piecewise', ...
  19. 'LearnRateDropPeriod', 125, ...
  20. 'LearnRateDropFactor', 0.2, ...
  21. 'Verbose', 0, ...
  22. 'Plots', 'training-progress');
  23. %训练LSTM
  24. net = trainNetwork(XTrain,YTrain,layers,options);

3.4 预测数据

!!!!这里补充一下很多人说没有看到的XTest YTest:


  
  1. dataTestStandardized = (dataTest - mu) / sig ;
  2. XTest = dataTestStandardized( 1:end- 1) ;
  3. YTest = dataTest( 2:end) ;

这里采用上一时刻的观测值来预测下一时刻的预测值。


  
  1. net = resetState(net);
  2. net = predictAndUpdateState(net,XTrain);
  3. YPred = [];
  4. numTimeStepsTest = numel(XTest);
  5. for i = 1:numTimeStepsTest
  6. [net,YPred(: ,i)] = predictAndUpdateState(net,XTest(:,i),'ExecutionEnvironment','cpu');
  7. end
  8. %使用先前计算的参数对预测去标准化。
  9. YPred = sig*YPred + mu;
  10. %计算均方根误差 (RMSE)。
  11. rmse = sqrt(mean((YPred-YTest).^2))

3.5 查看预测结果


  
  1. %将预测值与测试数据进行比较。
  2. figure
  3. subplot( 2, 1, 1)
  4. plot(YTest)
  5. hold on
  6. plot(YPred, '.-')
  7. hold off
  8. legend([ "Observed" "Predicted"])
  9. ylabel( "Loads")
  10. title( "Forecast with Updates")
  11. subplot( 2, 1, 2)
  12. stem(YPred - YTest)
  13. xlabel( "Days")
  14. ylabel( "Error")
  15. title( "RMSE = " + rmse)
  16. figure
  17. subplot( 2, 1, 1)
  18. plot(dataTrain( 1:end -1))
  19. hold on
  20. idx = numTimeStepsTrain:(numTimeStepsTrain+numTimeStepsTest);
  21. plot(idx,[data(numTimeStepsTrain) YPred], '.-')
  22. hold off
  23. xlabel( "Days")
  24. ylabel( "Loads")
  25. title( "Forecast")
  26. legend([ "Observed" "Forecast"])
  27. subplot( 2, 1, 2)
  28. plot(data)
  29. xlabel( "Days")
  30. ylabel( "Loads")
  31. title( "Daily load")

可以看到预测效果非常的好。

其他:

深度学习--Matlab使用LSTM长短期记忆网络对负荷进行分类


转载:https://blog.csdn.net/u010058695/article/details/101062662
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场