基于MATLAB的BP神经网络应用
图3.3 未训练网络的输出结果
其中 “ ” 代表要逼近的非线性函数曲线;
“‥‥‥” 代表未经训练的函数曲线;
因为使用newff( )函数建立函数网络时,权值和阈值的初始化是随机的,所以网络输出结构很差,根本达不到函数逼近的目的,每次运行的结果也有时不同。
步骤3:网络训练
应用train()函数对网络进行训练之前,需要预先设置网络训练参数。将训练时间设置为50,训练精度设置为0.01,其余参数使用缺省值。训练后得到的误差变化过程如图3.4所示。
图3.4 训练过程
net.trainParam.epochs=50; (网络训练时间设置为50)
14
基于MATLAB的BP神经网络应用
net.trainParam.goal=0.01;(网络训练精度设置为0.01) net=train(net,p,t);(开始训练网络)
TRAINLM-calcjx, Epoch 0/50, MSE 9.27774/0.01, Gradient 13.3122/1e-010 TRAINLM-calcjx, Epoch 3/50, MSE 0.00127047/0.01, Gradient 0.0337555/1e-010 TRAINLM, Performance goal met.
从以上结果可以看出,网络训练速度很快,经过一次循环跌送过程就达到了要求的精度0.01。
步骤4: 网络测试
对于训练好的网络进行仿真: y2=sim(net,p); figure;
plot(p,t,'-',p,y1,':',p,y2, '--') title('训练后网络的输出结果'); xlabel('时间'); ylabel('仿真输出');
绘制网络输出曲线,并与原始非线性函数曲线以及未训练网络的输出结果曲线相比较,比较出来的结果如图3.5所示。
图3.5 训练后网络的输出结果
其中 “ ” 代表要逼近的非线性函数曲线;
“‥‥‥” 代表未经训练的函数曲线; “―――” 代表经过训练的函数曲线;
从图中可以看出,得到的曲线和原始的非线性函数曲线很接近。这说明经过训练后,BP网络对非线性函数的逼近效果比较好。
15
基于MATLAB的BP神经网络应用
3.2.3 不同频率下的逼近效果
改变非线性函数的频率和BP函数隐层神经元的数目,对于函数逼近的效果有一定的影响。网络非线性程度越高,对于BP网络的要求越高,则相同的网络逼近效果要差一些;隐层神经元的数目对于网络逼近效果也有一定影响,一般来说隐层神经元数目越多,则BP网络逼近非线性函数的能力越强。
下面通过改变频率参数和非线性函数的隐层神经元数目来加以比较证明。
(1)频率参数设为k=2,当隐层神经元数目分别取n=3、n=6时,得到了训练后的网络输出结果如图3.6,3.7所示。
图3.6 当n=3时训练后网络的输出结果 图3.7 当n=6时训练后网络的输出结果
其中 “ ” 代表要逼近的非线性函数曲线;
“‥‥‥” 代表未经训练的函数曲线; “―――” 代表经过训练的函数曲线;
(2)频率参数设为k=4,当隐层神经元数目分别取n=6、n=8时,得到了训练后的网络输出结果如图3.8,3.9所示。
图3.8 当n=6时训练后网络的输出结果 图3.9 当n=8时训练后网络的输出结果
其中 “ ” 代表要逼近的非线性函数曲线;
16
基于MATLAB的BP神经网络应用
“‥‥‥ ” 代表未经训练的函数曲线; “―――” 代表经过训练的函数曲线;
(2)频率参数设为k=8,当隐层神经元数目分别取n=10、n=15时,得到了训练后的网络输出结果如图3.10,3.11所示。
图3.10 当n=10时训练后网络的输出结果 图3.11 当n=15时训练后网络的输出结果
其中 “ ” 代表要逼近的非线性函数曲线;
“‥‥‥ ” 代表未经训练的函数曲线; “―――” 代表经过训练的函数曲线;
3.2.4 讨论
通过上述仿真结果可知,当 k=1,n=3时;k=2,n=6时; k=4,n=8时;k=8,n=15时,BP神经网络分别对函数取得了较好的逼近效果。由此可见,n取不同的值对函数逼近的效果有很大的影响。改变BP网络隐层神经元的数目,可以改变BP神经网络对于函数的逼近效果。隐层神经元数目越多,则BP网络逼近非线性函数的能力越强。
3.3 BP网络在样本含量估计中的应用
3.3.1 问题的提出
这是一个神经网络在医学中应用的例子。拟设计一台仪器,通过对血液样本进行光谱分析来测试血清中胆固醇水平。共采集了264位病人的血液样本,对其光谱分析共发现21种光谱波长。对这些病人,通过血清分离,同样也测量了hdl、ldl、vldl胆固醇水平。
(1)将数据导入Matlab 工作空间,进行主要成分的分析。数据文件为choles_all.mat。 load choles_all %matlab中有一个choles_all.mat文件它包含了本问题需要的原始数据 [pn,meanp,stdp,tn,meant,stdt]=prestd(p,t); % prestd 函数对样本数据作归一化处理
[ptrans,sransMat]=prepca(pn,0.001);% 利用 prepca 函数对归一化后的样本数据进行主元分析
17
基于MATLAB的BP神经网络应用
这里剔除了一些数据,只保留了所占99.9%的主要成分数据。下面检验一下转换后数据矩阵的大小。 [R,Q]=size(ptrans) R = 4 Q = 264
从中可以看出通过主要成分分析,输入数据从21组减少到4组,由此可见原始数据有着很大的冗余度。
(2) 将这些数据分成几个部分,分别用于训练、验证和测试。将数据的1/4用于验证、1/4用于测试,其余的用于训练网络。采用等间隔的方式在原始数据中抽取出这些数据。
iitst=2:4:Q; iival=4:4:Q; iitr=[1:4:Q 3:4:Q];
val.P=ptrans(:,iival);val.T=tn(:,iival); test.P=ptrans(:,iitst);test.T=tn(:,iitst); ptr=ptrans(:,iitr);ttr=tn(:,iitr);
3.3.2 基于BP神经网络对胆固醇含量估计
步骤一:网络建立
一切准备工作做好后,开始建立网络。在本例中,建立一个两层网络,隐层的传递函数采用tan-sigmoid,输出层采用线性传递函数。隐层神经元初步设计为五个,因为需要得到三个目标,网络输出层设计为三个神经元。
net=newff(minmax(ptr),[5 3],{'tansig' 'purelin'},'trainlm');
步骤二:网络训练
进行网络训练,其训练过程如图3.12所示。
18