【LSTM回归预测】基于matlab灰狼算法优化LSTM回归预测【含Matlab源码 2038期】

举报
海神之光 发表于 2022/08/18 00:27:35 2022/08/18
【摘要】 一、灰狼算法及LSTM简介 1 灰狼算法简介 1.1 前言 灰狼优化算法(Grey Wolf Optimizer,GWO)由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智...

一、灰狼算法及LSTM简介

1 灰狼算法简介
1.1 前言
灰狼优化算法(Grey Wolf Optimizer,GWO)由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智能优化算法。该算法受到了灰狼捕食猎物活动的启发而开发的一种优化搜索方法,它具有较强的收敛性能、参数少、易实现等特点。近年来受到了学者的广泛关注,它己被成功地应用到了车间调度、参数优化、图像分类等领域中。
1.2 算法原理
灰狼隶属于群居生活的犬科动物,且处于食物链的顶层。灰狼严格遵守着一个社会支配等级关系。如图:
在这里插入图片描述
社会等级第一层:狼群中的头狼记为 \alpha,\alpha 狼主要负责对捕食、栖息、作息时间等活动作出决策。由于其它的狼需要服从\alpha 狼的命令,所以 \alpha 狼也被称为支配狼。另外, \alpha 狼不一定是狼群中最强的狼,但就管理能力方面来说, \alpha 狼一定是最好的。
社会等级第二层:\beta 狼,它服从于 \alpha 狼,并协助 \alpha 狼作出决策。在 \alpha 狼去世或衰老后,\beta 狼将成为 \alpha 狼的最候选者。虽然 \beta 狼服从 \alpha 狼,但 \beta 狼可支配其它社会层级上的狼。
社会等级第三层:\delta 狼,它服从 \alpha 、\beta 狼,同时支配剩余层级的狼。\delta 狼一般由幼狼、哨兵狼、狩猎狼、老年狼及护理狼组成。
社会等级第四层:\omega 狼,它通常需要服从其它社会层次上的狼。虽然看上去 \omega 狼在狼群中的作用不大,但是如果没有 \omega 狼的存在,狼群会出现内部问题如自相残杀。
GWO 优化过程包含了灰狼的社会等级分层、跟踪、包围和攻击猎物等步骤,其步骤具体情况如下所示。

1)社会等级分层(Social Hierarchy)当设计 GWO 时,首先需构建灰狼社会等级层次模型。计算种群每个个体的适应度,将狼群中适应度最好的三匹灰狼依次标记为 \alpha、\beta 、\delta ,而剩下的灰狼标记为 \omega。也就是说,灰狼群体中的社会等级从高往低排列依次为; \alpha、\beta 、\delta 及 \omega。GWO 的优化过程主要由每代种群中的最好三个解(即 \alpha、\beta 、\delta )来指导完成。
2)包围猎物( Encircling Prey )灰狼捜索猎物时会逐渐地接近猎物并包围它,该行为的数学模型如下:
在这里插入图片描述
式中:t 为当前迭代次数:。表示 hadamard 乘积操作;A 和 C 是协同系数向量;Xp 表示猎物的位置向量; X(t) 表示当前灰狼的位置向量;在整个迭代过程中 a 由2 线性降到 0; r1 和 r2 是 [0,1] 中的随机向量。
3)狩猎( Hunring)
灰狼具有识别潜在猎物(最优解)位置的能力,搜索过程主要靠 \alpha、\beta 、\delta 灰狼的指引来完成。但是很多问题的解空间特征是未知的,灰狼是无法确定猎物(最优解)的精确位置。为了模拟灰狼(候选解)的搜索行为,假设 \alpha、\beta 、\delta 具有较强识别潜在猎物位置的能力。因此,在每次迭代过程中,保留当前种群中的最好三只灰狼( \alpha、\beta 、\delta ),然后根据它们的位置信息来更新其它搜索代理(包括 \omega)的位置。该行为的数学模型可表示如下:
在这里插入图片描述
式中:X_{{\alpha }}、X{{\beta }}、X{{\delta }} 分别表示当前种群中 \alpha、\beta 、\delta 的位置向量;X表示灰狼的位置向量;D{{\alpha }}、D{{\beta }}、D{_{\delta }} 分别表示当前候选灰狼与最优三条狼之间的距离;当|A|>1时,灰狼之间尽量分散在各区域并搜寻猎物。当|A|<1时,灰狼将集中捜索某个或某些区域的猎物。
在这里插入图片描述
从图中可看出,候选解的位置最终落在被 \alpha、\beta 、\delta 定义的随机圆位置内。总的来说, \alpha、\beta 、\delta 需首先预测出猎物(潜
在最优解)的大致位置,然后其它候选狼在当前最优兰只狼的指引下在猎物附近随机地更新它们的位置。

