lstm预测基于粒子群优化lstm预测matlab源码
Posted 博主QQ2449341593
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lstm预测基于粒子群优化lstm预测matlab源码相关的知识,希望对你有一定的参考价值。
LSTM网络
long short term memory,即我们所称呼的LSTM,是为了解决长期以来问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层。
图3.RNNcell
LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。
图4.LSTMcell
LSTM的关键在于细胞的状态整个(绿色的图表示的是一个cell),和穿过细胞的那条水平线。
细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。
图5.LSTMcell内部结构图
若只有上面的那条水平线是没办法实现添加或者删除信息的。而是通过一种叫做 门(gates) 的结构来实现的。
门 可以实现选择性地让信息通过,主要是通过一个 sigmoid 的神经层 和一个逐点相乘的操作来实现的。
图6.信息节点
sigmoid 层输出(是一个向量)的每个元素都是一个在 0 和 1 之间的实数,表示让对应信息通过的权重(或者占比)。比如, 0 表示“不让任何信息通过”, 1 表示“让所有信息通过”。
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 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
实现
%%%% 基于粒子群算法优化lstm预测单序列
clc
clear all
close all
%加载数据,重构为行向量
%加载数据,重构为行向量
data =xlsread('台风日数据2','Sheet1','B2:E481');%把你的负荷数据赋值给data变量就可以了。
%%
%序列的前 90% 用于训练,后 10% 用于测试
numTimeStepsTrain =round(0.8*size(data,1));
dataTrain = data(1:numTimeStepsTrain,:)';
dataTest = data(numTimeStepsTrain+1:end-1,:)';
numTimeStepsTest = size(data,1)-numTimeStepsTrain-1 ;%步数
%% 数据归一化
[dataTrainStandardized, ps_input] = mapminmax(dataTrain,0,1);
[dataTestStandardized, ps_output] = mapminmax(dataTest,0,1);
%输入LSTM的时间序列交替一个时间步
XTrain = dataTrainStandardized(2:end,:);
YTrain = dataTrainStandardized(1,:);
[dataTrainStandardized_zong, ps_input_zong] = mapminmax(data',0,1);
XTest_zong = dataTrainStandardized_zong(2:end,end);%测试集输入
YTest_zong = dataTest(1,1)';%测试集输出
XTest = dataTestStandardized(2:end,:);%测试集输入
YTest = dataTest(1,:)';%测试集输出
%%
%创建LSTM回归网络,指定LSTM层的隐含单元个数96*3
%序列预测,因此,输入一维,输出一维
numFeatures = 3;%输入层数
numResponses = 1;%输出层数
numHiddenUnits = 20*3;
layers = [ ...
sequenceInputLayer(numFeatures)
lstmLayer(numHiddenUnits)
fullyConnectedLayer(numResponses)
regressionLayer];
%% 初始化种群
N = 5; % 初始种群个数
d = 1; % 空间维数
ger =100; % 最大迭代次数
limit = [0.001, 0.01;]; % 设置位置参数限制(矩阵的形式可以多维)
vlimit = [-0.005, 0.005;]; % 设置速度限制
c_1 = 0.8; % 惯性权重
c_2 = 0.5; % 自我学习因子
c_3 = 0.5; % 群体学习因子
for i = 1:d
x(:,i) = limit(i, 1) + (limit(i, 2) - limit(i, 1)) * rand(N, 1);%初始种群的位置
end
v = 0.005*rand(N, d); % 初始种群的速度
xm = x; % 每个个体的历史最佳位置
ym = zeros(1, d); % 种群的历史最佳位置
fxm = 1000*ones(N, 1); % 每个个体的历史最佳适应度
fym = 1000; % 种群历史最佳适应度
%% 粒子群工作
iter = 1;
times = 1;
record = zeros(ger, 1); % 记录器
while iter <= ger
iter
for i=1:N
%指定训练选项,求解器设置为adam, 250 轮训练。
%梯度阈值设置为 1。指定初始学习率 0.005,在 125 轮训练后通过乘以因子 0.2 来降低学习
end
disp(['最小值:',num2str(fym)]);
disp(['变量取值:',num2str(ym)]);
figure
plot(record)
title(['粒子群优化后Error-Cost曲线图,最佳学习率=',num2str(ym)]);
xlabel('迭代次数')
ylabel('误差适应度值')
figure(2)
% subplot(2,1,1)
plot(YTest,'gs-','LineWidth',2)
hold on
plot(YPred_best,'ro-','LineWidth',2)
hold off
legend('观测值','预测值')
xlabel('时间')
ylabel('数据值')
title('粒子群算法优化预测效果图')
完整代码或仿真咨询QQ1575304183
以上是关于lstm预测基于粒子群优化lstm预测matlab源码的主要内容,如果未能解决你的问题,请参考以下文章
风电功率预测基于matlab粒子群算法优化LSTM风电功率预测含Matlab源码 941期
风电功率预测基于matlab粒子群算法优化LSTM风电功率预测含Matlab源码 941期
电力负荷预测基于matlab粒子群算法优化LSTM短期电力负荷预测含Matlab源码 1232期
LSTM回归预测基于matlab布谷鸟算法优化LSTM回归预测含Matlab源码 2037期