【改进】BP算法及其C语言实现分析




三层网络BP算法C语言实现

#include  < math.h >
#include 
< stdio.h >
#include 
< string .h >
#include 
< stdlib.h >
#include 
< graphics.h >

#define  pi    3.1415926
#define  nP    1
#define  nHiddenNodes    20
#define  nInputNodes    10
#define  nOutputNodes    10


double  out0[nP][nInputNodes];
double  out1[nP][nHiddenNodes];
double  delta1[nP][nHiddenNodes];
double  delw1[nHiddenNodes][nInputNodes];
double  w1[nHiddenNodes][nInputNodes];
double  out2[nP][nOutputNodes];
double  delta2[nP][nOutputNodes];
double  delw2[nOutputNodes][nHiddenNodes];
double  w2[nOutputNodes][nHiddenNodes];
double  target[nP][nHiddenNodes];
double  Differ[nP][nOutputNodes];

double  getErm( int  iter) {
    
float eta=0.7,alpha=0.075,scale=42767,wmax=0.8,y0=0.5,t1=0.4;
    
float expin,expout;
    register 
int h,i,j;
    
int p,q,nIterations=iter;
    
double Erms;
    printf(
"The initial random weight matrix w1--element: ");
    printf(
"The rows are 5; The cols are 20: ");

    
for(i=0;i<nHiddenNodes;i++){
        
for(j=0;j<nInputNodes;j++){
            
float frand=rand();
            
float w11=wmax*(1.0-2*frand/scale);
            w1[i][j]
=w11;
            printf(
"%-8.5f%2.5c",w1[i][j],(j%5==(5-1)||j==nInputNodes)?' ':' ');
        }

    }

    printf(
" ");
    printf(
"The initial random weight matrix w2--element: ");
    printf(
"The rows are 20; The cols are 5: ");
    
for(i=0;i<nOutputNodes;i++){
        
for(j=0;j<nHiddenNodes;j++){
            
float frand=rand();
            
float w22=wmax*(1.0-2*frand/scale);
            w2[i][j]
=w22;
            printf(
"%-8.5f%2.5c",w2[i][j],(j%5==(5-1)||j==nHiddenNodes)?'n':' ');
        }

    }

    printf(
" ");

    
for(h=0;h<nHiddenNodes;h++){
        
for(i=0;i<nInputNodes;i++){
            delw1[h][i]
=0.0;
        }

    }

    
for(j=0;j<nOutputNodes;j++){
        
for(h=0;h<nHiddenNodes;h++){
            delw2[j][h]
=0.0;
        }

    }

    
/*输入模式*/
    printf(
"The initial input matrix out0: ");
    
for(p=0;p<nP;p++){
        
for(i=0;i<nInputNodes;i++){

            out0[p][i]
=(double)(i)/20.0;
            printf(
"%-8.5f%2.5c",out0[p][i],(i%5==(5-1)||i==nInputNodes)?'n':' ');
        }

    }

    printf(
" ");
    
/*期望输出节点值*/
    printf(
"The desired output target: ");
    
for(p=0;p<nP;p++){
        
for(i=0,j=0;j<nOutputNodes;i++,j++){

            target[p][j]
=(t1*sin((2*pi)*(out0[p][i])))+y0;
            printf(
"%-8.5f%2.5c",target[p][j],(j%5==(5-1)||j==nOutputNodes)?' ':' ');
        }

    }

    printf(
" ");
    
/*开始迭加过程*/
    
for(q=0;q<nIterations;q++){
        
for(p=0;p<nP;p++){
            
/*相对于输入模式的隐层节点值*/
            
for(h=0;h<nHiddenNodes;h++){
                
float sum=w1[h][nInputNodes];          
                
for(i=0;i<nInputNodes;i++)
                    sum
=sum+w1[h][i]*out0[p][i];
                out1[p][h]
=1.0/(1.0+exp(-sum));
            }

            
/*输出层节点值*/
            printf(
"Output every adapted out2--Value: ");
            
for(j=0;j<nOutputNodes;j++){
                
float sum=w2[j][nHiddenNodes];
                
for(h=0;h<nHiddenNodes;h++){
                    sum
=sum+w2[j][h]*out1[p][h];
                    out2[p][j]
=1.0/(1.0+exp(-sum));
                }

                printf(
"%-8.5f%2.5c",out2[p][j],(j%5==(5-1)||j==nOutputNodes)?' ':' ');
            }

            
/* 输出层节点值偏差delta2 */
            
for(j=0;j<nOutputNodes;j++)
                delta2[p][j]
=(target[p][j]-out2[p][j])*out2[p][j]*(1.0-out2[p][j]);
            
/* 隐层节点值偏差delta1 */
            
for(h=0;h<nHiddenNodes;h++){
                
float sum=0.0;
                
for(j=0;j<nOutputNodes;j++){
                    sum
=sum+delta2[p][j]*w2[j][h];
                    delta1[p][h]
=sum*out1[p][h]*(1.0-out1[p][h]);
                }

            }

            
/*调节隐层与输出层之间的权值*/
            
for(j=0;j<nOutputNodes;j++){
                
float dw,sum=0.0;
                
for(p=0;p<nP;p++)
                    sum
=sum+delta2[p][j];
                dw
=eta*sum+alpha*delw2[j][nHiddenNodes];
                w2[j][nHiddenNodes]
+=dw;
                delw2[j][nHiddenNodes]
=dw;
                
/* 计算隐层与输出层之间新权值w2 */
                
for(h=0;h<nHiddenNodes;h++){
                    
float sum=0.0;
                    
for(p=0;p<nP;p++)
                        sum
=sum+delta2[p][j]*out1[p][h];
                    dw
=eta*sum+alpha*delw2[j][h];
                    w2[j][h]
+=dw;
                    delw2[j][h]
=dw;
                }

            }

            
/*调节输入层与隐层之间的权值*/
            
for(h=0;h<nHiddenNodes;h++){
                
float sum=0.0,dw;
                
for(p=0;p<nP;p++)
                    dw
=eta*sum+alpha*delw1[h][nInputNodes];
                w1[h][nInputNodes]
+=dw;
                delw1[h][nInputNodes]
=dw;
                
for(i=0;i<nInputNodes;i++)
                    
for(p=0;p<nP;p++)
                    sum
=sum+delta1[p][h]*out0[p][i];
                dw
=eta*sum+alpha*delw1[h][i];
                w1[h][i]
+=dw;
                delw1[h][i]
=dw;
            }

        }

    }

    printf(
"The new weight w1: ");
    printf(
"The rows are 5; The cols are 20: ");
    
for(h=0;h<nHiddenNodes;h++)
        
for(i=0;i<nInputNodes;i++){
        printf(
"%-8.5f%2.5c",w1[h][i],(i%5==(5-1)||i==nInputNodes)?' ':' ');
    }

    printf(
" ");
    printf(
"The new weight w2: ");
    printf(
"The rows are 20;The cols are 5: ");
    
for(j=0;j<nOutputNodes;j++)
        
for(h=0;h<nHiddenNodes;h++){
        printf(
"%-8.5f%2.5c",w2[j][h],(h%5==(5-1)||h==nHiddenNodes)?' ':' ');
    }

    printf(
"The real output_out2: ");
    
for(p=0;p<nP;p++)
        
for(j=0;j<nOutputNodes;j++){
        printf(
"%-8.5f%2.5c",out2[p][j],(j%5==(5-1)||j==nOutputNodes)?' ':' ');
    }

    printf(
"The output unit bias: ");
    
for(p=0;p<nP;p++){
        
double sum=0.0;
        
for(j=0;j<nOutputNodes;j++){
            Differ[p][j]
=fabs(out2[p][j]-target[p][j]);
            printf(
"%-8.5f%2.5c",Differ[p][j],(j%5==(5-1)||j==nOutputNodes)?' ':' ');
        }

        printf(
"The average sqrt--value:Erms is: ");
        
for(j=0;j<nOutputNodes;j++)
            sum
=sum+Differ[p][j]*Differ[p][j];
        Erms
=sqrt(0.05)*sqrt(sum);
        printf(
"Erms=%f ",Erms);
    }

    
return Erms;
}




main()
{    
    
int iteration;
    
double out;
    printf(
"Please give a number of iteration :");
    scanf(
"%d",&iteration);
    
out=getErm(iteration);
    printf(
"The Erm is .....   %f ",out);
    getch();    
}

 
Matlab做出误差曲线如下图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路漫漫其修远.

你的鼓励是我寻找真相的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值