matlab⽤rnn预测,深度学习--Matlab使⽤LSTM长短期记忆⽹络
对负荷进⾏预测
⼀、LSTM描述
长短期记忆⽹络(LSTM,Long Short-Term Memory)是⼀种时间循环神经⽹络,是为了解决⼀般的RNN(循环神经⽹络)存在的长期依赖问题⽽专门设计出来的,所有的RNN都具有⼀种重复神经⽹络模块的链式形式。在标准RNN中,这个重复的结构模块只有⼀个⾮常简单的结构,例如⼀个tanh层。[概念参考:百度百科]
LSTM⽹络结构如下图:[图⽚来源:OPEN-OPEN]
单个LSTM主要包括以下四个步骤。
(1)遗忘门
(2)更新输⼊信息
(3)更新⽹络状态
(4)⽹络输出信息
更详细的分析,此处不再描述,本⽂着重实现和解决问题。
⼆、问题描述
已有⼀个⽉的电⼒负荷数据,该负荷数据为每15分钟⼀个数据点,要求通过对该数据进⾏学习,对未来的负荷数据进⾏预测。采⽤单向LSTM长短期记忆⽹络进⾏深度学习,采⽤MATLAB平台实现。
三、MATLAB实现
3.1 加载原始数据
原始数据需要构建为⾏向量,即时间序列值。
%%
%加载数据,重构为⾏向量
datayears = load('RPD_data.mat');
datayears = datayears.Prpd;
data = datayears(length(datayears)-96*(31):end);
data = data';
%很多⼈问我这个datayears是什么,这⾥解释⼀下,以上代码是加载数据
%把你的负荷数据赋值给data变量就可以了。
%data是⾏向量。要是还不明⽩,就留⾔吧。
figure
plot(data)
xlabel("Days")
ylabel("Loads")matlab学好了有什么用
title("Daily load")
运⾏结果如下:
3.2 数据预处理
%%
%序列的前 90% ⽤于训练,后 10% ⽤于测试numTimeStepsTrain = floor(0.9*numel(data)); dataTrain = data(1:numTimeStepsTrain+1);
dataTest = data(numTimeStepsTrain+1:end);
%数据预处理,将训练数据标准化为具有零均值和单位⽅差。mu = mean(dataTrain);
sig = std(dataTrain);
dataTrainStandardized = (dataTrain - mu) / sig;
%输⼊LSTM的时间序列交替⼀个时间步
XTrain = dataTrainStandardized(1:end-1);
YTrain = dataTrainStandardized(2:end);
3.3 创建LSTM⽹络
%%
%创建LSTM回归⽹络,指定LSTM层的隐含单元个数96*3 %序列预测,因此,输⼊⼀维,输出⼀维
numFeatures = 1;
numResponses = 1;
numHiddenUnits = 96*3;
layers = [ ...
sequenceInputLayer(numFeatures)
lstmLayer(numHiddenUnits)
fullyConnectedLayer(numResponses) regressionLayer];
%指定训练选项,求解器设置为adam, 250 轮训练。
%梯度阈值设置为 1。指定初始学习率 0.005,在 125 轮训练后通过乘以因⼦ 0.2 来降低学习率。options = trainingOptions('adam', ...
'MaxEpochs',250, ...
'GradientThreshold',1, ...
'InitialLearnRate',0.005, ...
'LearnRateSchedule','piecewise', ...
'LearnRateDropPeriod',125, ...
'LearnRateDropFactor',0.2, ...
'Verbose',0, ...
'Plots','training-progress');
%训练LSTM
net = trainNetwork(XTrain,YTrain,layers,options);
3.4 预测数据
这⾥补充⼀下很多⼈说没有看到的XTest YTest:
dataTestStandardized = (dataTest - mu) / sig;
XTest = dataTestStandardized(1:end-1);
YTest = dataTest(2:end);
这⾥采⽤上⼀时刻的观测值来预测下⼀时刻的预测值。
net = resetState(net);
net = predictAndUpdateState(net,XTrain);
YPred = [];
numTimeStepsTest = numel(XTest);
for i = 1:numTimeStepsTest
[net,YPred(:,i)] = predictAndUpdateState(net,XTest(:,i),'ExecutionEnvironment','cpu');
end
%使⽤先前计算的参数对预测去标准化。
YPred = sig*YPred + mu;
%计算均⽅根误差 (RMSE)。
rmse = sqrt(mean((YPred-YTest).^2))
3.5 查看预测结果
%将预测值与测试数据进⾏⽐较。
figure
subplot(2,1,1)
plot(YTest)
hold on
plot(YPred,'.-')
hold off
legend(["Observed" "Predicted"])
ylabel("Loads")
title("Forecast with Updates")
subplot(2,1,2)
stem(YPred - YTest)
xlabel("Days")
ylabel("Error")
title("RMSE = " + rmse)
figure
subplot(2,1,1)
plot(dataTrain(1:end-1))
hold on
idx = numTimeStepsTrain:(numTimeStepsTrain+numTimeStepsTest); plot(idx,[data(numTimeStepsTrain) YPred],'.-')
hold off
xlabel("Days")
ylabel("Loads")
title("Forecast")
legend(["Observed" "Forecast"])
subplot(2,1,2)
plot(data)
xlabel("Days")
ylabel("Loads")
title("Daily load")

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。