• 技术文章 >数据库 >mysql教程

    BP神经网络算法(2)

    2016-06-07 15:49:25原创698

    // 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;
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    专题推荐:神经网络 算法 BpNet.h interfaceforth
    上一篇:Yii中使用gii连接数据库报错CDbConnection failed to open the D 下一篇:关于cocos2dx 2.0.3 及以上找不到org.cocos2dx.lib库的解决
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• Mysql体系化解析之JOIN运算• 深入浅析mysql的timestamp存在的时区问题• MySQL流程控制之while、repeat、loop循环• MySQL事务的ACID特性及并发问题知识点总结• 怎样解决mysql深分页问题
    1/1

    PHP中文网