《BP神经网络实现异或功能(C++)》由会员分享,可在线阅读,更多相关《BP神经网络实现异或功能(C++)(13页珍藏版)》请在金锄头文库上搜索。
1、真诚为您提供优质参考资料,若有不当之处,请指正。#include iostream.h#include iomanip.h#include stdlib.h#include math.h#include stdio.h#include time.h#include fstream.h#define N 4 /学习样本个数#define T_N 4 /检验样本的个数#define IN 2 /输入层神经元数目#define HN 3 /隐层神经元数目#define ON 1 /输出层神经元数目/一般化误差数组double delta_ONNON;double delta_HNNHN;/ doub
2、le delta_INNIN;/ double PIN; /单个样本输入数据double PNIN; /单个样本输入数据/ double TON; /单个样本教师数据double TNON; /单个样本教师数据double WHNIN; /输入层至隐层权值double VONHN; /隐层至输出层权值double XHN; /隐层的输入double YON; /输出层的输入/ double HHN; /隐层的输出double HNHN; /隐层的输出double OON; /输出层的输出double YU_HNHN; /隐层的阈值double YU_ONON; /输出层的阈值/ double
3、err_mN; /第m个样本的总误差double err_mNON; /第m个样本的总误差double sum_err_mN;double a1; /输出层至隐层的学习效率double a2;double b1; /隐层至输入层学习效率double b2;ofstream out_test_result( test_result.txt, ios:out );/定义一个放学习样本的结构struct double inputIN; /输入在上面定义是一个double teachON; /输出在上面定义也是一个Study_DataN;/学习样本/定义一个放检测样本的结构struct double
4、inputIN; /输入在上面定义是一个double teachON; /输出在上面定义也是一个Test_DataT_N;/检测样本 /初始化权、阈值子程序/initial()/隐层权、阈值初始化/srand( (unsigned)time( NULL ) );for(int i=0;iHN;i+)for(int j=0;jIN;j+)Wij= rand()/double(RAND_MAX);for(int ii=0;iiON;ii+)for(int jj=0;jjHN;jj+)Viijj=rand()/double(RAND_MAX);for(int k=0;kHN;k+)YU_HNk=ra
5、nd()/double(RAND_MAX);for(int kk=0;kkON;kk+)YU_ONkk=rand()/double(RAND_MAX); return 1;/子程序initial()结束/第m个学习样本输入子程序/Train_input_P(int m)for (int i=0;iIN;i+)Pmi=Study_Datam.inputi;/获得第m个样本的数据return 1;/子程序Train_input_P(m)结束Test_input_P(int m)for (int i=0;iIN;i+)Pmi=Test_Datam.inputi;/获得第m个样本的数据return 1
6、;/子程序Test_input_P(m)结束/第m个样本教师信号子程序/Train_input_T(int m)for (int k=0;kON;k+)Tmk=Study_Datam.teachk;return 1;/子程序Train_input_T(m)结束Test_input_T(int m)for (int k=0;kON;k+)Tmk=Test_Datam.teachk;return 1;/子程序Test_input_T(m)结束/隐层各单元输入、输出值子程序/H_I_O(int m)double sigma;for (int j=0;jHN;j+)sigma=0.0;for (int
7、 i=0;iIN;i+)sigma+=Wji*Pmi;/求隐层内积Xj=sigma - YU_HNj;Hmj=1.0/(1.0+exp(-Xj);/求隐层输出 siglon算法return 1;/子程序H_I_O()结束/输出层各单元输入、输出值子程序/O_I_O(int m)double sigma;for (int k=0;kON;k+)sigma=0.0;for (int j=0;jHN;j+)sigma+=Vkj*Hmj;Yk=sigma-YU_ONk; /求输出层净输入Ok=1.0/(1.0+exp(-Yk);/求输出层输出return 1;/子程序O_I_O()结束/输出层至隐层的
8、一般化误差子程序/ double d_errON;Err_O_H(int m)double abs_errON;/每个样本的绝对误差都是从0开始的double sqr_err=0;/每个样本的平方误差计算都是从0开始的sum_err_mm=0.0;for (int k=0;kON;k+)abs_errk=Tmk-Ok;sqr_err+=(abs_errk)*(abs_errk);/求第m个样本下输出层的平方误差delta_ONmk=abs_errk*Ok*(1.0-Ok);err_mmk=sqr_err/2;for(int j=0;jON;j+)sum_err_mm +=err_mmj;ret
9、urn 1;/子程序Err_O_H(m)结束/隐层至输入层的一般化误差子程序/ double e_errHN;Err_H_I(int m)double sigma;for (int j=0;jHN;j+) sigma=0.0;for (int k=0;kON;k+) sigma +=delta_ONmk*Vkj;delta_HNmj=sigma*Hmj*(1-Hmj);return 1;/子程序Err_H_I()结束/输出层至隐层的权值调整、输出层阈值调整计算子程序/Delta_O_H()for (int k=0;kON;k+)for (int j=0;jHN;j+)double temp1=
10、0.0;for(int m=0;mN;m+)temp1 +=delta_ONmk*Hmj;Vkj +=a1*temp1;double temp2=0.0;for(int i=0;iN;i+)temp2 +=delta_ONik;YU_ONk -=a2*temp2;/输出层至隐层的阈值调整return 1;/子程序Delta_O_H()结束/隐层至输入层的权值调整、隐层阈值调整计算子程序/ Delta_H_I(int m)Delta_H_I()for (int j=0;jHN;j+)for (int i=0;iIN;i+) double temp1=0.0;for(int m=0;mN;m+)temp1 +=delta_HNmj*Pmi;Wji +=b1*temp1;double temp2=0.0;for(int k=0;kN;k+)temp2 +=delta_HNkj;YU_HNj -=b2*temp2;