BP神经网络实现异或功能C++.docx
- 文档编号:24739914
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:15
- 大小:16.88KB
BP神经网络实现异或功能C++.docx
《BP神经网络实现异或功能C++.docx》由会员分享,可在线阅读,更多相关《BP神经网络实现异或功能C++.docx(15页珍藏版)》请在冰豆网上搜索。
BP神经网络实现异或功能C++
#include"iostream.h"
#include"iomanip.h"
#include"stdlib.h"
#include"math.h"
#include"stdio.h"
#include"time.h"
#include"fstream.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;i for(intj=0;j W[i][j]=rand()/double(RAND_MAX); for(intii=0;ii for(intjj=0;jj V[ii][jj]=rand()/double(RAND_MAX); for(intk=0;k YU_HN[k]=rand()/double(RAND_MAX); for(intkk=0;kk YU_ON[kk]=rand()/double(RAND_MAX); return1; }//子程序initial()结束 //////////////////////////////// ////第m个学习样本输入子程序/// /////////////////////////////// Train_input_P(intm) { for(inti=0;i P[m][i]=Study_Data[m].input[i]; //获得第m个样本的数据 return1; }//子程序Train_input_P(m)结束 Test_input_P(intm) { for(inti=0;i P[m][i]=Test_Data[m].input[i]; //获得第m个样本的数据 return1; }//子程序Test_input_P(m)结束 ///////////////////////////// ////第m个样本教师信号子程序// ///////////////////////////// Train_input_T(intm) { for(intk=0;k T[m][k]=Study_Data[m].teach[k]; return1; }//子程序Train_input_T(m)结束 Test_input_T(intm) { for(intk=0;k T[m][k]=Test_Data[m].teach[k]; return1; }//子程序Test_input_T(m)结束 ///////////////////////////////// //隐层各单元输入、输出值子程序/// ///////////////////////////////// H_I_O(intm) { doublesigma; for(intj=0;j { sigma=0.0; for(inti=0;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;k { sigma=0.0; for(intj=0;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;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;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;j { sigma=0.0; for(intk=0;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;k { for(intj=0;j { doubletemp1=0.0; for(intm=0;m temp1+=delta_ON[m][k]*H[m][j]; V[k][j]+=a1*temp1; } doubletemp2=0.0; for(inti=0;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;j { for(inti=0;i { doubletemp1=0.0; for(intm=0;m temp1+=delta_HN[m][j]*P[m][i]; W[j][i]+=b1*temp1; } doubletemp2=0.0; for(intk=0;k temp2+=delta_HN[k][j]; YU_HN[j]-=b2*temp2; } return1; }//子程序Delta_H_I()结束 ///////////////////////////////// //N个样本的全局误差计算子程序//// ///////////////////////////////// doubleErr_Sum() { doubletotal_err=0; for(intm=0;m total_err+=sum_err_m[m]; returntotal_err; }//子程序Err_sum()结束 GetTrainingData() { ifstreamGetTrainingData("训练样本.txt",ios: : in); for(intm=0;m { for(inti=0;i GetTrainingData>>Study_Data[m].input[i];//取得输入数据 for(intj=0;j GetTrainingData>>Study_Data[m].teach[j];//取得输出数据 } GetTrainingData.close(); return1; } GetTestingData() { ifstreamGetTestingData("检测样本.txt",ios: : in); for(intm=0;m { for(inti=0;i GetTestingData>>Test_Data[m].input[i];//取得输入数据 for(intj=0;j GetTestingData>>Test_Data[m].teach[j];//取得输出数据 } GetTestingData.close(); return1; } voidsavequan() { ofstreamoutQuanFile("权值.txt",ios: : out); ofstreamoutYuFile("阈值.txt",ios: : out); outQuanFile<<"A\n"; for(inti=0;i { for(intj=0;j outQuanFile< outQuanFile<<"\n"; } outQuanFile<<"B\n"; for(intii=0;ii { for(intjj=0;jj outQuanFile< outQuanFile<<"\n"; } outYuFile<<"输出层的阈值为: \n"; for(intk=0;k outYuFile< outYuFile<<"\n隐层的阈值为: \n"; for(intkk=0;kk outYuFile< outYuFile.close(); outQuanFile.close(); } /**********************/ /**程序入口,即主程序**/ /**********************/ voidmain() { doublesum_err; intstudy=0;//训练次数 a1=0.5; a2=0.1; b1=0.5; b2=0.1; doublePre_error=0.001;//预定误差 GetTrainingData(); initial();//隐层、输出层权、阈值初始化 (1) do { ++study; for(intm=0;m { Train_input_P(m);//输入第m个学习样本 (2) Train_input_T(m);//输入第m个样本的教师信号(3) H_I_O(m);//第m个学习样本隐层各单元输入、输出值(4) O_I_O(m);//第m个学习样本输出层各单元输入、输出值(5) Err_O_H(m);//第m个学习样本输出层至隐层一般化误差(6) Err_H_I(m);//第m个学习样本隐层至输入层一般化误差(7) }//全部样本训练完毕 Delta_O_H(); Delta_H_I(); sum_err=Err_Sum();//全部样本全局误差计算(10) cout<<"第"< }while(sum_err>Pre_error);//while(study<2000);//while((sum_err>Pre_error)||study<2000); cout<<"网络已经学习了"< savequan(); GetTestingData(); for(intm=0;m { Test_input_P(m);//输入第m个检验样本 Test_input_T(m);//输入第m个样本的教师信号 H_I_O(m);//第m个检验样本隐层各单元输入、输出值 O_I_O(m);//第m个检验样本输出层各单元输入、输出值 out_test_result< "; for(inti=0;i out_test_result< out_test_result< "; for(intj=0;j out_test_result< out_test_result<<"\n"; //out_test_result.close(); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- BP 神经网络 实现 功能 C+