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

📄 isodata.cpp

📁 聚类分析isodata算法的C++实现程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{ 
	cout<<endl<<"更新类中心开始!!"<<endl; 
  int i,j,k;   
  double average;
	for(i=0;i<CenterNum;i++)
		for(j=0;j<InDim;j++)
		  {
		  	average=0;		  	
		    for(k=0;k<m_center[i].HasSampleNum;k++)
		       average+=m_sample[m_center[i].HasSample[k]].SFeature[j];
		       		      
		    m_center[i].CFeature[j]=average/static_cast<double>(m_center[i].HasSampleNum);
		  }
		  cout<<endl<<"更新类中心结束!!"<<endl; 
};


/************************************************************************/
/*	计算每一类内平均距离                                                */
/************************************************************************/
void CalCenterDist()
{
	cout<<endl<<"计算每一类内平均距离开始!!"<<endl; 
  int i,j;
  double avgdist;
  for(i=0;i<CenterNum;i++)
     {
     	 avgdist=0;
     	 for(j=0;j<m_center[i].HasSampleNum;j++)
         {
         	 cout<<"m_center["<<i<<"].HasSampleNum="<<m_center[i].HasSampleNum<<endl;
         	 avgdist+=GetDistance(m_center[i].CFeature,m_sample[m_center[i].HasSample[j]].SFeature);    
         }       
      AvgDistance[i]=avgdist/static_cast<double>(m_center[i].HasSampleNum);
     }   
     cout<<endl<<"计算每一类内平均距离结束!!"<<endl;     
}       
 
/************************************************************************/
/*	计算所有类的平均距离                                                */
/************************************************************************/ 
 void CalAllAvgDist()
{
  cout<<endl<<"计算所有类的平均距离开始!!"<<endl;
  int i;
  double avgdist=0.0;
  for(i=0;i<CenterNum;i++)
      avgdist+=AvgDistance[i]*m_center[i].HasSampleNum;    
  AllAvgDist=avgdist/static_cast<double>(SamNum); 
  cout<<endl<<"计算所有类的平均距离结束!!"<<endl;       
}   
 
       
/************************************************************************/
/*	计算每一类的标准差                                                  */
/************************************************************************/ 
void CalStanDeviation()
{
	 cout<<endl<<"计算每一类的标准差开始!!"<<endl;
	 int i,j,k;
		for(i=0;i<CenterNum;i++)
	    {
		   float tem[InDim]={0.0};
		   for(j=0;j<InDim;j++)
		     { 
		     	 for(k=0;k<m_center[i].HasSampleNum;k++)
		          tem[j]+=(m_sample[m_center[i].HasSample[k]].SFeature[j]-m_center[i].CFeature[j])*(m_sample[m_center[i].HasSample[k]].SFeature[j]-m_center[i].CFeature[j]);
           m_center[i].StanDeviation[j]=sqrt(tem[j]/static_cast<double>(m_center[i].HasSampleNum));
		     } 	
	    }
	    cout<<endl<<"计算每一类的标准差结束!!"<<endl;
}	


/************************************************************************/
/*	找出每一类的标准差最大分量                                          */
/************************************************************************/ 

void FindMaxStanDeviation()
{
	cout<<endl<<"找出每一类的标准差最大分量开始!!"<<endl;
	int i,j;
	double temp=0;
	for(i=0;i<CenterNum;i++)
	  {
	   	m_center[i].MaxStanDev=m_center[i].StanDeviation[0];
	    for(j=0;j<InDim;j++)
	      if(m_center[i].MaxStanDev<m_center[i].StanDeviation[j]) 
	   	     {
	   	 	     m_center[i].MaxStanDev=m_center[i].StanDeviation[j];
	   	 	     m_center[i].MaxStanDevIndex=j;
	   	     }	     
	  }	  
	 cout<<endl<<"找出每一类的标准差最大分量结束!!"<<endl;
}