4)攻击猎物(Attacking Prey)构建攻击猎物模型的过程中,根据2)中的公式,a值的减少会引起 A 的值也随之波动。换句话说,A 是一个在区间[-a,a](备注:原作者的第一篇论文里这里是[-2a,2a],后面论文里纠正为[-a,a])上的随机向量,其中a在迭代过程中呈线性下降。当 A 在[-1,1]区间上时,则捜索代理(Search Agent)的下一时刻位置可以在当前灰狼与猎物之间的任何位置上。

5)寻找猎物(Search for Prey)灰狼主要依赖 \alpha、\beta 、\delta 的信息来寻找猎物。它们开始分散地去搜索猎物位置信息,然后集中起来攻击猎物。对于分散模型的建立,通过|A|>1使其捜索代理远离猎物,这种搜索方式使 GWO 能进行全局搜索。GWO 算法中的另一个搜索系数是C。从2)中的公式可知,C向量是在区间范围[0,2]上的随机值构成的向量,此系数为猎物提供了随机权重,以便増加(|C|>1)或减少(|C|<1)。这有助于 GWO 在优化过程中展示出随机搜索行为,以避免算法陷入局部最优。值得注意的是,C并不是线性下降的,C在迭代过程中是随机值,该系数有利于算法跳出局部,特别是算法在迭代的后期显得尤为重要。

2 LSTM简介
2.1 LSTM控制流程
LSTM的控制流程:是在前向传播的过程中处理流经细胞的数据,不同之处在于 LSTM 中细胞的结构和运算有所变化。
在这里插入图片描述
这一系列运算操作使得 LSTM具有能选择保存信息或遗忘信息的功能。咋一看这些运算操作时可能有点复杂,但没关系下面将带你一步步了解这些运算操作。

2.2 核心概念
LSTM 的核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径,让信息能在序列连中传递下去。你可以将其看作网络的“记忆”。理论上讲,细胞状态能够将序列处理过程中的相关信息一直传递下去。
因此,即使是较早时间步长的信息也能携带到较后时间步长的细胞中来,这克服了短时记忆的影响。信息的添加和移除我们通过“门”结构来实现,“门”结构在训练过程中会去学习该保存或遗忘哪些信息。

