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

📄 neural_network.cpp

📁 本文介绍了一个用java语言编写的用于分析消费行为的数据挖掘应用软件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				}
				
			}
			/*隐藏层和隐藏层之间的权重更新*/
			for(i=0;i<GetNum_h()-1;i++)
			{
				for(j=0;j<h_layers[i].GetNode_Num();j++)
				{
					for(k=0;k<h_layers[i+1].GetNode_Num();k++)
					{
						m_w = wp[m_w_id].GetW_w() + l*(h_layers[i+1].GetNode(k).GetErr())*(h_layers[i].GetNode(j).GetO_value());
						wp[m_w_id].SetW_w(m_w);
						m_w_id++;
					}
				}
			}
			/*隐藏层和输出层之间的权重更新*/
        
			for(j=0;j<h_ln_num;j++)
			{
				for(i=0;i<o_n_num;i++)
				{
					m_w = wp [m_w_id].GetW_w() + l*(o_layers[0].GetNode(i).GetErr())*(h_layers[GetNum_h()-1].GetNode(j).GetO_value()); //按公式计算
					wp[m_w_id].SetW_w(m_w);
					m_w_id++;
				}
				
			}
			
			/*隐藏层和输出层节点的偏倚更新*/
			
			/*隐藏层*/
			for(i=0;i<GetNum_h();i++)
			{
				for(j=0;j<h_layers[i].GetNode_Num();j++)
				{
					m_bas = h_layers[i].GetNode(j).GetBias() + l*(h_layers[i].GetNode(j).GetErr());
					h_layers[i].GetNode(j).SetBias(m_bas);
				}
			}
			/*输出层*/
			for(j=0;j<o_n_num;j++)
			{
				m_bas = o_layers[0].GetNode(j).GetBias() + l*(o_layers[0].GetNode(j).GetErr()); //按公式计算
				o_layers[0].GetNode(j).SetBias(m_bas); 
			}

		} //周期结束
		p_data = temp;
		err_kind = err_kind_num/num_data;
		if(err_kind<m_err_kind)
		{
			isStop = true;
		}
		
	}

}
CString CNeural_NetWork::GetResult()
{
	       /*输出训练停止后的各节点权重和偏倚*/
	       CString outstr = "";
		   CString tempstr = "";
		   CString cstr = "";
		   float *temp_hbas = new float[count_of_hbas];
		   float *temp_obas = new float[o_layers[0].GetNode_Num()];
		   int index = 0;
			for(int i=0;i<GetNum_h();i++)
			{
				for(int j=0;j<h_layers[i].GetNode_Num();j++)
				{
					tempstr.Format("%d",index+1);
					cstr.Format("%f",h_layers[i].GetNode(j).GetBias());
					outstr = outstr+"隐藏层结点"+tempstr+"偏倚:"+cstr+"\r\n";
					temp_hbas[index] = h_layers[i].GetNode(j).GetBias();
					index++;
				}
			}
			for(i=0;i<o_layers[0].GetNode_Num();i++)
			{
				     tempstr.Format("%d",i+1);
					 cstr.Format("%f",o_layers[0].GetNode(i).GetBias());
					 outstr = outstr+"输出层结点"+tempstr+"偏倚:"+cstr+"\r\n";
				     temp_obas[i] = o_layers[0].GetNode(i).GetBias();
			}
			tempstr = "";
			cstr.Format("%f",o_layers[0].GetNode(0).GetO_value());
			tempstr = outstr+"结点输出值:"+cstr+"\r\n";
			cstr.Format("%f",o_layers[0].GetNode(0).GetErr());
			tempstr = tempstr + "输出结点误差:"+cstr;
			return tempstr;
}
void CNeural_NetWork::ParametersSave(int n)
{
           
	       BOOL si,so,sh,shbas,sobas,sw,sh_l;
	       CString tempstr = "";
		   CString outstr = "";
		   CString cstr = "";
		   int isSave=AfxMessageBox("保存会覆盖上一次的数据,确认保存?",MB_YESNO|MB_ICONINFORMATION,-1);
           if(isSave == 6)
		   {
		   cstr.Format("%d",o_layers[0].GetNode_Num());
		   so = WriteToSaveFile(cstr,"NumOfOlayerNodes.txt"); //保存输出层结点数

		   cstr.Format("%d",i_layers[0].GetNode_Num());
		   si = WriteToSaveFile(cstr,"NumOfIlayerNodes.txt"); //保存输入层结点数

		   cstr.Format("%d",GetNum_h());
		   sh_l = WriteToSaveFile(cstr,"NumOfHlayer.txt"); //保存隐藏层数

	       for(int i=0;i<GetNum_h();i++)
			{
				tempstr.Format("%d",h_layers[i].GetNode_Num());
                outstr = outstr + tempstr +"\r\n";
			} 
            sh =  WriteToSaveFile(outstr,"NumOfHlayerNodes.txt"); //保存隐藏层各层的结点数
            
			outstr = ""; //清空
			for(i=0;i<GetNum_h();i++)
			{
				for(int j=0;j<h_layers[i].GetNode_Num();j++)
				{
					
					tempstr.Format("%f",h_layers[i].GetNode(j).GetBias());
					outstr = outstr + tempstr +"\r\n";
                
				}
			}
            shbas =  WriteToSaveFile(outstr,"HlayesBas.txt"); //保存隐藏层各层的结点的偏倚
            
			outstr = "";
			for(i=0;i<o_layers[0].GetNode_Num();i++)
			{
				     tempstr.Format("%f",o_layers[0].GetNode(i).GetBias());
                     outstr = outstr + tempstr +"\r\n";
			}
			sobas = WriteToSaveFile(outstr,"OlayesBas.txt"); //保存输出层各层的结点的偏倚
			
			outstr = "";
			for (i=0;i<n;i++) 
			{    
                     tempstr.Format("%f",wp[i].GetW_w());
                     outstr = outstr + tempstr +"\r\n";
			}
			sw =    WriteToSaveFile(outstr,"w.txt"); //保存网络权重

            
			if(si&&so&&sh&&shbas&&sobas&&sw&&sh_l)
			{
				AfxMessageBox("保存成功!");
				return;
			}
			else
			{
                AfxMessageBox("保存失败!");
				return;
			}
		   }
}
BOOL CNeural_NetWork::WriteToSaveFile(CString m_str,CString FileName)
{
	 
		   CStdioFile file;
		   file.Open(FileName,CFile::modeCreate|CFile::modeReadWrite);
		   file.WriteString(m_str);
		   file.Close();
		   return TRUE;
}
int CNeural_NetWork::ReadFromSaveFile(CString FileName)
{
	       CStdioFile file;
		   CString tempstr;
		   int thedata;
		   file.Open(FileName,CFile::modeRead|CFile::typeText);
		   while(file.ReadString(tempstr))
		   {
				 tempstr.TrimLeft();
				 tempstr.TrimRight();
				 thedata = int(atoi(tempstr));
		   }
		  
		   
		   file.Close();
		   return thedata;
}
float* CNeural_NetWork::ReadPFromSaveFile(CString FileName)
{
	       CStdioFile file;
		   CString tempstr;
		   int NumofIndex = 0;
		   file.Open(FileName,CFile::modeRead|CFile::typeText);
		   while(file.ReadString(tempstr))
		   {
               
			   NumofIndex++;
		   }
		   file.Close();
		   tempstr = "";
		   float *m_p_data = new float[NumofIndex];
		   NumofIndex = 0;
           file.Open(FileName,CFile::modeRead|CFile::typeText);
		   while(file.ReadString(tempstr))
		   {
               tempstr.TrimLeft();
			   tempstr.TrimRight();    
			   m_p_data[NumofIndex++] = float(atof(tempstr));
		   }
		   file.Close();
		   return m_p_data;
}
CWeight* CNeural_NetWork::ReadWFromSaveFile(CString FileName)
{
	       CStdioFile file;
		   CString tempstr;
		   int NumofIndex = 0;
		   file.Open(FileName,CFile::modeRead|CFile::typeText);
		   while(file.ReadString(tempstr))
		   {
               
			   NumofIndex++;
		   }
		   file.Close();
		   tempstr = "";
		   CWeight *m_p_data = new CWeight[NumofIndex];
		   NumofIndex = 0;
           file.Open(FileName,CFile::modeRead|CFile::typeText);
		   while(file.ReadString(tempstr))
		   {
               tempstr.TrimLeft();
			   tempstr.TrimRight();    
			   m_p_data[NumofIndex++].SetW_w(float(atof(tempstr)));
		   }
		   file.Close();
		   
		   return m_p_data;
}
int* CNeural_NetWork::ReadPHFromSaveFile(CString FileName)
{
          CStdioFile file;
		   CString tempstr;
		   int NumofIndex = 0;
		   file.Open(FileName,CFile::modeRead|CFile::typeText);
		   while(file.ReadString(tempstr))
		   {
               
			   NumofIndex++;
		   }
		   file.Close();
		   tempstr = "";
		   int *m_p_data = new int[NumofIndex];
		   NumofIndex = 0;
           file.Open(FileName,CFile::modeRead|CFile::typeText);
		   while(file.ReadString(tempstr))
		   {
               tempstr.TrimLeft();
			   tempstr.TrimRight();    
			   m_p_data[NumofIndex++] = float(atof(tempstr));
		   }
		   file.Close();
		   return m_p_data;
}
float CNeural_NetWork::GetOvalue(float *p_data)
{
    int i,j,k,m,n,t; //循环计数变量
	float i_value,o_value; //临时变量用于存储节点净输入和净输出
	float err; //临时变量存储节点误差
	float t_value; //临时变量存储输出节点期望
	short h_n_num,o_n_num,i_n_num,h_ln_num,h_an_num=0; //分别存储隐藏层第一层节点数和输出层节点数,输入层节点数,
	                                        //隐藏层最后一层节点数,隐藏层总的节点数
	short ih_w_num =0,hh_w_num = 0; //ih_w_num,输入层到隐藏层第一层的权重总数,hh_w_num隐藏层之间的权重总数
	short m_w_id; //权重主标识
	float m_w; //临时变量存储权重
	float m_bas; //临时变量存储偏倚
	int idx = 0; //数据数组的行索引
	double train_t_num=1;
	isStop = false;
	h_n_num = h_layers[0].GetNode_Num();
	o_n_num = o_layers[0].GetNode_Num();
	i_n_num = i_layers[0].GetNode_Num();
	h_ln_num = h_layers[GetNum_h()-1].GetNode_Num();
	for(j=0;j<GetNum_h();j++)
	{
		h_an_num = h_an_num + h_layers[j].GetNode_Num();
	}
	ih_w_num = i_layers[0].GetNode_Num()*h_layers[0].GetNode_Num();
	for(int ii_h=0;ii_h<GetNum_h()-1;ii_h++)
	{
		hh_w_num = hh_w_num+h_layers[ii_h].GetNode_Num()*h_layers[ii_h+1].GetNode_Num();
	}
	float w_sum = 0; //w_sum存储节点加权和
	float *temp;
	temp = p_data;
	/*算法开始*/
			m_w_id = 0; //权重主标识清零
			for(i=0;i<i_n_num;i++)
			{
				i_layers[0].GetNode(i).SetI_value(*p_data); //设置元组输入层单元的输入值
				p_data++;
			}
			for(i=0;i<o_n_num;i++)
			{
			    o_layers[0].GetNode(i).SetT(*p_data); //设置元组输出层单元对应期望
			    p_data++;
			}
			
			/*向前传播输入*/ 
			for(i=0;i<h_n_num;i++)
			{
				for(j=0;j<i_n_num;j++)
				{
					k = j*h_n_num;
					w_sum = w_sum+(wp[k+i].GetW_w())*(i_layers[0].GetNode(j).GetI_value());
				}
				i_value = w_sum+h_layers[0].GetNode(i).GetBias(); //计算出隐藏层第一层各个节点的净输入
				o_value = 1/(1+exp(-i_value));                       //计算出隐藏层第一层各个节点的净输出
				h_layers[0].GetNode(i).SetI_value(i_value); 
				h_layers[0].GetNode(i).SetO_value(o_value);
				w_sum = 0;
			}
			/////////////////////////////////////////////////////
			n = h_n_num*i_n_num;
			for(i=0;i<GetNum_h()-1;i++)
			{
				for(j=0;j<h_layers[i+1].GetNode_Num();j++)
				{
					for(k=0;k<h_layers[i].GetNode_Num();k++)
					{
						m = k*h_layers[i+1].GetNode_Num();
						w_sum = w_sum + (wp[m+j+n].GetW_w())*(h_layers[i].GetNode(k).GetO_value());
					}
					i_value = w_sum+h_layers[i+1].GetNode(j).GetBias();  //隐藏层其它层净输入
					o_value = 1/(1+exp(-i_value));                       //隐藏层其它层净输出
					h_layers[i+1].GetNode(j).SetI_value(i_value); 
					h_layers[i+1].GetNode(j).SetO_value(o_value);
					w_sum = 0;
				}
				n = n + h_layers[i].GetNode_Num()*h_layers[i+1].GetNode_Num();
			}
			/////////////////////////////////////////////////////
			for(i=0;i<o_n_num;i++)
			{
				for(j=0;j<h_ln_num;j++)
				{
					k = j*o_n_num;
					w_sum = w_sum+(wp[(k+i)+(ih_w_num+hh_w_num)].GetW_w())*(h_layers[GetNum_h()-1].GetNode(j).GetO_value());

				}
				i_value = w_sum+o_layers[0].GetNode(i).GetBias(); //计算出输出层各个节点的净输入
				o_value = 1/(1+exp(-i_value));                       //计算出输出层各个节点的净输出
				o_layers[0].GetNode(i).SetI_value(i_value); 
				o_layers[0].GetNode(i).SetO_value(o_value);
				w_sum = 0;
			}

			
	return o_layers[0].GetNode(0).GetO_value();
}
CNeural_NetWork::~CNeural_NetWork()
{
	delete [] h_layers;
	delete [] o_layers;
	delete [] i_layers;

}

⌨️ 快捷键说明

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