最近准备数学建模,了解了一下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);