2023新算法:改进的减法优化器算法优化BP神经网络---回归+分类两种案例

文章介绍了融合黄金正弦的减法优化器算法(GSABO)在BP神经网络中的应用,通过优化权值阈值提高模型精度。以股票预测和分类为例,展示了标准BP与GSABO-BP的对比,显示了GSABO在收敛速度和预测准确性上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天采用前一阵改进最为成功的智能优化算法---融合黄金正弦的减法优化器算法(GSABO)优化BP神经网络。该算法不仅是2023年较新的算法,而且改进后的收敛速度和寻优精度都是极佳!点击链接跳转GSABO算法:融合黄金正弦,十种混沌映射,搞定!把把最优值,本文思路可用于所有智能算法的改进

文章一次性讲解两种案例,回归分类。回归案例中,作者选用了一个经典的股票数据。分类案例中,作者选用的是公用的UCI数据集。

BP神经网络初始的权值阈值都是随机生成的,因此不一定是最佳的。采用智能算法优化BP神经网络的权值阈值,使得输入与输出有更加完美的映射关系,以此来提升BP神经网络模型的精度。本文采用GSABO算法对BP神经网络的权值阈值进行优化,并应用于实际的回归和分类案例中。

01 股票预测案例

案例虽然介绍的是股票预测,但是GSABO-BP预测模型是通用的,大家根据自己的数据直接替换即可。

股票数据特征有:开盘价,盘中最高价,盘中最低价,收盘价等。预测值为股票价格。股票数据整理代码已写好,想换成自己数据的童鞋不需要理解此代码,替换数据即可。下面直接上标准BP的预测结果和GSABO-BP的预测结果。

标准BP模型预测结果

89bedca3b7a1ae7e9598b48c0d7d1c77.png

可以看到标准BP神经网络的预测效果不是很理想,无法跟踪真实值偏差较大

GSABO-BP预测结果

可以看到GSABO-BP神经网络的预测值可以紧密跟随真实值,效果很好。

f5c3e024cfc4cd37f38b279de62b4661.png

将真实值,BP预测值和GSABO-BP预测值放在一起,效果更加明显。6f727aeebdb3094e81c94ec7df46b924.png

接下来是一个GSABO优化前后的BP神经网络误差对比图。

c75f45ddcd8df9cdc3964315717a3103.png

GSABO-BP的迭代曲线,以预测值和真实值的MSE为目标函数。

073bff1a59be9875a2cefc21247f073c.png

5c30063fcb169a122d409665443819b4.png

3c57638c2243a183bf2b311781419fc7.png

GSABO-BP预测模型的评价:可以看到,GSABO-BP方法在股票预测案例中可以很好地进行股票价格预测。

02 分类案例

接下来是GSABO-BP的分类案例,采用的数据是UCI数据集中的Balancescale.mat数据,该数据一共分为三类。接下来看结果。

标准BP模型分类结果

混淆矩阵结果图:

简单说一下这个图该怎么理解。请大家横着看,每行的数据加起来是100%,每行的数据个数加起来就是测试集中第一类数据的真实个数。以第一行为例,测试集中一共有12个数据是属于第一类的,而12个数据中,有8个预测正确,有1个预测成了第2类,3个预测成了第三类。其他行均这样理解。

69419762679fbd129bbf8085e9e06c86.png

下面这个图是另一种结果展现方式,在一些论文中会用这种方式展示结果。

3ce6ce56f71932534e0be2f8cbb5e4ed.png

GSABO-BP分类结果:

2649a8ef93ef019aa36118b8e320c18a.png

caf19eec623b0044d94101d0c0a06489.png

dabfb46b38634b09c2d3369807a8183a.png

03 代码展示

%% 初始化
clear
close all
clc
warning off
rng(0)
load data.mat  %加载股票数据,这里直接替换自己的数据即可。
%% 数据归一化
[inputn,inputps]=mapminmax(input_train,0,1);
[outputn,outputps]=mapminmax(output_train);
inputn_test=mapminmax('apply',input_test,inputps);
%% 获取输入层节点、输出层节点个数
inputnum=size(input_train,1);
outputnum=size(output_train,1);
disp('/')
disp('神经网络结构...')
disp(['输入层的节点数为:',num2str(inputnum)])
disp(['输出层的节点数为:',num2str(outputnum)])
disp(' ')
disp('隐含层节点的确定过程...')


%确定隐含层节点个数
%采用经验公式hiddennum=sqrt(m+n)+a,m为输入层节点个数,n为输出层节点个数,a一般取为1-10之间的整数
MSE=1e+5; %初始化最小误差
for hiddennum=fix(sqrt(inputnum+outputnum))+1:fix(sqrt(inputnum+outputnum))+5
    %构建网络
    net=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm');% 建立模型
    % 网络参数
    net.trainParam.epochs=1000;         % 训练次数
    net.trainParam.lr=0.01;                   % 学习速率
    net.trainParam.goal=0.000001;        % 训练目标最小误差
    net.trainParam.showWindow=0;  %隐藏仿真界面
    % 网络训练
    net=train(net,inputn,outputn);
    an0=sim(net,inputn);  %仿真结果,依旧采用训练集进行测试
    test_simu0=mapminmax('reverse',an0,outputps); %把仿真得到的数据还原为原始的数量级
    mse0=mse(test_simu0,output_train);  %仿真的均方误差
    disp(['隐含层节点数为',num2str(hiddennum),'时,训练集的均方误差为:',num2str(mse0)])


    %更新最佳的隐含层节点
    if mse0<MSE
        MSE=mse0;
        hiddennum_best=hiddennum;
    end
end
disp(['最佳的隐含层节点数为:',num2str(hiddennum_best),',训练集的均方误差为:',num2str(MSE)])


