来自「神经网络的算法」· 代码 · 共 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 + -
显示快捷键?