您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息
三六零分类信息网 > 宜春分类信息网,免费分类信息发布

BP神经网络算法(2)

2024/3/30 12:14:28发布32次查看
// 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;isl;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;isamptrainsample;isamp++)//循环训练一次样品
    { 
        for(int i=0;iinnode;i++)
            x[i]=p[isamp][i];
        for(i=0;ioutnode;i++)
            yd[i]=t[isamp][i];
//构造每个样品的输入和输出标准
        for(int j=0;jhidenode;j++)
        {
            o1[j]=0.0;
for(i=0;iinnode;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;koutnode;k++)
        {
            o2[k]=0.0;
for(j=0;jhidenode;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;koutnode;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;jhidenode;j++)
                w1[j][k]=w1[j][k]+rate_w1*qq[k]*x1[j];//下一次的隐含层和输出层之间的新连接权
            e=sqrt(e);
            error=e;
}
for(j=0;jhidenode;j++)
        {
            pp[j]=0.0;
            for(k=0;koutnode;k++)
                pp[j]=pp[j]+qq[k]*w1[j][k];
            pp[j]=pp[j]*x1[j]*(1-x1[j]);//隐含层的校正误差
for(i=0;iinnode;i++)
                w[i][j]=w[i][j]+rate_w*pp[j]*x[i];//下一次的输入层和隐含层之间的新连接权
        }
for(k=0;koutnode;k++)
            b2[k]=b2[k]+rate_b2*qq[k];//下一次的隐含层和输出层之间的新阈值
        for(j=0;jhidenode;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;iinnode;i++)
        x[i]=p[i];
    for(int j=0;jhidenode;j++)
    {
        o1[j]=0.0;
for(int i=0;iinnode;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;koutnode;k++)
    {
        o2[k]=0.0;
        for(int j=0;jhidenode;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;koutnode;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;
宜春分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录