神经网络的BP算法C语言实现_第1页
神经网络的BP算法C语言实现_第2页
神经网络的BP算法C语言实现_第3页
神经网络的BP算法C语言实现_第4页
神经网络的BP算法C语言实现_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/BP算法简单实现,C语言代码可运行,详细注释/代码存放文件本文用的绝对路径,会报错,请自行更改路径或者改成相对路径/#include #include #include #include #define input 2 /输入层 #define hidden 10 /隐层 #define output 1 /输出层 #define sampleNum 90 /样本容量 #define test 10 /测试集容量 #define nr 0.1 /学习效率 #define EPS 0.00001 float xsampleNuminput,dsampleNumoutput,whiinputhidden,wijhiddenoutput,thihidden,thjoutput; /x是输入的值,d是输出的值,whi是权值, int h,i,j,k,ff; double testdata12;float xmininput,xmaxinput,dminoutput,dmaxoutput; FILE *fp1,*fp2,*fp3,*fp4; void init(void); void startleaning(void); void testsample(void); void readw(void); void readt(void); void writew(void); float sigmoid(float a); double ranu(void); void init(void) int min,max; if(fp1=0) system(cls); printf(Can not find the learning sample file!n); exit(0); for(k=0;ksampleNum;k+) for(h=0;hinput;h+) fscanf(fp1,%f,&xkh); /神经网络输入 for(j=0;joutput;j+) fscanf(fp1,%f,&dkj); /神经网络输出 for(j=0;joutput;j+) min=1;max=1; for(k=0;ksampleNum;k+) if(dkjdmaxj) max=k; dminj=dminj; dmaxj=dmaxj; for(k=0;ksampleNum;k+) /神经网络输出归一化 dkj=(dkj-dminj)/(dmaxj-dminj); void startlearning(void) long int nt,n; float t,errorsampleNum,gerror,xjoutput,xihidden,yjoutput,yihidden,pxihidden,pxjoutput; float u0=0,u1=0,u2=0,u3=0; float v0,v1,v2,v3; for(i=0;ihidden;i+) for(h=0;hinput;h+) whihi=-0.8+1.6*ranu(); /whi为输入到隐藏层的权值 for(j=0;joutput;j+) wijij=-0.8+1.6*ranu(); /wij为隐藏层到输出的权值 thii=-0.5+ranu(); /thi为输入到隐藏层的bias for(j=0;joutput;j+) thjj=-0.5+ranu(); /thj为隐藏层到输出的bias /学习开始 printf(tnPlease enter the learning times:n); scanf(%ld,&nt); for(n=0;nnt;n+) /*nt为学习次数*/ gerror=0; for(k=0;ksampleNum;k+) /*单样本循环*/ for(i=0;ihidden;i+) t=0; for(h=0;hinput;h+) t+=whihi*xkh; xii=t+thii; /xi为输入层到隐藏层的权值和 yii=sigmoid(xii); /yi为函数变换后的输出层/隐层输出 for(j=0;joutput;j+) t=0; for(i=0;ihidden;i+) t+=wijij*yii; xjj=t+thjj; /xj为隐藏层到输出层的权值和 yjj=sigmoid(xjj); /yj为函数变换后的输出层 /输出层输出 for(j=0;joutput;j+) /pxj为输出层单样本点误差变化率 pxjj=yjj*(1-yjj)*(yjj-dkj); for(i=0;ihidden;i+) /pxi为隐层单样本点误差变化率 t=0; for(j=0;joutput;j+) t+=pxjj*wijij; pxii=yii*(1-yii)*t; for(j=0;joutput;j+) thjj=thjj-nr*pxjj; for(i=0;ihidden;i+) wijij=wijij-nr*pxjj*yii; /隐层到输出层权值修正,其中nr为步长 for(i=0;ihidden;i+) thii=thii-nr*pxii; for(h=0;hinput;h+) whihi=whihi-nr*pxii*xkh; /输入层到隐层权值修正,其中nr为步长 t=0; for(j=0;joutput;j+) t+=(yjj-dkj)*(yjj-dkj)/2.0; errork=t; gerror+=errork; /全局误差 g(lobal)error /单样本循环结束 if(gerrorEPS) break; writew(); fclose(fp2); int k=0; for(k=0;ksampleNum;k+) for(i=0;ihidden;i+) t=0; for(h=0;hinput;h+) t+=whihi*xkh; xii=t+thii; /xi为输入层到隐藏层的权值和 yii=sigmoid(xii); /yi为函数变换后的输出层/隐层输出 for(j=0;joutput;j+) t=0; for(i=0;ihidden;i+) t+=wijij*yii; xjj=t+thjj; /xj为隐藏层到输出层的权值和 yjj=sigmoid(xjj); /yj为函数变换后的输出层 printf(%f %f %fn,xk0,xk1,yj0*(dmax0-dmin0)+dmin0);while(1) printf(press any number to test Network,press C exit to use test.txtn);scanf(%lf%lf,&testdata00,&testdata01); if(getchar()=c) break; for(i=0;ihidden;i+) t=0; for(h=0;hinput;h+) t+=whihi*testdata0h; xii=t+thii; /xi为输入层到隐藏层的权值和 yii=sigmoid(xii); /yi为函数变换后的输出层/隐层输出 for(j=0;joutput;j+) t=0; for(i=0;ihidden;i+) t+=wijij*yii; xjj=t+thjj; /xj为隐藏层到输出层的权值和 yjj=sigmoid(xjj); /yj为函数变换后的输出层 printf(test:%fn,yj0*(dmax0-dmin0)+dmin0); / 学习循环结束 for(i=0;ihidden;i+) for(h=0;hhidden)%d%d=%fn,h,i,whihi); for(i=0;ihidden;i+) for(j=0;joutput)%d%d=%fn,i,j,wijij); for(i=0;ihidden)%d=%fn,i,thii); for(j=0;joutput)%d=%fn,j,thjj); printf(tnGlobal error=%fn,gerror); printf(Press any key to choose a next task!/n); getch(); void testsample(void) float txinput,t,xjoutput,xihidden,yjoutput,yihidden; if(fp2=0) printf(t can not find the weight file:w.txtn); exit(0); readw(); for(ff=0;fftest;ff+) for(h=0;hinput;h+) fscanf(fp3,%f,&txh); for(i=0;ihidden;i+) t=0; for(h=0;hinput;h+) t+=whihi*txh; xii=t+thii; yii=sigmoid(xii); for(j=0;joutput;j+) t=0; for(i=0;ihidden;i+) t+=wijij*yii; xjj=t+thjj; yjj=sigmoid(xjj); for(j=0;joutput;j+) yjj=yjj*(dmaxj-dminj)+dminj; fprintf(fp4,%fn,yjj); fclose(fp4); printf(tnThe result save in testreslut.txt?n); printf(Press any key to choose a next task!n); getch(); void writew(void) rewind(fp2); for(h=0;hinput;h+) for(i=0;ihidden;i+) fprintf(fp2,%8.3f ,whihi); fprintf(fp2,n); fprintf(fp2,n); for(i=0;ihidden;i+) fprintf(fp2,%8.3f ,thii); fprintf(fp2,nn); for(j=0;joutput;j+) for(i=0;ihidden;i+) fprintf(fp2,%8.3f ,wijij); fprintf(fp2,n); fprintf(fp2,n); for(j=0;joutput;j+) fprintf(fp2,%8.3f ,thjj); void readw(void) for(h=0;hinput;h+) for(i=0;ihidden;i+) fscanf(fp2,%f,&whihi); for(i=0;ihidden;i+) fscanf(fp2,%f,&thii); for(j=0;joutput;j+) for(i=0;ihidden;i+) fscanf(fp2,%f,&wijij); for(j=0;j1.0) return(xrand/m); else xrand=1.0; goto lp; void main() fp1=fopen(D:/BP/sample.txt,r); fp2=fopen(D:/BP/weight.txt,w+); fp3=fopen(D:/BP/test.txt,r+); fp4=fopen(D:/BP/testreslut.txt,w+); init(); while(1) system(cls); printf(tn choose a task.nn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论