代码原理
1. BP神经网络简介
BP神经网络是一种多层前馈神经网络,主要用于解决非线性映射问题。它通过一个前向传播和一个反向传播的过程进行训练:
(1)前向传播:输入信号经过输入层、隐藏层,直到输出层逐层传递,并得到预测输出。
(2)反向传播:计算预测输出与实际输出的误差,然后将误差反向传播,通过调整网络中的权重和偏置,来最小化误差。
2. BP神经网络的不足
(1)收敛速度慢:BP网络的训练过程容易陷入局部最优解,导致收敛速度慢。
(2)易陷入局部最优:由于随机初始化权重,BP网络可能收敛到局部最优解,而非全局最优。
(3)过拟合问题:在训练数据不足或模型复杂度较高时,BP网络容易产生过拟合。
3.本代码包括的多种智能优化算法
4. 优化BP神经网络的过程
(1)权重初始化:利用智能优化算法来初始化BP网络的权重,可以使得网络从一个更优的初始点开始训练,避免落入局部最优。
(2)训练过程优化:在BP网络的训练过程中,使用优化算法调整学习率、权重更新等参数,以加速收敛并提高预测精度。
(3)全局搜索能力:智能优化算法可以在更大的搜索空间内寻找全局最优解,从而提高模型的泛化能力。
5. 应用效果
通过引入智能优化算法,BP神经网络在回归预测任务中通常能够获得更好的性能表现,包括更快的收敛速度、更高的预测精度以及更强的泛化能力。
总结
综合利用智能优化算法优化BP神经网络,可以有效地改善其训练和预测性能,使其更好地应用于复杂的非线性回归预测任务。
%% 清空环境变量
warning off % 关闭报警信息
close all % 关闭开启的图窗
clear % 清空变量
clc % 清空命令行
%% 导入数据
res = xlsread('回归数据集.xlsx');
%% 数据分析
num_size = 0.7; % 训练集占数据集比例
outdim = 1; % 最后一列为输出
num_samples = size(res, 1); % 样本个数
res = res(randperm(num_samples), :); % 打乱数据集(不希望打乱时,注释该行)
num_train_s = round(num_size * num_samples); % 训练集样本个数
f_ = size(res, 2) - outdim; % 输入特征维度
%% 划分训练集和测试集
P_train = res(1: num_train_s, 1: f_)';
T_train = res(1: num_train_s, f_ + 1: end)';
M = size(P_train, 2);
P_test = res(num_train_s + 1: end, 1: f_)';
T_test = res(num_train_s + 1: end, f_ + 1: end)';
N = size(P_test, 2);
%% 数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);
[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);
%% 节点个数
inputnum = size(p_train, 1); % 输入层节点数
outputnum = size(t_train, 1); % 输出层节点数
disp('/////////////////////////////////');disp(['输入层的节点数为:',num2str(inputnum)]);disp(['输出层的节点数为:',num2str(outputnum)]);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(p_train,t_train,hiddennum,{'tansig','purelin'},'trainlm');% 建立模型
% 网络参数
net.trainParam.epochs=1000; % 训练次数,这里设置为1000次
net.trainParam.lr=0.01; % 学习速率,这里设置为0.01
net.trainParam.goal=0.00001; % 训练目标最小误差,这里设置为0.0001
net.trainParam.showWindow = 0;
net=train(net,p_train,t_train); % 网络训练
an0=sim(net,p_train); %仿真结果,依旧采用训练集进行测试
Test_simu0=mapminmax('reverse',an0,ps_output); %把仿真得到的数据还原为原始的数量级
mse0=mse(T_train,Test_simu0);%均方归一化误差性能函数
disp(['隐含层节点数为',num2str(hiddennum),'时,训练集的均方误差为:',num2str(mse0)])
if mse0<MSE
MSE=mse0;
hiddennum_best=hiddennum;
end
end
clear net0
disp(['最佳的隐含层节点数为:',num2str(hiddennum_best),',训练集的均方误差为:',num2str(MSE)])