BP算法的实现概要_第1页
BP算法的实现概要_第2页
BP算法的实现概要_第3页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、BP 算法的实现适合普通BP算法和改进型BP 带缓冲项 算法)/ 训练样本大概是这些 ( 每组前三个为 in 样本数据 后面为 out 结果 ) : /0 0 0 0.9 /0 0 1 0.1 /0 1 0 0.1 /0 1 1 0.9/1 0 0 0.1/1 0 1 0.9/1 1 0 0.9/1 1 1 0.1测试样本可以自己试试这些数据/0 0.1 0.9 (期望: 0.1 )/0.9 0.9 0.1(期望 0.9 )-分割线-#include stdlib.h#include math.h#include conio.h#include stdio.h#include time.h#d

2、efine N 8 /*学习样本个数 ( 测试样本个数 )*/#define IN 3 /*输入层神经元数目*/#define HN 2 /*隐层神经元数目 */#define ON 1 /*输出层神经元数目*/float PIN; /*单个样本输入数据*/float TON; /*单个样本教师数据*/float WHNIN; /*输入层至隐层权值*/float VONHN; /*隐层至输出层权值*/float XHN; /*隐层的输入 */float YON; /*输出层的输入 */float HHN; /*隐层的输出 */float OON; /*输出层的输出 */float YU_HNH

3、N; /*隐层的阈值 */float YU_ONON; /*输出层的阈值 */float err_mN; /*第 m个样本的总误差 */float a; /*输出层至隐层学习效率*/float b; /*隐层至输入层学习效率*/float alpha;/*/动量因子,改进型bp 算法使用 */float d_errON;/* k*/float e_errHN;/* j*/FILE *fp;/* 定义一个放学习样本的结构*/struct float inputIN;float teachON;Study_DataN;/* 定义一个放测试样本的结构*/struct float inputIN;fl

4、oat expectON;Test_DataN;/* 改进型 bp 算法用来保存每次计算的权值*/float old_WHNIN;float old_VONHN;int Start_Show()clrscr();printf(n*n);printf(*Welcome touse*n);printf(*this programof*n);printf(*calculating the BP*n);printf(*model!*n);printf(*Happy everyday!*n);printf(*n);printf(nnBefore starting,please read the foll

5、ows carefully:nn);printf( The program of BP can study itself for no more than 200000 times.nAnd surpassing the number,the program will be ended by itself innpreventing runninginfinitely because of error!n);printf(nnn);printf(Now press any key to start.n);getch();clrscr();int End_Show()printf(nn-n);p

