融合黄金正弦的减法优化器算法优化BP神经网络---回归+分类两种案例

作品简介

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

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

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

01 股票预测案例

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

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

标准BP模型预测结果

图片

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

GSABO-BP预测结果

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

图片

将真实值,BP预测值和GSABO-BP预测值放在一起,效果更加明显。图片

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

图片

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

图片

图片

图片

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

02 分类案例

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

标准BP模型分类结果

混淆矩阵结果图:

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

图片

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

图片

GSABO-BP分类结果:

图片

图片

图片

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

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

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


创作时间: