当前位置:首页 >> 能源/化工 >>

BP神经网络的设计实例


BP 神经网络的设计实例 神经网络的设计实例(MATLAB 编程 编程)
网络。 例 1 采用动量梯度下降算法训练 BP 网络。
训练样本定义如下: 输入矢量为 9 U3 r0 z, p. S" I4 B p =[-1 -2 3 1 -1 1 5 -3] 目标矢量为 t = [-1 -1 1 1] 解:本例的 MATLAB 程序如下: close a

ll clear echo on clc % NEWFF——生成一个新的前向神经网络 % TRAIN——对 BP 神经网络进行训练 % SIM——对 BP 神经网络进行仿真 pause % 敲任意键开始 clc % 定义训练样本 % P 为输入矢量 P=[-1, -2, 3, 1; -1, 1, 5, -3]; % T 为目标矢量 T=[-1, -1, 1, 1]; pause; clc % 创建一个新的前向神经网络 net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingdm') % 当前输入层权值和阈值 inputWeights=net.IW{1,1} inputbias=net.b{1} 4 K8 \# % 当前网络层权值和阈值 layerWeights=net.LW{2,1} + layerbias=net.b{2} pause clc 9 V% Z3 m8 @' A7 G5 T4 % 设置训练参数 # z. h* b7 net.trainParam.show = 50; net.trainParam.lr = 0.05;

^3 K+ ~- E2 _ Q4 ]9 _8 U) m7 R

I0 r _5 r

