MATLAB环境下基于粒子群优化的LSTM网络预测

传统的RNN模型的有效信息与预测点相隔较远所以信息的持久性低,而LSTM时间序列模型有效地解决了这个问题。LSTM模型的核心主要由记忆元组和非线性的门单元这两个组成,其中记忆元组用于保持系统的状态,非线性的门单元用于在每一个时间点调节流入和流出记忆元组的信息。 每个递归的神经网络都可以分解成无数个基本重复单元,在LSTM中,使用 了四个神经网络层并且彼此之间以一种特殊的关系进行交互。

粒子群算法PSO是一种生物仿生算法,该算法可以在求解空间中通过已有的数据寻找最优的解。 与其他优化算法的根本不同之处在于它仅仅只需要目标函数,也不依靠目标梯度或任何的微分形式。

PSO与LSTM模型神经网络相结合综合了两者的优点。种群规模、学习率、迭代次数、维度等是选取最优效果的变量,通过不断更新粒子的速度,位置从而得到最优的模型参数。 迭代次数、 惯性因子及权重直接影响实验结果的准确性。 因此,将PSO与LSTM模型相结合得到的结果更具有说服性。 PSO优化神经网络的实质是利用粒子群算法找出最适合的惯性因子与权重,并将最合适参数赋给LSTM神经网络。

详细步骤如下:

(1)初始化种群粒子并根据情况设好相关参数。

(2)设 MAE为粒子群的适度函数。

(3)找到粒子及粒子群的最佳位置。

(4) 更新全体最优的粒子,以及粒子群的位置。

(5)判断是否满足收敛条件,若不满足继续迭代计算,满足则输出最优结果和权重。

(6)将优化的参数赋给LSTM神经网络,对LSTM神经网络进行训练和预测。

部分代码如下:

%% 粒子群优化LSTM(PSO_LSTM)
clc
clear
close  all
%% 数据读取
geshu=200;%训练集的个数
%读取数据
shuru=xlsread('input.xlsx');
shuchu=xlsread('output.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]);
[cc,dd]=mapminmax([output_train output_test]);
global inputn outputn shuru_num shuchu_num XValidation YValidation
[inputn,inputps]=mapminmax('apply',input_train,bb);
[outputn,outputps]=mapminmax('apply',output_train,dd);
shuru_num = size(input_train,1); % 输入维度
shuchu_num = 1;  % 输出维度
dam = 10; % 验证集个数,验证集是从训练集里面取的数据
idx = randperm(size(inputn,2),dam);
XValidation = inputn(:,idx);
inputn(:,idx) = [];
YValidation = outputn(idx);
outputn(idx) = [];
YValidationy = output_train(idx);
output_train(idx) = [];
%%
% 1. 寻找最佳参数
NN=5;                   %初始化群体个数
D=2;                    %初始化群体维数,
T=10;                   %初始化群体最迭代次数
c1=2;                   %学习因子1
c2=2;                   %学习因子2
%用线性递减因子粒子群算法
Wmax=1.2; %惯性权重最大值
Wmin=0.8; %惯性权重最小值
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%每个变量的取值范围
ParticleScope(1,:)=[10 200];  % 中间层神经元个数
ParticleScope(2,:)=[0.01 0.15]; % 学习率
ParticleScope=ParticleScope';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
xv=rand(NN,2*D); %首先,初始化种群个体速度和位置
for d=1:D
    xv(:,d)=xv(:,d)*(ParticleScope(2,d)-ParticleScope(1,d))+ParticleScope(1,d);  
    xv(:,D+d)=(2*xv(:,D+d)-1 )*(ParticleScope(2,d)-ParticleScope(1,d))*0.2;
end
x1=xv(:,1:D);%位置
v1=xv(:,D+1:2*D);%速度
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%------初始化个体位置和适应度值-----------------
p1=x1;
pbest1=ones(NN,1);
for i=1:NN
    pbest1(i)=fitness(x1(i,:));
end
%------初始时全局最优位置和最优值---------------

结果如下:

 

 

 

 

 

代码如下

mbd.pub/o/bread/mbd-ZJuUkplx

擅长现代信号处理(改进小波分析系列,改进变分模态分解,改进经验小波变换,改进辛几何模态分解等等),改进机器学习,改进深度学习,机械故障诊断,改进时间序列分析(金融信号,心电信号,振动信号等) 

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值