BP神经网络算法原理

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

BP网络模型处理信息的基本原理是:输入信号Xi通过中间节点(隐层点)作用于输出节点,经过非线形变换,产生输出信号Yk,网络训练的每个样本包括输入向量X和期望输出量t,网络输出值Y与期望输出值t之间的偏差,通过调整输入节点与隐层节点的联接强度取值Wij和隐层节点与输出节点之间的联接强度Tjk以及阈值,使误差沿梯度方向下降,经过反复学习训练,确定与最小误差相对应的网络参数(权值和阈值),训练即告停止。此时经过训练的神经网络即能对类似样本的输入信息,自行处理输出误差最小的经过非线形转换的信息。一BP神经网络模型BP网络模型包括其输入输出模型、作用函数模型、误差计算模型和自学习模型。(1)节点输出模型隐节点输出模型:Oj=f(∑Wij×Xi-qj)(1)输出节点输出模型:Yk=f(∑Tjk×Oj-qk)(2)f-非线形作用函数;q-神经单元阈值。(2)作用函数模型作用函数是反映下层输入对上层节点刺激脉冲强度的函数又称刺激函数,一般取为(0,1)内连续取值Sigmoid函数:f(x)=1/(1+e-x)(3)(3)误差计算模型误差计算模型是反映神经网络期望输出与计算输出之间误差大小的函数:Ep=1/2×∑(tpi-Opi)2(4)tpi-i节点的期望输出值;Opi-i节点计算输出值。(4)自学习模型神经网络的学习过程,即连接下层节点和上层节点之间的权重拒阵Wij的设定和误差修正过程。BP网络有师学习方式-需要设定期望值和无师学习方式-只需输入模式之分。自学习模型为△Wij(n+1)=h×Фi×Oj+a×△Wij(n)(5)h-学习因子;Фi-输出节点i的计算误差;Oj-输出节点j的计算输出;a-动量因子。二BP网络模型的缺陷分析及优化策略(1)学习因子h的优化采用变步长法根据输出误差大小自动调整学习因子,来减少迭代次数和加快收敛速度。h=h+a×(Ep(n)-Ep(n-1))/Ep(n)a为调整步长,0~1之间取值(6)(2)隐层节点数的优化隐节点数的多少对网络性能的影响较大,当隐节点数太多时,会导致网络学习时间过长,甚至不能收敛;而当隐节点数过小时,网络的容错能力差。利用逐步回归分析法并进行参数的显著性检验来动态删除一些线形相关的隐节点,节点删除标准:当由该节点出发指向下一层节点的所有权值和阈值均落于死区(通常取±0.1、±0.05等区间)之中,则该节点可删除。最佳隐节点数L可参考下面公式计算:L=(m+n)1/2+c(7)m-输入节点数;n-输出节点数;c-介于1~10的常数。(3)输入和输出神经元的确定利用多元回归分析法对神经网络的输入参数进行处理,删除相关性强的输入参数,来减少输入节点数。(4)算法优化由于BP算法采用的是剃度下降法,因而易陷于局部最小并且训练时间较长。用基于生物免疫机制地既能全局搜索又能避免未成熟收敛的免疫遗传算法IGA取代传统BP算法来克服此缺点。该程序实现神经网络的BP算法,输入节点数,输出节点数,隐层数,隐层节点数任意,由用户决定。其中隐层数指的是总共曾数包含输出层,比如说异或算法为2层,第一层节点数为2,第二层也即输出层节点数为1,输入点数为2。但是该程序对异或算法实现并不理想,对多层多节点的神经网络有较好的结果。#includeiostream.h#includetime.h#includestdlib.h#includefstream#includemath.h#includestdio.h#defineMAXCOUNT1e5//迭代训练次数上限//精度0.001的随机浮点数,范围在-0.5——0.5floatrandf(){return(float)((rand()%1001)*0.001f-0.5);}//高斯随机数产生函数doublegaussrand(){staticdoubleV1,V2,S;staticintphase=0;doubleX;if(phase==0){do{doubleU1=(double)rand()/RAND_MAX;doubleU2=(double)rand()/RAND_MAX;V1=2*U1-1;V2=2*U2-1;S=V1*V1+V2*V2;}while(S=1||S==0);X=V1*sqrt(-2*log(S)/S);}elseX=V2*sqrt(-2*log(S)/S);phase=1-phase;returnX;}//定义一个多层前向BP网络classBP{public:double***p;//记录所有的权值double***ddp;//记录所有的权值增量int*pnode;//记录每一层的节点数double**pnodey;//记录每组每一层的节点的输出值double**ddlj;//记录每组每一层的节点的ddljdouble**pX;//记录输入样本double**pY;//记录输入理想输出值intSidenum;intInputnodenum;intoutputnodenum;intyangbenzushu;BP(){Sidenum=0;Inputnodenum=0;outputnodenum=0;yangbenzushu=0;}~BP(){for(intm=0;mSidenum;m++){for(intn=0;npnode[m+1];n++){delete[]p[m][n];delete[]ddp[m][n];}delete[]p[m];delete[]ddp[m];}delete[]p;delete[]ddp;p=NULL;ddp=NULL;if(p==NULL)delete[]pnode;for(intM=0;MSidenum;M++){delete[]pnodey[M];delete[]ddlj[M];}delete[]pnodey;delete[]ddlj;pnodey=NULL;ddlj=NULL;}//完成所有权值的初始化voidgetW(intsidenum,intinputnodenum,intoutputnodenum1,intyangbenzu){Sidenum=sidenum;yangbenzushu=yangbenzu;Inputnodenum=inputnodenum;outputnodenum=outputnodenum1;p=newdouble**[sidenum];ddp=newdouble**[sidenum];pnode=newint[sidenum+1];//包含输入层输出层每一层的节点数for(inti=0;isidenum+1;i++){intdata=0;cout请输入第i层节点数endl;cindata;pnode[i]=data;}for(intj=0;jsidenum;j++){p[j]=newdouble*[pnode[j+1]];ddp[j]=newdouble*[pnode[j+1]];for(intk=0;kpnode[j+1];k++){ddp[j][k]=newdouble[pnode[j]+1];p[j][k]=newdouble[pnode[j]+1];for(intt=0;tpnode[j]+1;t++){ddp[j][k][t]=0;//每一层的权值初始化为0if(t==0)p[j][k][t]=-fabs(randf());//每一层的阀值初始化elsep[j][k][t]=randf();//每一层的权值初始化}}}//为记录每一层的节点的输出值和ddlj的指针开辟内存pnodey=newdouble*[Sidenum];ddlj=newdouble*[Sidenum];for(intp=0;pSidenum;p++){pnodey[p]=newdouble[pnode[p+1]+1];ddlj[p]=newdouble[pnode[p+1]];pnodey[p][0]=1;//每组每层的首值为1}}/**********************///每个节点输出函数doublefas(doubles){doublet;t=1.0/(exp(-s)+1);returnt;}/************************************************///该函数用来记录样本值和理想输出值voidINPUT(intyangbenzushu1){pY=newdouble*[yangbenzushu1];pX=newdouble*[yangbenzushu1];for(intyu=0;yuyangbenzushu1;yu++){pX[yu]=newdouble[Inputnodenum+1];pY[yu]=newdouble[outputnodenum+1];}//每组样本的首值赋为1for(intyu1=0;yu1yangbenzushu1;yu1++){pX[yu1][0]=1;pY[yu1][0]=1;}cout请输出样本输入值endl;for(intyuy=0;yuyyangbenzushu1;yuy++)for(intyy=1;yy=Inputnodenum;yy++){if(yy==Inputnodenum)coutendl;coutX[yuy][yy]='';cinpX[yuy][yy];}cout请输出样本理想输出值endl;for(intyuy1=0;yuy1yangbenzushu1;yuy1++)for(intyy1=1;yy1=outputnodenum;yy1++){//if(yy==Inputnodenum)coutendl;coutY[yuy1][yy1]='';cinpY[yuy1][yy1];}}/****************************************************************************///计算每个节点的输出值函数doublecomputeYl(intKK)//KK代表第几组组号{doublesum1=0;//把所有的层的每一个节点的输出值算出来并记录在pnodey里,不包含输入点值for(inty=0;ySidenum;y++)//层数{for(intr=1;rpnode[y+1]+1;r++)//节点数{doublesum=0;for(intz=0;zpnode[y]+1;z++)//前一层的节点数{if(y==0)sum+=pX[KK][z]*p[y][r-1][z];elsesum+=pnodey[y-1][z]*p[y][r-1][z];}pnodey[y][r]=fas(sum);}}for(intj=1;j=outputnodenum;j++)sum1+=pow(pY[KK][j]-pnodey[Sidenum-1][j],2);returnsum1;}/**********************************************************///ComputeBack-Propagation-ErrorsvoidComputeBackPropagationErrors(intgf)//gf代表组号{//计算所有的ddlj[][]//for(intgf=0;gfyangbenzushu;gf++)//组数for(intq=Sidenum-1;q=0;q--)//从最后一层开始{if(q==Sidenum-1)//如果是最外一层的话{for(intrt=0;rtpnode[q+1];rt++)//每层的节点数ddlj[q][rt]=pnodey[q][rt+1]*(1-pnodey[q][rt+1])*(pY[gf][rt+1]-pnodey[q][rt+1]);}else{for(intry=0;rypnode[q+1];ry++){d

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功