net.trainParam.mc = 0.9; 0 |& e& x9 b4 S) q( H' @/ K( x/ f net.trainParam.epochs = 1000; net.trainParam.goal = 1e-3; + ^* I: l! _ z8 j# i* Q; F) y pause clc % 调用 TRAINGDM 算法训练 BP 网络 [net,tr]=train(net,P,T); ! I% _% o' v( g+ `' c3 y- d) \ pause & d) ?6 F# ~* t0 q0 X$ q7 s# l/ C clc % 对 BP 网络进行仿真 A = sim(net,P) % 计算仿真误差 ! h. V( p% l3 Y7 r7 |2 G E = T - A / O( [" P8 I0 [: ?# h* ?5 K) t MSE=mse(E) pause 7 s6 k( V$ B; q `! r- G' N N clc echo off 0 Y# y* P& l( [2 d9 f

例 2 采用贝叶斯正则化算法提高 BP 网络的推广能 力。
在本例中,我们采用两种训练方法,即 L-M 优化算法(trainlm)和贝叶斯正则化算法 (trainbr),用以训练 BP 网络,使其能够拟合某一附加有白噪声的正弦样本数据。其中, 样本数据可以采用如下 MATLAB 语句生成: 输入矢量:P = [-1:0.05:1]; 目标矢量:randn(’seed’,78341223); T = sin(2*pi*P)+0.1*randn(size(P)); 解:本例的 MATLAB 程序如下: ( o! P( O+ s. B$ _! X close all $ w' b" ^! e$ }# X+ g- a8 q/ u clear echo on clc % NEWFF——生成一个新的前向神经网络 ) |! l5 P# X" ^# n# n5 S % TRAIN——对 BP 神经网络进行训练, N- e/ [+ i+ O; h % SIM——对 BP 神经网络进行仿真 7 v- ]+ Y; W% b5 {6 c1 C# Q% k pause $ A1 u; |) R3 M; D5 j W % 敲任意键开始 clc , G! _. X- r( k0 }# G7 | % 定义训练样本矢量 . ]# r5 a+ [7 [! e8 o' e % P 为输入矢量 " t6 {. B0 S. g! f P = [-1:0.05:1];

% T 为目标矢量 randn('seed',78341223); T = sin(2*pi*P)+0.1*randn(size(P)); % 绘制样本数据点 plot(P,T,'+'); echo off hold on; & Q) _; V; O" _) z- m plot(P,sin(2*pi*P),':'); % 绘制不含噪声的正弦曲线 echo on clc ; c: N; q, R5 ?( D W, ` pause clc % 创建一个新的前向神经网络 net=newff(minmax(P),[20,1],{'tansig','purelin'}); 6 X" q0 r. |4 V+ p& o pause ; V3 D) C7 k1 {2 n clc echo off clc disp('1. L-M 优化算法 TRAINLM'); disp('2. 贝叶斯正则化算法 TRAINBR'); choice=input('请选择训练算法(1,2):'); % \" \7 o2 q5 G8 f+ W figure(gcf); ( y1 t/ |* k( H4 Q/ n z if(choice==1) ! D# _& p$ E$ k7 j, z3 b echo on clc 2 j# G6 T! ?$ I1 k3 l % 采用 L-M 优化算法 TRAINLM net.trainFcn='trainlm'; 2 U& F$ d9 Q9 A }. c1 X+ w7 h, i pause clc % 设置训练参数 : x# S7 z0 F' v" `7 c& r) R- q net.trainParam.epochs = 500; net.trainParam.goal = 1e-6; net=init(net); 7 @ T' r& ^. c % 重新初始化 $ |5 N, y/ q- w5 l( J. h% i2 Z. N5 I pause clc elseif(choice==2) % J( ~5 |3 ^) a echo on - b) `8 Q6 ^; L% y u clc # j& R2 Q4 }6 K" t+ @- U % 采用贝叶斯正则化算法 TRAINBR % e( {7 p$ X+ p" y net.trainFcn='trainbr'; ! R5 o% h& P! K9 u* ^6 |8 _ pause clc % 设置训练参数 net.trainParam.epochs = 500;

randn('seed',192736547); net = init(net); # k! U' ?/ P! m9 `$ A % 重新初始化 pause " l* a4 `5 Y, b: j clc ( H" ?8 g! L0 F5 o% S end 0 `- b5 m$ k) s8 n1 I8 F3 [6 n7 b % 调用相应算法训练 BP 网络 [net,tr]=train(net,P,T); pause clc % 对 BP 网络进行仿真 A = sim(net,P); % H% ^" S9 j4 Z2 @ % 计算仿真误差 E = T - A; MSE=mse(E) : F5 d+ }7 Q8 a pause ) s6 j- P1 P- i- S) K4 g3 l: U clc ! R' U, _& y, c3 R/ ~; G1 ] % 绘制匹配结果曲线 close all; # b/ E, I4 l4 P* m5 \4 p; M0 a5 F plot(P,A,P,T,'+',P,sin(2*pi*P),':'); pause; / P+ `8 p% c# e7 ]1 i. ~$ } clc echo off4 z) w/ I; j# Y2 F 4 s. j, D: j8 N8 x6 B 通过采用两种不同的训练算法,我们可以得到如图 1 和图 2 所示的两种拟合结果。图中的 实线表示拟合曲线, 虚线代表不含白噪声的正弦曲线, “+”点为含有白噪声的正弦样本数 据点。显然,经 trainlm 函数训练后的神经网络对样本数据点实现了“过度匹配”,而经 trainbr 函数训练的神经网络对噪声不敏感,具有较好的推广能力。 F) B- Q& \! K. }* [* 值得指出的是,在利用 trainbr 函数训练 BP 网络时,若训练结果收敛,通常会给出提示 信息“Maximum MU reached”。 此外, 用户还可以根据 SSE 和 SSW 的大小变化情况来判 断训练是否收敛: SSE 和 SSW 的值在经过若干步迭代后处于恒值时, 当 则通常说明网络训 练收敛,此时可以停止训练。观察 trainbr 函数训练 BP 网络的误差变化曲线,可见,当训 练迭代至 320 步时, 网络训练收敛, 此时 SSE 和 SSW 均为恒值, 当前有效网络的参数 (有 效权值和阈值)个数为 11.7973。

采用“提前停止” 例 3 采用“提前停止”方法提高 BP 网络的推广能 力。
对于和例 2 相同的问题,在本例中我们将采用训练函数 traingdx 和“提前停止”相结合 的方法来训练 BP 网络,以提高 BP 网络的推广能力。

解:在利用“提前停止”方法时,首先应分别定义训练样本、验证样本或测试样本,其中, 验证样本是必不可少的。 在本例中, 我们只定义并使用验证样本, 即有 & _" ^7 G4 e5 C) @! ?* b 验证样本输入矢量:val.P = [-0.975:.05:0.975] 3 V' ?: @6 i7 v% O 验证样本目标矢量:val.T = sin(2*pi*val.P)+0.1*randn(size(val.P)) 值得注意的是, 尽管“提前停止”方法可以和任何一种 BP 网络训练函数一起使用, 但是不 适合同训练速度过快的算法联合使用,比如 trainlm 函数,所以本例中我们采用训练速度 相对较慢的变学习速率算法 traingdx 函数作为训练函数。% A, a' m2 V4 ^4 e 本例的 MATLAB 程序如下:! v( P u3 X: e$ a3 d1 \7 ? close all 4 j8 ?( R# X* M$ C& f- A clear I, J2 ]( G- k echo on 0 X# g/ K8 b& ], {* k; {2 L% o clc % NEWFF——生成一个新的前向神经网络 ; O8 G1 a/ D% t1 | % TRAIN——对 BP 神经网络进行训练 3 Z1 Z S! R$ q$ K. g, u3 L) i* h % SIM——对 BP 神经网络进行仿真 pause % 敲任意键开始 ' k/ `8 d( ~& L7 C; B clc $ M* B7 z& ]9 @% m; U' f' { % 定义训练样本矢量 % P 为输入矢量 P = [-1:0.05:1]; % T 为目标矢量 randn('seed',78341223); ( W3 e% t8 q% a6 y1 | T = sin(2*pi*P)+0.1*randn(size(P)); % 绘制训练样本数据点 plot(P,T,'+'); & z" M; l0 s! T; ]7 o6 i2 U echo off , q4 r8 \( ?2 _9 ?* L# |/ { hold on; ; j3 T* E L g4 |2 L plot(P,sin(2*pi*P),':'); % 绘制不含噪声的正弦曲线 3 G! K& i% e4 F/ r& b/ Y) x+ r* t echo on * j: b6 T8 p1 I, p% ^% P- G clc pause clc / w+ W' U+ W! D' g, Z' i& w % 定义验证样本 5 {& }/ e: @! M$ D2 y val.P = [-0.975:0.05:0.975]; % 验证样本的输入矢量 val.T = sin(2*pi*val.P)+0.1*randn(size(val.P)); % 验证样本的目标矢量 j( O5 m! t1 Y0 u" q# Q: ^ pause ! W0 X: }0 y% b clc U- R6 q, p( U5 T- E P % 创建一个新的前向神经网络 net=newff(minmax(P),[5,1],{'tansig','purelin'},'traingdx'); 7 _6 f5 g+ r7 @- m: \

pause 8 r! G8 w/ h3 v' s& V( t+ { clc % 设置训练参数 6 N$ z: `5 d j. q+ E; f, ^ net.trainParam.epochs = 500; net = init(net); pause clc + T, X3 Y+ o% u/ C6 z! s4 p % 训练 BP 网络 : j+ W+ z, |% U$ I# ? [net,tr]=train(net,P,T,[],[],val); pause clc % 对 BP 网络进行仿真 A = sim(net,P); % 计算仿真误差 E = T - A; MSE=mse(E) 6 X. C8 x4 z0 E l8 s, Z pause clc % 绘制仿真拟合结果曲线 close all; 8 R5 X0 W6 M% D# { plot(P,A,P,T,'+',P,sin(2*pi*P),':'); $ w: F" l) _$ j1 i pause; + j% }! q5 z% M) \: K; ]9 n2 P ) k9 C7 s4 X3 L0 V+ C `4 X6 Q clc echo off 2 ?! {6 W3 G+ a& o" Z5 ? 下面给出了网络的某次训练结果,可见,当训练至第 136 步时,训练提前停止,此时的网 络误差为 0.0102565。给出了训练后的仿真数据拟合曲线,效果是相当满意的。 1 [# \2 Z G5 Z: p* w1 r/ \' X [net,tr]=train(net,P,T,[],[],val); ; U" D: L; @, W# _- p) Y. p, E! E) T TRAINGDX, Epoch 0/500, MSE 0.504647/0, Gradient 2.1201/1e-006% Q5 S$ M% c/ T; K1 U3 ?: v TRAINGDX, Epoch 25/500, MSE 0.163593/0, Gradient 0.384793/1e-006 TRAINGDX, Epoch 50/500, MSE 0.130259/0, Gradient 0.158209/1e-006- ?7 g; k& y) s, ]" e" Z TRAINGDX, Epoch 75/500, MSE 0.086869/0, Gradient 0.0883479/1e-006' g" z& v% B+ @3 f9 `, y# ~ TRAINGDX, Epoch 100/500, MSE 0.0492511/0, Gradient 0.0387894/1e-0068 F, e0 i# i6 @5 z3 N TRAINGDX, Epoch 125/500, MSE 0.0110016/0, Gradient 0.017242/1e-006. F) M0 M4 B0 n5 @2 k TRAINGDX, Epoch 136/500, MSE 0.0102565/0, Gradient 0.01203/1e-006' n& O* n( J2 Q& T TRAINGDX, Validation stop.0 {8 K+ k0 S. s0 d0 t8 I# q

例 3 用 BP 网络估计胆固醇含量
这是一个将神经网络用于医疗应用的例子。 我们设计一个器械, 用于从血样的光谱组成的测 量中得到血清的 胆固醇含量级别,我们有 261 个病人的血样值,包括 21 种波长的谱线的数据,对于这些病 人,我们得到了基于 光谱分类的胆固醇含量级别 hdl,ldl,vldl。! o' n; u3 l, {3 H- S! D , o7 S9 {4 E d' q: I (1) 样本数据的定义与预处理。 choles_all.mat 文件中存储了网络训练所需要的全部样本数据。. v# @7 N) p+ r 利用 load 函数可以在工作空间中自动载入网络训练所需的输入数据 p 和目标数据 t,即 load choles_all sizeofp = size (p) . m6 k+ }) Z% x0 a g sizeofp = 21 264 ( Y* W9 h' \! v3 I2 B% I4 j( e- n sizeoft = size (t) % Q) d- d G% Y) J e0 t sizeoft = 3 264/ U. B$ y/ ?' @5 w 可见,样本集的大小为 264。为了提高神经网络的训练效率,通常要对样本数据作适当的预 处理。首先,利用 prestd 函数对样本数据作归一化处理,使得归一化后的输入和目标数据 均服从正态分布,即 [pn,meanp,stdp,tn,meant,stdt] = prestd(p,t); 1 m# ?3 a+ t- [! O! y3 y! K' k 然后, 利用 prepca 函数对归一化后的样本数据进行主元分析, 从而消除样本数据中的冗余 成份,起到数据降维的目的。 0 t+ y3 b2 K" _: M0 a* w: s4 y* } [ptrans,transMat] = prepca(pn,0.001); [R,Q] = size(ptrans) R = 4 Q = 264 可见,主元分析之后的样本数据维数被大大降低,输入数据的维数由 21 变为 4。 (2) 对训练样本、验证样本和测试样本进行划分。 为了提高网络的推广能力和识别能力, 训练中采用“提前停止”的方法, 因此, 在训练之前, 需要将上面处理后的样本数据适当划分为训练样本集、验证样本集和测试样本集。 (3) 网络生成与训练。 选用两层 BP 网络,其中网络输入维数为 4,输出维数为 3,输出 值即为血清胆固醇的三个指标值大小。 网络中间层神经元数目预选为 5, 传递函数类型选为 tansig 函数,输出层传递函数选为线性函数 purelin,训练函数设为 trainlm。网络的生 成语句如下:) E+ A& K( w* t @ net = newff(minmax(ptr),[5 3],{'tansig' 'purelin'},'trainlm'); 利用 train 函数对所生成的神经网络进行训练,训练结果如下: [net,tr]=train(net,ptr,ttr,[],[],val,test); 2 m2 x b l [" w( p 见,网络训练迭代至第 20 步时提前停止,这是由于验证误差已经开始变大。利用下面语句 可以绘制出训练误差、验证误差和测试误差的变化曲线,如图 4.50 所示。由图可见,验证 误差和测试误差的变化趋势基本一致,说明样本集的划分基本合理。由训练误差曲线可见, 训练误差结果也是比较满意的。 (4) 网络仿真。 为了进一步检验训练后网络的性能,下面对训练结果作进一步仿真分析。

利用 postreg 函数可以对网络仿真的输出结果和目标输出作线性回归分析,并得到两者的 相关系数,从而可以作为网络训练结果优劣的判别依据。仿真与线性回归分析如下: an = sim(net,ptrans); ! [) M( a$ s4 w/ v- w a = poststd(an,meant,stdt); for i=1:3 ) P: m m4 b* Q) W figure(i) [m(i),b(i),r(i)] = postreg(a(i,:),t(i,:)); 6 ~& v3 z$ s% } j" l2 Q end i: k+ h4 C* H2 M, P# i1 {* v %导入原始测量数据 4 k7 s9 g1 N( I( k6 e" ]: j& h load choles_all;* I' u; D* }0 @, ? %对原始数据进行规范化处理,prestd 是对输入数据和输出数据进行规范化处理,5 K1 i" c/ e2 Y %prepca 可以删除一些数据,适当地保留了变化不小于 0.01 的数据 7 K. L& t; y) q- X* R5 _% H) k) S1 J [pn,meanp,stdp,tn,meant,stdt]=prestd(p,t); [ptrans,transMat]=prepca(pn,0.001);7 [9 `1 ~3 R4 H) U8 \2 j) x [R,Q]=size(ptrans) ) ^) j# x3 v! ^2 m8 s) _/ s %将原始数据分成几个部分作为不同用途四分已用于确证,四分一用于测试,二分一用于训 练网络 iitst=2:4:Q;! _6 v' I6 C# a/ g# w- [ iival=4:4:Q; iitr=[1:4:Q 3:4:Q];9 F6 S; H& I5 ^* l %vv 是确证向量,.P 是输入,.T 是输出,vt 是测试向量) D$ _8 C9 l( k. F+ v0 ~ vv.P=ptrans(:,iival); 4 N' N& u0 s* b/ B9 |; B& s vv.T=tn(:,iival); vt.P=ptrans(:,iitst); ; K9 _$ ]0 Y+ r6 r& t2 Q vt.T=tn(:,iitst); ptr=ptrans(:,iitr); ttr=tn(:,iitr);/ v7 B# d/ h2 F' M3 g* U6 y$ j %建立网络,隐层中设计 5 个神经元,由于需要得到的是 3 个目标,所以网络需要有 3 个输 出 net=newff(minmax(ptr),[5 3],{'tansig' 'purelin'},'trainlm');2 I1 R. X# t: ^2 q9 {/ [! H %训练网络 net.trainParam.show=5; [net,tr]=train(net,ptr,ttr,[],[],vv,vt);7 A; J! X$ c0 C5 a %绘出训练过程中各误差的变化曲线 plot(tr.epoch,tr.perf,'r',tr.epoch,tr.vperf,':g',tr.epoch,tr.tperf,'-.b'); legend('训练','确证','测试',-1);. w& g9 R; |3 l5 z ylabel('平方误差'); xlabel('时间'); pause; %将所有数据通过网络(包括训练,确证,测试),然后得到网络输出和相应目标进行线性

