BP算法例子.docx

上传人:b****2 文档编号:2455186 上传时间:2022-10-29 格式:DOCX 页数:8 大小:16.90KB
下载 相关 举报
BP算法例子.docx_第1页
第1页 / 共8页
BP算法例子.docx_第2页
第2页 / 共8页
BP算法例子.docx_第3页
第3页 / 共8页
BP算法例子.docx_第4页
第4页 / 共8页
BP算法例子.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

BP算法例子.docx

《BP算法例子.docx》由会员分享,可在线阅读,更多相关《BP算法例子.docx(8页珍藏版)》请在冰豆网上搜索。

BP算法例子.docx

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]+

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

当前位置:首页 > 医药卫生 > 基础医学

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

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