三层网络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();
}
#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做出误差曲线如下图