【MATLAB】 麻雀算法优化BP神经网络及其应用

【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
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

春风惹人醉

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值