LSTM
LSTM网络
long short term memory,即我们所称呼的LSTM,是为了解决长期以来问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层。
图3.RNNcell
LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互
图4.LSTMcell
LSTM核心思想
LSTM的关键在于细胞的状态整个(绿色的图表示的是一个cell),和穿过细胞的那条水平线。
细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。
图5.LSTMcell内部结构图
若只有上面的那条水平线是没办法实现添加或者删除信息的。而是通过一种叫做 门(gates) 的结构来实现的。
门 可以实现选择性地让信息通过,主要是通过一个 sigmoid 的神经层 和一个逐点相乘的操作来实现的。
图6.信息节点
sigmoid 层输出(是一个向量)的每个元素都是一个在 0 和 1 之间的实数,表示让对应信息通过的权重(或者占比)。比如, 0 表示“不让任何信息通过”, 1 表示“让所有信息通过”。
LSTM通过三个这样的基本结构来实现信息的保护和控制。这三个门分别输入门、遗忘门和输出门。
深入理解LSTM
遗忘门
在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取h t − 1 h_{t−1}ht−1和x t x_txt,输出一个在 0到 1之间的数值给每个在细胞状态C t − 1 C_{t-1}Ct−1中的数字。1 表示“完全保留”,0 表示“完全舍弃”。
其中ht−1表示的是上一个cell的输出,xt表示的是当前细胞的输入。σσ表示sigmod函数。
输入门
下一步是决定让多少新的信息加入到 cell 状态 中来。实现这个需要包括两个 步骤:首先,一个叫做“input gate layer ”的 sigmoid 层决定哪些信息需要更新;一个 tanh 层生成一个向量,也就是备选的用来更新的内容,C^t 。在下一步,我们把这两部分联合起来,对 cell 的状态进行一个更新。
现在是更新旧细胞状态的时间了,Ct−1更新为Ct。前面的步骤已经决定了将会做什么,我们现在就是实际去完成。
我们把旧状态与ft相乘,丢弃掉我们确定需要丢弃的信息。接着加上it∗C~t。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。
输出门
最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
%%
clc
clear all
close all
%加载数据,重构为行向量
num=100;
x=1:num;
db=0.1;
data =abs(0.5.*sin(x)+0.5.*cos(x)+db*rand(1,num));
data1 =data;%把你的负荷数据赋值给data变量就可以了。
%data是行向量。要是还不明白,就留言吧。
%%
%序列的前 90% 用于训练,后 10% 用于测试
numTimeStepsTrain = floor(0.9*numel(data));
dataTrain = data(1:numTimeStepsTrain+1);
dataTest = data1(numTimeStepsTrain+1:end);
%数据预处理,将训练数据标准化为具有零均值和单位方差。
mu = mean(dataTrain);
sig = std(dataTrain);
dataTrainStandardized = dataTrain;
%输入LSTM的时间序列交替一个时间步
XTrain = dataTrainStandardized(1:end-1);
YTrain = dataTrainStandardized(2:end);
%%
%创建LSTM回归网络,指定LSTM层的隐含单元个数96*3
%序列预测,因此,输入一维,输出一维
numFeatures = 1;
numResponses = 1;
numHiddenUnits = 20*3;
layers = [ ...
sequenceInputLayer(numFeatures)
lstmLayer(numHiddenUnits)
fullyConnectedLayer(numResponses)
regressionLayer];
%% WOA
lb=0.001;%学习率下限
ub=0.1;%学习率上限
% Main loop
while t<Max_iter
t
end
%将预测值与测试数据进行比较。
figure(1)
subplot(2,1,1)
plot(YTest,'gs-','LineWidth',2)
hold on
plot(YPred_best,'ro-','LineWidth',2)
hold off
legend('观测值','预测值')
xlabel('时间')
ylabel('数据值')
title('Forecast with Updates')
subplot(2,1,2)
stem(YPred_best - YTest)
xlabel('时间')
ylabel('均方差值')
title('均方差图 ' )
figure(2)
plot(dataTrain(1:end-1))
hold on
idx = numTimeStepsTrain:(numTimeStepsTrain+numTimeStepsTest);
plot(idx,[data(numTimeStepsTrain) YPred_best],'.-')
hold off
xlabel('时间')
ylabel('数据值')
title('预测图')
legend('观测值', '预测值')
figure(3)
plot(1:Max_iter,Convergence_curve,'bo-');
hold on;
title('鲸鱼优化后Error-Cost曲线图');
xlabel('迭代次数')
ylabel('误差适应度值')
注:完整代码或者代写添加QQ2449341593
往期回顾>>>>>>
【lssvm预测】基于鲸鱼优化算法的lssvm数据预测matlab源码【Matlab 104期】【预测模型2】
【SVM预测】基于蝙蝠算法改进的SVM预测【Matlab 106期】【预测模型4】
【SVM预测】灰狼算法优化svm支持向量机预测matlab源码【Matlab 107期】【预测模型5】
BP神经网络的预测【Matlab 108期】【预测模型6】
【lssvm预测模型】基于蝙蝠算法改进的最小二乘支持向量机lssvm预测【Matlab 109期】【预测模型7】