2.3 Sigmoid
门结构中包含着 sigmoid 激活函数。Sigmoid 激活函数与 tanh 函数类似,不同之处在于 sigmoid 是把值压缩到 0~1 之间而不是 -1~1 之间。这样的设置有助于更新或忘记信息,因为任何数乘以 0 都得 0,这部分信息就会剔除掉。同样的,任何数乘以 1 都得到它本身,这部分信息就会完美地保存下来。这样网络就能了解哪些数据是需要遗忘,哪些数据是需要保存。
在这里插入图片描述
2.4 LSTM门结构
LSTM 有三种类型的门结构:遗忘门、输入门和输出门。
2.4.1 遗忘门
遗忘门的功能是决定应丢弃或保留哪些信息。来自前一个隐藏状态的信息和当前输入的信息同时传递到 sigmoid 函数中去,输出值介于 0 和 1 之间,越接近 0 意味着越应该丢弃,越接近 1 意味着越应该保留。
在这里插入图片描述
2.4.2 输入门
输入门用于更新细胞状态。首先将前一层隐藏状态的信息和当前输入的信息传递到 sigmoid 函数中去。将值调整到 0~1 之间来决定要更新哪些信息。0 表示不重要,1 表示重要。
其次还要将前一层隐藏状态的信息和当前输入的信息传递到 tanh 函数中去,创造一个新的侯选值向量。最后将 sigmoid 的输出值与 tanh 的输出值相乘,sigmoid 的输出值将决定 tanh 的输出值中哪些信息是重要且需要保留下来的。
在这里插入图片描述
2.4.3 细胞状态
下一步,就是计算细胞状态。首先前一层的细胞状态与遗忘向量逐点相乘。如果它乘以接近 0 的值,意味着在新的细胞状态中,这些信息是需要丢弃掉的。然后再将该值与输入门的输出值逐点相加,将神经网络发现的新信息更新到细胞状态中去。至此,就得到了更新后的细胞状态。
在这里插入图片描述
2.4.4 输出门
输出门用来确定下一个隐藏状态的值,隐藏状态包含了先前输入的信息。首先,我们将前一个隐藏状态和当前输入传递到 sigmoid 函数中,然后将新得到的细胞状态传递给 tanh 函数。
最后将 tanh 的输出与 sigmoid 的输出相乘,以确定隐藏状态应携带的信息。再将隐藏状态作为当前细胞的输出,把新的细胞状态和新的隐藏状态传递到下一个时间步长中去。
在这里插入图片描述
让我们再梳理一下。遗忘门确定前一个步长中哪些相关的信息需要被保留;输入门确定当前输入中哪些信息是重要的,需要被添加的;输出门确定下一个隐藏状态应该是什么。

二、部分源代码

