您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > BP神经网络实现异或功能(C++)
#includeiostream.h#includeiomanip.h#includestdlib.h#includemath.h#includestdio.h#includetime.h#includefstream.h#defineN4//学习样本个数#defineT_N4//检验样本的个数#defineIN2//输入层神经元数目#defineHN3//隐层神经元数目#defineON1//输出层神经元数目//一般化误差数组doubledelta_ON[N][ON];doubledelta_HN[N][HN];//doubledelta_IN[N][IN];//doubleP[IN];//单个样本输入数据doubleP[N][IN];//单个样本输入数据//doubleT[ON];//单个样本教师数据doubleT[N][ON];//单个样本教师数据doubleW[HN][IN];//输入层至隐层权值doubleV[ON][HN];//隐层至输出层权值doubleX[HN];//隐层的输入doubleY[ON];//输出层的输入//doubleH[HN];//隐层的输出doubleH[N][HN];//隐层的输出doubleO[ON];//输出层的输出doubleYU_HN[HN];//隐层的阈值doubleYU_ON[ON];//输出层的阈值//doubleerr_m[N];//第m个样本的总误差doubleerr_m[N][ON];//第m个样本的总误差doublesum_err_m[N];doublea1;//输出层至隐层的学习效率doublea2;doubleb1;//隐层至输入层学习效率doubleb2;ofstreamout_test_result(test_result.txt,ios::out);//定义一个放学习样本的结构struct{doubleinput[IN];//输入在上面定义是一个doubleteach[ON];//输出在上面定义也是一个}Study_Data[N];//学习样本//定义一个放检测样本的结构struct{doubleinput[IN];//输入在上面定义是一个doubleteach[ON];//输出在上面定义也是一个}Test_Data[T_N];//检测样本/////////////////////////////初始化权、阈值子程序////////////////////////////////initial(){//隐层权、阈值初始化//srand((unsigned)time(NULL));for(inti=0;iHN;i++)for(intj=0;jIN;j++)W[i][j]=rand()/double(RAND_MAX);for(intii=0;iiON;ii++)for(intjj=0;jjHN;jj++)V[ii][jj]=rand()/double(RAND_MAX);for(intk=0;kHN;k++)YU_HN[k]=rand()/double(RAND_MAX);for(intkk=0;kkON;kk++)YU_ON[kk]=rand()/double(RAND_MAX);return1;}//子程序initial()结束////////////////////////////////////第m个学习样本输入子程序//////////////////////////////////Train_input_P(intm){for(inti=0;iIN;i++)P[m][i]=Study_Data[m].input[i];//获得第m个样本的数据return1;}//子程序Train_input_P(m)结束Test_input_P(intm){for(inti=0;iIN;i++)P[m][i]=Test_Data[m].input[i];//获得第m个样本的数据return1;}//子程序Test_input_P(m)结束/////////////////////////////////第m个样本教师信号子程序///////////////////////////////Train_input_T(intm){for(intk=0;kON;k++)T[m][k]=Study_Data[m].teach[k];return1;}//子程序Train_input_T(m)结束Test_input_T(intm){for(intk=0;kON;k++)T[m][k]=Test_Data[m].teach[k];return1;}//子程序Test_input_T(m)结束///////////////////////////////////隐层各单元输入、输出值子程序////////////////////////////////////H_I_O(intm){doublesigma;for(intj=0;jHN;j++){sigma=0.0;for(inti=0;iIN;i++)sigma+=W[j][i]*P[m][i];//求隐层内积X[j]=sigma-YU_HN[j];H[m][j]=1.0/(1.0+exp(-X[j]));//求隐层输出siglon算法}return1;}//子程序H_I_O()结束/////////////////////////////////////输出层各单元输入、输出值子程序//////////////////////////////////////O_I_O(intm){doublesigma;for(intk=0;kON;k++){sigma=0.0;for(intj=0;jHN;j++)sigma+=V[k][j]*H[m][j];Y[k]=sigma-YU_ON[k];//求输出层净输入O[k]=1.0/(1.0+exp(-Y[k]));//求输出层输出}return1;}//子程序O_I_O()结束//////////////////////////////////////输出层至隐层的一般化误差子程序//////////////////////////////////////////doubled_err[ON];Err_O_H(intm){doubleabs_err[ON];//每个样本的绝对误差都是从0开始的doublesqr_err=0;//每个样本的平方误差计算都是从0开始的sum_err_m[m]=0.0;for(intk=0;kON;k++){abs_err[k]=T[m][k]-O[k];sqr_err+=(abs_err[k])*(abs_err[k]);//求第m个样本下输出层的平方误差delta_ON[m][k]=abs_err[k]*O[k]*(1.0-O[k]);err_m[m][k]=sqr_err/2;}for(intj=0;jON;j++)sum_err_m[m]+=err_m[m][j];return1;}//子程序Err_O_H(m)结束//////////////////////////////////////隐层至输入层的一般化误差子程序//////////////////////////////////////////doublee_err[HN];Err_H_I(intm){doublesigma;for(intj=0;jHN;j++){sigma=0.0;for(intk=0;kON;k++)sigma+=delta_ON[m][k]*V[k][j];delta_HN[m][j]=sigma*H[m][j]*(1-H[m][j]);}return1;}//子程序Err_H_I()结束//////////////////////////////////////////////////////////输出层至隐层的权值调整、输出层阈值调整计算子程序//////////////////////////////////////////////////////////////Delta_O_H(){for(intk=0;kON;k++){for(intj=0;jHN;j++){doubletemp1=0.0;for(intm=0;mN;m++)temp1+=delta_ON[m][k]*H[m][j];V[k][j]+=a1*temp1;}doubletemp2=0.0;for(inti=0;iN;i++)temp2+=delta_ON[i][k];YU_ON[k]-=a2*temp2;//输出层至隐层的阈值调整}return1;}//子程序Delta_O_H()结束///////////////////////////////////////////////////////隐层至输入层的权值调整、隐层阈值调整计算子程序////////////////////////////////////////////////////////////Delta_H_I(intm)Delta_H_I(){for(intj=0;jHN;j++){for(inti=0;iIN;i++){doubletemp1=0.0;for(intm=0;mN;m++)temp1+=delta_HN[m][j]*P[m][i];W[j][i]+=b1*temp1;}doubletemp2=0.0;for(intk=0;kN;k++)temp2+=delta_HN[k][j];YU_HN[j]-=b2*temp2;}return1;}//子程序Delta_H_I()结束///////////////////////////////////N个样本的全局误差计算子程序/////////////////////////////////////doubleErr_Sum(){doubletotal_err=0;for(intm=0;mN;m++)total_err+=sum_err_m[m];returntotal_err;}//子程序Err_sum()结束GetTrainingData(){ifstreamGetTrainingData(训练样本.txt,ios::in);for(intm=0;mN;m++){for(inti=0;iIN;i++)GetTrainingDataStudy_Data[m].input[i];//取得输入数据for(intj=0;jON;j++)GetTrainingDataStudy_Data[m].teach[j];//取得输出数据}GetTrainingData.close();return1;}GetTestingData(){ifstreamGetTestingData(检测样本.txt,ios::in);for(intm=0;mT_N;m++){for(inti=0;iIN;i++)GetTestingDataTest_Data[m].input[i];//取得输入数据for(intj=0;jON;j++)GetTestingDataTest_Data[m].teach[j];//取得输出数据}GetTestingData.close();return1;}voidsavequan(){ofstreamoutQuanFile(权值.txt,ios::out);ofstreamoutYuFile(阈值.txt,ios::out);outQuanFileA\n;for(inti=0;iHN;i++){for(intj=0;jIN;j++)outQuanFileW[i][j];outQuanFile\n;}outQuanFileB\n;for(intii=0;iiON;ii++){for(intjj=0;jjHN;jj++)outQuanFile
本文标题:BP神经网络实现异或功能(C++)
链接地址:https://www.777doc.com/doc-1835448 .html