今天采用前一阵改进最为成功的智能优化算法---融合黄金正弦的减法优化器算法(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常用的数据集及其解释。大家可以自行尝试别的数据进行分类。