BP神经网络算法的C语言实现代码

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

//BP神经网络算法,c语言版本//VS2010下,无语法错误,可直接运行//添加了简单注释//欢迎学习交流#includestdlib.LayerNum#includemath.LayerNum#includestdio.LayerNum#includetime.LayerNum#defineN_Out2//输出向量维数#defineN_In3//输入向量维数#defineN_Sample6//样本数量//BP人工神经网络typedefstruct{intLayerNum;//中间层数量doublev[N_In][50];//中间层权矩阵i,中间层节点最大数量为50doublew[50][N_Out];//输出层权矩阵doubleStudyRate;//学习率doubleAccuracy;//精度控制参数intMaxLoop;//最大循环次数}BPNet;//Sigmoid函数doublefnet(doublenet){return1/(1+exp(-net));}//初始化intInitBpNet(BPNet*BP);//训练BP网络,样本为x,理想输出为yintTrainBpNet(BPNet*BP,doublex[N_Sample][N_In],inty[N_Sample][N_Out]);//使用BP网络intUseBpNet(BPNet*BP);//主函数intmain(){//训练样本doublex[N_Sample][N_In]={{0.8,0.5,0},{0.9,0.7,0.3},{1,0.8,0.5},{0,0.2,0.3},{0.2,0.1,1.3},{0.2,0.7,0.8}};//理想输出inty[N_Sample][N_Out]={{0,1},{0,1},{0,1},{1,1},{1,0},{1,0}};BPNetBP;InitBpNet(&BP);//初始化BP网络结构TrainBpNet(&BP,x,y);//训练BP神经网络UseBpNet(&BP);//测试BP神经网络return1;}//使用BP网络intUseBpNet(BPNet*BP){doubleInput[N_In];doubleOut1[50];doubleOut2[N_Out];//Out1为中间层输出,Out2为输出层输出//持续执行,除非中断程序while(1){printf(请输入3个数:\n);inti,j;for(i=0;iN_In;i++)scanf_s(%f,&Input[i]);doubleTmp;for(i=0;i(*BP).LayerNum;i++){Tmp=0;for(j=0;jN_In;j++)Tmp+=Input[j]*(*BP).v[j][i];Out1[i]=fnet(Tmp);}for(i=0;iN_Out;i++){Tmp=0;for(j=0;j(*BP).LayerNum;j++)Tmp+=Out1[j]*(*BP).w[j][i];Out2[i]=fnet(Tmp);}printf(结果:);for(i=0;iN_Out;i++)printf(%.3f,Out2[i]);printf(\n);}return1;}//训练BP网络,样本为x,理想输出为yintTrainBpNet(BPNet*BP,doublex[N_Sample][N_In],inty[N_Sample][N_Out]){doublef=(*BP).Accuracy;//精度控制参数doublea=(*BP).StudyRate;//学习率intLayerNum=(*BP).LayerNum;//中间层节点数doublev[N_In][50],w[50][N_Out];//权矩阵doubleChgH[50],ChgO[N_Out];//修改量矩阵doubleOut1[50],Out2[N_Out];//中间层和输出层输出量intMaxLoop=(*BP).MaxLoop;//最大循环次数inti,j,k,n;doubleTmp;for(i=0;iN_In;i++)//复制结构体中的权矩阵for(j=0;jLayerNum;j++)v[i][j]=(*BP).v[i][j];for(i=0;iLayerNum;i++)for(j=0;jN_Out;j++)w[i][j]=(*BP).w[i][j];doublee=f+1;//对每个样本训练网络for(n=0;ef&&nMaxLoop;n++){e=0;for(i=0;iN_Sample;i++){//计算中间层输出向量for(k=0;kLayerNum;k++){Tmp=0;for(j=0;jN_In;j++)Tmp=Tmp+x[i][j]*v[j][k];Out1[k]=fnet(Tmp);}//计算输出层输出向量for(k=0;kN_Out;k++){Tmp=0;for(j=0;jLayerNum;j++)Tmp=Tmp+Out1[j]*w[j][k];Out2[k]=fnet(Tmp);}//计算输出层的权修改量for(j=0;jN_Out;j++)ChgO[j]=Out2[j]*(1-Out2[j])*(y[i][j]-Out2[j]);//计算输出误差for(j=0;jN_Out;j++)e=e+(y[i][j]-Out2[j])*(y[i][j]-Out2[j]);//计算中间层权修改量for(j=0;jLayerNum;j++){Tmp=0;for(k=0;kN_Out;k++)Tmp=Tmp+w[j][k]*ChgO[k];ChgH[j]=Tmp*Out1[j]*(1-Out1[j]);}//修改输出层权矩阵for(j=0;jLayerNum;j++)for(k=0;kN_Out;k++)w[j][k]=w[j][k]+a*Out1[j]*ChgO[k];for(j=0;jN_In;j++)for(k=0;kLayerNum;k++)v[j][k]=v[j][k]+a*x[i][j]*ChgH[k];}if(n%10==0)printf(误差:%f\n,e);}printf(总共循环次数:%d\n,n);printf(调整后的中间层权矩阵:\n);for(i=0;iN_In;i++){for(j=0;jLayerNum;j++)printf(%f,v[i][j]);printf(\n);}printf(调整后的输出层权矩阵:\n);for(i=0;iLayerNum;i++){for(j=0;jN_Out;j++)printf(%f,w[i][j]);printf(\n);}//把结果复制回结构体for(i=0;iN_In;i++)for(j=0;jLayerNum;j++)(*BP).v[i][j]=v[i][j];for(i=0;iLayerNum;i++)for(j=0;jN_Out;j++)(*BP).w[i][j]=w[i][j];printf(BP网络训练结束!\n);return1;}//初始化intInitBpNet(BPNet*BP){printf(请输入中间层节点数,最大数为100:\n);scanf_s(%d,&(*BP).LayerNum);printf(请输入学习率:\n);scanf_s(%lf,&(*BP).StudyRate);//(*BP).StudyRate为double型数据,所以必须是lfprintf(请输入精度控制参数:\n);scanf_s(%lf,&(*BP).Accuracy);printf(请输入最大循环次数:\n);scanf_s(%d,&(*BP).MaxLoop);inti,j;srand((unsigned)time(NULL));for(i=0;iN_In;i++)for(j=0;j(*BP).LayerNum;j++)(*BP).v[i][j]=rand()/(double)(RAND_MAX);for(i=0;i(*BP).LayerNum;i++)for(j=0;jN_Out;j++)(*BP).w[i][j]=rand()/(double)(RAND_MAX);return1;}

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功