clear
close all
%% 数据读取
geshu=200;%训练集的个数
%读取数据
shuru=xlsread(‘数据的输入.xlsx’);
shuchu=xlsread(‘数据的输出.xlsx’);
nn = randperm(size(shuru,1));%随机排序
% nn=1:size(shuru,1);%正常排序
input_train =shuru(nn(1:geshu)😅;
input_train=input_train’;
output_train=shuchu(nn(1:geshu)😅;
output_train=output_train’;
input_test =shuru(nn((geshu+1):end)😅;
input_test=input_test’;
output_test=shuchu(nn((geshu+1):end)😅;
output_test=output_test’;
%样本输入输出数据归一化
[aa,bb]=mapminmax([input_train input_test]);

shuru_num = size(input_train,1); % 输入维度
shuchu_num = 1; % 输出维度
%% 利用灰狼算法选择最佳的BP参数
SearchAgents_no=6; % 狼群数量
Max_iteration=30; % 最大迭代次数
%优化维度
numsum=2;
dim=numsum;
ub=[200 0.15];%上限
lb=[10 0.01]; %下限
Alpha_pos=zeros(1,dim); % 初始化Alpha狼的位置
Alpha_score=inf; % 初始化Alpha狼的目标函数值,
Beta_pos=zeros(1,dim); % 初始化Beta狼的位置
Beta_score=inf; % 初始化Beta狼的目标函数值,
Delta_pos=zeros(1,dim); % 初始化Delta狼的位置
Delta_score=inf; % 初始化Delta狼的目标函数值,
Positions=initialization(SearchAgents_no,dim,ub,lb);
Convergence_curve=zeros(1,Max_iteration);
l=0; % 循环计数器
while l<Max_iteration % 对迭代次数循环
for i=1:size(Positions,1) % 遍历每个狼
% 若搜索位置超过了搜索空间,需要重新回到搜索空间

    Positions(i,:)=(Positions(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb; % ~表示取反
    x= Positions(i,:);
    % 计算适应度函数值
    fitness=fun(x);
    if fitness<Alpha_score % 如果目标函数值小于Alpha狼的目标函数值
        Alpha_score=fitness; % 则将Alpha狼的目标函数值更新为最优目标函数值
        Alpha_pos=Positions(i,:); % 同时将Alpha狼的位置更新为最优位置
    end        
    if fitness>Alpha_score && fitness<Beta_score % 如果目标函数值介于于Alpha狼和Beta狼的目标函数值之间
        Beta_score=fitness; % 则将Beta狼的目标函数值更新为最优目标函数值
        Beta_pos=Positions(i,:); % 同时更新Beta狼的位置
    end        
    if fitness>Alpha_score && fitness>Beta_score && fitness<Delta_score  % 如果目标函数值介于于Beta狼和Delta狼的目标函数值之间
        Delta_score=fitness; % 则将Delta狼的目标函数值更新为最优目标函数值
        Delta_pos=Positions(i,:); % 同时更新Delta狼的位置
    end
end   
a=2-l*((2)/Max_iteration); % 对每一次迭代,计算相应的a值,a decreases linearly fron 2 to 0
for i=1:size(Positions,1) % 遍历每个狼
    for j=1:size(Positions,2) % 遍历每个维度            
        % 包围猎物,位置更新           
        r1=rand(); % r1 is a random number in [0,1]
        r2=rand(); % r2 is a random number in [0,1]
        A1=2*a*r1-a; % 计算系数A,Equation (3.3)
        C1=2*r2; % 计算系数C,Equation (3.4)  
    
    end
end
l=l+1;    
Convergence_curve(l)=Alpha_score;

end
%% 参数选择结果赋值
x=Alpha_pos;
zhongjian1_num = round(x(1));
xue = x(2);
%% 模型建立与训练
layers = [ …
sequenceInputLayer(shuru_num) % 输入层
lstmLayer(zhongjian1_num) % LSTM层
fullyConnectedLayer(shuchu_num) % 全连接层
regressionLayer];

options = trainingOptions(‘adam’, … % 梯度下降
‘MaxEpochs’,50, … % 最大迭代次数
‘GradientThreshold’,1, … % 梯度阈值
‘InitialLearnRate’,xue,…
‘Verbose’,0, …
‘Plots’,‘training-progress’); % 学习率
%% 训练LSTM
net = trainNetwork(inputn,outputn,layers,options);
%% 预测
net = resetState(net);% 网络的更新状态可能对分类产生了负面影响。重置网络状态并再次预测序列。

%将预测值与测试数据进行比较。
figure
plot(output_train)
hold on
plot(test_simu,‘.-’)
hold off
legend([“真实值” “预测值”])
xlabel(“样本”)
title(“训练集”)

figure
plot(output_test)
hold on
plot(test_simu1,‘.-’)
hold off
legend([“真实值” “预测值”])
xlabel(“样本”)
title(“测试集”)

% 真实数据,行数代表特征数,列数代表样本数output_test = output_test;
T_sim_optimized = test_simu1; % 仿真数据

num=size(output_test,2);%统计样本总数
error=T_sim_optimized-output_test; %计算误差
mae=sum(abs(error))/num; %计算平均绝对误差
me=sum((error))/num; %计算平均绝对误差
mse=sum(error.error)/num; %计算均方误差
rmse=sqrt(mse); %计算均方误差根
% R2=r
r;
tn_sim = T_sim_optimized’;
tn_test =output_test’;
N = size(tn_test,1);
R2=(N*sum(tn_sim.*tn_test)-sum(tn_sim)*sum(tn_test))2/((N*sum((tn_sim).2)-(sum(tn_sim))2)*(N*sum((tn_test).2)-(sum(tn_test))^2));

disp(’ ‘)
disp(’----------------------------------------------------------')

disp(['平均绝对误差mae为: ',num2str(mae)])
disp(['平均误差me为: ',num2str(me)])
disp(['均方误差根rmse为: ',num2str(rmse)])
disp(['相关系数R2为: ’ ,num2str(R2)])

三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/126337176

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。