好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

BP神经网络算法(2)

// BpNet.h:interfacefortheBpclass. // // E-Mail:zengzhijun369@163测试数据 /**/ ///////////////////////////////////////////////////////////////////// / #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测试数据
/**/ ///////////////////////////////////////////////////////////////////// /
#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;
查看更多关于BP神经网络算法(2)的详细内容...

  阅读:48次