当前位置:   article > 正文

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

麻雀算法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')

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167

三、总算法优化结果

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

代码获取:

点击获得代码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/700197
推荐阅读
相关标签
  

闽ICP备14008679号