6、rintf(Theprogram has reached the end successfully!nnPressany key to exit!nn);printf(n*n);printf(*This is theend*n);printf(* of the program which*n);printf(* can calculate the BP*n);printf(*model!*n);printf(*n);printf(*Thanks forusing!*n);printf(*Happy everyday!*n);printf(*n);getch();exit(0);/* 读取训练样

7、本*/GetTrainingData()int i,j,m;float datr;if(fp=fopen(sample.txt,r)=NULL)printf(Cannot open file strike any key exit!);getch();exit(1);for(i=0;iIN-1) Study_Datai.teachj-IN=datr;elseStudy_Datai.inputj=datr;/*printf(ntheStudy_Data%d.input%d=%fn %f,i,j,Study_Datai.inputj,datr);getch();*/ /*use to check

8、the loaded training datas*/j+;fclose(fp);printf(nThereare%d sample datasthathave been loadedsuccessfully!n,N*(IN+ON);printf(nShow the data which has been loaded as follows:n);for(m=0;mN;m+)for(i=0;iIN;i+)printf(Study_Data%d.input%d=%f,m,i,Study_Datam.inputi);for(j=0;jON;j+)printf(Study_Data%d.teach%

9、d=%f,m,j,Study_Datam.teachj);printf(nnnPress any key to begin Study.);getch();clrscr();return 1;/* 初始化权、阈值子程序*/initial()int i;int ii;int j;int jj;int k;int kk;printf(nRandsom Weight value and Bias value as follow:n);srand(time(NULL);/*随机函数种子*/printf(nWeight Value:n);for(i=0;iHN;i+) for(j=0;jIN;j+)Wi

10、j=(float)(rand ()/32767.0 )* 2-1 )/2);/*初始化输入层到隐层的权值,随机模拟0.5-0.5 */printf(nw%d%d=%f,i,j,Wij);for(ii=0;iiON;ii+) for(jj=0;jjHN;jj+)Viijj= (float)(rand ()/32767.0 )* 2-1 )/2);/*初始化隐层到输出层的权值,随机模拟0.5-0.5 */printf(nV%d%d=%f,ii,jj,Viijj);printf(nnBias Value:n);for(k=0;kHN;k+) YU_HNk = 1.0;/* 隐层阈值初始化,-0.01

11、 0.01之间 */printf(nYU_HN%d=%f,k,YU_HNk);for(kk=0;kkON;kk+) YU_ONkk = 1.0;/* 输出层阈值初始化,-0.01 0.01之间 */printf(nYU_ON%d=%fn,kk,YU_ONkk);printf(nnnnnPress any key to start culculating.:n);getch();clrscr();printf(Please wait.);return 1;/* 第 m个学习样本输入子程序*/input_P(int m) int i,j;for(i=0;iIN;i+)Pi=Study_Datam.