回归, %对网络输出进行反规范化变换,并绘出个各级别的线性回归结果曲线: M: I+ ]5 P1 [" F an=sim(net,ptrans); a=poststd(an,meant,stdt);$ y$ V, d5 m' @4 J %得到 3 组输出,所以进行 3 次线性回归 for i=1:3 figure(i) [m(i),b(i),r(i)] = postreg(a(i,:),t(i,:)); end 网络输出数据和目标数据作线性回归后, 前面两个输出对目标的跟踪比较好, 相应的 R 值接 近 0.9。而第三个输出却并不理想,我们很可能需要在这点上做更多工作。可能需要使用其 它的网络结构(使用更多的隐层神经元),或者是在训练技术上使用贝叶斯规范华而不实使 用早停的方法。0 r, h) Z z4 R/ w* j8 K" F" v 把隐层数目改为 20 个时,网络训练的 3 种误差非常接近,得到的结果 R 也相应提高。但不 代表神经元越多就越精确。 多层神经网络能够对任意的线性或者非线性函数进行逼近,其精度也是任意的。但是 BP 网 络不一定能找到解。训练时,学习速率太快可能引起不稳定,太慢则要花费太多时间,不同 的训练算法也对网络的性能有很大影响。BP 网络对隐层的神经元数目也是很敏感的,太少 则很难适应,太多则可能设计出超适应网络。 $ b# ?( o* {8 u4 H5 a- G 注:例子均来自于互联网,本人的工作只是将多个例子整合在一起

1. To configure Real-Time Windows Target you must type 'rtwintgt -setup' in a MATLAB command window 2. The MATLAB Web Server has been installed on your system as a Windows NT service. After installation, you must reboot your system to start it. The service starts automatically at system boot. To remove it, uninstall the product. Refer to the documentation for more information.


相关文章:
bp神经网络设计实例
BP神经网络实例 14页 5财富值如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 bp神经网络设计实例 隐藏>> 基于Matlab 神...
神经网络一个简单实例
CvANN_MLP bp; // Set up BPNetwork's parameters CvANN_MLP_TrainParams ...BP神经网络的设计实例-f 9页 免费 神经网络BP法实例 8页 免费 ©...
BP神经网络的设计实例(MATLAB编程)
BP 神经网络的设计实例(MATLAB 编程) 转 2010 年 04 月 06 日 星期二 下午 01:22 BP 神经网络的设计实例(MATLAB 编程) 例 1 采用动量梯度下降算法训练 BP...
BP神经网络的设计实例(MATLAB编程)
神经网络的设计实例(MATLAB 编程) 例 1 采用动量梯度下降算法训练 BP 网络。 训练样本定义如下: 输入矢量为 p =[-1 -2 3 1 -1 1 5 -3] 目标矢量为 ...
BP神经网络的设计实例
BP神经网络的matlab实现BP神经网络的matlab实现隐藏>> 神经网络的设计实例(MATLAB 编程) BP 神经网络的设计实例(MATLAB 编程) 例 1 采用动量梯度下降算法训练 BP ...
BP神经网络模型应用实例
BP神经网络模型应用实例_自然科学_专业资料。BP 神经网络模型 第 1 节 基本原理...故而, 在程序中,我们设计了一个随机发生器程序,产生一 组一 0.5~+0.5 ...
MATLAB程序代码--BP神经网络的设计实例
MATLAB程序代码--BP神经网络的设计实例_IT/计算机_专业资料。MATLAB编程程序代码,BP神经网络应用基础知识,通用代码MATLAB 程序代码--BP 神经网络的设计实例例 1 采用...
matlab神经网络实例(超级简单)
这里我用复合中心设计法则构造设计点,根据规则,八个变量将构造出 81 个设 计...BP神经网络的matlab实现... 21页 免费 BP神经网络Matlab实例(2... 8页 免费...
BP神经网络实例
BP神经网络实例_信息与通信_工程科技_专业资料。智能控制 BP 神经网络实例分析一、实例要求 1、 f1 ( x) ? cos( x), x ? (0, 2? ) 取九个点来训练网...
BP神经网络matlab实例(简单而经典)
BP神经网络matlab实例(简单而经典)_信息与通信_工程科技_专业资料。几个BP神经...BP神经网络matlab工具箱... 5页 免费 BP 神经网络的设计实例(... 8页 1...
更多相关标签:
bp神经网络设计实例 | bp神经网络matlab实例 | bp神经网络预测实例 | bp神经网络 实例 | bp神经网络算法实例 | bp神经网络应用实例 | bp神经网络分类实例 | keras bp神经网络实例 |