%% 构建最佳隐含层节点的BP神经网络
disp(' ')
disp('标准的BP神经网络:')
net0=newff(inputn,outputn,hiddennum_best,{'tansig','purelin'},'trainlm');% 建立模型
%网络参数配置
net0.trainParam.epochs=1000;         % 训练次数,这里设置为1000次
net0.trainParam.lr=0.01;                   % 学习速率,这里设置为0.01
net0.trainParam.goal=0.00001;                    % 训练目标最小误差,这里设置为0.0001
net0.trainParam.show=25;                % 显示频率,这里设置为每训练25次显示一次
net0.trainParam.mc=0.01;                 % 动量因子
net0.trainParam.min_grad=1e-6;       % 最小性能梯度
net0.trainParam.max_fail=6;               % 最高失败次数
% net0.trainParam.showWindow = false;
% net0.trainParam.showCommandLine = false;            %隐藏仿真界面
%开始训练
net0=train(net0,inputn,outputn);


%预测
an0=sim(net0,inputn_test); %用训练好的模型进行仿真
%预测结果反归一化与误差计算
test_simu0=mapminmax('reverse',an0,outputps); %把仿真得到的数据还原为原始的数量级
%误差指标
mse0=mse(output_test,test_simu0);
%% 标准BP神经网络作图
figure
plot(output_test,'b-','markerfacecolor',[0.5,0.5,0.9],'MarkerSize',6)
hold on
plot(test_simu0,'r--','MarkerSize',6)
legend('真实y','预测的y')
xlabel('样本数')
ylabel('股票价格')
title(['标准BP神经网络预测结果',newline,'MSE误差为:',num2str(mse0)])
disp(['标准神经网络测试集的均方误差为:',num2str(mse0)])


%% GSABO优化算法寻最优权值阈值
disp(' ')
disp('GSABO优化BP神经网络:')


net=newff(inputn,outputn,hiddennum_best,{'tansig','purelin'},'trainlm');% 建立模型


%网络参数配置
net.trainParam.epochs=1000;         % 训练次数,这里设置为1000次
net.trainParam.lr=0.01;                   % 学习速率,这里设置为0.01
net.trainParam.goal=0.00001;                    % 训练目标最小误差,这里设置为0.0001
net.trainParam.show=25;                % 显示频率,这里设置为每训练25次显示一次
net.trainParam.mc=0.01;                 % 动量因子
net.trainParam.min_grad=1e-6;       % 最小性能梯度
net.trainParam.max_fail=6;               % 最高失败次数
%% 初始化GSABO参数
popsize=10;   %初始种群规模
maxgen=30;   %最大进化代数
lb = -2;  %神经网络权值阈值的上下限
ub = 2;
numm = 2; %混沌系数
dim=inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+outputnum;    %自变量个数
fobj = @fitness;
[Best_score,Best_pos,GSABO_curve]=GSABOforBP(numm,popsize,maxgen,lb,ub,dim,inputnum,hiddennum_best,outputnum,net,inputn,outputn,inputn_test,outputps,output_test);


%% 绘制进化曲线
figure
plot(GSABO_curve,'r-','linewidth',2)
xlabel('进化代数')
ylabel('均方误差')
legend('最佳适应度')
title('GSABO的进化曲线')

代码中注释非常详细,有对神经网络构建的注释,有对GASBO-BP代码的注释,简单易懂。

代码附带UCI常用的数据集及其解释。大家可以自行尝试别的数据进行分类。

一次性获取两种案例代码。

点击下方卡片获取更多代码!

融合黄金分割正弦波的减法优化器(Golden Section Asymptotic Bisection Optimization, GSABO)是一种用于改进梯度下降等传统优化算法的新型优化策略。它结合了黄金分割比例和正弦函数的优势,能够在搜索过程中更有效地找到局部最优解。 对于将GSABO应用于BP(Back Propagation,反向传播)神经网络的MATLAB代码示例,这里给出一个简化的版本。请注意,实际应用中可能需要更多的代码细节,如初始化、神经元结构设置以及损失函数计算等: ```matlab % 导入所需库 clear all; close all; clc; % 定义黄金分割参数 golden_ratio = (sqrt(5) - 1) / 2; % 黄金分割比例 function [weights, biases] = gsabo_bp(neural_net, learning_rate, num_iterations) % 初始化权重和偏置 weights = randn(size(neural_net.weights)); biases = randn(size(neural_net.biases)); % 设置优化参数 max_iter = num_iterations; min_val = Inf; % 目标函数最小值初始设为无穷大 best_weights = weights; % 最佳权重初始化 for iter = 1:max_iter % 使用GSABO更新步骤 golden_step_size = learning_rate * sin(iter * golden_ratio * pi); new_weights = weights - golden_step_size * gradient(neural_net); % 计算新权重下的损失并比较 loss_new = compute_loss(new_weights, biases, neural_net.data); if loss_new < min_val min_val = loss_new; best_weights = new_weights; end % 更新权重 weights = best_weights; % 满足一定条件后跳出循环,例如达到收敛阈值或迭代次数限制 % ... end end % 假设你有compute_loss()和gradient()这两个函数来计算损失和梯度 % 你需要自定义这些函数,因为它们依赖于神经网络的具体架构和任务 % 示例用法 net = create_neural_network(); % 创建一个简单的BP神经网络实例 learning_rate = 0.1; num_iterations = 1000; [weights, biases] = gsabo_bp(net, learning_rate, num_iterations); ``` 注意,这段代码只是一个框架,具体实现取决于你的神经网络模型、数据集、损失函数以及其它特定需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淘个代码_

不想刀我的可以选择爱我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值