12、inputi;return 1;/* 第 m个样本教师信号子程序*/input_T(int m)int k;for(k=0;kON;k+)Tk=Study_Datam.teachk;return 1;/* 求净输入,输出*/IN_OUT()float sigma1,sigma2;int i,j,ii,jj;for(i=0;iHN;i+)sigma1=0.0;for(j=0;jIN;j+)sigma1+=Wij*Pj;/*Xi=sigma1+YU_HNi;Hi=1.0/(1.0+exp(-Xi);求隐层内积*/for(ii=0;iiON;ii+) sigma2=0.0;for(jj=0;jjHN

13、;jj+)sigma2+=Viijj*Hjj;Yii=sigma2+YU_ONii;Oii=1.0/(1.0+exp(-Yii);return 1;/* 误差分析 */* k*/int Err_O_H(int m)int k;float abs_errON;float sqr_err=0.0;for (k=0;kON;k+)abs_errk=Tk-Ok;sqr_err+=(abs_errk)*(abs_errk);d_errk=abs_errk*Ok*(1.0-Ok);err_mm=sqr_err/2;return 1;/* j*/int Err_H_I()int j,k;float sigm

14、a;for(j=0;jHN;j+) sigma=0.0;for(k=0;kON;k+)sigma+=d_errk*Vkj;e_errj=sigma*Hj*(1-Hj);return 1;/* 总误差 */float Err_Sum()int m;float total_err=0.0;for(m=0;mN;m+)total_err+=err_mm;return total_err;/* 新旧权值更新量交替- 改进型Bp 算法 */saveWV()int i;int ii;int j;int jj;for(i=0;iHN;i+)for(j=0;jIN;j+)old_Wij =b*e_erri*P

15、j;for(ii=0;iiON;ii+)for(jj=0;jjHN;jj+)old_Viijj =a*d_errii*Hjj;return 1;/* 更新权值,阈值*/* 输出层 */int Delta_O_H(int n,int study)int k,j;if(n=1)|(study=1)for (k=0;kON;k+)for (j=0;jHN;j+)Vkj=Vkj+a*d_errk*Hj;YU_ONk+=a*d_errk;elsefor (k=0;kON;k+)for (j=0;jHN;j+)Vkj=Vkj+(1.0-alpha)*a*d_errk*Hj+alpha*old_Vkj;YU

16、_ONk+=a*d_errk;return 1;/* 隐层 */Delta_H_I(int n,int study)int i,j;if(n=1)|(study=1)for (j=0;jHN;j+)for (i=0;iIN;i+)Wji=Wji+b*e_errj*Pi;YU_HNj+=b*e_errj;elsefor(j=0;jHN;j+)for(i=0;iIN;i+)Wji=Wji+(1.0-alpha)*b*e_errj*Pi+alpha*old_Wji;YU_HNj+=b*e_errj;return 1;/* 保存更新 */void savequan() int i,j,k;int ii

17、,jj,kk;/*save weight*/if(fp=fopen(weight.txt,a)=NULL)printf(Cannot open file strike any key exit!);getch();exit(1);for(i=0;iHN;i+)for(j=0;jIN;j+)fprintf(fp,W%d%d=%fn,i,j,Wij); fprintf(fp,n);for(ii=0;iiON;ii+)for(jj=0;jjHN;jj+)fprintf(fp,V%d%d=%fn,ii,jj,Viijj);fclose(fp);printf(nThe result of weight.

18、txt(quanzhi) has been saved successfully!); /*save limit*/if(fp=fopen(limit.txt,a)=NULL)printf(Cannot open file strike any key exit!);getch();exit(1);for(k=0;kON;k+)fprintf(fp,YU_ON%d=%fn,k,YU_ONk);for(kk=0;kkHN;kk+) fprintf(fp,YU_HN%d=%fn,kk,YU_HNkk); fclose(fp);printf(nThe result of limit.txt(yuzh

19、i) has been savedsuccessfully!nnnnnPress any key to Test.);getch();clrscr();/* 读取测试样本*/GetTestData()int i,j,m;float datr;if(fp=fopen(test.txt,r)=NULL)printf(Cannot open file strike any key exit!);getch();exit(1);for(i=0;iIN-1) Test_Datai.expectj-IN=datr;elseTest_Datai.inputj=datr;j+;fclose(fp);print

20、f(nThereare %d testdatasthathave been loadedsuccessfully!n,N*(IN+ON);printf(nShow the data which has been loaded as follows:n);for(m=0;mN;m+)for(i=0;iIN;i+)printf(Test_Data%d.input%d=%f,m,i,Test_Datam.inputi);for(j=0;jON;j+)printf(Test_Data%d.expec%d=%f,m,j,Test_Datam.expectj);printf(nnnnPress any k

21、ey to culculating.);getch();clrscr();return 1;/* 样本测试及结果*/Test()int i,j,k,m;float net1HN,net2ON,H_netHN,O_netON;for(m=0;mN;m+)for(i=0;iHN;i+)net1i=0.0;for(j=0;jIN;j+)net1i+=Test_Datam.inputj*Wij;net1i=net1i+YU_HNi;H_neti=1.0/(1.0+exp(-net1i);for(k=0;kON;k+)net2k=0.0;for(j=0;jHN;j+)net2k+=H_netj*Vkj;

22、net2k=net2k+YU_ONk;O_netk=1.0/(1.0+exp(-net2k);printf(nTest result%d=%fn,m,O_netk);/* 直接输入测试*/OnlineSet()char s;printf(nnnnIf you want to test the data you inputted now,press Y(or other buttonexcept Q);nOr press Q to quit Test!n);while(1)s=getch();switch(s) case Q:clrscr();End_Show();default:Online_

23、Test();break;printf(nTocontinuetestingpressY(or otherbuttonexceptQ);nOrpressQ to quit Test!n);getch();Online_Test()int i,j,k;float datr,TSIN;float net1HN,net2ON,H_netHN,O_netON;printf(nPlease Input %d test datas with a space between each two datas:n,IN); for(i=0;iIN;i+)scanf(%f,&datr);TSi=datr;for(i=0;iHN;i+)net1i=0.0;for(j=0;jIN;j+)net1i+=TSj*Wij;net1i=net1i+YU_HNi;H_neti=1.0/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论