BP神经网络——MATLAB实现
最近正在准备参加数学建模竞赛,在学习过程中对BP神经网络有了基本的了解。按照步骤编写了一段代码作为辅助练习,并认为这种实践确实能够节省大家编写代码的时间。同时我也结合自己的理解分享了一些内容希望能帮助大家更好地掌握这一技术要点,并直接在代码基础上进行必要的修改与应用操作。
下面是一道拟合白噪声的正弦样本的数据题。
%%%%%%%%%%%%%%%%运用BP网络拟合白噪声的正弦样本数据%%%%%%%%%%%%%%%
clear;
close all;
clc;
%%%%%%%%%定义训练样本矢量%%%%%%%%%%%%%%
%%%%%%%%%%%p为输入矢量%%%%%%%%%
p=-1:0.05:1;
%%%%%%%%%%%T为目标矢量%%%%%%%
T=sin(2*pi*p)+0.1*randn(size(p));
%%%%%%%%%%%%%%绘制样本数据点%%%%%%%
figure
plot(p,T,'+')
hold on;
plot(p,sin(2*pi*p),':');
%%%%%%%%%%%%绘制不产生噪声的正弦曲线%%%%%%%%%%
net=newff(p,T,20,{'tansig','purelin'});
%%%%%%%%%%%%%%%采用贝叶斯正则化算法%%%%%%%%
net.trainFcn='trainbr';
%%%%%%%%%%%%%%设置训练参数%%%%%%%%%%%%
net.trainParam.show=50; %显示中间结果周期
net.trainParam.lr=0.05; %学习率
net.trainParam.epochs=500; %最大迭代次数
net.trainParam.goal=1e-3; %目标误差
net.divideFcn=''; %清楚样本数据分为训练集、验证集和测试集命令
%%%%%%%%%%%%%%%%%用相应算法训练BP网络%%%%%%%%%%%%
[net,tr]=train(net,p,T);
%%%%%%%%%%%%%对于BP网络进行仿真%%%%%%%%%%%
A=sim(net,p);
%%%%%%%%%%%%%%%%计算仿真误差%%%%%%%%%%%%%%
E=T-A;
MSE=mse(E);
%%%%%%%%%%%%%%%绘制匹配结果曲线%%%%%%%%%%%%%
plot(p,A,p,T,'+',p,sin(2*pi*p),':');
legend('样本点','标准正弦曲线','拟合正弦曲线')
代码解读
从上面的具体代码中,我们需要了解以下几点
通常情况下,在神经网络中一般由三层组成:输入层、隐含层和输出层。其中输入与输出变量的重要性不言而喻,在如上所示的数学公式中p代表输入变量而T代表期望输出变量,在BP(Back Propagation)神经网络模型中是通过实际输出与期望值之间的误差进行权值调节以实现模型优化的过程。因此,在神经网络训练过程中,期望输出的作用不可小觑。
2.下面我们就根据代码来了解一下相关代码
(1)newff:前馈神经网络创建函数
用法 ;net=newff(p,T,[每层神经元个数],{神将网络激活函数,默认为‘tansig’},......)
(2)net.trainFcn:训练函数
net.trainFcn='trainbr';
注:trainbr————贝叶斯正则化算法
traingd————梯度下降BP算法
trainbfg————BFGS拟牛顿BP算法
trainlm————Levenberg-Marquardt的BP算法
除此之外,还有很多哦大家可以去查询MATLAB手册
(3)一些重要的配置参数
net.trainParam.show = 50; %设置显示中间结果的频率为每50次迭代一次
net.trainParam.lr = 0.05; %指定学习率为固定值
net.trainParam.epochs = 500; %设定最大迭代次数为500次
net.trainParam.goal = 1e-3; %设定目标误差阈值为1e-3
这些参数都是依据题目中要求需要改进的。
(4)train函数:神经网络训练学习函数
用法:[net,tr,Y1,E]=train(net,X,Y)
X:网络输入矩阵 Y:网络输出矩阵
tr:训练跟踪信息 Y1:网络实际输出 E:误差矩阵
(5)sim函数:神经网络仿真计算网络
用法:Y=sim(net,X)
net:训练好的神经网络 X:网络输入矩阵 Y:网络输出矩阵
当输入数据的规模较大时(可以理解为输入数据的范围非常广),可能导致神经网络的学习效率降低(即训练耗时较长)。因此,在开始神经网络模型的训练之前(建议在模型构建阶段)就可以对输入的数据特征进行归一化预处理(采用premnmx函数),这样可以使后续模型的收敛速度更快,并且能够更好地改善模型性能)。完成模型参数优化后(即完成模型训练阶段),再利用mapminmax函数将标准化后的输出结果转换回原始的数据范围。
相关用法如下:[pn,minp,maxp,tn,mint,maxt]=premnmx(p,t)
x_again=mapminmax('reverse',y1,PS);
