#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;
}
网友评论