BP算法例子.docx
- 文档编号:2455186
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:8
- 大小:16.90KB
BP算法例子.docx
《BP算法例子.docx》由会员分享,可在线阅读,更多相关《BP算法例子.docx(8页珍藏版)》请在冰豆网上搜索。
BP算法例子
//---------------------------------------------------------------------------------------//
// BP算法例子:
用一个五层的神经网络去逼近函数 //
// f(x1,x2)=pow(x1-1,4)+2*pow(x2,2) //
// 作者:
MaxMatrix //
// 2004.5.9调通运行于VC++6.0 //
//--------------------------------------------------------------------------------------//
#include
#include
#include
#include
#include
//---------------------------------------------------------------------
#defineRANDOMrand()/32767.0 //0~1随机数生成函数
constintLayer_Max=5;//神经网络的层数
constdoublePI=3.1415927;//圆周率
constintLayer_number[Layer_Max]={2,4,4,2,1};//神经网络各层的神经元个数
constintNeural_Max=4;//神经网络各层最大神经元个数
constintInMax=21;//样本输入的个数
ofstreamOut_W_File("All_W.txt",ios:
:
out);
ofstreamOut_Error("Error.txt",ios:
:
out);
//定义类BP
classBP
{
public:
BP();//BP类的构造函数
voidBP_Print();//打印权系数
doubleF(doublex);//神经元的激发函数
doubleY(doublex1,doublex2);//要逼近的函数
//
doubleNetWorkOut(intx1,intx2);//网络输出,他的输入为
//第input个样本
voidAllLayer_D(intx1,intx2);//求所有神经元的输出误差微分
voidChange_W(); //改变权系数
voidTrain(); //训练函数
voidAfter_Train_Out();//经过训练后,21样本的神经网络输出
doubleCost(doubleout,doubleExp);//代价函数
private:
doubleW[Layer_Max][Neural_Max][Neural_Max];//保存权系数
//规定W[i][j][k]表示网络第i层的第j个神经元连接到
//第i-1层第k个神经元的权系数
doubleInput_Net[2][InMax];//21个样本输入,约定Input_Net[0][i]
//表示第i个样本的输入x1
//而Input_Net[1][i]表示第i个样本的输入x2
doubleOut_Exp[InMax][InMax];//期望输出
doubleLayer_Node[Layer_Max][Neural_Max];//保存各神经元的输出
//规定Layer_Node[i][j]表示第i层的第j个神经元的输出
doubleD[Layer_Max][Neural_Max];//保存各神经元的误差微分
//规定D[i][j]表示第i层第j个神经元的误差微分
doubleStudy_Speed;//学习速度
doublee;//误差
};
//构造函数,用来初始化权系数,输入,期望输出和学习速度
BP:
:
BP()
{
srand(time(NULL));//播种,以便产生随即数
for(inti=1;i { for(intj=0;j { for(intk=0;k { W[i][j][k]=RANDOM;//随机初始化权系数 } // Q[i][j]=RANDOM;//初始化各神经元的阀值 } } //输入归和输出归一化 for(intl=0;l { Input_Net[0][l]=l*0.05;//把0~1分成20等分,表示x1 Input_Net[1][l]=1-l*0.05;//表示x2 } for(i=0;i { for(intj=0;j { Out_Exp[i][j]=Y(Input_Net[0][i],Input_Net[1][j]);//期望输出 Out_Exp[i][j]=Out_Exp[i][j]/3.000000;//期望输出归一化 } } Study_Speed=0.5;//初始化学习速度 e=0.0001;//误差精度 }//end //激发函数F() doubleBP: : F(doublex) { return(1.0/(1+exp(-x))); }//end //要逼近的函数Y() //输入: 两个浮点数 //输出: 一个浮点数 doubleBP: : Y(doublex1,doublex2) { doubletemp; temp=pow(x1-1,4)+2*pow(x2,2); returntemp; }//end //-------------------------------------------------------- //代价函数 doubleBP: : Cost(doubleOut,doubleExp) { return(pow(Out-Exp,2)); }//end //网络输出函数 //输入为: 第input个样本 doubleBP: : NetWorkOut(intx1,intx2) { inti,j,k; doubleN_node[Layer_Max][Neural_Max]; //约定N_node[i][j]表示网络第i层的第j个神经元的总输入 //第0层的神经元为输入,不用权系数和阀值,即输进什么即输出什么 N_node[0][0]=Input_Net[0][x1]; Layer_Node[0][0]=Input_Net[0][x1]; N_node[0][1]=Input_Net[1][x2]; Layer_Node[0][1]=Input_Net[1][x2]; for(i=1;i { for(j=0;j { //神经元个数 N_node[i][j]=0.0; for(k=0;k { //表示与第i层第j个神经元连接的上一层的 //神经元个数 //求上一层神经元对第i层第j个神经元的输入之和 N_node[i][j]+=Layer_Node[i-1][k]*W[i][j][k]; } N_node[i][j]=N_node[i][j]-W[i][j][k];//减去阀值 //求Layer_Node[i][j],即第i层第j个神经元的输出 Layer_Node[i][j]=F(N_node[i][j]); } } returnLayer_Node[Layer_Max-1][0];//最后一层的输出 }//end //求所有神经元的输出误差微分函数 //输入为: 第input个样本 //计算误差微分并保存在D[][]数组中 voidBP: : AllLayer_D(intx1,intx2) { inti,j,k; doubletemp; D[Layer_Max-1][0]=Layer_Node[Layer_Max-1][0]* (1-Layer_Node[Layer_Max-1][0])* (Layer_Node[Layer_Max-1][0]-Out_Exp[x1][x2]); for(i=Layer_Max-1;i>0;i--) { for(j=0;j { temp=0; for(k=0;k { temp=temp+W[i][k][j]*D[i][k]; } D[i-1][j]=Layer_Node[i-1][j]*(1-Layer_Node[i-1][j]) *temp; } } }//end //修改权系数和阀值 voidBP: : Change_W() { inti,j,k; for(i=1;i { for(j=0;j { for(k=0;k { //修改权系数 W[i][j][k]=W[i][j][k]-Study_Speed* D[i][j]*Layer_Node[i-1][k]; } W[i][j][k]=W[i][j][k]+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- BP 算法 例子