美文网首页
用C++实现BP算法

用C++实现BP算法

作者: 天使zhang | 来源:发表于2020-05-15 22:26 被阅读0次

    #include

    #include

    #include

    #include

    using namespace std;

    #define IN  3             //第一层神经元个数

    #define IN2 4

    #define HN  3             //第二层神经元个数

    #define HN2 4

    #define ON  3             //第三层神经元个数

    #define IP  4             //输入数据个数

    #define w   10000         //运行周期

    int   p ;                 //次数计算

    double u0 , alf, u ;      //步伐,S函数成分变量

    double mX[3][4],D[3][3];

    double tempx[9];

    double  W1[IN][IP], W2[HN][IN2], W3[ON][HN2];    //1,2,3层阈值矩阵

    double dW1[IN][IP],dW2[HN][IN2],dW3[ON][HN2];    //1,2,3层增量阈值矩阵

    double Net1[IN],Net2[HN],Net3[ON];               //1,2,3层神经元净输入

    double   F1[IN],  F2[HN],  F3[ON];               //1,2,3层神经元求导

    double   d1[IN],  d2[HN],  d3[ON];               //1,2,3层神经元误差分量

    double  Es1[IN], Es2[HN], Es3[ON];

    double   O1[IN2],  O2[HN2],  O3[ON];             //1,2,3层神经元输出

    double  Ep[w];

    /*

    double W1[IN][IP]={

    { 1.2 , 0.23 , 0.5 , 0.75 },

    { 0.7 , 0.22 , 0.21, 0.4},

    { 1.9 , 2.2  , 1.22, 2.34},

    };

    double W2[HN][IN2]={

    { 0.2 , 0.73 , 0.2  , 0.3 },

    { 0.44, 1.22 , 2.21 , 0.76},

    { 1.1 , 0.86 , 0.11 , 1.64},

    };

    double W3[ON][HN2]={

    { 1.3 , 0.13 , 0.4 , 0.15 },

    { 0.24, 1.82 ,0.41 , 0.36 },

    { 1.11, 0.56, 3.31 , 0.42 },

    };

    */

    //介绍

    void abstract()

    {

    cout<<"///////////////////////////////////////"<

    cout<<"运用BP算法(3-3-3)训练:"<

    cout<<"<1>: 1 , 0 , 0"<

    cout<<"<2>: 0 , 1 , 0"<

    cout<<"<3>: 0 , 0 , 1"<

    cout<<"使网络正确识别上述三组数"<

    cout<<"///////////////////////////////////////"<

    }

    //初始化数据

    void ini()

    {

    int i , j , X=0 , Y=100 ;

    time_t t;                                   //随机生成0~1的常量 所需

    srand((unsigned) time(&t));                 //随机生成0~1的常量 所需

    p=1;

    u0=0.25;

    alf=0.5 ;

    u=0 ;

    for( i=0;i<3;i++ )

    {for( j=0;j<4;j++ )

    //随机生成0~1的常量,需调用#include#include

    {    W1[i][j]=0.01*( rand()%(Y-X+1)+X );

    dW1[i][j]=0;

    W2[i][j]=0.01*( rand()%(Y-X+1)+X );

    dW2[i][j]=0;

    W3[i][j]=0.01*( rand()%(Y-X+1)+X );

    dW3[i][j]=0;

    }

    }

    for( i=0;i

    {    O1[i]=1;    }

    for( i=0;i

    {    O2[i]=1;    }

    for( i=0;i

    {    O3[i]=1;    }

    for( i=0;i

    {    Net1[i]=0;

    F1[i]=0;

    d1[i]=0;

    Es1[i]=0;    }

    for( i=0;i

    {    Net2[i]=0;

    F2[i]=0;

    d2[i]=0;

    Es2[i]=0;    }

    for( i=0;i

    {    Net3[i]=0;

    F3[i]=0;

    d3[i]=0;

    Es3[i]=0; }

    for( i=0;i

    {    tempx[i]=0;    }

    }

    //计算各层误差变量

    void errorCompo( double temp_D[])

    {

    int i , j ;

    double m=0;

    for(i=0;i

    {

    Es3[i]=temp_D[i]-O3[i] ;

    d3[i]=Es3[i]*F3[i];

    Ep[w] += Es3[i]*Es3[i];

    }

    for(i=0;i

    {

    m=0;

    for(j=0;j

    {m += W3[j][i]*d3[j];}

    d2[i] = m*F2[i] ;

    }

    for(i=0;i

    {

    m=0;

    for(j=0;j

    {m += W2[j][i]*d2[j];}

    d1[i] = m*F1[i] ;

    }

    }

    //显示数据

    void show()

    {

    int i ,j ;

    for(i=0;i<3;i++)

    {

    for(j=0;j<4;j++)

    {

    cout<

    }

    cout<

    }

    cout<<"=================================================="<

    for(i=0;i<3;i++)

    {

    for(j=0;j<4;j++)

    {

    cout<

    }

    cout<

    }

    cout<<"=================================================="<

    for(i=0;i<3;i++)

    {

    for(j=0;j<4;j++)

    {

    cout<

    }

    cout<

    }

    }

    //计算增量阈值矩阵

    void addW()

    {

    int i , j ;

    for(i=0;i<3;i++)

    {for(j=0;j<4;j++)

    {    dW3[i][j] += alf*d3[i]*O2[j];    }

    }

    for(i=0;i<3;i++)

    {for(j=0;j<4;j++)

    {    dW2[i][j] += alf*d2[i]*O1[j];    }

    }

    for(i=0;i<3;i++)

    {for(j=0;j<4;j++)

    {    dW1[i][j] += alf*d1[i]*tempx[j];}

    }

    }

    //更新阈值矩阵

    void newW()

    {

    int i , j ;

    for( i=0;i<3;i++ )

    {for( j=0;j<4;j++ )

    {    W1[i][j]+=dW1[i][j];    }

    }

    for( i=0;i<3;i++ )

    {for( j=0;j<4;j++ )

    {    W2[i][j]+=dW2[i][j];    }

    }

    for( i=0;i<3;i++ )

    {for( j=0;j<4;j++ )

    {    W3[i][j]+=dW3[i][j];    }

    }

    }

    //增量矩阵重新定义为零

    void reflash()

    {

    int i , j ;

    for( i=0;i<3;i++ )

    {

    for( j=0;j<4;j++ )

    {    dW1[i][j]=0;

    dW2[i][j]=0;

    dW3[i][j]=0;

    }

    }

    }

    //第一层所有变量计算,包括“净输入”、“输出”、“S函数的求导”

    void proL1( double b[] )

    {

    int i , j ;

    double m ;

    for( i=0;i

    {    tempx[i] = b[i];    }

    for(i=0;i

    {

    m=0;

    for(j=0;j

    {

    m += (W1[i][j]*tempx[j]);

    }

    Net1[i] = m ;

    }

    for(i=0;i

    {

    u=exp(-Net1[i]/u0);

    O1[i]=(1/(1+u));

    F1[i]= u/( u0*(1+u)*(1+u) ) ;

    }

    }

    //第二层所有变量计算,包括“净输入”、“输出”、“S函数的求导”

    void proL2( )

    {

    int i , j  ;

    double m ;

    for(i=0;i

    {

    m=0;

    for(j=0;j

    {

    m += W2[i][j]*O1[j];

    }

    Net2[i]=m;                 //net2[1]与matlab不同

    }

    for(i=0;i

    {

    u=exp(-Net2[i]/u0);

    O2[i]=1/(1+u);

    F2[i]= u/( u0*(1+u)*(1+u) ) ;

    }

    }

    //第三层所有变量计算,包括“净输入”、“输出”、“S函数的求导”

    void proL3()

    {

    int i , j  ;

    double m ;

    for(i=0;i

    {

    m=0;

    for(j=0;j

    {

    m += W3[i][j]*O2[j];

    }

    Net3[i]=m;

    }

    for(i=0;i

    {

    u=exp(-Net3[i]/u0);

    O3[i]=1/(1+u);

    F3[i]= u/( u0*(1+u)*(1+u) ) ;

    }

    }

    //测试

    void test()

    {

    cout<<"--------------------测试训练效果-------------------"<

    int i , j , k  ;

    double y[4]={0,0,0,0};

    double testmX[3][4] = {

    { 0 , 0 , 1 , 1 },

    { 0 , 1 , 0 , 1 },

    { 1 , 0 , 0 , 1 },

    };

    cout<<"-------------------------输入1----------------------"<

    for( i=0;i<3;i++ )

    {

    for( j=0;j<3;j++ )

    {

    cout<

    }

    cout<

    }

    cout<<"-------------------------输出1----------------------"<

    for( i=0;i<3;i++ )

    {

    for( j=0;j<4;j++ )

    {    y[j] = testmX[i][j]; }

    proL1( y );

    proL2();

    proL3();

    for( k=0;k

    {

    cout<

    }

    cout<

    }

    }

    //主函数

    int main()

    {

    abstract();

    double mX[3][4] = {

    { 1.0 , 0 , 0 , 1.0 },

    { 0 , 1.0 , 0 , 1.0 },

    { 0 , 0 , 1.0 , 1.0 },

    };

    double D[3][3] = {

    { 0.9 , 0.1 , 0.1 },

    { 0.1 , 0.9 , 0.1 },

    { 0.1 , 0.1 , 0.9 },

    };

    double x[4];

    double d[3];

    int i , j  ;

    char stop ;

    ini();

    cout<<"--------------------初始阈值--------------------"<

    show();

    cin>>stop;

    while(p

    {

    for( i=0;i<3;i++ )

    {

    for( j=0;j<4;j++ )

    {    x[j] = mX[i][j]; }

    for( j=0;j<3;j++ )

    {    d[j] = D[i][j];    }

    proL1( x );

    proL2();

    proL3();

    errorCompo( d );

    addW();

    }

    newW();

    reflash();

    p++;

    }

    cin>>stop;

    cout<<"--------------------训练后阈值--------------------"<

    show();

    cin>>stop;

    test();

    return 0 ;

    cin>>stop;

    }

    相关文章

      网友评论

          本文标题:用C++实现BP算法

          本文链接:https://www.haomeiwen.com/subject/ouqkohtx.html