BP神经网络算法原理(15页).doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《BP神经网络算法原理(15页).doc》由会员分享,可在线阅读,更多相关《BP神经网络算法原理(15页).doc(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-BP神经网络算法原理-第 15 页BP网络模型处理信息的基本原理是:输入信号Xi通过中间节点(隐层点)作用于输出节点,经过非线形变换,产生输出信号Yk,网络训练的每个样本包括输入向量X和期望输出量t,网络输出值Y与期望输出值t之间的偏差,通过调整输入节点与隐层节点的联接强度取值Wij和隐层节点与输出节点之间的联接强度Tjk以及阈值,使误差沿梯度方向下降,经过反复学习训练,确定与最小误差相对应的网络参数(权值和阈值),训练即告停止。此时经过训练的神经网络即能对类似样本的输入信息,自行处理输出误差最小的经过非线形转换的信息。 一 BP神经网络模型BP网络模型包括其输入输出模型、作用函数模型、误差
2、计算模型和自学习模型。(1)节点输出模型隐节点输出模型:Oj=f(WijXi-q j) (1)输出节点输出模型:Yk=f(TjkOj-q k) (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)自学习模型神经网络的学习过程,即连接下层节点和上层节点之
3、间的权重拒阵Wij的设定和误差修正过程。BP网络有师学习方式-需要设定期望值和无师学习方式-只需输入模式之分。自学习模型为 Wij(n+1)= h iOj+aWij(n) (5)h -学习因子;i-输出节点i的计算误差;Oj-输出节点j的计算输出;a-动量因子。二 BP网络模型的缺陷分析及优化策略(1)学习因子h 的优化采用变步长法根据输出误差大小自动调整学习因子,来减少迭代次数和加快收敛速度。h =h +a(Ep(n)- Ep(n-1)/ Ep(n) a为调整步长,01之间取值 (6)(2)隐层节点数的优化 隐 节点数的多少对网络性能的影响较大,当隐节点数太多时,会导致网络学习时间过长,甚至
4、不能收敛;而当隐节点数过小时,网络的容错能力差。利用逐步回归分析 法并进行参数的显著性检验来动态删除一些线形相关的隐节点,节点删除标准:当由该节点出发指向下一层节点的所有权值和阈值均落于死区(通常取0.1、0.05等区间)之中,则该节点可删除。最佳隐节点数L可参考下面公式计算:L=(m+n)1/2+c (7)m-输入节点数;n-输出节点数;c-介于110的常数。(3)输入和输出神经元的确定利用多元回归分析法对神经网络的输入参数进行处理,删除相关性强的输入参数,来减少输入节点数。(4)算法优化由于BP算法采用的是剃度下降法,因而易陷于局部最小并且训练时间较长。用基于生物免疫机制地既能全局搜索又能
5、避免未成熟收敛的免疫遗传算法IGA取代传统BP算法来克服此缺点。该程序实现神经网络的BP算法,输入节点数,输出节点数,隐层数,隐层节点数任意,由用户决定。其中隐层数指的是总共曾数包含输出层,比如说异或算法为2层,第一层节点数为2,第二层也即输出层节点数为1,输入点数为2 。但是该程序对异或算法实现并不理想,对多层多节点的神经网络有较好的结果。#include iostream.h#include #include #include#include #include stdio.h #define MAXCOUNT 1e5 /迭代训练次数上限float randf()return (float)
6、(rand() % 1001) * 0.001f-0.5);/高斯随机数产生函数double gaussrand() static double V1, V2, S; static int phase = 0; double X; if(phase = 0) do double U1 = (double)rand() / RAND_MAX; double U2 = (double)rand() / RAND_MAX; V1 = 2 * U1 - 1; V2 = 2 * U2 - 1; S = V1 * V1 + V2 * V2; while(S = 1 | S = 0); X = V1 * s
7、qrt(-2 * log(S) / S); else X = V2 * sqrt(-2 * log(S) / S); phase = 1 - phase; return X;/定义一个多层前向BP网络class BPpublic:double *p;/记录所有的权值double *ddp;/记录所有的权值增量int *pnode;/记录每一层的节点数double *pnodey;/记录每组每一层的节点的输出值double *ddlj;/记录每组每一层的节点的ddljdouble *pX;/记录输入样本double *pY;/记录输入理想输出值int Sidenum;int Inputnoden
8、um;int outputnodenum;int yangbenzushu;BP() Sidenum=0;Inputnodenum=0;outputnodenum=0;yangbenzushu=0;BP() for(int m=0;mSidenum;m+) for(int n=0;npnodem+1;n+) delete pmn; delete ddpmn; delete pm; delete ddpm; delete p; delete ddp; p=NULL; ddp=NULL;if(p=NULL)delete pnode;for(int M=0;MSidenum;M+)delete pn
9、odeyM;delete ddljM;delete pnodey;delete ddlj;pnodey=NULL;ddlj=NULL;/完成所有权值的初始化void getW(int sidenum,int inputnodenum,int outputnodenum1,int yangbenzu) Sidenum=sidenum; yangbenzushu= yangbenzu; Inputnodenum=inputnodenum;outputnodenum=outputnodenum1;p=new double *sidenum;ddp=new double *sidenum;pnode=
10、new int sidenum+1;/包含输入层输出层每一层的节点数for(int i=0;isidenum+1;i+)int data=0;cout请输入第i层节点数data; pnodei=data;for (int j=0;jsidenum;j+) pj=new double* pnodej+1; ddpj=new double*pnodej+1; for (int k=0;kpnodej+1;k+) ddpjk=new doublepnodej+1; pjk=new doublepnodej+1; for (int t=0;tpnodej+1;t+) ddpjkt=0;/每一层的权值初
11、始化为0 if(t=0)pjkt=-fabs(randf();/每一层的阀值初始化 else pjkt=randf();/每一层的权值初始化 /为记录每一层的节点的输出值和ddlj的指针开辟内存pnodey=new double *Sidenum;ddlj=new double *Sidenum;for(int p=0;pSidenum;p+) pnodeyp = new double pnodep+1+1; ddljp=new double pnodep+1; pnodeyp0=1;/每组每层的首值为1/*/每个节点输出函数double fas(double s) double t;t=1.
12、0/(exp(-s)+1);return t;/*/该函数用来记录样本值和理想输出值void INPUT(int yangbenzushu1 ) pY=new double*yangbenzushu1;pX=new double*yangbenzushu1;for(int yu=0;yuyangbenzushu1;yu+) pXyu=new doubleInputnodenum+1; pYyu=new doubleoutputnodenum+1;/每组样本的首值赋为1 for(int yu1=0;yu1yangbenzushu1;yu1+) pXyu10=1; pYyu10=1; cout请输
13、出样本输入值endl;for(int yuy=0;yuyyangbenzushu1;yuy+)for(int yy=1;yy=Inputnodenum;yy+) if(yy=Inputnodenum) coutendl; coutXyuyyy=pXyuyyy;cout请输出样本理想输出值endl;for(int yuy1=0;yuy1yangbenzushu1;yuy1+)for(int yy1=1;yy1=outputnodenum;yy1+) /if(yy=Inputnodenum) coutendl; coutYyuy1yy1=pYyuy1yy1;/*/计算每个节点的输出值函数doubl
14、e computeYl(int KK)/KK代表第几组组号 double sum1=0;/把所有的层的每一个节点的输出值算出来并记录在 pnodey里,不包含输入点值 for(int y=0;ySidenum;y+)/层数 for(int r=1;rpnodey+1+1;r+)/节点数 double sum=0; for(int z=0;zpnodey+1;z+)/前一层的节点数 if(y=0)sum+= pXKKz*pyr-1z; else sum+=pnodeyy-1z*pyr-1z; pnodeyyr=fas(sum); for(int j=1;j=outputnodenum;j+)su
15、m1+=pow(pYKKj-pnodeySidenum-1j,2);return sum1;/*/Compute Back-Propagation-Errorsvoid ComputeBackPropagationErrors(int gf)/gf代表组号/计算所有的ddlj/for(int gf=0;gf=0;q-)/从最后一层开始 if (q=Sidenum-1)/如果是最外一层的话 for(int rt=0;rtpnodeq+1;rt+)/每层的节点数 ddljqrt=pnodeyqrt+1*(1-pnodeyqrt+1)*(pYgfrt+1-pnodeyqrt+1) ; else fo
16、r(int ry=0;rypnodeq+1;ry+) double sumtemp=0; for(int fg=0;fgpnodeq+2;fg+) sumtemp+=ddljq+1fg*pq+1fgry+1; ddljqry = pnodeyqry+1*(1-pnodeyqry+1)* sumtemp; /计算所有的ddp/for(int gf1=0;gf1yangbenzushu;gf1+)/组数 for(int l=0;lSidenum;l+)/层数 for(int JJ=0;JJpnodel+1;JJ+)/每一层的节点数 for(int i=0;ipnodel+1;i+)/前一层的节点数
17、 if(l=0)/如果是第一层的话,y值为输入的X值 ddplJJi=ddljlJJ*pXgfi; else ddplJJi=ddljlJJ*pnodeyl-1i; /*/void UpdatetheWeightsusingBPAlgorithm() for(int cent=0;centSidenum;cent+)/层数 for(int J=0;Jpnodecent+1;J+)/每一层的节点数 for(int i=0;ipnodecent+1;i+)/前一层的节点数 pcentJi+=0.2*ddpcentJi;/*/double xunlianErrors()/定义训练误差函数 doubl
18、e error=0; double sum=0; double temp=0; double temp1=0;for(int gf1=0;gf1yangbenzushu;gf1+)/组数temp= computeYl(gf1); /temp1=zhengquelv(gf1); /sum+=temp1;for(int jj=1;jj=outputnodenum;jj+) coutpnodeySidenum-1jj; error+=temp;/ sum=sum/yangbenzushu; cout用训练集所得到的正确率:sumendl;return error/yangbenzushu;/*/do
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- BP 神经网络 算法 原理 15
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内