通用的B-P人工神经网络程序

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

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

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

资源描述

Matlab程序:只需要修改输入p1和输出t1的数据就可以直接进行训练,别忘修改输入结点和隐层结点、输出结点的数目。p1=[0.134118212400671.020.51.485.53101200;0.1412321165.873.91.0201.5791.32.9110199.99;0.16123152000891.060.51.2452001200.001;0.1306.519189949.51.0101.6732.62.5000200;0.12305201600891.0602903.2000200;0.14506.519170089101.78565000200;0.134124812003710.51.3370.67101200;0.161181340231.0211.9890.7101200;0.0902231000191.200.7120.2000200;0.110325700211.1801.02170.2000200;];t1=[1000;1000;1000;0010;0010;0010;0100;0100;0001;0001;];p=p1';t=t1';[pn,minp,maxp,tn,mint,maxt]=premnmx(p,t)%设置网络隐单元的神经元数(5~30验证后5个最好)n=10;%建立相应的BP网络pauseclcnet=newff(minmax(pn),[10,4],{'tansig','purelin'},'traingdm');net.trainParam.show=50;net.trainParam.lr=0.7;net.trainParam.mc=0.9;net.trainParam.epochs=200000;net.trainParam.goal=1e-5;pauseclc%调用TRAINGDM算法训练BP网络net=train(net,pn,tn);%对BP网络进行仿真A=sim(net,pn);E=A-tn;M=sse(E)N=mse(E)pauseclcp2=[0.134118212400671.020.51.485.53101200];p2=p2';p2n=tramnmx(p2,minp,maxp);a2n=sim(net,p2n);a2=postmnmx(a2n,mint,maxt)echooffpauseC语言程序:修改数据即可→#includestdlib.h#includemath.h#includestdio.h#includetime.h#defineOUT_COUT4//输出向量维数#defineIN_COUT15//输入向量维数#defineCOUT10//样本数量typedefstruct{//bp人工神经网络结构inth;//实际使用隐层数量doublev[IN_COUT][50];//隐藏层权矩阵i,隐层节点最大数量为100doublew[50][OUT_COUT];//输出层权矩阵doublea;//学习率doubleb;//精度控制参数intLoopCout;//最大循环次数}bp_nn;doublefnet(doublenet){//Sigmoid函数,神经网络激活函数return1/(1+exp(-net));}intInitBp(bp_nn*bp){//初始化bp网络printf(请输入隐层节点数,最大数为100:\n);scanf(%d,&(*bp).h);printf(请输入学习率:\n);scanf(%lf,&(*bp).a);//(*bp).a为double型数据,所以必须是lfprintf(请输入精度控制参数:\n);scanf(%lf,&(*bp).b);printf(请输入最大循环次数:\n);scanf(%d,&(*bp).LoopCout);inti,j;srand((unsigned)time(NULL));for(i=0;iIN_COUT;i++)for(j=0;j(*bp).h;j++)(*bp).v[i][j]=rand()/(double)(RAND_MAX);for(i=0;i(*bp).h;i++)for(j=0;jOUT_COUT;j++)(*bp).w[i][j]=rand()/(double)(RAND_MAX);return1;}intTrainBp(bp_nn*bp,floatx[COUT][IN_COUT],inty[COUT][OUT_COUT]){//训练bp网络,样本为x,理想输出为ydoublef=(*bp).b;//精度控制参数doublea=(*bp).a;//学习率inth=(*bp).h;//隐层节点数doublev[IN_COUT][50],w[50][OUT_COUT];//权矩阵doubleCh_v[IN_COUT][50],Ch_w[50][OUT_COUT];//权矩阵修改量doubleChgH[50],ChgO[OUT_COUT];//修改量矩阵doubleO1[50],O2[OUT_COUT];//隐层和输出层输出量intLoopCout=(*bp).LoopCout;//最大循环次数inti,j,k,n;doubletemp;for(i=0;iIN_COUT;i++)//复制结构体中的权矩阵for(j=0;jh;j++)v[i][j]=(*bp).v[i][j];for(i=0;ih;i++)for(j=0;jOUT_COUT;j++)w[i][j]=(*bp).w[i][j];doublee=f+1;for(n=0;ef&&nLoopCout;n++){//对每个样本训练网络e=0;for(j=0;jOUT_COUT;j++)ChgO[j]=0;for(j=0;jh;j++)ChgH[j]=0;for(j=0;jh;j++)for(k=0;kOUT_COUT;k++)Ch_w[j][k]=0;for(j=0;jIN_COUT;j++)for(k=0;kh;k++)Ch_v[j][k]=0;for(i=0;iCOUT;i++){for(k=0;kh;k++){//计算隐层输出向量temp=0;for(j=0;jIN_COUT;j++)temp=temp+x[i][j]*v[j][k];O1[k]=fnet(temp);}for(k=0;kOUT_COUT;k++){//计算输出层输出向量temp=0;for(j=0;jh;j++)temp=temp+O1[j]*w[j][k];O2[k]=fnet(temp);}for(j=0;jOUT_COUT;j++)//计算输出误差e=e+(y[i][j]-O2[j])*(y[i][j]-O2[j]);for(j=0;jOUT_COUT;j++)ChgO[j]=O2[j]*(1-O2[j])*(y[i][j]-O2[j]);for(j=0;jh;j++)for(k=0;kOUT_COUT;k++)Ch_w[j][k]+=a*O1[j]*ChgO[k];//累加所有样本训练后的改变量for(j=0;jh;j++){temp=0;for(k=0;kOUT_COUT;k++)temp=temp+w[j][k]*ChgO[k];ChgH[j]=temp*O1[j]*(1-O1[j]);}for(j=0;jIN_COUT;j++)for(k=0;kh;k++)Ch_v[j][k]+=a*x[i][j]*ChgH[k];//累加所有样本训练后的改变量,消除样本顺序影响}for(j=0;jh;j++)//修改输出层权矩阵for(k=0;kOUT_COUT;k++)w[j][k]=w[j][k]+Ch_w[j][k];for(j=0;jIN_COUT;j++)//修改隐藏层权矩阵for(k=0;kh;k++)v[j][k]=v[j][k]+Ch_v[j][k];if(n%10==0){printf(误差:%f\n,e);printf(循环次数:%d\n,n);}}printf(总共循环次数:%d\n,n);printf(调整后的隐层权矩阵:\n);for(i=0;iIN_COUT;i++){for(j=0;jh;j++)printf(%f,v[i][j]);printf(\n);}printf(调整后的输出层权矩阵:\n);for(i=0;ih;i++){for(j=0;jOUT_COUT;j++)printf(%f,w[i][j]);printf(\n);}for(i=0;iIN_COUT;i++)//把结果复制回结构体for(j=0;jh;j++)(*bp).v[i][j]=v[i][j];for(i=0;ih;i++)for(j=0;jOUT_COUT;j++)(*bp).w[i][j]=w[i][j];printf(bp网络训练结束!\n);return1;}intUseBp(bp_nn*bp){//使用bp网络floatInput[IN_COUT];doubleO1[50];doubleO2[OUT_COUT];//O1为隐层输出,O2为输出层输出while(1){//持续执行,除非中断程序printf(请输入15个数:\n);inti,j;for(i=0;iIN_COUT;i++)scanf(%f,&Input[i]);doubletemp;for(i=0;i(*bp).h;i++){temp=0;for(j=0;jIN_COUT;j++)temp+=Input[j]*(*bp).v[j][i];O1[i]=fnet(temp);}for(i=0;iOUT_COUT;i++){temp=0;for(j=0;j(*bp).h;j++)temp+=O1[j]*(*bp).w[j][i];O2[i]=fnet(temp);}printf(结果:);for(i=0;iOUT_COUT;i++)printf(%.3f,O2[i]);printf(\n);}return1;}intmain(){floatx[COUT][IN_COUT]={{0.251,1,0.4545,0.6667,1,0.3714,-0.8,0,0.0769,0.8537,0.1667,1,-1,1,0},{0.4286,1,0.9091,0.6667,-1,0.5686,-0.8,-1,0.3385,1,0.1250,1,1,-1,0},{1,1,0.9091,0.1667,0.6419,1,-0.4,0,-0.2308,-0.1677,-0.25,-1,-1,1,0},{0.1429,-1,-0.5909,0.5,0.5515,-0.1286,-0.9,-1,0.4923,-0.4805,-0.0417,-1,-1,-1,0},{-0.0571,-1,-0.7273,0.5833,0.2839,1,-0.4,-1,1,0.9672,0.25,-1,-1,-1,0},{0.5714,-1,-0.5909,0.5,0.3734,1,-1,-1,0.6615,0.1097,1,-1,-1,-1,0},{0.2571,1,1,-0.4167,-0.0742,-0.4857,-1,0,-0.0769,-0.3695,-0.8042,1,-1,1,0},{1,1,0.4545,-1,-0.8441,-0.8557,-0.8,1,0.8462,0.942,-0.7917,1,-1,1,0},{-1,-1,-1,0.8333,-0.2532,-1,1,-1,-1,-1,-1,-1,-1,-1,0},{-0.4286,-1,-0.9091,1,-0.5218,-0.9429,0.8,-1,-0.5077,-0.8739,-1,-1,-1,-1,0}};//训练样本inty[COUT][OUT_COUT]={{1,0,0,0},{1,0,0,0},{1,0,0

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

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

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

×
保存成功