BP神经网络.docx
- 文档编号:8860374
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:19
- 大小:441.94KB
BP神经网络.docx
《BP神经网络.docx》由会员分享,可在线阅读,更多相关《BP神经网络.docx(19页珍藏版)》请在冰豆网上搜索。
BP神经网络
BP神经网络算法实现
题目:
用三层BP网络来模拟单输入单输出系统
设初始化时
,取网络节点个数如图。
试画出BP算法详细框图,编写BP程序并用符合
的100组样本进行训练,看训练完成后,网络对
的逼近效果。
若效果不理想,再增加一个5节点的隐层,然后再训练,结果如何?
解:
一、算法的主要流程图如下:
二、各层说明以及演算:
定义输入为
,
,
为BP网络的数值输出。
首先,从正向输入计算,输入经过第一隐层(3节点),第二隐层(4节点),输出层(1节点)然后获得输出。
第一隐层:
第二隐层:
输出层:
定义整个系统的误差函数为
,
式中,
为理想输出,
为实际输出
对于单输出系统,单个样本下
下面从反向误差开始计算以确定
。
输出层:
第二隐层:
第一隐层:
至此,完成一个样本的计算,后面不断的按照此步骤进行运算,直到把所有样本用一次,所谓一次训练。
此时判断
?
,如果成立,结束计算,获得的
即是最终结果,如果不成立,继续下一次训练,重复输入所有样本,直到满足精度。
三、Matlab仿真
(一)直接调用Matlab里的神经网络模块,编写程序如下:
%定义要逼近的非线性函数
p=[-2*pi:
0.02*pi:
2*pi];
t=abs(cos(p));
plot(p,t,'-')
title('要逼近的非线性函数');
xlabel('时间');
ylabel('非线性函数');
%建立相应的BP网络
net=newff(minmax(p),[3,4,1],{'tansig''tansig''purelin'},'trainlm');
%对没有训练的网络进行仿真
y1=sim(net,p);
%绘出仿真得到的曲线
figure;
plot(p,t,'-',p,y1,'--')
title('没有训练的网络仿真结果');
xlabel('时间');
ylabel('仿真输出--原函数-');
%训练网络
net.trainParam.lr=0.5;%设置学习系数
net.trainParam.epochs=1000;%设置最大训练循环次数
net.trainParam.goal=0.0001;%设置想要达到的精度
net=train(net,p,t);
%对训练后的网络进行仿真
y2=sim(net,p);
%绘出训练后的仿真结果
figure;
plot(p,t,'-',p,y2,'--')
title('训练后的网络仿真结果');
xlabel('时间');
ylabel('仿真输出');
输出结果如下:
结果还是很理想的,但仿真的结果随机性很大,不是很稳定。
(二)增加一个5节点的隐层,然后再训练,
%定义要逼近的非线性函数
p=[-2*pi:
.02*pi:
2*pi];
t=abs(cos(p));
plot(p,t,'-')
title('要逼近的非线性函数');
xlabel('时间');
ylabel('非线性函数');
%建立相应的BP网络
net=newff(minmax(p),[3,4,5,1],{'tansig''tansig''tansig''purelin'},'trainlm');
%对没有训练的网络进行仿真
y1=sim(net,p);
%绘出仿真得到的曲线
figure;
plot(p,t,'-',p,y1,'--')
title('没有训练的网络仿真结果');
xlabel('时间');
ylabel('仿真输出--原函数-');
%训练网络
net.trainParam.lr=0.5;%设置学习系数
net.trainParam.epochs=1000;%设置最大训练循环次数
net.trainParam.goal=0.0001;%设置想要达到的精度
net=train(net,p,t);
%对训练后的网络进行仿真
y2=sim(net,p);
%绘出训练后的仿真结果
figure;
plot(p,t,'-',p,y2,'--')
title('训练后的网络仿真结果');
xlabel('时间');
ylabel('仿真输出');
结果比前面的那次仿真要好一点,但随机性依然很大,仿真的参数设计没有理论的支持,依靠经验的居多,仅仅依靠增加网络层并不是理想的做法,而增加网络层不仅增加了计算的负担,同时扰动的影响也会相应的积累,可能会导致结果与预设的有很大的偏差。
四:
源程序
采用面向对象的语言C#进行编写,C#与C/C++具有极为类似的语法,其编程效率更高。
这里在VisualStudio2005.NET下开发的Windows程序可以直观的展现结果。
下面是其关键部分代码:
变量定义:
#regionValuableDefinition
publicconstdoublePI=3.1415926535897931;
publicconstintN=100;//样本数
publicintNodesNum=3;//默认的第一隐层个数
privatedoublex0;
privatedouble[]x1;
privatedouble[]x2;
privatedouble[]w0;
privatedouble[,]w1;
privatedouble[]w2;
privatedouble[]d0;
privatedouble[,]d1;
privatedouble[]d2;
privatedouble[]n0;
privatedouble[]n1;
privatedoublen2;
privatedoubled;
privatedoubley;
privatedoubleum;
privateArrayListx0List,x1List,x2List,w0List,w1List,w2List,d0List,d1List,d2List,n0List,n1List,n2List,dList,yList;
privateArrayListtrainTimes;
privateArrayListpresionValue;
privateArrayListsimpleNums;
#endregion
#regionMathFunction
voidCalculateN0()
{
for(inti=0;i n0[i]=x0*w0[i]; } voidCalculateN1() { for(inti=0;i { x1[i]=Sigmoid(n0[i]); } for(inti=0;i { n1[i]=0; for(intj=0;j n1[i]+=x1[j]*w1[j,i]; } } voidCalculateN2() { for(inti=0;i { x2[i]=Sigmoid(n1[i]); } n2=0; for(inti=0;i n2+=x2[i]*w2[i]; } voidCalculateD2() { for(inti=0;i { d2[i]=(d-y)*DiffSigmoid(n2)*x2[i]; w2[i]=w2[i]+um*d2[i]; } } voidCalculateD1() { for(inti=0;i { for(intj=0;j { d1[j,i]=(d-y)*DiffSigmoid(n2)*DiffSigmoid(n1[i])*w2[i]*x1[j]; w1[j,i]=w1[j,i]+um*d1[j,i]; } } } voidCalculateD0() { doubletemp=0; for(inti=0;i { temp=0; for(intj=0;j { temp+=w1[i,j]*DiffSigmoid(n1[j])*w2[j]; } d0[i]=(d-y)*DiffSigmoid(n2)*temp*DiffSigmoid(n0[i])*x0; w0[i]=w0[i]+um*d0[i]; } } doubleSigmoid(doublen) { return1/(1+Math.Exp(-1*n)); } doubleDiffSigmoid(doublen) { doubletemp=Sigmoid(n); returntemp*(1-temp); } #endregion //开始计算 privatevoidOKBtn_Click(objectsender,EventArgse) { NodesNum=Convert.ToInt32(NumBox.Text.ToString()); doubleaim=Convert.ToDouble(PresionTB.Text.ToString()); trainTimes.Clear(); presionValue.Clear(); simpleNums.Clear(); InitializeValue(); doubleee=1;intj=0; while(ee>aim) { j++; ee=0; for(inti=0;i { x0=(double)x0List[i]; x1=(double[])x1List[i]; x2=(double[])x2List[i]; w0=(double[])w0List[i]; w1=(double[,])w1List[i]; w2=(double[])w2List[i]; d0=(double[])d0List[i]; d1=(double[,])d1List[i]; d2=(double[])d2List[i]; n0=(double[])n0List[i]; n1=(double[])n1List[i]; n2=(double)n2List[i]; y=(double)yList[i]; d=(double)dList[i]; CalculateN0(); CalculateN1(); CalculateN2(); y=Sigmoid(n2); ee+=0.5*(d-y)*(d-y); CalculateD0(); CalculateD1(); CalculateD2(); x0List[i]=x0; x1List[i]=x1; x2List[i]=x2; w0List[i]=w0; w1List[i]=w1; w2List[i]=w2; d0List[i]=d0; d1List[i]=d1; d2List[i]=d2; n0List[i]=n0; n1List[i]=n1; n2List[i]=n2; yList[i]=y; } trainTimes.Add(j); presionValue.Add(ee); } for(inti=0;i simpleNums.Add(i); MessageBox.Show("训练完成,其次数为"+trainTimes.Count.ToString()); PlotCurve();//绘图函数 } 计算效果 界面效果 采用 ,第一隐层节点为3时, 采用 ,第一隐层节点为5时, 采用 ,第一隐层节点为3时, 采用 ,第一隐层节点为5时, 算法小结 从计算结果比较可以得出: 在隐层节点个数不变下,目标精度越小,所需要的训练次数越多。 在同一目标精度下,隐层节点个数越多,所需要的训练次数越少。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- BP 神经网络