您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 神经网络的BP算法C语言实现
//BP算法简单实现,C语言代码可运行,详细注释//代码存放文件本文用的绝对路径,会报错,请自行更改路径或者改成相对路径///////////////////////////////////////////#includestdio.h#includemath.h#includeconio.h#includestdlib.h#defineinput2//输入层#definehidden10//隐层#defineoutput1//输出层#definesampleNum90//样本容量#definetest10//测试集容量#definenr0.1//学习效率#defineEPS0.00001floatx[sampleNum][input],d[sampleNum][output],whi[input][hidden],wij[hidden][output],thi[hidden],thj[output];//x是输入的值,d是输出的值,whi是权值,inth,i,j,k,ff;doubletestdata[1][2];floatxmin[input],xmax[input],dmin[output],dmax[output];FILE*fp1,*fp2,*fp3,*fp4;voidinit(void);voidstartleaning(void);voidtestsample(void);voidreadw(void);voidreadt(void);voidwritew(void);floatsigmoid(floata);doubleranu(void);voidinit(void){intmin,max;if(fp1==0){system(cls);printf(Cannotfindthelearningsamplefile!\n);exit(0);}for(k=0;ksampleNum;k++){for(h=0;hinput;h++)fscanf(fp1,%f,,&x[k][h]);//神经网络输入for(j=0;joutput;j++)fscanf(fp1,%f,,&d[k][j]);//神经网络输出}for(j=0;joutput;j++){min=1;max=1;for(k=0;ksampleNum;k++){if(d[k][j]d[min][j])min=k;if(d[k][j]d[max][j])max=k;}dmin[j]=d[min][j];dmax[j]=d[max][j];for(k=0;ksampleNum;k++)//神经网络输出归一化d[k][j]=(d[k][j]-dmin[j])/(dmax[j]-dmin[j]);}}voidstartlearning(void){longintnt,n;floatt,error[sampleNum],gerror,xj[output],xi[hidden],yj[output],yi[hidden],pxi[hidden],pxj[output];floatu0=0,u1=0,u2=0,u3=0;floatv0,v1,v2,v3;for(i=0;ihidden;i++){for(h=0;hinput;h++)whi[h][i]=-0.8+1.6*ranu();//whi为输入到隐藏层的权值for(j=0;joutput;j++)wij[i][j]=-0.8+1.6*ranu();//wij为隐藏层到输出的权值thi[i]=-0.5+ranu();//thi为输入到隐藏层的bias}for(j=0;joutput;j++)thj[j]=-0.5+ranu();//thj为隐藏层到输出的bias//学习开始printf(\t\nPleaseenterthelearningtimes:\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+=whi[h][i]*x[k][h];xi[i]=t+thi[i];//xi为输入层到隐藏层的权值和yi[i]=sigmoid(xi[i]);//yi为函数变换后的输出层//隐层输出}for(j=0;joutput;j++){t=0;for(i=0;ihidden;i++)t+=wij[i][j]*yi[i];xj[j]=t+thj[j];//xj为隐藏层到输出层的权值和yj[j]=sigmoid(xj[j]);//yj为函数变换后的输出层}//输出层输出for(j=0;joutput;j++)//pxj为输出层单样本点误差变化率pxj[j]=yj[j]*(1-yj[j])*(yj[j]-d[k][j]);for(i=0;ihidden;i++)//pxi为隐层单样本点误差变化率{t=0;for(j=0;joutput;j++)t+=pxj[j]*wij[i][j];pxi[i]=yi[i]*(1-yi[i])*t;}for(j=0;joutput;j++){thj[j]=thj[j]-nr*pxj[j];for(i=0;ihidden;i++){wij[i][j]=wij[i][j]-nr*pxj[j]*yi[i];//隐层到输出层权值修正,其中nr为步长}}for(i=0;ihidden;i++){thi[i]=thi[i]-nr*pxi[i];for(h=0;hinput;h++){whi[h][i]=whi[h][i]-nr*pxi[i]*x[k][h];//输入层到隐层权值修正,其中nr为步长}}t=0;for(j=0;joutput;j++)t+=(yj[j]-d[k][j])*(yj[j]-d[k][j])/2.0;error[k]=t;gerror+=error[k];//全局误差g(lobal)error}//单样本循环结束if(gerrorEPS)break;}writew();fclose(fp2);intk=0;for(k=0;ksampleNum;k++){for(i=0;ihidden;i++){t=0;for(h=0;hinput;h++)t+=whi[h][i]*x[k][h];xi[i]=t+thi[i];//xi为输入层到隐藏层的权值和yi[i]=sigmoid(xi[i]);//yi为函数变换后的输出层//隐层输出}for(j=0;joutput;j++){t=0;for(i=0;ihidden;i++)t+=wij[i][j]*yi[i];xj[j]=t+thj[j];//xj为隐藏层到输出层的权值和yj[j]=sigmoid(xj[j]);//yj为函数变换后的输出层}printf(%f%f%f\n,x[k][0],x[k][1],yj[0]*(dmax[0]-dmin[0])+dmin[0]);}while(1){printf(pressanynumbertotestNetwork,press'C'exittousetest.txt\n);scanf(%lf%lf,&testdata[0][0],&testdata[0][1]);if(getchar()=='c')break;for(i=0;ihidden;i++){t=0;for(h=0;hinput;h++)t+=whi[h][i]*testdata[0][h];xi[i]=t+thi[i];//xi为输入层到隐藏层的权值和yi[i]=sigmoid(xi[i]);//yi为函数变换后的输出层//隐层输出}for(j=0;joutput;j++){t=0;for(i=0;ihidden;i++)t+=wij[i][j]*yi[i];xj[j]=t+thj[j];//xj为隐藏层到输出层的权值和yj[j]=sigmoid(xj[j]);//yj为函数变换后的输出层}printf(test:%f\n,yj[0]*(dmax[0]-dmin[0])+dmin[0]);}//学习循环结束for(i=0;ihidden;i++){for(h=0;hinput;h++)printf(W(input-hidden)[%d][%d]=%f\n,h,i,whi[h][i]);}for(i=0;ihidden;i++){for(j=0;joutput;j++)printf(W(hidden-output)[%d][%d]=%f\n,i,j,wij[i][j]);}for(i=0;ihidden;i++)printf(bias(input-hidden)[%d]=%f\n,i,thi[i]);for(j=0;joutput;j++)printf(bias(hidden-output)[%d]=%f\n,j,thj[j]);printf(\t\nGlobalerror=%f\n,gerror);printf(Pressanykeytochooseanexttask!/n);getch();}voidtestsample(void){floattx[input],t,xj[output],xi[hidden],yj[output],yi[hidden];if(fp2==0){printf(\tcannotfindtheweightfile:w.txt\n);exit(0);}readw();for(ff=0;fftest;ff++){for(h=0;hinput;h++)fscanf(fp3,%f,,&tx[h]);for(i=0;ihidden;i++){t=0;for(h=0;hinput;h++)t+=whi[h][i]*tx[h];xi[i]=t+thi[i];yi[i]=sigmoid(xi[i]);}for(j=0;joutput;j++){t=0;for(i=0;ihidden;i++)t+=wij[i][j]*yi[i];xj[j]=t+thj[j];yj[j]=sigmoid(xj[j]);}for(j=0;joutput;j++){yj[j]=yj[j]*(dmax[j]-dmin[j])+dmin[j];fprintf(fp4,%f\n,yj[j]);}}fclose(fp4);printf(\t\nTheresultsaveintestreslut.txt?\n);printf(Pressanykeytochooseanexttask!\n);getch();}voidwritew(void){rewind(fp2);for(h=0;hinput;h++){for(i=0;ihidden;i++)fprintf(fp2,%8.3f,whi[h][i]);fprintf(fp2,\n);}fprintf(fp2,\n);for(i=0;ihidden;i++)fprintf(fp2,%8.3f,thi[i]);fprintf(fp2,\n\n);for(j=0;joutput;j++){for(i=0;ihidden;i++)fprintf(fp2,%8.3f,wij[i][j]);fprintf(fp2,\n);}fprintf(fp2,\n);for(j=0;joutput;j++)fprintf(fp2,%8.3f,thj[j]);}voidreadw(void){for(h=0;hinput;h++)for(i=0;ihidden;i++)fscanf(fp2,%f,&whi[h][i]);for(i=0;ihidden;i++)fscanf(fp2,%f,&thi[i]);for(j=0;joutput;j++)for(i=0;ihidden;i++)f
本文标题:神经网络的BP算法C语言实现
链接地址:https://www.777doc.com/doc-4224100 .html