⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bp神经网络的设计实例.htm

📁 数学建模用到的常见算法 神经网络
💻 HTM
📖 第 1 页 / 共 4 页
字号:
                  <TABLE cellSpacing=0 cellPadding=10 align=left border=0>
                    <TBODY>
                    <TR>
                      <TD></TD></TR></TBODY></TABLE>
                  <P>
                  <P>
                  <P>
                  <P>
                  <P><BR>例1 采用动量梯度下降算法训练 BP 
                  网络。<BR>训练样本定义如下:<BR>输入矢量为&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;p 
                  =[-1&nbsp;-2 3&nbsp; 
                  1&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp; 1 5 
                  -3]<BR>目标矢量为&nbsp;&nbsp;&nbsp;t = [-1 -1 1 1]</P>
                  <P>解:本例的 MATLAB 程序如下: <BR><BR>close all <BR>clear <BR>echo on 
                  <BR>clc <BR>% NEWFF——生成一个新的前向神经网络 <BR>% TRAIN——对 BP 神经网络进行训练 
                  <BR>% SIM——对 BP 神经网络进行仿真 
                  <BR>pause&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>%&nbsp; 敲任意键开始 <BR>clc <BR>%&nbsp; 定义训练样本 <BR>% P 为输入矢量 
                  <BR>P=[-1,&nbsp; -2,&nbsp;&nbsp;&nbsp; 3,&nbsp;&nbsp;&nbsp; 
                  1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1,&nbsp;&nbsp;&nbsp; 
                  1,&nbsp;&nbsp;&nbsp; 5,&nbsp; -3];<BR>% T 为目标矢量 <BR>T=[-1, -1, 
                  1, 1]; <BR>pause; <BR>clc <BR>%&nbsp; 创建一个新的前向神经网络 
                  <BR>net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingdm')<BR>%&nbsp; 
                  当前输入层权值和阈值 <BR>inputWeights=net.IW{1,1} <BR>inputbias=net.b{1} 
                  <BR>%&nbsp; 当前网络层权值和阈值 <BR>layerWeights=net.LW{2,1} 
                  <BR>layerbias=net.b{2} <BR>pause <BR>clc <BR>%&nbsp; 设置训练参数 
                  <BR>net.trainParam.show = 50; <BR>net.trainParam.lr = 0.05; 
                  <BR>net.trainParam.mc = 0.9; <BR>net.trainParam.epochs = 1000; 
                  <BR>net.trainParam.goal = 1e-3; <BR>pause <BR>clc <BR>%&nbsp; 
                  调用 TRAINGDM 算法训练 BP 网络 <BR>[net,tr]=train(net,P,T); <BR>pause 
                  <BR>clc <BR>%&nbsp; 对 BP 网络进行仿真 <BR>A = sim(net,P) <BR>%&nbsp; 
                  计算仿真误差 <BR>E = T - A <BR>MSE=mse(E) <BR>pause <BR>clc <BR>echo 
                  off </P>
                  <P>例2 采用贝叶斯正则化算法提高 BP 网络的推广能力。在本例中,我们采用两种训练方法,即 L-M 
                  优化算法(trainlm)和贝叶斯正则化算法(trainbr),用以训练 BP 
                  网络,使其能够拟合某一附加有白噪声的正弦样本数据。其中,样本数据可以采用如下MATLAB 语句生成: <BR>输入矢量:P 
                  = [-1:0.05:1]; <BR>目标矢量:randn(’seed’,78341223); <BR>T = 
                  sin(2*pi*P)+0.1*randn(size(P)); <BR>解:本例的 MATLAB 程序如下: </P>
                  <P>close all <BR>clear <BR>echo on <BR>clc <BR>% 
                  NEWFF——生成一个新的前向神经网络 <BR>% TRAIN——对 BP 神经网络进行训练<BR>% SIM——对 BP 
                  神经网络进行仿真 <BR>pause&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>%&nbsp; 敲任意键开始 <BR>clc <BR>%&nbsp; 定义训练样本矢量 <BR>% P 为输入矢量 
                  <BR>P = [-1:0.05:1]; <BR>% T 为目标矢量 <BR>randn('seed',78341223); 
                  T = sin(2*pi*P)+0.1*randn(size(P)); <BR>%&nbsp; 绘制样本数据点 
                  <BR>plot(P,T,'+'); <BR>echo off <BR>hold on; 
                  <BR>plot(P,sin(2*pi*P),':');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>%&nbsp; 绘制不含噪声的正弦曲线 <BR>echo on <BR>clc <BR>pause <BR>clc 
                  <BR>%&nbsp; 创建一个新的前向神经网络 
                  <BR>net=newff(minmax(P),[20,1],{'tansig','purelin'}); 
                  <BR>pause <BR>clc <BR>echo off <BR>clc<BR>disp('1.&nbsp; L-M 
                  优化算法 TRAINLM'); disp('2.&nbsp; 贝叶斯正则化算法 TRAINBR'); 
                  <BR>choice=input('请选择训练算法(1,2):'); <BR>figure(gcf); 
                  <BR>if(choice==1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; echo 
                  on&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  clc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; %&nbsp; 采用 L-M 优化算法 TRAINLM 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  net.trainFcn='trainlm';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  pause&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  clc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; %&nbsp; 
                  设置训练参数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; net.trainParam.epochs = 
                  500;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; net.trainParam.goal = 
                  1e-6;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  net=init(net);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; %&nbsp; 
                  重新初始化&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  pause&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  clc<BR>elseif(choice==2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; echo 
                  on&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  clc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; %&nbsp; 采用贝叶斯正则化算法 
                  TRAINBR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  net.trainFcn='trainbr';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  pause&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  clc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; %&nbsp; 
                  设置训练参数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; net.trainParam.epochs = 
                  500;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  randn('seed',192736547);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; net = 
                  init(net);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; %&nbsp; 
                  重新初始化&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  pause&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>&nbsp;&nbsp;&nbsp; 
                  clc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>end 
                  <BR>%&nbsp; 调用相应算法训练 BP 网络 <BR>[net,tr]=train(net,P,T); 
                  <BR>pause <BR>clc <BR>%&nbsp; 对 BP 网络进行仿真 <BR>A = sim(net,P); 
                  <BR>%&nbsp; 计算仿真误差 <BR>E = T - A; <BR>MSE=mse(E) <BR>pause 
                  <BR>clc <BR>%&nbsp; 绘制匹配结果曲线 <BR>close all; 
                  <BR>plot(P,A,P,T,'+',P,sin(2*pi*P),':'); <BR>pause; 
                  <BR>clc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>echo off<BR></P>
                  <P>通过采用两种不同的训练算法,我们可以得到如图 1和图 
                  2所示的两种拟合结果。图中的实线表示拟合曲线,虚线代表不含白噪声的正弦曲线,“+”点为含有白噪声的正弦样本数据点。显然,经 
                  trainlm 函数训练后的神经网络对样本数据点实现了“过度匹配”,而经 trainbr 
                  函数训练的神经网络对噪声不敏感,具有较好的推广能力。<BR><IMG alt="" 
                  src="BP神经网络的设计实例.files/200486235422921.gif" 
                  onload="javascript:if(this.width>740)this.width=740" 
                  border=undefined><BR>值得指出的是,在利用 trainbr 函数训练 BP 
                  网络时,若训练结果收敛,通常会给出提示信息“Maximum&nbsp; MU&nbsp; 
                  reached”。此外,用户还可以根据 SSE 和 SSW 的大小变化情况来判断训练是否收敛:当 SSE 和 SSW 
                  的值在经过若干步迭代后处于恒值时,则通常说明网络训练收敛,此时可以停止训练。观察trainbr 函数训练 BP 
                  网络的误差变化曲线,可见,当训练迭代至 320 步时,网络训练收敛,此时 SSE 和 SSW 
                  均为恒值,当前有效网络的参数(有效权值和阈值)个数为 11.7973。 </P>
                  <P>例3 采用“提前停止”方法提高 BP 网络的推广能力。对于和例 2相同的问题,在本例中我们将采用训练函数 
                  traingdx 和“提前停止”相结合的方法来训练 BP 网络,以提高 BP 网络的推广能力。 </P>
                  <P>解:在利用“提前停止”方法时,首先应分别定义训练样本、验证样本或测试样本,其中,验证样本是必不可少的。在本例中,我们只定义并使用验证样本,即有 
                  <BR>验证样本输入矢量:val.P = [-0.975:.05:0.975] <BR>验证样本目标矢量:val.T = 
                  sin(2*pi*val.P)+0.1*randn(size(val.P)) 
                  <BR>值得注意的是,尽管“提前停止”方法可以和任何一种 BP 
                  网络训练函数一起使用,但是不适合同训练速度过快的算法联合使用,比如 trainlm 
                  函数,所以本例中我们采用训练速度相对较慢的变学习速率算法 traingdx 函数作为训练函数。<BR>本例的 MATLAB 
                  程序如下:<BR>close all <BR>clear <BR>echo on <BR>clc <BR>% 
                  NEWFF——生成一个新的前向神经网络 <BR>% TRAIN——对 BP 神经网络进行训练 <BR>% SIM——对 BP 
                  神经网络进行仿真 <BR>pause&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>%&nbsp; 敲任意键开始 <BR>clc <BR>%&nbsp; 定义训练样本矢量 <BR>% P 为输入矢量 
                  <BR>P = [-1:0.05:1]; <BR>% T 为目标矢量 <BR>randn('seed',78341223); 
                  <BR>T = sin(2*pi*P)+0.1*randn(size(P)); <BR>%&nbsp; 绘制训练样本数据点 
                  <BR>plot(P,T,'+'); <BR>echo off <BR>hold on; 
                  <BR>plot(P,sin(2*pi*P),':');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  %&nbsp; 绘制不含噪声的正弦曲线 <BR>echo on <BR>clc <BR>pause <BR>clc 
                  <BR>%&nbsp; 定义验证样本 <BR>val.P = 
                  [-0.975:0.05:0.975];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  %&nbsp; 验证样本的输入矢量 <BR>val.T = 
                  sin(2*pi*val.P)+0.1*randn(size(val.P));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  %&nbsp; 验证样本的目标矢量 <BR>pause <BR>clc <BR>%&nbsp; 创建一个新的前向神经网络 
                  <BR>net=newff(minmax(P),[5,1],{'tansig','purelin'},'traingdx'); 
                  <BR>pause <BR>clc <BR>%&nbsp; 设置训练参数 <BR>net.trainParam.epochs 
                  = 500; <BR>net = init(net); <BR>pause <BR>clc <BR>%&nbsp; 训练 
                  BP 网络 <BR>[net,tr]=train(net,P,T,[],[],val); <BR>pause <BR>clc 
                  <BR>%&nbsp; 对 BP 网络进行仿真 <BR>A = sim(net,P); <BR>%&nbsp; 计算仿真误差 
                  <BR>E = T - A; <BR>MSE=mse(E) <BR>pause <BR>clc <BR>%&nbsp; 
                  绘制仿真拟合结果曲线 <BR>close all; 
                  <BR>plot(P,A,P,T,'+',P,sin(2*pi*P),':'); <BR>pause; 
                  <BR>clc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
                  <BR>echo off </P>
                  <P>下面给出了网络的某次训练结果,可见,当训练至第 136 步时,训练提前停止,此时的网络误差为 
                  0.0102565。给出了训练后的仿真数据拟合曲线,效果是相当满意的。 
                  <BR>[net,tr]=train(net,P,T,[],[],val); <BR>TRAINGDX, Epoch 
                  0/500, MSE 0.504647/0, Gradient 2.1201/1e-006<BR>TRAINGDX, 
                  Epoch 25/500, MSE 0.163593/0, Gradient 
                  0.384793/1e-006<BR>TRAINGDX, Epoch 50/500, MSE 0.130259/0, 
                  Gradient 0.158209/1e-006<BR>TRAINGDX, Epoch 75/500, MSE 
                  0.086869/0, Gradient 0.0883479/1e-006<BR>TRAINGDX, Epoch 
                  100/500, MSE 0.0492511/0, Gradient 
                  0.0387894/1e-006<BR>TRAINGDX, Epoch 125/500, MSE 0.0110016/0, 
                  Gradient 0.017242/1e-006<BR>TRAINGDX, Epoch 136/500, MSE 
                  0.0102565/0, Gradient 0.01203/1e-006<BR>TRAINGDX, Validation 
                  stop.<BR><IMG alt="" 
                  src="BP神经网络的设计实例.files/200486235436543.gif" 
                  onload="javascript:if(this.width>740)this.width=740" 
                  border=undefined></P>
                  <P><BR><BR>&nbsp;</P>
                  <P></P>
                  <P></P>
                  <P></P>
                  <P></P>
                  <P></P>
                  <P align=center><FONT 
              color=red><B>[1]</B></FONT></P></TD></TR></TBODY></TABLE></TD></TR>
        <TR>
          <TD colSpan=2>
            <TABLE 
            style="BORDER-TOP: #6687ba 1px solid; BORDER-BOTTOM: #6687ba 1px solid" 
            height=50 cellSpacing=5 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD>
                  <LI>上一篇文章: <A 
                  title="文章标题:径向基函数网络设计&#13;&#10;作    者:cac&#13;&#10;更新时间:2004-7-28 1:45:45&#13;&#10;点击次数:801" 
                  href="http://homepage.scau.edu.cn/club/lixue/01c4/Article_Show.asp?ArticleID=16">径向基函数网络设计</A> 
                  <BR>
                  <LI>下一篇文章: 没有了 </LI></TD></TR></TBODY></TABLE></TD></TR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -