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

📄 neuralnetwork.cpp

📁 利用matlab编写的神经网络算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			AfxMessageBox("正确!");
			count++;
		}
	}
	right_ratio=(double)count/(double)test_num;
}



void NeuralNetwork::Clonal_Muta()
{
   //i.j为克隆规模循环和抗体规模循环
	//m,n为权值维数循环
       
		for (int j=0;j<10;j++)
		{
			//变异第一个权值矩阵
			for (int m=0; m<number_hidden;m++)
			{	
				for (int n=0;n<number_input;n++)
				{
					weight_1_muta[m][n][j]=weight_1[m][n]+alpha*mrand(-1,1);
				}
			}
			//变异第二个权值矩阵
			for (m=0; m<number_output;m++)
			{	
				for (int n=0;n<number_hidden;n++)
				{
					weight_2_muta[m][n][j]=weight_2[m][n]+alpha*mrand(-1,1);
				}
			}
		}



}


NeuralNetwork::train()
{
    double min_w,max_w;
	min_w=-1;
	max_w=1;
 
	double err_sum_temp=0;
	int count=0;
 
	double min_err;
	int min_pos=0;

	total_training_epoch=0;
	for (int p=0;p<sample_num-1;p++)
	{
		for (int q=p;q<sample_num;q++)
		{
			for (int n=0;n<character_num;n++)
			{
				data_norm_temp[q-p][n]=data_norm[q][n];
			}
			if (p==q)
			    data_out_temp[q-p]=3;
			else
				data_out_temp[q-p]=1;
			
		}
        sample_num_temp=sample_num-p;
		GetBinary();
		Init_weight(min_w,max_w);

    do
	{

		feed();
		alpha=1-exp(-err_sum);
		Clonal_Muta();
		feed_muta();
		min_err=err_sum_muta[0];
		min_pos=0;
		for (int m=1;m<10;m++)
		{
			if (err_sum_muta[m]<=min_err)
			{
				min_err=err_sum_muta[m];
			    min_pos=m;
			}
		}


			for (int i=0;i<number_hidden;i++)
			{
				for (int j=0;j<number_input;j++)
				{
					weight_1[i][j]=weight_1_muta[i][j][min_pos];
				}
			}
			for ( i=0;i<number_output;i++)
			{
				for (int j=0;j<number_hidden;j++)
				{
					weight_2[i][j]=weight_2_muta[i][j][min_pos];
				}
			}
  			total_training_epoch++;
			err_sum=min_err/(sample_num_temp*output_num);

           
	} while ((total_training_epoch<epoch)&&(err_sum>0.001));//
	CString ss,ss1;
	output_combine();
	ss.Format("第%d次训练结束!训练次数为 %d\n训练正确率为%f", p+1,total_training_epoch,right_ratio);
	AfxMessageBox(ss);
	ss.Format("file_w1_%d.txt",p+1);
	ss1.Format("file_w2_%d.txt",p+1);
	SaveWeightAsFile(ss,ss1);
	total_training_epoch=0;
	}
}

void NeuralNetwork::feed_muta()
{
    double output_of_hidden_muta[max_sample][max_node][10];//隐含层节点的输出
	double sum=0;
	for (int m=0;m<10;m++)
	{
	    for (int i=0;i<sample_num_temp;i++)
		{
		    for (int j=0;j<number_hidden;j++)
			{
			    for (int h=0;h<number_input;h++)
				{

			    	sum=sum+weight_1_muta[j][h][m]*data_norm_temp[i][h];
				}
		    	output_of_hidden_muta[i][j][m]=sum;
				output_of_hidden_muta[i][j][m]=sigmoid(output_of_hidden_muta[i][j][m]);
		    	sum=0;
			}
		}
	}


	for (m=0;m<10;m++)
	for (int i=0;i<sample_num_temp;i++)
	{
		for (int j=0;j<number_output;j++)
		{
			for (int h=0;h<number_hidden;h++)
			{
				sum=sum+weight_2_muta[j][h][m]*output_of_hidden_muta[i][h][m];
			}
			output_of_output_muta[i][j][m]=sum;
			output_of_output_muta[i][j][m]=sigmoid(output_of_output_muta[i][j][m]);
			sum=0;
		}
	}

	double err_temp=0;//
	double err_sum_temp=0;
	for (m=0;m<10;m++)
	{
	    for (int i=0;i<sample_num_temp;i++)
		{
		    for (int j=0;j<number_output;j++)
			{
			    err_temp=err_temp+fabs(output_of_output_muta[i][j][m]-data_out_binary[i][j]);
			}
		    err_sum_temp=err_sum_temp+err_temp;	
			err_temp=0;
		}
		err_sum_muta[m]=err_sum_temp;
		err_sum_temp=0;
	}


}

NeuralNetwork::output_combine()
{

	int out=0;
	int data=0,data1=0;
	double dd;
    CString ss;
	int count=0;
	for (int i=0;i<sample_num_temp;i++)
	{
		for (int j=0;j<number_output;j++)
		{

			if (output_of_output[i][j]>=0.5)
				data=1;
			else if (output_of_output[i][j]<0.5)
				data=0;
			out=out+data*pow(2,output_num-j-1);
			data=0;
		}
        output_com[i]=out;
		if (output_com[i]==data_out_temp[i])
		{
			count++;
		}
		out=0;
	}

	right_ratio=(double)count/(double)sample_num_temp;
	
}


BOOL NeuralNetwork::SaveDatanormAsFile(CString filename)
{
		FILE *fp;
	    fp=fopen(filename,"w");
		if (fp==NULL)
		{
			AfxMessageBox("没有此文件");
			return FALSE;
		}
    	for (int i=0;i<sample_num;i++)
			for (int j=0;j<character_num;j++)
			    fprintf(fp,"%f\n",data_norm[i][j]);
				fclose(fp);
		return TRUE;

}

void NeuralNetwork::LoadDatanorm(CString filename)
{
	CFile fp;//文件变量
	DWORD len;//文件长度
	char buf[10000];
	CString cweight;
//读取
	fp.Open(filename,CFile::modeRead);
	len=fp.GetLength();
	fp.Read(buf,len);
	fp.Close();
	cweight.Empty();
	for (int i=0;i<(int)len;i++)
		cweight=cweight+buf[i];

    double data;//临时保存数据
	int count=0;
	int numb_sam=0;
	int numb_cha=0;
	CString ss;
	for (i=0;i<(int)len;i++)
	{
		if (cweight.Mid(i,1)!="\n")
			count++;
		if (cweight.Mid(i,1)=="\n")
		{
		    data=atof(cweight.Mid(i-count-1,count));//
		    count=0;
			numb_cha++;

		    if ((fmod((numb_cha-1),character_num)==0)&&((numb_cha-1)!=0))
			{
				numb_sam++;
				numb_cha=1;
			}
			data_norm[numb_sam][numb_cha-1]=data;
			ss.Format("data_norm[%d][%d]=%f",numb_sam,numb_cha-1,data_norm[numb_sam][numb_cha-1]);
			AfxMessageBox(ss);
		}
	}


}

BOOL NeuralNetwork::GetTestData(CString filename)
{
	CFile fp;
	CString sdata;
    DWORD len;//记录文件长度
	char  buf[5000];//读取的字符串

	fp.Open(filename,CFile::modeRead);
	len=fp.GetLength();
    fp.Read(buf,len);
    fp.Close();

	sdata.Empty();
	for (int i=0;i<int(len);i++)
	{
		sdata=sdata+buf[i];
	}

	int di=0;
	int character_num1=0,character_num2;
	sample_num_test=0;

    int data_len=sdata.GetLength();
    while (di<data_len)
	{
		if (sdata.Mid(di,1)==' ')
		{
			data_file[sample_num][character_num1]=atof(sdata.Mid(di-5,5));
			character_num1++;
		}
        if (sdata.Mid(di,1)=='\n')
		{
			data_file[sample_num][character_num1]=atof(sdata.Mid(di-6,5));
     
			sample_num_test++;
			
			
			if ((sample_num>1) && (character_num2!=character_num1))
			{
				AfxMessageBox("数据错误,数据不完整,请检查!");
				return 0;
			}
            character_num2=character_num1;
			character_num1=0;
		}
		di++;
	}
    character_num_test=character_num2;

	if (character_num_test!=character_num)
	{
		AfxMessageBox("测试数据的属性个数与神经网络输入不符!");
		return FALSE;
	}
//将样本分离为输入和输出样本
	CString ss;
	for (i=0;i<sample_num_test;i++)
	{
		for (int j=1;j<=character_num;j++)
		{
			data_in[i][j-1]=data_file[i][j];

		}
		data_out[i]=data_file[i][0];

	}
//将输出分解为二进制数
	int  tem_bi;
	for (i=0;i<sample_num;i++)
	{
		for (int j=0;j<output_num;j++)
		{
			tem_bi=(int)data_out[i]>>(int)(output_num-j-1);
			data_out_binary[i][j]=(tem_bi&1);
		}
	}
	return TRUE;

}

CString NeuralNetwork::LoadInfo(CString filename, int num)
{
	CFile fp;//文件变量
	DWORD len;//文件长度
	char buf[10000];
	CString info;

//读取信息
	fp.Open(filename,CFile::modeRead);
	len=fp.GetLength();
	fp.Read(buf,len);
	fp.Close();
	info.Empty();
	for (int i=0;i<(int)len;i++)
		info=info+buf[i];

	int numb=0;
	int numb1=0;
	CString nums;
    nums.Format("#%d",num);
	numb=info.Find(nums,0);
	if (numb==-1)
	{
		AfxMessageBox("没有找到该故障编号!");
		return "0";
	}

	numb1=info.Find("#",numb);
	return info.Mid(numb,numb1-numb);


}

void NeuralNetwork::normnofile()
{
	int i=0,j=0;
	double ddd;
	CString ss;
	for (i=0;i<sample_num;i++)
	{
		for (j=0;j<character_num;j++)
		{
			ddd=data_in[i][j];

			if ((ddd<=28.3) && (ddd>27.7))
			{
				data_norm[i][j]=1;
			}
			if ((ddd==1))
			{
				data_norm[i][j]=1;
			}
			if ((ddd<=27.7) && (ddd>0.3) && (ddd!=1))
			{
				data_norm[i][j]=(28.3-data_in[i][j])/27.4;
			}
			if ((ddd<=0.3) && (ddd>-0.3))
			{
				data_norm[i][j]=0;
			}
			if ((ddd<=-0.3) && (ddd>-27.7))
			{
				data_norm[i][j]=(-27.7-data_in[i][j])/27.4;
			}
			if ((ddd<=-27.7) && (ddd>=-28.3))
			{
 				data_norm[i][j]=-1;
			}
			if (ddd<-28.3)
			{
				data_norm[i][j]=-2;
			}
			if (ddd>28.3)
			{
				data_norm[i][j]=2;
			}
		}
	}

}

NeuralNetwork::GetBinary()
{
    
/*	max_out=data_out_[0];
	for (int i=1;i<sample_num;i++)
	{
		if (data_out[i]>max_out)
			max_out=data_out[i];
	}
	
//确定输出维数
	if (max_out<1)
		AfxMessageBox("输出维数小于或等于0,错误!");
	else if (max_out==2)
		output_num=1;
	else if ((max_out==3)||(max_out==4))
		output_num=2;
	else if ((max_out>4)&&(max_out<=8))
		output_num=3;
	else if ((max_out>8)&&(max_out<=16))
		output_num=4;
	else if ((max_out>16)&&(max_out<=32))
		output_num=5;
	else if ((max_out>32)&&(max_out<=64))
		output_num=6;
	else if ((max_out>64)&&(max_out<=128))
		output_num=7;
 /*   if (max_out<1)
		AfxMessageBox("输出维数小于或等于0,错误!");
	else if (max_out<10)
		output_num=1;
	else if (max_out>=10)
		output_num=2;
	number_output=output_num;
	number_hidden=NUM_HIDDEN;
//将输出分解为二进制数*/
	int  tem_bi;
	output_num=2;
	for (int i=0;i<sample_num_temp;i++)
	{
		for (int j=0;j<output_num;j++)
		{
			tem_bi=(int)data_out_temp[i]>>(int)(output_num-j-1);
			data_out_binary[i][j]=(tem_bi&1);
		}
	}	
}

⌨️ 快捷键说明

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