(深度学习入门)DBO-BiLSTM优化算法,基于蜣螂算法优化双向长短期记忆网络,适用于数据回归预测(多变量输入、单变量输出) | MATLAB代码

此代码免费公开,可用作大家入门深度学习的一个简单例子。

目录

算法说明:

代码及数据集:

感悟:


算法说明:

本代码采用蜣螂优化算法 (DBO) 优化双向长短期记忆网络 (BiLSTM),用于数据回归预测。代码编写精良,适合多变量输入和单变量输出的预测任务,适用场景广泛,包括但不限于金融、气象、工业数据等复杂数据的分析。

具体代码的解释大家可以问GPT4o(需要的可以dd我分享),本代码也会有部分解释。


代码及数据集:

看代码,数据集及代码如下所示,数据集可私聊我获取。

%%  清空环境变量
warning off             % 关闭报警信息
close all               % 关闭开启的图窗
clear                   % 清空变量
clc                     % 清空命令行

%%  读取数据
res = xlsread('数据.xlsx');

%%  数据分析
num_size = 0.7;                              % 训练集占数据集比例
outdim = 1;                                  % 最后一列为输出
num_samples = size(res, 1);                  % 样本个数
% res = res(randperm(num_samples), :);       % 打乱数据集(不希望打乱时,注释该行)
num_train_s = round(num_size * num_samples); % 训练集样本个数
f_ = size(res, 2) - outdim;                  % 输入特征维度

%%  设置变量存储数据
P_train = []; P_test = [];
T_train = []; T_test = [];

%%  划分训练集和测试集
P_train = res(1: num_train_s, 1: f_)';
T_train = res(1: num_train_s, f_ + 1: end)';
M = size(P_train, 2);

P_test = res(num_train_s + 1: end, 1: f_)';
T_test = res(num_train_s + 1: end, f_ + 1: end)';
N = size(P_test, 2);

%%  数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);

[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);

 格式转换
for i = 1 : M 
    vp_train{i, 1} = p_train(:, i);
    vt_train{i, 1} = t_train(:, i);
end

for i = 1 : N 
    vp_test{i, 1} = p_test(:, i);
    vt_test{i, 1} = t_test(:, i);
end

%%  优化算法参数设置
SearchAgents_no = 20;                   % 种群数量
Max_iteration = 10;                    % 最大迭代次数
dim = 3;                               % 优化参数个数
lb = [1e-4, 5, 1e-4];                 % 参数取值下界(学习率,隐藏层节点,正则化系数)
ub = [1e-1, 100, 1e-1];                 % 参数取值上界(学习率,隐藏层节点,正则化系数)
fobj = @(X)fical(X);

[Best_score,Best_pos, curve] = DBO(SearchAgents_no, Max_iteration, lb, ub, dim, fobj); 

%%  记录最佳参数
best_lr = Best_pos(1, 1);
best_hd = round(Best_pos(1, 2));
best_l2 = Best_pos(1, 3);

%%  建立模型
% ----------------------  修改模型结构时需对应修改fical.m中的模型结构  --------------------------
layers = [
    sequenceInputLayer(f_)            % 输入层
    
    bilstmLayer(best_hd)                 % BiLSTM层
    reluLayer                         % Relu激活层
    
    fullyConnectedLayer(outdim)             % 全连接层
    regressionLayer];                   % 回归层

%%  参数设置
% ----------------------  修改模型参数时需对应修改fical.m中的模型参数  --------------------------
options = trainingOptions('adam', ...           % Adam 梯度下降算法
         'MaxEpochs', 500, ...                  % 最大训练次数 500
         'InitialLearnRate', best_lr, ...       % 初始学习率 best_lr
         'LearnRateSchedule', 'piecewise', ...  % 学习率下降
         'LearnRateDropFactor', 0.5, ...        % 学习率下降因子 0.1
         'LearnRateDropPeriod', 400, ...        % 经过 400 次训练后 学习率为 best_lr * 0.5
         'Shuffle', 'every-epoch', ...          % 每次训练打乱数据集
         'ValidationPatience', Inf, ...         % 关闭验证
         'L2Regularization', best_l2, ...       % 正则化参数
         'Plots', 'training-progress', ...      % 画出曲线
         'Verbose', false);

%%  训练
net = trainNetwork(vp_train, vt_train, layers, options);

%%  预测
t_sim1 = predict(net, vp_train); 
t_sim2 = predict(net, vp_test); 

%%  数据反归一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output);
T_sim2 = mapminmax('reverse', t_sim2, ps_output);

