2022年Bp网络算法源代码 .pdf

上传人:Che****ry 文档编号:27259890 上传时间:2022-07-23 格式:PDF 页数:9 大小:57.75KB
返回 下载 相关 举报
2022年Bp网络算法源代码 .pdf_第1页
第1页 / 共9页
2022年Bp网络算法源代码 .pdf_第2页
第2页 / 共9页
点击查看更多>>
资源描述

《2022年Bp网络算法源代码 .pdf》由会员分享,可在线阅读,更多相关《2022年Bp网络算法源代码 .pdf(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、#include #include #include #include #define IN 2 / 输入向量维数#define OUT 2 / 输出向量维数#define NUM 20 / 样本数量#define Loop_MAX 262140 / 最大循环次数#define dot_MAX 20 / 最大结点个数typedef struct /bp 人工神经网络结构 int dot; / 隐层节点数double vINdot_MAX; / 输入层权矩阵double udot_MAXdot_MAX; / 隐藏层权矩阵double wdot_MAXOUT; / 输出层权矩阵double rat

2、e; / 学习率double error; / 允许误差限bp_net; double vIN3=0.5,0.4,0.1,0.2,0.6,0.2; / 题目要求的权矩阵double u33=0.10,0.55,0.35,0.20,0.45,0.35,0.25,0.15,0.60; / 同上double w3OUT=0.30,0.35,0.35,0.25,0.45,0.30; / 同上double fnet(double net) /Sigmoid 函数 return 1/(1+exp(-net); void Initialize_Bp(bp_net *bp) / 初始化 bp 网络 print

3、f( 请输入隐层结点数:n); scanf(%d, &(*bp).dot); printf( 请输入学习率:n); scanf(%lf, &(*bp).rate); printf( 请输入允许误差限:n); scanf(%lf, &(*bp).error); int i, j,flag; start: printf( 请选择权矩阵输入形式:n1 、随机产生权矩阵n2 、手动输入权矩阵n3 、名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - -

4、 - - 载入题目要求权矩阵n); scanf(%d,&flag); if(flag=1) srand(unsigned)time(NULL); / 随机函数产生随机权矩阵for (i = 0; i IN; i+) for (j = 0; j (*bp).dot; j+) (*bp).vij = rand() / (double)(RAND_MAX); for (i = 0; i (*bp).dot; i+) for (j = 0; j (*bp).dot; j+) (*bp).uij = rand() / (double)(RAND_MAX); for (i = 0; i (*bp).dot

5、; i+) for (j = 0; j OUT; j+) (*bp).wij = rand() / (double)(RAND_MAX); else if(flag=2) printf( 输入权矩阵: n); for (i = 0; i IN; i+) for (j = 0; j (*bp).dot; j+) scanf(%lf,&(*bp).vij); printf( 隐藏权矩阵:n); for (i = 0; i (*bp).dot; i+) for (j = 0; j (*bp).dot; j+) scanf(%lf,&(*bp).uij); printf( 输出权矩阵: n); for

6、 (i = 0; i (*bp).dot; i+) for (j = 0; j OUT; j+) scanf(%lf,&(*bp).wij); else if(flag=3) for (i = 0; i IN; i+) for (j = 0; j 3; j+) (*bp).vij = vij; for (i = 0; i 3; i+) for (j = 0; j 3; j+) (*bp).uij = uij; for (i = 0; i 3; i+) for (j = 0; j OUT; j+) (*bp).wij = wij; printf( 载入完成! n); else 名师资料总结 -

7、- -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 9 页 - - - - - - - - - printf( 输入错误!请重新输入!n); goto start; printf( 初始化输入权矩阵:n); for (i = 0; i IN; i+) for (j = 0; j (*bp).dot; j+) printf(%lf ,(*bp).vij); printf(n); printf( 初始化隐藏层权矩阵:n); for (i = 0; i (*bp).dot; i+) for (j =

8、 0; j (*bp).dot; j+) printf(%lf ,(*bp).uij); printf(n); printf( 初始化输出权矩阵:n); for (i = 0; i (*bp).dot; i+) for (j = 0; j OUT; j+) printf(%lf ,(*bp).wij); printf(n); printf(n); void Train_Bp(bp_net *bp, double xNUMIN, int yNUMOUT) / 训练 bp 网络 double e = (*bp).error; / 允许误差限double rate = (*bp).rate; / 学

9、习率int dot = (*bp).dot; / 隐藏层结点double vINdot_MAX,wdot_MAXOUT,udot_MAXdot_MAX; / 权矩阵double Error_Inputdot_MAX,Error_hiderdot_MAX, Error_OutputOUT; / 各个结点的反向误差double Inputdot_MAX,hiderdot_MAX,OutputOUT; / 各个层的结点输出int i,j,k,n,flag; /flag为是否继续修改权矩阵标志量double temp; for (i = 0; i IN; i+) / 复制结构体中的权矩阵for (j

10、= 0; j dot; j+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - vij = (*bp).vij; for (i = 0; i dot; i+) for (j = 0; j dot; j+) uij = (*bp).uij; for (i = 0; i dot; i+) for (j = 0; j OUT; j+) wij = (*bp).wij; for (n = 0;nLoop_MAX; n+) / 反向误差计

11、算 flag=1; for (i= 0; i NUM; i+) for (k= 0; k dot; k+) / 计算输入层输出向量 temp = 0; for (j = 0; j IN; j+) temp += xij * vjk; Inputk = fnet(temp); for (k= 0; k dot; k+) / 计算隐藏层输出向量 temp = 0; for (j = 0; j dot; j+) temp +=Inputj * ujk; hiderk = fnet(temp); for (k = 0; k OUT; k+) / 计算输出层输出向量 temp = 0; for (j =

12、 0; j dot; j+) temp += hiderj * wjk; Outputk = fnet(temp); for (j = 0; j OUT ; j+) / 测试结果与是否在误差范围内 if(fabs(yij-Outputj)e) continue; / 如果满足精度要求,则继续测试下一个结点的情况else 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - - - - - - - - flag=0; / 修改了权矩阵for (j = 0; j O

13、UT; j+) Error_Outputj = yij - Outputj; for (j = 0; j dot; j+) / 计算隐层权修改量 temp = 0; for (k = 0; k OUT; k+) temp += wjk * Error_Outputk; Error_hiderj = temp * hiderj * (1-hiderj); for (j = 0; j dot; j+) / 修改输出层权矩阵for (k = 0; k OUT; k+) wjk += rate * hiderj * Error_Outputk; for(j = 0;j dot;j +) / 计算输入层

14、修改量 temp = 0; for(k = 0;k dot; k+) temp += ujk * Error_hiderk; Error_Inputj= temp * Inputj * (1-Inputj); for (j = 0; j dot; j+) / 修改隐藏层权矩阵for (k = 0; k dot; k+) ujk += rate * Inputj * Error_hiderk; for(j = 0;j IN; j+) / 修改输入层权矩阵for(k =0 ;k dot;k +) vjk += rate * xij * Error_Inputk; if(!flag) continu

15、e; / 若 flag=0,标明修改了权矩阵,需重新训练实例直到满足精度条件else / 相反,当所有实例均循环一次后,仍未修改权矩阵,标明满足要求,结束循环break; printf( 总共循环次数:%dn, n); printf(n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - printf( 修改后的输入权矩阵:n); / 输出修改后的输入层权矩阵for (i = 0; i IN; i+) for (j = 0; j

16、 dot; j+) printf(%f , vij); printf(n); printf( 修改后的隐藏层权矩阵:n); / 输出修改后的隐藏层权矩阵for (i = 0; i dot; i+) for (j = 0; j dot; j+) printf(%f , uij); printf(n); printf( 修改后的输出层权矩阵:n); / 输出修改后的输出权矩阵for (i = 0; i dot; i+) for (j = 0; j OUT; j+) printf(%f , wij); printf(n); for (i = 0; i IN; i+) / 将修改后的输入层权矩阵返回给

17、bp 结构体for (j = 0; j dot; j+) (*bp).vij = vij; for (i = 0; i dot; i+) / 将修改后的隐藏层权矩阵返回给bp 结构体for (j = 0; j dot; j+) (*bp).uij = uij; for (i = 0; i dot; i+) / 将修改后的输出层权矩阵返回给 bp 结构体for (j = 0; j OUT; j+) (*bp).wij = wij; printf(bp 网络训练结束!n); void Test_Bp(bp_net *bp) / 使用 bp 网络测试结果 float InputIN; / 输入实例名

18、师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 9 页 - - - - - - - - - double Output_Indot_MAX; / 输入层输出double Output_Hidot_MAX; / 隐藏层输出double Output_OuOUT; / 输出层输出double temp; while (1) printf( 请输入一个实例:n); int i, j; for (i = 0; i IN ; i+) scanf(%f, &Inputi); for (

19、i = 0; i (*bp).dot; i+) / 计算输入层输出 temp = 0; for (j = 0; j IN; j+) temp += Inputj * (*bp).vji; Output_Ini = fnet(temp); for (i = 0; i (*bp).dot; i+) / 计算隐藏层输出 temp = 0; for (j = 0; j (*bp).dot; j+) temp += Output_Inj * (*bp).uji; Output_Hii = fnet(temp); for (i = 0; i OUT; i+) / 计算输出层输出 temp = 0; for

20、 (j = 0; j (*bp).dot; j+) temp += Output_Hij * (*bp).wji; Output_Oui = fnet(temp); printf(bp 网络计算结果:n); printf(n); for (i = 0; i =1) printf( 肯定是! n); else switch(int)(Output_Oui*10) case 0:printf( 肯定不是! );break; case 1:printf( 稍稍像是! );break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名

21、师精心整理 - - - - - - - 第 7 页,共 9 页 - - - - - - - - - case 2:printf( 有点像是! );break; case 3:printf( 有些像是! );break; case 4:printf( 比较像是! );break; case 5:printf( 差不多是! );break; case 6:printf( 相当是! );break; case 7:printf( 很是! );break; case 8:printf( 极是! );break; case 9:printf( 几乎是! );break; printf(n); void

22、main(void) double xNUMIN= / 训练样本 0.05,0.02, 0.09,0.11, 0.12,0.20, 0.15,0.22, 0.20,0.25, 0.75,0.75, 0.80,0.83, 0.82,0.80, 0.90,0.89, 0.95,0.89, 0.09,0.04, 0.10,0.10, 0.14,0.21, 0.18,0.24, 0.22,0.28, 0.77,0.78, 0.79,0.81, 0.84,0.82, 0.94,0.93, 0.98,0.99, ; int yNUMOUT = / 理想输出 1,0, 1,0, 1,0, 名师资料总结 -

23、- -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 9 页 - - - - - - - - - 1,0, 1,0, 0,1, 0,1, 0,1, 0,1, 0,1, 1,0, 1,0, 1,0, 1,0, 1,0, 0,1, 0,1, 0,1, 0,1, 0,1, ; bp_net bp; / 定义 bp 结构体Initialize_Bp(&bp); / 初始化 bp 网络结构Train_Bp(&bp, x, y); / 训练 bp 神经网络Test_Bp(&bp); / 测试 bp 神经网络 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