BP神经网络实现异或功能C++.docx

上传人:b****8 文档编号:10303424 上传时间:2023-02-10 格式:DOCX 页数:15 大小:16.98KB
下载 相关 举报
BP神经网络实现异或功能C++.docx_第1页
第1页 / 共15页
BP神经网络实现异或功能C++.docx_第2页
第2页 / 共15页
BP神经网络实现异或功能C++.docx_第3页
第3页 / 共15页
BP神经网络实现异或功能C++.docx_第4页
第4页 / 共15页
BP神经网络实现异或功能C++.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

BP神经网络实现异或功能C++.docx

《BP神经网络实现异或功能C++.docx》由会员分享,可在线阅读,更多相关《BP神经网络实现异或功能C++.docx(15页珍藏版)》请在冰豆网上搜索。

BP神经网络实现异或功能C++.docx

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();

}

}

(注:

文档可能无法思考全面,请浏览后下载,供参考。

可复制、编制,期待你的好评与关注)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 销售营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1