基于麻雀搜索算法的LSTM优化(文末附代码,带数据)


一、SSA-LSTM

长短期记忆网络的出现有效解决了长期依赖问题,但是在训练过程中,LSTM神经网络仍存在网络结构难以确定以及最优参数如何选择的问题。为了解决上述问题,本文利用SSA对LSTM进行优化,构建基于SSA的LSTM模型结构。

二、麻雀搜索算法

1.算法介绍

麻雀搜索算法是近两年提出的新兴群智能优化算法,具备算法原理简单、收敛速度快等优势。该算法基于麻雀种群的社会行为将麻雀个体分为发现、加入者以及警戒者,发现者能力较强可以找到食物并为同类指明方向,公式为:
在这里插入图片描述
式中:t和T分别为算法当前以及最大更新次数,∝为随机数,其取值范围为1,1;Q同样为随机数,但服从正态分布;L为所有元素都是1的行短阵,其列数由待求解问题维度确定;R2为大于0小于1的预警值,ST为大于0.5小于1的安全值。

加入者则通过观察发现者的食物来源以便取而代之,公式为:
在这里插入图片描述
式中:Xp(t+1)为所有发现者中位置更新后的最佳位置;A+ = AT(AAT)-1其中,A为所有元素随机取值为1或-1的行矩阵,列数为求解问题维度;Xworst为当前种群中的最劣位置;n为种群中麻雀数量.
警戒者需要时刻留意当前环境,以便发现危险立即飞往安全环境。位置更新公式为:
在这里插入图片描述
式中:Xbest为当前种群中的最佳位置;β为随机数且遵循标准正态分布;fi, fg, fw分别为目前个体、当前种群最优、最劣的适应度值;k在-1,1范围内随机取值,E的作用是防止分母为0.

2.部分代码

代码中包括了参数设置,提供数据以及如何讲代码中的数据更改为您自己的数据。
代码如下(示例):

clc;
clear
close all
%% 单一的LSTM预测
tic
disp('…………………………………………………………………………………………………………………………')
disp('单一的LSTM预测')
disp('…………………………………………………………………………………………………………………………')

geshu=200;%训练集的个数
%读取数据
data = xlsread('Data1.xlsx');
shuru = data(:,1:end-1);
shuchu = data(:, end);
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]);

[xTrain,inputps]=mapminmax('apply',input_train,bb);
[yTrain,outputps]=mapminmax('apply',output_train,dd);

%% 创建LSTM回归网络,序列预测,因此,输入24维,输出一维
numFeatures = size(xTrain,1);
numResponses = 1;

%% 基础LSTM测试
numHiddenUnits = 68;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits)
    fullyConnectedLayer(numResponses)
    regressionLayer];

%指定训练选项
options = trainingOptions('adam', ...
    'MaxEpochs',35, ...
    'ExecutionEnvironment' ,'cpu',...
    'GradientThreshold',1, ...
    'InitialLearnRate',0.001, ...
    'LearnRateSchedule','piecewise', ...
    'LearnRateDropPeriod',30, ...
    'LearnRateDropFactor',0.2, ...%指定初始学习率 0.005,在 125 轮训练后通过乘以因子 0.2 来降低学习率
    'L2Regularization',0.0001,...
    'Verbose',0);
%训练LSTM
net = trainNetwork(xTrain,yTrain,layers,options);


net = resetState(net);% 网络的更新状态可能对分类产生了负面影响。重置网络状态并再次预测序列。
[~,Ytrain]= predictAndUpdateState(net,xTrain);
test_simu=mapminmax('reverse',Ytrain,dd);%反归一化
%测试集样本输入输出数据归一化
inputn_test=mapminmax('apply',input_test,bb);
[net,an]= predictAndUpdateState(net,inputn_test);
test_simu1=mapminmax('reverse',an,dd);%反归一化
error1=test_simu1-output_test;%测试集预测-真实

disp('')
disp('训练集误差指标:')
[mae1,rmse1,mape1,error1]=calc_error(output_train,test_simu);
fprintf('\n')

disp('测试集误差指标:')
[mae2,rmse2,mape2,error2]=calc_error(output_test,test_simu1);
fprintf('\n')
toc

figure
plot(output_test,'r-o','Color',[255 0 0]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[255 0 0]./255)
hold on
plot(test_simu1,'-s','Color',[0 0 0]./255,'linewidth',0.8,'Markersize',5,'MarkerFaceColor',[0 0 0]./255)
hold off
legend(["真实值" "预测值"])
xlabel("样本")
title("训练集")

%% VMD-SSA-LSTM预测
tic
disp('…………………………………………………………………………………………………………………………')
disp('VMD-SSA-LSTM预测')
disp('…………………………………………………………………………………………………………………………')
pop=10; % 麻雀数量
Max_iteration=20; % 最大迭代次数
dim=3; % 优化lstm的3个参数
lb = [40,40,0.001];%下边界
ub = [200,200,0.03];%上边界
fobj = @(x) fun(x,numFeatures,numResponses,xTrain,yTrain,input_test,output_test);
%基础麻雀算法
[Best_pos,Best_score,SSA_curve]=SSA(pop,Max_iteration,lb,ub,dim,fobj); %开始优化