/************************************************************************/
/*	将一类分裂为两类                                                    */
/************************************************************************/ 
void Split(int i)
{
	 cout<<endl<<"将一类分裂为两类开始!!"<<endl;
	 cout<<"被分裂的是第"<<i+1<<"类!"<<endl; 
	 int j;
     float Gama=0.5;
	 Center centerposi,centerneg;		        
	 centerposi.CenterIndex=m_center[i].CenterIndex;	 
	 for(j=0;j<InDim;j++)
	   {
	      centerposi.CFeature[j]=centerneg.CFeature[j]=m_center[i].CFeature[j];	
          cout<<"centerposi.CFeature["<<j<<"]=centerneg.CFeature["<<j<<"]="<<centerposi.CFeature[j]<<endl;	       			       	
		    if(j==m_center[i].MaxStanDevIndex) 
		       {
		 	       centerposi.CFeature[j]=m_center[i].CFeature[j]+Gama*m_center[i].MaxStanDev;
		         centerneg.CFeature[j]=m_center[i].CFeature[j]-Gama*m_center[i].MaxStanDev;
		       }
		  }	
		m_center[i]=centerposi;
		m_center[CenterNum]=centerneg;
		flag2=true; 	
		cout<<endl<<"将一类分裂为两类结束!!"<<endl;        
}


/************************************************************************/
/*	计算两两中心间的距离                                                */
/************************************************************************/ 
void Cal22CenterDist()
{
	cout<<endl<<"计算两两中心间的距离开始!!"<<endl;
	int i,j;	
	for(i=0;i<CenterNum;i++)
	  for(j=0;j<CenterNum;j++)
	    {
	  	  Distij[ss]=GetDistance(m_center[i].CFeature,m_center[j].CFeature);
	  	  Disti[ss]=i;
	  	  Distj[ss]=j;
	  	  ss++;
	  	}
	  	cout<<endl<<"计算两两中心间的距离结束!!"<<endl;
}


