来自「神经网络的算法」· 代码 · 共 448 行

TXT
448
字号
#include "iostream.h"
#include "math.h"
#include "stdlib.h"
#include "conio.h"
void main()
{    
	
	//定义部分
	double X[20][3];   //存储样本数据
	double Y[20];      //存储样本数据
    double z;          //测试误差

	double W[3][8];    //存储第一层权重值
	double A[8];       //存储第一层输入值
	double B[8];       //存储第一层输出值
    double V[8][8];    //存储第二层权重值
	double C[8];       //存储第二层输入值
	double D[8];       //存储第二层输出值
    double U[8];       //存储第三层权重值
	double F[20];      //存储第三层输入值
	double G[20];      //存储第三层输出值

    double h;          //定义学习率
	double q;          //定义置偏值率
	double e;          //总误差
	double E[20];      //定义样本误差
    int t;             //计算循环次数         
    
	double S[20];          //定义第三层调整中间值
    double Q[20][8];       //定义第二层调整中间值
    double R[20][8];       //定义第一层调整中间值
	
	double H[20][8];       //定义各样本第三层调整值
    double L[20][8][8];    //定义各样本第二层调整值
    double N[20][3][8];    //定义各样本第一层调整值
	
	double ZH[8];          //定义总样本第三层调整值
    double ZL[8][8];       //定义总样本第二层调整值
    double ZN[3][8];       //定义总样本第一层调整值

    int i,j,k,l,m,n;

	double r;           //定义第四层置偏值
	double M[8];        //定义第三层置偏值
	double T[8];        //定义第二层置偏值
	double I[20];
//////////////////////////////////////////////////////////    
//样本赋值
  	X[0][0]=0.695;
    X[0][1]=0.483;
    X[0][2]=0.000;
 	Y[0]=0.5;
    
	X[1][0]=0.580;
    X[1][1]=0.538;
    X[1][2]=0.009;
 	Y[1]=0.537;
	
	X[2][0]=0.774;
    X[2][1]=0.588;
    X[2][2]=0.021;
 	Y[2]=0.584;	
	
	X[3][0]=0.806;
    X[3][1]=0.67;
    X[3][2]=0.03;
 	Y[3]=0.552;	
	
	X[4][0]=0.615;
    X[4][1]=0.583;
    X[4][2]=0.039;
 	Y[4]=0.638;
    
	X[5][0]=0.572;
    X[5][1]=0.683;
    X[5][2]=0.061;
 	Y[5]=0.709;
    
	X[6][0]=0.772;
    X[6][1]=0.658;
    X[6][2]=0.074;
 	Y[6]=0.717;
    
	X[7][0]=0.697;
    X[7][1]=0.688;
    X[7][2]=0.092;
 	Y[7]=0.649;
    
	X[8][0]=0.642;
    X[8][1]=0.438;
    X[8][2]=0.117;
 	Y[8]=0.557;
    
	X[9][0]=0.680;
    X[9][1]=0.325;
    X[9][2]=0.128;
 	Y[9]=0.491;
    
	X[10][0]=0.672;
    X[10][1]=0.375;
    X[10][2]=0.137;
 	Y[10]=0.462;

    X[11][0]=0.668;
    X[11][1]=0.313;
    X[11][2]=0.148;
 	Y[11]=0.404;

    X[12][0]=0.667;
    X[12][1]=0.42;
    X[12][2]=0.156;
 	Y[12]=0.267;

    X[13][0]=0.660;
    X[13][1]=0.369;
    X[13][2]=0.166;
 	Y[13]=0.238;

    X[14][0]=0.702;
    X[14][1]=0.288;
    X[14][2]=0.175;
 	Y[14]=0.238;

    X[15][0]=0.733;
    X[15][1]=0.244;
    X[15][2]=0.187;
 	Y[15]=0.204;

    X[16][0]=0.655;
    X[16][1]=0.240;
    X[16][2]=0.2;
 	Y[16]=0.254;

    X[17][0]=0.644;
    X[17][1]=0.218;
    X[17][2]=0.216;
 	Y[17]=0.329;

    X[18][0]=0.604;
    X[18][1]=0.456;
    X[18][2]=0.224;
 	Y[18]=0.410;

    X[19][0]=0.637;
    X[19][1]=0.506;
    X[19][2]=0.231;
 	Y[19]=0.424;

		
	
//学习率变量赋值
	h=0.6;
//置偏值赋值率    
	q=0.3;	

//赋第三层权值
    for(n=0;n<=7;n++)
	{
		U[n]=0.65;
	}

//赋第二层权值
  	for(m=0;m<=7;m++)
	{
		for(l=0;l<=7;l++)
		{
			V[m][l]=0.65;				
		}
	}      

//赋第一层权值
    for(k=0;k<=2;k++)
	{
		for(j=0;j<=7;j++)
		{		
			W[k][j]=0.65;

		}
	}


//置偏值赋初值
	r=0.35;                //第四层置偏值赋值
	for(l=0;l<=7;l++)
	{
		M[l]=0.35;         //第三层置偏值赋值
	}
	for(j=0;j<=7;j++)      //第二层置偏值赋值
	{
		T[j]=0.35;
	}
	
	
	
//////////////////////////////////////////////////
//计算部分
	
  t=0;

  do
  {
    e=0;
	t++;
   //总样本第三层调整值赋初值 
    for(i=0;i<=7;i++)
	{
		ZH[i]=0; 
	}
    //总样本第二层调整值赋初值
	for(i=0;i<=7;i++)
	{
		for(j=0;j<=7;j++)
		{
			ZL[i][j]=0; 
		}
	}
    //总样本第一层调整值赋初值
	for(i=0;i<=2;i++)
	{
		for(j=0;j<=7;j++)
		{
			ZN[i][j]=0; 
		}
	}      


	for (i=0;i<=18;i++)
    {    
		//求第一层的输入值A[j]、输出值B[j]
		for (j=0;j<=7;j++)
		{
			A[j]=0;
            for (k=0; k<=2; k++)
			{
                A[j]=A[j]+X[i][k]*W[k][j];
			}
            A[j]=A[j]+T[j];
			B[j]=1/(1+exp(-A[j]));
		}
		
		//求第二层的输入值C[j]、输出值D[j]
		for (l=0; l<=7; l++)
		{
			C[l]=0;
			for(m=0; m<=7; m++)
			{
				C[l]=C[l]+B[m]*V[m][l];
			}
            C[l]=C[l]+M[l];
			D[l]=1/(1+exp(-C[l]));
		}
        
		//求第三层的输入值F[i]、输出值G[i]
		F[i]=0;
		for(n=0;n<=7;n++)
		{
			F[i]=F[i]+D[n]*U[n];	
		}
        F[i]=F[i]+r;
		G[i]=1/(1+exp(-F[i]));


		//求样本误差
		E[i]=0.5*(Y[i]-G[i])*(Y[i]-G[i]);
        e=e+E[i];

///////////////////////////////////////////////////////////////////		
//权值和置偏量计算

//计算第三层权值调整量		
		S[i]=(Y[i]-G[i])*G[i]*(1-G[i]);
		for(n=0;n<=7;n++)
		{		
			H[i][n]=h*S[i]*D[n];
			ZH[n]=ZH[n]+H[i][n];
		}
//调整置偏值
		r=r+q*S[i];

//计算第二层权值调整量		
		for(l=0;l<=7;l++)
		{
			Q[i][l]=S[i]*U[l]*D[l]*(1-D[l]);	
			M[l]=M[l]+q*Q[i][l];
		}
		
		for(m=0;m<=7;m++)
		{
			for(l=0;l<=7;l++)
			{
				L[i][m][l]=h*Q[i][l]*B[m];
				ZL[m][l]=ZL[m][l]+L[i][m][l];
			}
		}

//计算第一层权值调整量
        for(j=0;j<=7;j++)
		{
			R[i][j]=0;
			for(l=0;l<=7;l++)
			{
				R[i][j]=R[i][j]+Q[i][l]*V[j][l]*B[j]*(1-B[j]);
			}
		    T[j]=T[j]+q*R[i][j];
		}	
		
		for(k=0;k<=2;k++)
		{
			for(j=0;j<=7;j++)
			{
				N[i][k][j]=h*R[i][j]*X[i][k];
                ZN[k][j]=ZN[k][j]+N[i][k][j];
			}
		}
    }
	
/////////////////////////////////////////////////////////////////	  

//调整第三层权值
    for(n=0;n<=7;n++)
	{
		U[n]=U[n]+ZH[n];
	}

//调整第二层权值

  	for(m=0;m<=7;m++)
	{
		for(l=0;l<=7;l++)
		{
			V[m][l]=V[m][l]+ZL[m][l];				
		}
	}      

//调整第一层权值
    for(k=0;k<=2;k++)
	{
		for(j=0;j<=7;j++)
		{				
			W[k][j]=W[k][j]+ZN[k][j];
		}
	}
    if(t>=40000)
	{
		break;
	}

  }while(e>=0.00005);

////////////////////////////////////////////////
//测试样本
  
   for (i=0;i<=19;i++)
   {    
		//求第一层的输入值A[j]、输出值B[j]
		for (j=0;j<=7;j++)
		{
			A[j]=0;
            for (k=0; k<=2; k++)
			{
                A[j]=A[j]+X[i][k]*W[k][j];
			}
            A[j]=A[j]+T[j];
			B[j]=1/(1+exp(-A[j]));
		}
		
		//求第二层的输入值C[j]、输出值D[j]
		for (l=0; l<=7; l++)
		{
			C[l]=0;
			for(m=0; m<=7; m++)
			{
				C[l]=C[l]+B[m]*V[m][l];
			}
            C[l]=C[l]+M[l];
			D[l]=1/(1+exp(-C[l]));
		}
        
		//求第三层的输入值F[i]、输出值G[i]
		F[i]=0;
		for(n=0;n<=7;n++)
		{
			F[i]=F[i]+D[n]*U[n];	
		}
        F[i]=F[i]+r;
		G[i]=1/(1+exp(-F[i]));
        I[i]=(G[i]-Y[i])/Y[i]*100;
		cout<<I[i]<<"\n";
   }
   cout<<"张潇菡,我永远爱你!W[k][j]"<<"\n";
//求第一层的输入值A[j]、输出值B[j]
  for (j=0; j<=7;j ++)
  {
	  A[j]=0;
      for (k=0; k<=2; k++)
	  {
          A[j]=A[j]+X[19][k]*W[k][j];
		  cout<<W[k][j]<<"\n";
	  }
      A[j]=A[j]+M[j];
      	  
	  B[j]=1/(1+exp(-A[j]));
      
  }
  cout<<"张潇菡,我永远爱你!M[j]"<<"\n";
  for (j=0; j<=7;j ++)
  {
	  cout<<M[j]<<"\n";
  }
  cout<<"张潇菡,我永远爱你!V[m][l]"<<"\n";		
//求第二层的输入值C[j]、输出值D[j]
  for (l=0; l<=7; l++)
  {
	  C[l]=0;
	  for(m=0; m<=7; m++)
	  {
		 C[l]=C[l]+B[m]*V[m][l];
		 cout<<V[m][l]<<"\n";
	  }
      C[l]=C[l]+T[l];
	  
	  D[l]=1/(1+exp(-C[l]));
  }
  cout<<"张潇菡,我永远爱你!T[l]"<<"\n"; 
  for (l=0; l<=7; l++)
  {
  cout<<T[l]<<"\n";
  }
  cout<<"张潇菡,我永远爱你!U[n]"<<"\n";     
//求第三层的输入值F[i]、输出值G[i]
  F[19]=0;
  for(n=0;n<=7;n++)
  {
	F[19]=F[19]+D[n]*U[n];
	cout<<U[n]<<"\n";
  }
  F[19]=F[19]+r;
  G[19]=1/(1+exp(-F[19]));
  cout<<"G[19]="<<G[19]<<"\n";
  cout<<"Y[19]="<<Y[19]<<"\n";
//误差分析
  z=(G[19]-Y[19])/Y[19]*100;
  cout<<"e="<<e<<"\t";
  cout<<"t="<<t<<"\t";
  cout<<"z="<<z<<"\t";

} 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?