最近准备数学建模,了解了一下BP神经网络,照着书写了一边代码,算作是搬运工吧,希望可以帮大家节约代码的时间。此外,加上一些个人理解,希望大家可以快速上手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('样本点','标准正弦曲线','拟合正弦曲线')

从上面的具体代码中,我们需要了解以下几点

1.一般来说神经网络包含三层,分别是输入层,输出层以及隐含层,所以说输入和输出是非常重要的,如上式代码中p是输入,T是期望输出,BP神经网络是根据实际输出与期望输出之间的残差来调整权重的,所以期望输出非常重要。

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;           %显示中间结果周期
           net.trainParam.lr=0.05;           %学习率
           net.trainParam.epochs=500;        %最大迭代次数
           net.trainParam.goal=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);