ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:24KB ,
资源ID:25178609      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25178609.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(BP神经网络算法基础学习知识原理.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

BP神经网络算法基础学习知识原理.docx

1、BP神经网络算法基础学习知识原理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 /迭代训练次数上限/ 精度0.001的随机浮点数,范围在-0.50.5flo

6、at randf()return (float)(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

7、= 1 | S = 0); X = V1 * sqrt(-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;/记录输入理想输出值in

8、t Sidenum;int Inputnodenum;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

9、=0;MSidenum;M+)delete pnodeyM;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=ne

10、w double *sidenum;pnode=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

11、+1;t+) ddpjkt=0;/每一层的权值初始化为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

12、(double s) double t;t=1.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+) pX

13、yu10=1; pYyu10=1; cout请输出样本输入值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=pYyuy1

14、yy1;/*/计算每个节点的输出值函数double 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

15、=1;j=outputnodenum;j+)sum1+=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+

16、1-pnodeyqrt+1) ; else for(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

17、=0;ipnodel+1;i+)/前一层的节点数 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 xunlia

18、nErrors()/定义训练误差函数 double 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

19、error/yangbenzushu;/*/double jiaoyanErrors(int yangbenzushu1 )/定义校验误差函数double error=0; double sum=0; double temp=0; double temp1=0;for(int gf1=0;gf1yangbenzushu1;gf1+)/组数temp= computeYl(gf1); for(int jj=1;jj=outputnodenum;jj+) coutpnodeySidenum-1jj; /temp1=zhengquelv(gf1); /sum+=temp1; error+=temp;/

20、sum=sum/yangbenzushu1; / cout用校验集所得到的正确率:sumendl;return error/yangbenzushu1;/*/double zhengquelv(int KK)int count=0; double av=0;/for(int gf1=0;gf1yangbenzushu;gf1+)/组数for(int jj=1;jj0) pnodeySidenum-1jj=1; else pnodeySidenum-1jj=0; if(pYKKjj=pnodeySidenum-1jj)count+; av=(double)count/outputnodenum;

21、return av;/*/void freeINput() if(pX!=NULL)for(int u=0;uyangbenzushu;u+) delete pXu; delete pX; pX=NULL;if(pY!=NULL)for(int u1=0;u1yangbenzushu;u1+) delete pYu1; delete pY; pY=NULL;/*/输出所有的权值void wputout() for (int j=0;jSidenum;j+) cout第j+1层权值为:endl; for (int k=0;kpnodej+1;k+) /if(k=pnodej+1-1) coute

22、ndl; for (int t=0;tpnodej+1;t+) coutpjkt ; if(t=pnodej) coutendl; /*/;void main()BP bp;int count=0;/用来统计所用的迭代次数/FILE *fp;int inputnodenum,outnodenum,sidenum,yangbenzunum;double error;cout请输入输入点数,输出点数,隐层数inputnodenumoutnodenumsidenum;cout请输入样本组数yangbenzunum;/第一步初始化所有的权值bp.getW(sidenum,inputnodenum,outnodenum,yangbenzunum);/第二步输入样本组bp.INPUT(yangbenzunum);for(;count+)double sum=0; double temp=0;for(int fuzu=0;fuzuyangbenzunum;fuzu+) /第三步计算所有y值temp=puteYl(fuzu);/第四步Compute Back-Propagation-Errorsbp.ComputeBackPropagationErrors(fuzu);/第五步Up

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1