您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > BP神经网络编程(基于C语言)
#includeiostream#includestdlib.h#includemath.h#includestdio.h#includetime.h#definega35//泛化数据组数#definea60//训练数据组数#defineni5//输入维数#defineno1//输出维数#definen10//隐含层节点数目#definenr1000voidmain(){doubledatai[a][ni];//导入训练数据到二维数组doubledatao[a][no];//输出数据FILE*fp1,*fp2,*fp3,*fp4,*fp5,*fp6,*fp7,*fp8,*fp9,*fp10,*fp11;fp1=fopen(训练输入.txt,r);fp3=fopen(训练误差.txt,wt);fp4=fopen(RECALL误差.txt,wt);fp5=fopen(RECALL输出.txt,wt);fp6=fopen(泛化输入.txt,r);fp7=fopen(泛化理想输出.txt,r);fp8=fopen(泛化误差.txt,wt);fp10=fopen(训练输出处理.txt,wt);fp11=fopen(泛化理想输出处理.txt,wt);inti,j,k;for(i=0;ia;i++)//读入外部样本数据{for(j=0;jni;j++)fscanf(fp1,%lf,&datai[i][j]);for(j=0;jno;j++)fscanf(fp1,%lf,&datao[i][j]);fscanf(fp1,\n);}fclose(fp1);//数据归化过程doublemaxi[ni];doublemini[ni];doublemaxo[no];doublemino[no];doubleb,d;for(i=0;ini;i++)//求输入最大最小值{b=datai[0][i];d=datai[0][i];for(j=1;ja;j++){if(datai[j][i]b)b=datai[j][i];if(datai[j][i]d)d=datai[j][i];}maxi[i]=b;mini[i]=d;}doublex[a][ni],y[a][no];for(i=0;ini;i++){for(j=0;ja;j++)x[j][i]=(datai[j][i]-mini[i])/(maxi[i]-mini[i]);}for(i=0;ino;i++)//求输出最大最小值{b=datao[0][i];d=datao[0][i];for(j=1;ja;j++){if(datao[j][i]b)b=datao[j][i];if(datao[j][i]d)d=datao[j][i];}maxo[i]=b;mino[i]=d;}for(i=0;ino;i++){for(j=0;ja;j++)y[j][i]=(datao[j][i]-mino[i])/(maxo[i]-mino[i]);}//训练过程%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%doublew1[ni][n],w2[n][no],e[nr][no];//初始化权值误差矩阵srand(time(0));intaa;for(i=0;ini;i++){for(j=0;jn;j++){aa=rand()%100;w1[i][j]=aa*0.01;}}for(i=0;in;i++){for(j=0;jno;j++){aa=rand()%100;w2[i][j]=aa*0.01;}}for(i=0;inr;i++){for(j=0;jno;j++)e[i][j]=0;}doubler1=0.7;//学习速率intz,L;doubleys[a][no];for(z=0;znr;z++){for(L=0;La;L++){doublep,s,q,r;doublec[n];for(i=0;in;i++)c[i]=0;doubleu1[n],v1[n];//第一层向前for(i=0;in;i++){p=0;for(j=0;jni;j++){q=w1[j][i]*x[L][j];p=p+q;}u1[i]=p;v1[i]=1/(1+exp(-u1[i]));}//第二层向前doubleu2[no];for(i=0;ino;i++){s=0;for(j=0;jn;j++){r=w2[j][i]*v1[j];s=s+r;}u2[i]=s;ys[L][i]=1/(1+exp(-u2[i]));}//第一次误差反传doubled2[n][no],dw2[n][no];for(i=0;in;i++){for(j=0;jno;j++){d2[i][j]=ys[L][j]*(1-ys[L][j])*(y[L][j]-ys[L][j]);dw2[i][j]=r1*d2[i][j]*v1[i];w2[i][j]=w2[i][j]+dw2[i][j];}}//第二次误差反传doubledc,d1[ni][n],dw1[ni][n];for(i=0;in;i++){for(j=0;jno;j++){dc=w2[i][j]*d2[i][j];c[i]=c[i]+dc;}}for(i=0;ini;i++){for(j=0;jn;j++){d1[i][j]=v1[j]*(1-v1[j])*c[j];dw1[i][j]=r1*d1[i][j]*x[L][i];w1[i][j]=w1[i][j]+dw1[i][j];}}}//数据反归一化doubleysr[a][no];for(i=0;ino;i++){for(j=0;ja;j++)ysr[j][i]=ys[j][i]*(maxo[i]-mino[i])+mino[i];}//训练误差doubleg;for(k=0;kno;k++){g=0;for(i=0;ia;i++){g=fabs((ysr[i][k]-datao[i][k])/datao[i][k]);e[z][k]=e[z][k]+g;}e[z][k]=e[z][k]/a;}for(i=0,j=0;ino;i++){if(e[z][i]=0)j++;}if(j==no)break;}for(i=0;ino;i++){for(j=0;jnr;j++){fprintf(fp3,%lf,e[j][i]);fprintf(fp3,\n);}fprintf(fp3,\n);}fclose(fp3);//权值for(i=0;ini;i++){for(j=0;jn;j++)printf(%lf,w1[i][j]);}printf(\n);for(i=0;in;i++){for(j=0;jno;j++)printf(%lf,w2[i][j]);}//RECALL过程¨¬---------------------------------------doublerys[a][no];for(L=0;La;L++){doublerp,rq,ru1[n],rv1[n];for(i=0;in;i++){rp=0;for(j=0;jni;j++){rq=w1[j][i]*x[L][j];rp=rp+rq;}ru1[i]=rp;rv1[i]=1/(1+exp(-ru1[i]));}//第二层向前doubleu2[no],rs,rr;for(i=0;ino;i++){rs=0;for(j=0;jn;j++){rr=w2[j][i]*rv1[j];rs=rs+rr;}u2[i]=rs;rys[L][i]=1/(1+exp(-u2[i]));}}doublerysr[a][no];for(i=0;ino;i++){for(j=0;ja;j++)rysr[j][i]=ys[j][i]*(maxo[i]-mino[i])+mino[i];}//RECALL误¨®差?doublere[a][no];for(k=0;kno;k++){for(i=0;ia;i++)re[i][k]=fabs((rysr[i][k]-datao[i][k])/datao[i][k]);}for(i=0;ino;i++){for(j=0;ja;j++){fprintf(fp4,%lf,re[j][i]);fprintf(fp4,\n);}fprintf(fp4,\n);}fclose(fp4);//回?想?输º?出?for(i=0;ino;i++){for(j=0;ja;j++){fprintf(fp5,%lf,rysr[j][i]);fprintf(fp5,\n);}fprintf(fp5,\n);}fclose(fp5);//泛化过程-------------------------------------------------doublegdatai[ga][ni];//导入训¦Ì练数据到二维数组doublegdatao[ga][no];//输出数据for(i=0;iga;i++)//读入外部样本数据{for(j=0;jni;j++)fscanf(fp6,%lf,&gdatai[i][j]);for(j=0;jno;j++)fscanf(fp6,%lf,&gdatao[i][j]);fscanf(fp6,\n);}fclose(fp6);doublegmaxi[ni];doublegmini[ni];doublegmaxo[no];doublegmino[no];doublegb,gd;for(i=0;ini;i++)//求输入最大最小值{gb=gdatai[0][i];gd=gdatai[0][i];for(j=1;jga;j++){if(gdatai[j][i]gb)gb=gdatai[j][i];if(gdatai[j][i]gd)gd=gdatai[j][i];}gmaxi[i]=gb;gmini[i]=gd;}doublegx[ga][ni],gy[ga][no];for(i=0;ini;i++){for(j=0;jga;j++)gx[j][i]=(gdatai[j][i]-gmini[i])/(gmaxi[i]-gmini[i]);}for(i=0;ino;i++)//求输出最大最小值{gb=gdatao[0][i];gd=gdatao[0][i];for(j=1;jga;j++){if(gdatao[j][i]gb)gb=gdatao[j][i];if(gdatao[j][i]gd)gd=gdatao[j][i];}gmaxo[i]=gb;gmino[i]=gd;}//第一层向前doublegys[ga][no];for(L=0;Lga;L++){doublegp,gq,gu1[n],gv1[n];for(i=0;in;i++){gp=0;for(j=0;jni;j++){gq=w1[j][i]*gx[L][j];gp=gp+gq;}gu1[i]=gp;gv1[i]=1/(1+exp(-gu1[i]));}//第二层向前doublegu2[no],gs,gr;for(i=0;ino;i++){gs=0;for(j=0;jn;j++){gr=w2[j][i]*gv1[j];gs=gs+gr;}gu2[i]=gs;gys[L][i]=1/(1+exp(-gu2[i]));}}doublegysr[ga][no];for(i=0;ino;i++){for(j=0;jga;j++)gysr[j][i]=gys[j][i]*(gmaxo[i]-gmino[i])+gmino[i];}//泛化误差doublege[a][no];for(k=0;kno;k++){for(i=0;iga;i++)ge[i][k]=fabs((gysr[i][k]-gdatao
本文标题:BP神经网络编程(基于C语言)
链接地址:https://www.777doc.com/doc-4222853 .html