c语言编bp算法及使用说明

上传人:wuy****ng 文档编号:132166103 上传时间:2022-08-08 格式:DOC 页数:14 大小:23.01KB
收藏 版权申诉 举报 下载
c语言编bp算法及使用说明_第1页
第1页 / 共14页
c语言编bp算法及使用说明_第2页
第2页 / 共14页
c语言编bp算法及使用说明_第3页
第3页 / 共14页
资源描述:

《c语言编bp算法及使用说明》由会员分享,可在线阅读,更多相关《c语言编bp算法及使用说明(14页珍藏版)》请在装配图网上搜索。

1、c语言编bp算法及使用说明训练样本数据文件sample.txt输入格式:(单样本对) (x1,x2,x3.xh,d1,d2,d3,.dj) 测试样本数据输入:(从键盘输入) x1,x2,x3.xh 屏幕输出:y1,y2,y3.yj 在确定网络结构以后,即可确定(输入层)nh,(隐层)ni,(输出层)nj,(样本容量)nk 每次使用之前请修改网络结构数据。 #include #include #include #include #define nh 4 /输入层节点个数#define ni 9 /隐层节点个数#define nj 3 /输出层节点个数#define nk 30 /样本个数#def

2、ine nr 0.85/*学习效率*/ #define EPS 0.00001 float xnknh,/每个样本在输入层每个节点的值dnknj,/ 每个样本在输出层每个节点的值whinhni ,/输入层和隐藏层每个节点的连接权重wijninj,/ 隐藏层和输出层的连接权重thini,thjnj;/ 隐藏层和输出层每个节点的阈植int h,i,j,k; float xminnh,xmaxnh,/存放输入层中每个属性节点的最小和最大值,便于归一化dminnj,dmaxnj; FILE *fp1,*fp2; void init(void); void startleaning(void); voi

3、d testsample(void); void readw(void); void writew(void); float sigmoid(float a); double ranu(void); void init(void) int min,max; if(fp1=0) clrscr(); printf(Can not find the learning sample file!n); exit(0); for(k=0;knk;k+) /对每一个输入样本进行处理,输入每个训练样本和类别信息 for(h=0;hnh;h+) fscanf(fp1,%f,&xkh); for(j=0;jnj;

4、j+) fscanf(fp1,%f,&dkj); for(h=0;hnh;h+) /对输入层的每个节点进行处理 min=1;max=1; for(k=0;knk;k+) /在输入层接点上,对每个样本 if(xkhxmaxh) max=k; xminh=xminh; /所有样本中h属性上最小的值 xmaxh=xmaxh; for(k=0;knk;k+)/*归一化*/ xkh=(xkh-xminh)/(xmaxh-xminh); for(j=0;jnj;j+) min=1;max=1; for(k=0;knk;k+) if(dkjdmaxj) max=k; dminj=dminj; dmaxj=d

5、maxj; for(k=0;knk;k+)/*归一化*/ dkj=(dkj-dminj)/(dmaxj-dminj); /*-*/ void startlearning(void) long int nt,n; float t,errornk,gerror,xjnj,xini,yjnj,yini,pxini,pxjnj; if(fp2=0) for(i=0;ini;i+) /初始化权重和阈值 for(h=0;hnh;h+) whi h i=-0.1+0.2*ranu(); for(j=0;jnj;j+) wiji j=-0.1+0.2*ranu(); thii=-0.1+0.2*ranu();