%% 绘制进化曲线
figure
plot(SSA_curve,'r-','linewidth',3)
xlabel('进化代数')
ylabel('均方误差MSE')
legend('最佳适应度')
title('SSA-LSTM的进化收敛曲线')

disp('')
disp(['最优隐藏单元数目为   ',num2str(round(Best_pos(1)))]);
disp(['最优最大训练周期为   ',num2str(round(Best_pos(2)))]);
disp(['最优初始学习率为   ',num2str((Best_pos(3)))]);
disp(['最优L2正则化系数为   ',num2str((Best_pos(2)))]);
% SSA优化后的LSTM做预测   对每个分量建模

[xTest,inputps]=mapminmax('apply',input_test,bb);
[yTest,outputps]=mapminmax('apply',output_test,dd);
%% 创建LSTM回归网络,序列预测,因此,输入24维,输出一维
numFeatures = size(xTest,1);
numResponses = 1;

%% 基础LSTM测试
numHiddenUnits = round(Best_pos(1));
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits)
    fullyConnectedLayer(numResponses)
    regressionLayer];

%指定训练选项
options = trainingOptions('adam', ...
    'MaxEpochs',round(Best_pos(2)), ...
    'ExecutionEnvironment' ,'cpu',...
    'GradientThreshold',1, ...
    'InitialLearnRate',Best_pos(3), ...
    'LearnRateSchedule','piecewise', ...
    'LearnRateDropPeriod',round(0.8*Best_pos(2)), ...
    'LearnRateDropFactor',0.2, ...%指定初始学习率 0.005,在 125 轮训练后通过乘以因子 0.2 来降低学习率
    'L2Regularization',0.0001,...
    'Verbose',0);
%训练LSTM
net = trainNetwork(xTrain,yTrain,layers,options);
%测试集测试
numTimeStepsTrain = size(xTest,2);

net = resetState(net);% 网络的更新状态可能对分类产生了负面影响。重置网络状态并再次预测序列。
[net,an] = predictAndUpdateState(net,xTest,'ExecutionEnvironment','cpu');

% 反归一化
test_simu2=mapminmax('reverse',an,dd);%反归一化


%% 模型测试集结果绘图对比

figure
plot(output_test,'-o','Color',[0 0 255]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[25 0 255]./255)
hold on
plot(test_simu2,'-s','Color',[0 0 0]./255,'linewidth',0.8,'Markersize',5,'MarkerFaceColor',[0 0 0]./255)
hold off
legend(["真实值" "SSA-LSTM"])
xlabel("样本")
title("测试集")

disp('测试集误差指标:')
[mae2,rmse2,mape2,error2]=calc_error(output_test,test_simu2);
fprintf('\n')


三、总算法优化结果

原始LSTM:
在这里插入图片描述
在这里插入图片描述
改进后的SSA-LSTM:
在这里插入图片描述
在这里插入图片描述

代码获取:

点击获得代码

### LSTM优化算法综述 在深度学习领域,LSTM(长短期记忆网络)作为一种特殊的递归神经网络架构,在处理序列数据方面表现出色。为了提高LSTM模型性能并加速训练过程,多种优化技术被广泛应用。 #### 1. 梯度下降及其变种 梯度下降是最常用的参数更新策略之一。对于复杂的非线性函数如LSTM而言,标准的随机梯度下降(SGD)可能难以找到全局最优解或者容易陷入局部极小值。因此,引入了一些改进版本来解决这些问题: - **动量法(Momentum)**:通过累积历史梯度方向加快收敛速度,减少震荡幅度[^1]。 - **AdaGrad**:自适应调整每个参数的学习率,使得稀疏特征获得较大步长而频繁变化的部分则较小。 - **Adam Optimizer**:结合了Momentum和RMSProp的优点,不仅能够有效应对病态曲面还能保持快速稳定的特性。 这些方法可以显著改善LSTM模型训练效率及最终效果。 ```python from keras.models import Sequential from keras.layers import Embedding, LSTM, Dense from keras.optimizers import Adam model = Sequential() model.add(Embedding(input_dim=top_words, output_dim=embedding_vecor_length, input_length=maxlen)) model.add(LSTM(units=128)) model.add(Dense(1, activation='sigmoid')) optimizer = Adam(lr=0.001) model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy']) ``` 此代码片段展示了如何配置有Adam优化器的LSTM模型[^2]。 反向传播算法在此过程中扮演着重要角色,它负责计算误差并通过链式法则逐层传递回前一层节点,从而实现权重的有效调整以最小化损失函数[^3]。 #### 2. 正则化与初始化技巧 除了上述提到的各种优化器外,正则项(如L2惩罚)、Dropout机制以及合适的权重初始分布同样有助于防止过拟合现象发生,并促进更健康的泛化能力发展[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值