⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bkneuro.h

📁 類神經網路的BK演算法
💻 H
📖 第 1 页 / 共 2 页
字号:
		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 + -