%%  数据格式转换
T_sim1 = cell2mat(T_sim1);
T_sim2 = cell2mat(T_sim2);

%%  均方根误差
error1 = sqrt(sum((T_sim1' - T_train).^2) ./ M);
error2 = sqrt(sum((T_sim2' - T_test ).^2) ./ N);
%% R2
R1 = 1 - norm(T_train - T_sim1')^2 / norm(T_train - mean(T_train))^2;
R2 = 1 - norm(T_test -  T_sim2')^2 / norm(T_test -  mean(T_test ))^2;
%%  MAE
mae1 = sum(abs(T_sim1' - T_train)) ./ M ;
mae2 = sum(abs(T_sim2' - T_test )) ./ N ;

%  绘图
figure
plot(1: M, T_train, 'r-*', 1: M, T_sim1, 'b-o', 'LineWidth', 1.5)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'训练集预测结果对比'; ['(RMSE=' num2str(error1) 'R^2 =' num2str(R1) 'MAE =' num2str(mae1) ')']};
title(string)
xlim([1, M])
grid

figure
plot(1: N, T_test, 'r-*', 1: N, T_sim2, 'b-o', 'LineWidth', 1.5)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'测试集预测结果对比';['(RMSE=' num2str(error2) 'R^2 =' num2str(R2)  'MAE =' num2str(mae2) ')']};
title(string)
xlim([1, N])
grid

% 绘制线性拟合图

% 训练集拟合效果图
figure
plot(T_train,T_sim1,'*r');
xlabel('真实值')
ylabel('预测值')
string = {'训练集效果图';['R^2_c=' num2str(R1)  '  RMSEC=' num2str(error1) ]};
title(string)
hold on ;h=lsline;
set(h,'LineWidth',1,'LineStyle','-','Color',[1 0 1])

% 预测集拟合效果图
figure
plot(T_test,T_sim2,'ob');
xlabel('真实值')
ylabel('预测值')
string1 = {'测试集效果图';['R^2_p=' num2str(R2)  '  RMSEP=' num2str(error2) ]};
title(string1)
hold on ;h=lsline();
set(h,'LineWidth',1,'LineStyle','-','Color',[1 0 1])

% 求平均
R3=(R1+R2)./2;
error3=(error1+error2)./2;

% 总数据线性预测拟合图
tsim=[T_sim1',T_sim2']'
Y=[T_train,T_test]'
figure
plot(Y,tsim,'ob');
xlabel('真实值')
ylabel('预测值')
string1 = {'所有样本拟合预测图';['R^2_p=' num2str(R3)  '  RMSEP=' num2str(error3) ]};
title(string1)
hold on ;h=lsline();
set(h,'LineWidth',1,'LineStyle','-','Color',[1 0 1])

% 打印出评价指标
disp(['-----------------------误差计算--------------------------'])
disp(['DBO-BiLSTM的预测集的评价结果如下所示:'])

disp(['训练集数据的RMSEC为:', num2str(error1)])
disp(['测试集数据的RMSEP为:', num2str(error2)])

disp(['训练集数据的R2为:', num2str(R1)])
disp(['测试集数据的R2为:', num2str(R2)])

disp(['训练集数据的MAE为:', num2str(mae1)])
disp(['测试集数据的MAE为:', num2str(mae2)])

% 测试集误差图
figure  
plot(T_test'-T_sim2,'b-*', 'LineWidth', 1.5)
xlabel('测试集样本编号')
ylabel('预测误差')
title('DBO-BiLSTM测试集预测误差')
grid on;
legend('DBO-BiLSTM预测输出误差')

% 绘制迭代图
figure
plot(curve,'linewidth',1.5);
grid on
xlabel('迭代次数')
ylabel('适应度函数')
title('DBO-BiLSTM收敛曲线')
grid on

以上就是所有的代码


感悟

  • 分享的初衷是因为自己在学习深度学习的路上会遇到很多的问题,那么第一个问题就是很多教材没有一个完整的深度学习的例子供我们去学习,都是一些零星的片段,无法整合,会给大家带来很多的困扰,希望这个完整的项目可以帮助大家去入门深度学习,当然这个代码是用MATLAB去做的,适合不是纯计算机的同学去做,如果大家想深耕于深度学习的话,还是建议大家去学习一下pytorch,以后我也会分享完整的pytorch项目,供大家去学习。其实这也是一个论文的创新点(比较水),就是把数据集替换一下,做一些预测的工作罢了。具体想聊的可以私信我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值