📄 bkneuro.h
字号:
hid.m[h]=1.0/(1.0+exp(-(sum-theta_h.m[h])));
}
for(j=0;j<nb_out;j++)
{
sum=0.0;
for(h=0;h<nb_hid;h++)sum=sum+hid.m[h]*poid_hy.m[h][j];
y.m[j]=1.0/(1.0+exp(-(sum-theta_y.m[j])));
}
for(j=0;j<nb_out;j++)delta_y.m[j]=y.m[j]*(1.0-y.m[j])*(desire_y.m[j]-y.m[j]);
for(h=0;h<nb_hid;h++)
{
sum=0.0;
for(j=0;j<nb_out;j++)sum=sum+poid_hy.m[h][j]*delta_y.m[j];
delta_h.m[h]=hid.m[h]*(1.0-hid.m[h])*sum;
}
for(j=0;j<nb_out;j++)for(h=0;h<nb_hid;h++)dPoid_hy.m[h][j]=0.0;
for(h=0;h<nb_hid;h++)for(i=0;i<nb_dim;i++)dPoid_xh.m[i][h]=0.0;
for(j=0;j<nb_out;j++)dTheta_y.m[j]=0.0;
for(h=0;h<nb_hid;h++)dTheta_h.m[h]=0.0;
for(j=0;j<nb_out;j++){for(h=0;h<nb_hid;h++)
{dPoid_hy.m[h][j]=eta*delta_y.m[j]*hid.m[h]+alpha*dPoid_hy.m[h][j];}}
for(j=0;j<nb_out;j++)dTheta_y.m[j]=-eta*delta_y.m[j]+alpha*dTheta_y.m[j];
for(h=0;h<nb_hid;h++){for(i=0;i<nb_dim;i++)
{dPoid_xh.m[i][h]=eta*delta_h.m[h]*x.m[i]+alpha*dPoid_xh.m[i][h];}}
for(h=0;h<nb_hid;h++)dTheta_h.m[h]=-eta*delta_h.m[h]+alpha*dTheta_h.m[h];
for(j=0;j<nb_out;j++){for(h=0;h<nb_hid;h++)
{poid_hy.m[h][j]=poid_hy.m[h][j]+dPoid_hy.m[h][j];}}
for(j=0;j<nb_out;j++)theta_y.m[j]=theta_y.m[j]+dTheta_y.m[j];
for(h=0;h<nb_hid;h++){for(i=0;i<nb_dim;i++)
{poid_xh.m[i][h]=poid_xh.m[i][h]+dPoid_xh.m[i][h];}}
for(h=0;h<nb_hid;h++)theta_h.m[h]=theta_h.m[h]+dTheta_h.m[h];
ModifyPara();
float err=0.0;
for(j=0;j<nb_out;j++)err+=fabs(desire_y.m[j]-y.m[j]);
return err/nb_out;
}
void BKNeuroNet::ModifyPara()
{
alpha=alpha*alpha_rate;
if(alpha<alpha_min)alpha=alpha_min;
eta=eta*eta_rate;
if(eta<eta_min)eta=eta_min;
}
// Fonction membre BKNeuroNet::Using
f1D& BKNeuroNet::Using()
{
int h,i,j;
for(i=0;i<nb_dim;i++)x.m[i]=(x.m[i]-min.m[i])*scaling.m[i];
for(h=0; h<nb_hid;h++)
{
sum=0.0;
for(i=0;i<nb_dim;i++)sum=sum+x.m[i]*poid_xh.m[i][h];
hid.m[h]=1.0/(1.0+exp(-(sum-theta_h.m[h])));
}
for(j=0;j<nb_out;j++)
{
sum=0.0;
for(h=0;h<nb_hid;h++)sum=sum+hid.m[h]*poid_hy.m[h][j];
y.m[j]=1.0/(1.0+exp(-(sum-theta_y.m[j])));
y.m[j]/=scaling[nb_dim+j];
y.m[j]+=min[nb_dim+j];
}
return y;
}
//
f1D& BKNeuroNet::Using(f1D &d)
{
int h,i,j;
for(i=0;i<nb_dim;i++)d.m[i]=(d.m[i]-min.m[i])*scaling.m[i];
for(h=0; h<nb_hid;h++)
{
sum=0.0;
for(i=0;i<nb_dim;i++)sum=sum+d.m[i]*poid_xh.m[i][h];
hid.m[h]=1.0/(1.0+exp(-(sum-theta_h.m[h])));
}
for(j=0;j<nb_out;j++)
{
sum=0.0;
for(h=0;h<nb_hid;h++)sum=sum+hid.m[h]*poid_hy.m[h][j];
y.m[j]=1.0/(1.0+exp(-(sum-theta_y.m[j])));
y.m[j]/=scaling[nb_dim+j];
y.m[j]+=min[nb_dim+j];
}
return y;
}
// Transcription des poids de connexion en tableau de d閜endance
f2D BKNeuroNet::TransDependantTable()
{
f2D dtab(nb_dim,nb_out);
int i,j,k;
float acc;
for(j=0;j<nb_out;j++)for(i=0;i<nb_dim;i++)
{
dtab.m[i][j]=0.0;
for(k=0;k<nb_hid;k++)
{
dtab.m[i][j]+=poid_xh.m[i][k]*poid_hy.m[k][j];
}
}
return dtab;
}
void BKNeuroNet::LoadTrainingData(ifstream& in)
{
int i,j,n1,n2,n3;
in>>n1>>n2>>n3;
// Network Initialization
nb_dim=n1;
nb_out=n2;
if(nb_hid==0)nb_hid=(nb_dim+nb_out)*2;
MemoryAlloc();
SetRandomPoid();
eta=5.0;eta_rate=0.99999;eta_min=0.00001;
alpha=1.0;alpha_rate=0.99998;alpha_min=0.00001;
input.Initialize(n3,n1);
output.Initialize(n3,n2);
nb_record=n3;
// Data loading
for(j=0;j<nb_dim+nb_out;j++){max[j]=-1e20;min[j]=1e20;scaling[j]=1.0;}
for(i=0;i<nb_record;i++)
{
for(j=0;j<nb_dim;j++)
{
in>>input.m[i][j];
if(max[j]<input.m[i][j])max[j]=input.m[i][j];
if(min[j]>input.m[i][j])min[j]=input.m[i][j];
}
for(j=0;j<nb_out;j++)
{
in>>output.m[i][j];
if(max[j+nb_dim]<output.m[i][j])max[j+nb_dim]=output.m[i][j];
if(min[j+nb_dim]>output.m[i][j])min[j+nb_dim]=output.m[i][j];
}
for(j=0;j<nb_dim+nb_out;j++)
{
if((min[j]==0)&&(max[j]==0))scaling[j]=1.0;
else if(max[j]==min[j])scaling[j]=1.0/max[j];
else scaling[j]=1./(max[j]-min[j]);
}
}
// Nomalization to [0,1]
for(i=0;i<nb_record;i++)
{
for(j=0;j<nb_dim;j++)input.m[i][j]=(input.m[i][j]-min[j])*scaling[j];
for(j=0;j<nb_out;j++)output.m[i][j]=(output.m[i][j]-min[j+nb_dim])*scaling[j+nb_dim];
}
}
void BKNeuroNet::LoadTrainingData(int n1,int n2,int n3, f2D& XV, f2D& YV)
{
int i,j;
if(!vide)MemoryFree();
// Network Initialization
nb_dim=n1;
nb_out=n2;
nb_hid=(nb_dim+nb_out)/2;
MemoryAlloc();
// SetRandomPoid();
eta=5.0;eta_rate=0.99999;eta_min=0.00001;
alpha=1.0;alpha_rate=0.99998;alpha_min=0.00001;
input.nr=XV.nr;input.nc=XV.nc;input.m=XV.m;
output.nr=YV.nr;output.nc=YV.nc;output.m=YV.m;
nb_record=n3;
// Data loading
for(j=0;j<nb_dim+nb_out;j++){max[j]=-1e20;min[j]=1e20;scaling[j]=1.0;}
for(i=0;i<nb_record;i++)
{
for(j=0;j<nb_dim;j++)
{
if(max[j]<input.m[i][j])max[j]=input.m[i][j];
if(min[j]>input.m[i][j])min[j]=input.m[i][j];
}
for(j=0;j<nb_out;j++)
{
if(max[j+nb_dim]<output.m[i][j])max[j+nb_dim]=output.m[i][j];
if(min[j+nb_dim]>output.m[i][j])min[j+nb_dim]=output.m[i][j];
}
for(j=0;j<nb_dim+nb_out;j++)
{
if((min[j]==0)&&(max[j]==0))scaling[j]=1.0;
else if(max[j]==min[j])scaling[j]=1.0/max[j];
else scaling[j]=1./(max[j]-min[j]);
}
}
// Nomalization to [0,1]
for(i=0;i<nb_record;i++)
{
for(j=0;j<nb_dim;j++)input.m[i][j]=(input.m[i][j]-min[j])*scaling[j];
for(j=0;j<nb_out;j++)output.m[i][j]=(output.m[i][j]-min[j+nb_dim])*scaling[j+nb_dim];
}
}
float BKNeuroNet::LearningFromBatchData()
{
int h,i,j;
float err=0.0;
for(int k=0;k<nb_record;k++)
{
for(i=0;i<nb_dim;i++)x.m[i]=input.m[k][i];
for(j=0;j<nb_out;j++)desire_y.m[j]=output.m[k][j];
for(h=0; h<nb_hid;h++)
{
sum=0.0;
for(i=0;i<nb_dim;i++)sum=sum+x.m[i]*poid_xh.m[i][h];
hid.m[h]=1.0/(1.0+exp(-(sum-theta_h.m[h])));
}
for(j=0;j<nb_out;j++)
{
sum=0.0;
for(h=0;h<nb_hid;h++)sum=sum+hid.m[h]*poid_hy.m[h][j];
y.m[j]=1.0/(1.0+exp(-(sum-theta_y.m[j])));
}
for(j=0;j<nb_out;j++)delta_y.m[j]=y.m[j]*(1.0-y.m[j])*(desire_y.m[j]-y.m[j]);
for(h=0;h<nb_hid;h++)
{
sum=0.0;
for(j=0;j<nb_out;j++)sum=sum+poid_hy.m[h][j]*delta_y.m[j];
delta_h.m[h]=hid.m[h]*(1.0-hid.m[h])*sum;
}
for(j=0;j<nb_out;j++)for(h=0;h<nb_hid;h++)dPoid_hy.m[h][j]=0.0;
for(h=0;h<nb_hid;h++)for(i=0;i<nb_dim;i++)dPoid_xh.m[i][h]=0.0;
for(j=0;j<nb_out;j++)dTheta_y.m[j]=0.0;
for(h=0;h<nb_hid;h++)dTheta_h.m[h]=0.0;
for(j=0;j<nb_out;j++){for(h=0;h<nb_hid;h++)
{dPoid_hy.m[h][j]=eta*delta_y.m[j]*hid.m[h]+alpha*dPoid_hy.m[h][j];}}
for(j=0;j<nb_out;j++)dTheta_y.m[j]=-eta*delta_y.m[j]+alpha*dTheta_y.m[j];
for(h=0;h<nb_hid;h++){for(i=0;i<nb_dim;i++)
{dPoid_xh.m[i][h]=eta*delta_h.m[h]*x.m[i]+alpha*dPoid_xh.m[i][h];}}
for(h=0;h<nb_hid;h++)dTheta_h.m[h]=-eta*delta_h.m[h]+alpha*dTheta_h.m[h];
for(j=0;j<nb_out;j++){for(h=0;h<nb_hid;h++)
{poid_hy.m[h][j]=poid_hy.m[h][j]+dPoid_hy.m[h][j];}}
for(j=0;j<nb_out;j++)theta_y.m[j]=theta_y.m[j]+dTheta_y.m[j];
for(h=0;h<nb_hid;h++){for(i=0;i<nb_dim;i++)
{poid_xh.m[i][h]=poid_xh.m[i][h]+dPoid_xh.m[i][h];}}
for(h=0;h<nb_hid;h++)theta_h.m[h]=theta_h.m[h]+dTheta_h.m[h];
ModifyPara();
for(j=0;j<nb_out;j++)err+=fabs(desire_y.m[j]-y.m[j]);
}
err=err/(nb_record*nb_out);
return err;
}
void BKNeuroNet::ApplyToTestingData(ifstream& in, ofstream& out)
{
int i,j,n1,n2,n3;
in>>n1>>n2>>n3;
if((n1!=nb_dim)||(n2!=nb_out))return;
out<<"observed"<<"\t"<<"infered\n";
for(i=0;i<n3;i++)
{
for(j=0;j<nb_dim;j++)in>>x.m[j];
for(j=0;j<nb_out;j++)in>>desire_y.m[j];
Using();
for(j=0;j<nb_out;j++){out<<desire_y.m[j]<<"\t"<<y.m[j]<<"\t";}
out<<endl;
}
}
void BKNeuroNet::ApplyToTestingData(ifstream& in, f2D& observed, f2D& infered)
{
int i,j,n1,n2,n3;
in>>n1>>n2>>n3;
if((n1!=nb_dim)||(n2!=nb_out))return;
observed.Initialize(n3,n2);
infered.Initialize(n3,n2);
for(i=0;i<n3;i++)
{
for(j=0;j<nb_dim;j++)in>>x.m[j];
for(j=0;j<nb_out;j++)in>>desire_y.m[j];
Using();
for(j=0;j<nb_out;j++)
{
observed.m[i][j]=desire_y.m[j];
infered.m[i][j]=y.m[j];
}
}
}
void BKNeuroNet::ApplyToData(f2D& Input, f2D& Output)
{
int i,j;
if((Input.nc!=nb_dim)||(Output.nc!=nb_out))return;
for(i=0;i<Input.nr;i++)
{
for(j=0;j<nb_dim;j++)x.m[j]=Input.m[i][j];
Using();
for(j=0;j<nb_out;j++)Output.m[i][j]=y.m[j];
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -