您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 神经网络BP算法程序C语言实现
/************************************************BackPropagationAlgorithm************************************************/#includestdio.h#includestdlib.h#includemath.h/************************************************TheDefinitionofUserData************************************************/#defineMAXINPUT1#defineMAXHIDE3#defineMAXOUTPUT1#defineMAX1#defineMIN-1#defineT100#defineCA4doublea=0.8;doubleb=0.05;doublek=0;doubleerror=0;intt=0;doublesout[MAXOUTPUT];doubleshide[MAXHIDE];doublem=2;doublehowchange[MAXHIDE][MAXOUTPUT];doubleihwchange[MAXINPUT][MAXHIDE];doubleCatalogueOut[CA][MAXOUTPUT];doubleCatalogueIn[CA][MAXINPUT];/************************************************TheDefinitionofDataStructure************************************************/structtheBP{doubleinput[MAXINPUT];doublehide[MAXHIDE];doubleoutput[MAXOUTPUT];doubleihw[MAXINPUT][MAXHIDE];doublehow[MAXHIDE][MAXOUTPUT];};structtheBPbpa;/************************************************DefinitionofPrototype************************************************/voidWeightInitial();voidInitialError();voidInPutCatalogue();voidCalculateOut(intk);voidCalculateError(intk);voidReverseHideError();voidCalculateChange();voidCalculateNewWeight();voidTest();voidTestCalculateOut();voidcamain();voidmain(){WeightInitial();//InitialError();InPutCatalogue();//dointm=0;while(1){printf(请选择要进行的操作\n);printf(0----------------学习\n);printf(1----------------测试\n);printf(2----------------退出\n);scanf(%d,&m);switch(m){case0:camain();break;case1:Test();break;case2:exit(0);}//while((error)k);;}}voidcamain(){for(t=0;tT;t++){for(intk=0;kCA;k++){CalculateOut(k);CalculateError(k);ReverseHideError();CalculateChange();CalculateNewWeight();}for(k=0;kCA;k++){CalculateOut(k);}}}/************************************************Function:initialtheweight************************************************/voidWeightInitial(){//产生输入层到隐藏层的权值for(inti=0;iMAXINPUT;i++){for(intj=0;jMAXHIDE;j++){bpa.ihw[i][j]=0.3;//((double)rand()/(double)(RAND_MAX))*(MAX-MIN)+MIN;}}//产生从隐藏层到输出层的权值for(i=0;iMAXHIDE;i++){for(intj=0;jMAXOUTPUT;j++){bpa.how[i][j]=0.2;//((double)rand()/(double)(RAND_MAX))*(MAX-MIN)+MIN;}}}/************************************************Function:inputtheCatalogue************************************************/voidInPutCatalogue(){for(intk=0;kCA;k++){printf(请输入第%d个样本的输入值:\n,k);for(inti=0;iMAXINPUT;i++){scanf(%lf,&bpa.input[i]);CatalogueIn[k][i]=bpa.input[i];}printf(请输入第%d个样本的输出值:\n,k);for(i=0;iMAXOUTPUT;i++){scanf(%lf,&CatalogueOut[k][i]);}}}/************************************************Function:calculatetheout************************************************/voidCalculateOut(intk){//计算隐藏层的输出for(intj=0;jMAXHIDE;j++){doublesum2=0;for(inti=0;iMAXINPUT;i++){bpa.input[i]=CatalogueIn[k][i];sum2+=bpa.ihw[i][j]*bpa.input[i];//计算输入}bpa.hide[j]=1/(1+exp(-sum2));//计算输出}//计算每输出层个单元的输入和输出for(j=0;jMAXOUTPUT;j++){doublesum3=0;for(inti=0;iMAXHIDE;i++){sum3+=bpa.how[i][j]*bpa.hide[i];//计算输入}bpa.output[j]=m*sum3;//计算输出bpa.output[j]=1/(1+exp(-sum3))printf(第%d个样本的最后输出%lf\n,k,bpa.output[j]);}}voidTestCalculateOut(){//计算隐藏层的输出for(intj=0;jMAXHIDE;j++){doublesum1=0;for(inti=0;iMAXINPUT;i++){sum1=sum1+bpa.ihw[i][j]*bpa.input[i];//计算输入}bpa.hide[j]=1/(1+exp(-sum1));//计算输出}//计算每输出层个单元的输入和输出for(j=0;jMAXOUTPUT;j++){doublesum2=0;for(inti=0;iMAXHIDE;i++){sum2=sum2+bpa.how[i][j]*bpa.hide[i];//计算输入}bpa.output[j]=m*sum2;//计算输出bpa.output[j]=1/(1+exp(sum2))printf(最后输出%lf\n,bpa.output[j]);}}/************************************************Function:对输出层Calculate************************************************/voidCalculateError(intk){doubletemp=0;error=0;for(inti=0;iMAXOUTPUT;i++){temp=(CatalogueOut[k][i]-bpa.output[i])*(CatalogueOut[k][i]-bpa.output[i]);error=(0.5)*temp+error;}for(i=0;iMAXOUTPUT;i++){sout[i]=(CatalogueOut[k][i]-bpa.output[i])*bpa.output[i]*(1-bpa.output[i]);}}/************************************************Function:从后向前对隐藏层************************************************/voidReverseHideError(){for(inti=0;iMAXHIDE;i++){doublesum=0;for(intj=0;jMAXOUTPUT;j++){sum+=sout[j]*bpa.how[i][j];}shide[i]=(bpa.hide[i])*(1-bpa.hide[i])*sum;}}/************************************************Function:Calculatethe权值的变化量************************************************/voidCalculateChange(){intj=0;//隐藏层到输出层for(inti=0;iMAXHIDE;i++){for(j=0;jMAXOUTPUT;j++){howchange[i][j]=a*(howchange[i][j])+b*(sout[i])*(bpa.hide[i]);//}}//对输入层到隐藏层for(i=0;iMAXINPUT;i++){for(j=0;jMAXHIDE;j++){ihwchange[i][j]=a*(ihwchange[i][j])+b*(shide[i])*(bpa.input[i]);//}}}/************************************************Function:Calculatethe新的权值************************************************/voidCalculateNewWeight(){intj=0;//隐藏层到输出层for(inti=0;iMAXHIDE;i++){for(j=0;jMAXOUTPUT;j++){bpa.how[i][j]=bpa.how[i][j]+howchange[i][j];}}//对输入层到隐藏层for(i=0;iMAXINPUT;i++){for(j=0;jMAXHIDE;j++){bpa.ihw[i][j]=bpa.ihw[i][j]+ihwchange[i][j];}}}voidTest(){printf(请输入测试数据的输入值:\n);for(inti=0;iMAXINPUT;i++){scanf(%lf,&bpa.input[i]);}TestCalculateOut();}
本文标题:神经网络BP算法程序C语言实现
链接地址:https://www.777doc.com/doc-4558091 .html