/************************************************************************/
/*	按CenterDist排序                                                    */
/************************************************************************/ 
void Taxis()
{
	cout<<endl<<"按CenterDist排序开始!!"<<endl;
	int i,j;	
	double temp1;
	int temp2;
	
	for(i=0;i<ss-1;i++)
    for(j=i+1;j<ss;j++)
      if(Distij[i]>Distij[j])
      	{
      		temp1=Distij[i];
      		Distij[i]=Distij[j];
      		Distij[j]=temp1;
      		
      		temp2=Disti[i];
      		Disti[i]=Disti[j];
      		Disti[j]=temp2;
      		
      		temp2=Distj[i];
      		Distj[i]=Distj[j];
      		Distj[j]=temp2;
      	}
      	
   for(i=0;i<ss;i++)
	 	if(Distij[i]>0&&Distij[i]<=MinCenterDist)
	  	{
	  		sss=i;
	  		flag3=true;
	  		break;
	  	} 
	  	cout<<endl<<"按CenterDist排序结束!!"<<endl;
}
    
      	
/************************************************************************/
/*	归并一对(一次只归并一对)                                            */
/************************************************************************/     	
void Combination()
{ 
	cout<<endl<<"归并一对开始!!"<<endl;
	int i,j,k;
	double tempcenterfea[InDim]={0};
	for(i=0;i<InDim;i++)
	  { 	  	
	  	tempcenterfea[i]=m_center[Disti[sss]].HasSampleNum*m_center[Disti[sss]].CFeature[i];
      tempcenterfea[i]+=m_center[Distj[sss]].HasSampleNum*m_center[Distj[sss]].CFeature[i];
      m_center[Disti[sss]].CFeature[i]=tempcenterfea[i]/static_cast<double>(m_center[Disti[sss]].HasSampleNum+m_center[Distj[sss]].HasSampleNum);
    }
   for(i=Distj[sss];i<CenterNum-1;i++)
      m_center[i]=m_center[i+1];
   CenterNum--;
   cout<<endl<<"归并一对结束!!"<<endl;
}
     
 
/************************************************************************/
/*	输出分类结果                                                        */
/************************************************************************/   
void ShowResults()
{
	cout<<endl<<"输出分类结果开始!!"<<endl;
	int i,j;
	ofstream outfile;
	outfile.open("result.txt");
	outfile<<"总共"<< SamNum<<"组数据:"<<endl<<endl;
	
	for(i=0;i<CenterNum;i++)
	  { outfile<<endl<<"-----------------------------------------------"<<endl<<endl;
	  	outfile<<"分在第"<<i+1<<"类的组数为:"<<endl<<endl;
	    for(j=0;j<m_center[i].HasSampleNum;j++)
	      {	 
	       outfile<<setw(5)<<m_center[i].HasSample[j];
	    	 if(j%5==4)   outfile<<endl;
		    }
      outfile<<endl<<endl<<"第"<<i+1<<"类共有"<<m_center[i].HasSampleNum<<"组数据。"<<endl;
      outfile<<endl<<"    第"<<i+1<<"类的中心是:"<<endl<<endl;
      for(j=0;j<InDim;j++)
         outfile<<setw(10)<<m_center[i].CFeature[j];
      outfile<<endl<<endl<<"此类的各分量的标准差为"<<endl<<endl;
      for(j=0;j<InDim;j++)
         outfile<<setw(10)<<m_center[i].StanDeviation[j];
	    outfile<<endl<<endl<<"-----------------------------------------------"<<endl<<endl;	
	  }
	 outfile<<endl<<endl<<"各类中心间的距离:"<<endl<<endl; 
	 for(i=0;i<CenterNum;i++)
	    outfile<<"         第"<<i+1<<"类";
	 outfile<<endl;
	 for(i=0;i<CenterNum;i++)
	  {	
	  	outfile<<"第"<<j+1<<"类";  	
	  	for(j=0;j<CenterNum;j++)
	  	   outfile<<setw(10)<<Distij[i][j];
	  	outfile<<endl;
	  }
	  outfile.close();	
	  cout<<endl<<"输出分类结果结束!!"<<endl;
};  
      
int main()
{   
	int i,j;
	cout<<endl;
	step1:
		SetParameter();
	PutinData();	
	CreateRandomCenters();
	step2_3:	
	do
	{ InitiateCenters();
		ClassJudge();	
		flag1=false;
		DecreaseCenters();
	   
	}while(flag1);
	step4:
		UpdateCenter();
	step5:
		CalCenterDist();
	step6:	
		CalAllAvgDist();		
	step7:
	  if(MergerTimes>=MaxMergerTimes)
		    goto step14;
	  if(CenterNum<=ExpectCenterNum/2) 
		  {
			  MinCenterDist-0;
	 	    goto step8;
      }
	  if((MergerTimes%2==0)||CenterNum>=2*ExpectCenterNum) 
	  	  goto step11;		
  step8:
	  CalStanDeviation();
	step9:
		FindMaxStanDeviation();
  step10:
  	for(i=0;i<CenterNum;i++)
  	  if(m_center[i].MaxStanDev>MaxStanDeviation)
  	  	if((AvgDistance[i]>AllAvgDist&&m_center[i].HasSampleNum>2*MinSampleNum+1)||CenterNum<=ExpectCenterNum/2)
		      Split(i);
		if(flag2)
		   	{  
		   		CenterNum++;
		   		goto step2_3;      
		   	}
	step11:
		Cal22CenterDist();
	step12:
		Taxis();
	step13:
		if(flag3)		   Combination();
	step14:		
		if(MergerTimes>=MaxMergerTimes) 
			goto step15;
		else 
			goto step2_3;
	step15:
		ShowResults();
	cout<<endl<<"分类成功!!"<<endl;
	system("pause");
	return 0; 	    
} 
 
 

⌨️ 快捷键说明

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