当前位置:Gxlcms > mysql > BP神经网络算法(2)

BP神经网络算法(2)

时间:2021-07-01 10:21:17 帮助过:48人阅读

// BpNet.h:interfacefortheBpclass. // // E-Mail:zengzhijun369@163.com /**/ ///////////////////////////////////////////////////////////////////// / #include stdafx.h #include BpNet.h #include math.h #ifdef_DEBUG #undef THIS_FILE static char

//BpNet.h: interface for the Bp class.
//
//E-Mail:zengzhijun369@163.com
/**///////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include
"BpNet.h"
#include
"math.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

/**///////////////////////////////////////////////////////////////////////
// Construction/Destruction
/**///////////////////////////////////////////////////////////////////////

BpNet::BpNet()
{
error
=1.0;
e
=0.0;

rate_w
=0.05; //权值学习率(输入层--隐含层)
rate_w1=0.047; //权值学习率 (隐含层--输出层)
rate_b1=0.05; //隐含层阀值学习率
rate_b2=0.047; //输出层阀值学习率
error=1.0;
e
=0.0;

rate_w
=0.05; //权值学习率(输入层--隐含层)
rate_w1=0.047; //权值学习率 (隐含层--输出层)
rate_b1=0.05; //隐含层阀值学习率
rate_b2=0.047; //输出层阀值学习率
}


BpNet::
~BpNet()
{

}


void winit(double w[],int sl)//权值初始化
{int i;
double randx();
for(i=0;i<sl;i++){
*(w+i)=0.2*randx();
}

}


double randx()//kqy error
{double d;
d
=(double) rand()/32767.0;
return d;
}


void BpNet::init()
{
winit((
double*)w,innode*hidenode);
winit((
double*)w1,hidenode*outnode);
winit(b1,hidenode);
winit(b2,outnode);
}



void BpNet::train(double p[trainsample][innode],double t[trainsample][outnode])
{
double pp[hidenode];//隐含结点的校正误差
double qq[outnode];//希望输出值与实际输出值的偏差
double yd[outnode];//希望输出值

double x[innode]; //输入向量
double x1[hidenode];//隐含结点状态值
double x2[outnode];//输出结点状态值
double o1[hidenode];//隐含层激活值
double o2[hidenode];//输出层激活值
for(int isamp=0;isamp<trainsample;isamp++)//循环训练一次样品
{
for(int i=0;i<innode;i++)
x[i]
=p[isamp][i];
for(i=0;i<outnode;i++)
yd[i]
=t[isamp][i];

//构造每个样品的输入和输出标准
for(int j=0;j<hidenode;j++)
{
o1[j]
=0.0;

for(i=0;i<innode;i++)
o1[j]
=o1[j]+w[i][j]*x[i];//隐含层各单元输入激活值
x1[j]=1.0/(1+exp(-o1[j]-b1[j]));//隐含层各单元的输出kqy1
// if(o1[j]+b1[j]>0) x1[j]=1;
//else x1[j]=0;
}


for(int k=0;k<outnode;k++)
{
o2[k]
=0.0;

for(j=0;j<hidenode;j++)
o2[k]
=o2[k]+w1[j][k]*x1[j];//输出层各单元输入激活值
x2[k]=1.0/(1.0+exp(-o2[k]-b2[k]));//输出层各单元输出
// if(o2[k]+b2[k]>0) x2[k]=1;
// else x2[k]=0;
}


for(k=0;k<outnode;k++)
{
e
=0.0;
qq[k]
=(yd[k]-x2[k])*x2[k]*(1.-x2[k]);//希望输出与实际输出的偏差
e+=fabs(yd[k]-x2[k])*fabs(yd[k]-x2[k]);//计算均方差

for(j=0;j<hidenode;j++)
w1[j][k]
=w1[j][k]+rate_w1*qq[k]*x1[j];//下一次的隐含层和输出层之间的新连接权
e=sqrt(e);
error
=e;

}


for(j=0;j<hidenode;j++)
{
pp[j]
=0.0;
for(k=0;k<outnode;k++)
pp[j]
=pp[j]+qq[k]*w1[j][k];
pp[j]
=pp[j]*x1[j]*(1-x1[j]);//隐含层的校正误差

for(i=0;i<innode;i++)
w[i][j]
=w[i][j]+rate_w*pp[j]*x[i];//下一次的输入层和隐含层之间的新连接权
}


for(k=0;k<outnode;k++)
b2[k]
=b2[k]+rate_b2*qq[k];//下一次的隐含层和输出层之间的新阈值
for(j=0;j<hidenode;j++)
b1[j]
=b1[j]+rate_b1*pp[j];//下一次的输入层和隐含层之间的新阈值

}
//end isamp样品循环

}

/**////////////////////////////end train/////////////////////////////

/////////////////////////////////////////////////////////////////


double *BpNet::recognize(double *p)
{
double x[innode]; //输入向量
double x1[hidenode];//隐含结点状态值
double x2[outnode];//输出结点状态值
double o1[hidenode];//隐含层激活值
double o2[hidenode];//输出层激活值

for(int i=0;i<innode;i++)
x[i]
=p[i];
for(int j=0;j<hidenode;j++)
{
o1[j]
=0.0;

for(int i=0;i<innode;i++)
o1[j]
=o1[j]+w[i][j]*x[i];//隐含层各单元激活值
x1[j]=1.0/(1.0+exp(-o1[j]-b1[j]));//隐含层各单元输出
//if(o1[j]+b1[j]>0) x1[j]=1;
// else x1[j]=0;
}


for(int k=0;k<outnode;k++)
{
o2[k]
=0.0;
for(int j=0;j<hidenode;j++)
o2[k]
=o2[k]+w1[j][k]*x1[j];//输出层各单元激活值
x2[k]=1.0/(1.0+exp(-o2[k]-b2[k]));//输出层各单元输出
//if(o2[k]+b2[k]>0) x2[k]=1;
//else x2[k]=0;
}


for(k=0;k<outnode;k++)
{
shuchu[k]
=x2[k];
}

return shuchu;
}
/**/////////////////////////////end sim///////////////////////////

void BpNet::writetrain()
{//曾志军 for 2006.7
AfxMessageBox("你还没有训练呢,训练后再写吧!请不要乱写,除非你认为这次训练是最好的,否则会覆盖我训练好的权值,那样你又要花时间训练!");
AfxMessageBox(
"你认为这次训练结果是最好的,就存下来,下次就不要花时间训练了!",MB_YESNO,NULL);
FILE
*stream0;
FILE
*stream1;
FILE
*stream2;
FILE
*stream3;

人气教程排行