6、 for(j=0;jnj;j+) thjj=-0.1+0.2*ranu(); fp2=fopen(w.txt,w+); else readw(); /*学习开始*/ printf(tnPlease enter the learning times:n); scanf(%ld,&nt); for(n=0;nnt;n+) /*学习次数*/ gerror=0; for(k=0;knk;k+)/*单样本循环*/ for(i=0;ini;i+) t=0; for(h=0;hnh;h+) t+=whih i*xkh; xi=t+thi; 隐藏层的输入 yi=sigmoid(xi); 隐藏层的输出 for(

7、j=0;jnj;j+) t=0; for(i=0;ini;i+) t+=wijj*yi; xjj=t+thjj; yjj=sigmoid(xjj); 输出层的输出 for(j=0;jnj;j+)/*输出层单样本点误差变化率*/ pxjj=yjj*(1-yjj)*(yjj-dkj); for(i=0;ini;i+)/*隐层单样本点误差变化率*/ t=0; for(j=0;jnj;j+) t+=pxjj*wijj; pxi=yi*(1-yi)*t; for(j=0;jnj;j+) thjj=thjj-nr*pxjj; /输出层权重和阈值的更新for(i=0;ini;i+) wijj=wijj-nr

8、*pxjj*yi; for(i=0;ini;i+) thi=thi-nr*pxi; for(h=0;hnh;h+) whih=whih-nr*pxi*xkh; /隐藏层权重和阈值的更新 t=0; for(j=0;jnj;j+) t+=(yjj-dkj)*(yjj-dkj)/2.0; errork=t; /第 k个样本的误差gerror+=errork;/*全局误差 g(lobal)error*/ /*单样本循环结束*/ if(gerrorEPS) break; /* 学习循环结束*/ writew(); printf(tnGlobal error=%fn,gerror); printf(tnA

9、re you satisfied with the global error?n); printf(Press any key to choose a next task!n); getch(); /*-*/ void testsample(void) /测试float txnh,t,xjnj,xini,yjnj,yini; if(fp2=0) clrscr(); printf(tncan not find the weight file:w.txtn); exit(0); readw(); printf(tnPlease enter the test data:n); for(h=0;hnh

10、;h+) scanf(%f,&txh); for(h=0;hnh;h+) txh=(txh-xminh)/(xmaxh-xminh);/测试样本归一化 for(i=0;ini;i+) t=0; for(h=0;hnh;h+) t+=whih*txh; xi=t+thi; yi=sigmoid(xi); for(j=0;jnj;j+) t=0; for(i=0;ini;i+) t+=wijj*yi; xjj=t+thjj; yjj=sigmoid(xjj); printf(tnNetwork output:n); for(j=0;jnj;j+) yjj=yjj*(dmaxj-dminj)+dmi

11、nj; printf(%f ,yjj); printf(tnAre you satisfied with the output?n); printf(Press any key to choose a next task!n); getch(); /*-*/ void writew(void) rewind(fp2); for(h=0;hnh;h+) for(i=0;ini;i+) fprintf(fp2,%8.3f ,whih); fprintf(fp2,n); fprintf(fp2,n); for(i=0;ini;i+) fprintf(fp2,%8.3f ,thi); fprintf(

12、fp2,nn); for(j=0;jnj;j+) for(i=0;ini;i+) fprintf(fp2,%8.3f ,wijj); fprintf(fp2,n); fprintf(fp2,n); for(j=0;jnj;j+) fprintf(fp2,%8.3f ,thjj); /*-*/ void readw(void) for(h=0;hnh;h+) for(i=0;ini;i+) fscanf(fp2,%f,&whih); for(i=0;ini;i+) fscanf(fp2,%f,&thi); for(j=0;jnj;j+) for(i=0;ini;i+) fscanf(fp2,%f

13、,&wijj); for(j=0;j1.0) return(xrand/m); else xrand=1.0;goto lp; /*-*/ void main() fp1=fopen(sample.txt,r); fp2=fopen(w.txt,r+); init(); while(1) clrscr(); printf(tn Please choose a next task.nn); printf(tn (S) to start learning.n); printf(tn (T) to test samples.n); printf(tn (R) to resume learning.n); printf(tn (Q)uit.n); switch(getchar() case s: startlearning();break; case t: testsample();break; case r: startlearning();break; case q: exit(0);break; fclose(fp1); fclose(fp2);

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!