【MATLAB】 麻雀算法优化BP神经网络及其应用
前言:日前需要设计一种基于麻雀算法改进的神经网络,并将其运用于岩石爆破参数的预测研究之中。
关于模型或算法代码存在任何疑问欢迎添加博主微信1178623893交流学习~
1.经典BP网络
clear all,clc,close all
%% load data
P_train = xlsread('shuju1.xlsx','A1:F7')';
T_train = xlsread('shuju1.xlsx','G1:I7')' ;
P_test = xlsread('shuju1.xlsx','A8:F8')' ;
%% 归一化
% 训练集
[Pn_train,inputps] = mapminmax(P_train,-1,1);
Pn_test = mapminmax('apply',P_test,inputps);
% 测试集
[Tn_train,outputps] = mapminmax(T_train,-1,1);
% Tn_test = mapminmax('apply',T_test,outputps);
%% 构造网络结构
%创建神经网络
inputnum = 6; %inputnum 输入层节点数 4维特征
hiddennum = 15; %hiddennum 隐含层节点数
outputnum = 3; %outputnum 隐含层节点数
%% 构造麻雀优化器
popsize = 20;%种群数量
Max_iteration = 20;%最大迭代次数x
lb = -5;%权值阈值下边界
ub = 5;%权值阈值上边界
% inputnum * hiddennum + hiddennum*outputnum 为权值的个数
% hiddennum + outputnum 为阈值的个数
dim = inputnum * hiddennum + hiddennum*outputnum + hiddennum + outputnum ;% inputnum * hiddennum + hiddennum*outputnum维度
fobj = @(x)new_funBP(x,inputnum,hiddennum,outputnum,Pn_train,Tn_train);
[Best_pos,Best_score,SSA_cg_curve,net]=SSA(popsize,Max_iteration,lb,ub,dim,fobj);
figure
plot(SSA_cg_curve,'Color','r')
title('Objective space')
xlabel('Iteration');
ylabel('Best score obtained so far');
legend('SSA')
grid on;
disp('初始化阈值与权值信息:')
%% 预测和误差可视化
%测试集预测
Y = sim( net , Pn_test );
%% 反归一化
Y_reverse = mapminmax('reverse',Y,outputps)
% 图1 误差分布
error_train = sim( net , Pn_train )-Tn_train;
figure
plot(error_train','b:o')
title('麻雀BP神经网络预测得到的误差分布')
xlabel('index')
ylabel('误差')
grid on
% disp(['麻雀BP神经网络得到的MSE:',num2str(E1)])
%%
2. 算法改进后的SSA_BP
主函数
clear all,clc,close all
%% load data
P_train = xlsread('shuju1.xlsx','A1:F7')';
T_train = xlsread('shuju1.xlsx','G1:I7')' ;
P_test = xlsread('shuju1.xlsx','A8:F8')' ;
%% 归一化
% 训练集
[Pn_train,inputps] = mapminmax(P_train,-1,1);
Pn_test = mapminmax('apply',P_test,inputps);
% 测试集
[Tn_train,outputps] = mapminmax(T_train,-1,1);
% Tn_test = mapminmax('apply',T_test,outputps);
%% 构造网络结构
%创建神经网络
inputnum = 6; %inputnum 输入层节点数 4维特征
hiddennum = 15; %hiddennum 隐含层节点数
outputnum = 3; %outputnum 隐含层节点数
%% 构造麻雀优化器
popsize = 20;%种群数量
Max_iteration = 20;%最大迭代次数x
lb = -5;%权值阈值下边界
ub = 5;%权值阈值上边界
% inputnum * hiddennum + hiddennum*outputnum 为权值的个数
% hiddennum + outputnum 为阈值的个数
dim = inputnum * hiddennum + hiddennum*outputnum + hiddennum + outputnum ;% inputnum * hiddennum + hiddennum*outputnum维度
fobj = @(x)new_funBP(x,inputnum,hiddennum,outputnum,Pn_train,Tn_train);
[Best_pos,Best_score,SSA_cg_curve,net]=SSA(popsize,Max_iteration,lb,ub,dim,fobj);
figure
plot(SSA_cg_curve,'Color','r')
title('Objective space')
xlabel('Iteration');
ylabel('Best score obtained so far');
legend('SSA')
grid on;
disp('初始化阈值与权值信息:')
%% 预测和误差可视化
%测试集预测
Y = sim( net , Pn_test );
%% 反归一化
Y_reverse = mapminmax('reverse',Y,outputps)
% 图1 误差分布
error_train = sim( net , Pn_train )-Tn_train;
figure
plot(error_train','b:o')
title('麻雀BP神经网络预测得到的误差分布')
xlabel('index')
ylabel('误差')
grid on
% disp(['麻雀BP神经网络得到的MSE:',num2str(E1)])
%%
目标优化函数
function [fitness,net] = new_funBP(x,inputnum,hiddennum,outputnum,inputn,outputn)
% 该函数用来计算适应度值
% 输入:
% x input 个体
% inputnum input 输入层节点数
% hiddennum input 隐含层节点数
% outputnum input 输出层节点数
% net input 网络
% inputn input 训练输入数据
% outputn input 训练输出数据
% 输出:
% error output 个体适应度值
% net output 训练后的网络
% 提取 阈值和权值
w1=x(1:inputnum*hiddennum);
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
% 网络权值、阈值赋值
net = newff( minmax(inputn) , [hiddennum outputnum] , { 'logsig' 'purelin' } , 'traingdx' ) ;
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=reshape(B2,outputnum,1);
%设置训练参数
net.trainparam.show = 50 ;
net.trainparam.epochs = 200 ;
net.trainparam.goal = 0.01 ;
net.trainParam.lr = 0.01 ;
net.trainParam.showWindow = false;
net.trainParam.showCommandLine = false;
% 网络训练
% net.outputs{2}
net=train(net,inputn,outputn);
%计算训练集的MSE
Y = sim( net , inputn );
error = Y - outputn;
MSE1 = mse(error);
%计算测试集的MSE
% Y1 = sim( net , inputn_test );
% error1 = Y1 - outputn_test;
% MSE2 = mse(error1);
fitness = MSE1;
end