一、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")
-
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")
可以看到预测效果非常的好。
其他:
深度学习--Matlab使用LSTM长短期记忆网络对负荷进行分类
转载:https://blog.csdn.net/u010058695/article/details/101062662
查看评论