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

📄 pr_hcm.cpp

📁 模式识别中的HCM算法
💻 CPP
字号:
#include"PR_HCM.h"
#include<stdlib.h>

#include<math.h>

#define MIN(x,y) (((x)>(y))?(y):(x))
#define MAX(x,y) (((x)<(y))?(y):(x))


PR_HCM::PR_HCM(int m,int n):num_iterations(m-1),
							num_cluster(m),distype(SHORTEST),
							min1(0),min2(0),
							K_num(m,1)
{    

	PR_unit unit;
	char buf[10];
	for(int i=0;i<m;i++)
	{
		samples.push_back(unit);
		_itoa(i,buf,10);
		cluster.push_back(buf);
	}
}

PR_HCM::PR_HCM(std::ifstream &fin)
{
	int m(0),n(0);
	
	if(!fin)return;
	
	std::string str;

	char buf[10];
	while(!fin.eof()) 
	{ 
		getline(fin,str);//get the number of the samples

		_itoa(m,buf,10);
		cluster.push_back(buf);

		m++;

		PR_unit unit;
		for(int i=0;i<str.size();i++)
		{
			std::string t_str;
			while(str[i] != ' '&& str[i] != '\n' && i<str.size())
			{
				t_str.push_back(str[i]);
				i++;
			}
			//std::cout<<t_str<<std::endl;

			unit.unit.push_back(atof(t_str.c_str()));
			if(1 == m)
			{
				n++;
			}
		}
		samples.push_back(unit);
	}


	num_iterations = m-1;
	num_cluster = m;
	distype = SHORTEST;
	min1=0;
	min2=0;

	for(int i=0;i<m;i++)
	{
		K_num.push_back(1);
	}

	//std::cout<<"mn:"<<m<<"\t"<<n<<std::endl;

}

void PR_HCM::Set_iternum(int num)
{
	num_iterations = num;
}

void PR_HCM::PrintSamples()
{
	for(std::vector< PR_unit >::size_type i=0;i<samples.size();i++)
	{
		std::cout<<i<<":\t";
		samples[i].Print();
		std::cout<<std::endl;
	}
}

void PR_HCM::Choosetwo()
{
	double dd = dis[0];
	int n=0;

	for(int i=0;i< num_cluster;i++)
	{
		for(int j=0;j< i;j++)
		{
			if(dis[n] <= dd)
			{
				dd = dis[n];
				min1 = i;//j<i
				min2 = j;//min2<min1
			}
			n++;
		}
	}
	//std::cout<<min1<<"\t"<<min2<<std::endl;
}

void PR_HCM::PrintCluster()
{
	std::cout<<"The cluster are:\n";
	for(std::vector< std::string >::size_type i=0;i<cluster.size();i++)
	{
		std::cout<<cluster[i]<<"\t";
	}
	std::cout<<std::endl;
}
void PR_HCM::PrintDis()
{
	int n=0;
	for(int i=0;i< num_cluster;i++)
	{
		for(int j=0;j< i;j++)
		{
			std::cout<<dis[n]*dis[n]<<"\t";
			n++;
		}
		std::cout<<std::endl;
	}
	/*for(int i=0;i<dis.size();i++)
	{
		std::cout<<dis[i]*dis[i]<<"\t";
	}*/
}
void PR_HCM::SetDistype(DisType type)
{
	distype = type;
}
void PR_HCM::CalcDis()
{
	for(int i=0;i< samples.size();i++)
	{
		for(int j=0;j< i;j++)
		{
			dis.push_back(distance(samples[i],samples[j]));
		}
	}
}

void PR_HCM::Mergingcluster()
{
	cluster[min2] = "(" + cluster[min2] + "," + cluster[min1] + ")";
	cluster.erase(cluster.begin()+min1);
}


int PR_HCM::serial(int i,int j)
{
	if(i>j)
	{
		return i*(i-1)/2 + j;
	}
	else
	{
		return j*(j-1)/2 + i;
	}
}
double PR_HCM::ChooseDis(int h,int i,int j)
{
	double res;
	double ai,aj,b,g;
	double Dhi,Dhj,Dij;

	Dhi = dis[serial(h,i)];
	Dhj = dis[serial(h,j)];
	Dij = dis[serial(i,j)];

	//std::cout<<Dhi*Dhi<<"\t"<<Dhj*Dhj<<"\t"<<Dij*Dij<<"\n";
	switch(distype)
	{
	case SHORTEST:
		{
			ai=0.5,aj=0.5,b=0,g=-0.5;
			break;
		}
	case LONGEST:
		{
			ai=0.5,aj=0.5,b=0,g=0.5;
			break;
		}
	case MIDDLE:
		{
			
			break;
		}
	case AVERAGE:
		{
			
			break;
		}
	case CENTERGRAVITY:
		{
			ai=0.5,aj=0.5,b=-0.25,g=0;
			break;
		}
	default:
		break;
	}
	res = sqrt( ai*Dhi*Dhi + aj*Dhj*Dhj + b*Dij*Dij + g*fabs(Dhi*Dhi - Dhj*Dhj));

	return res;
}
void PR_HCM::UpdateDis()
{
	std::vector<double> dis_temp;

	for(int i=0;i< num_cluster;i++)
	{
		for(int j=0;j< i;j++)
		{
			if( i != min1 && i!= min2 )
			{
				if(j != min2 && j!= min1)
				{
					dis_temp.push_back(dis[serial(i,j)]);
				}
				else if( j == min2)
				{
					dis_temp.push_back(ChooseDis(i,min1,min2));
				}
				else if( j == min1)
				{
					continue;
				}
			}
			else if(i == min2)
			{
				if(j != min2 && j!= min1)
				{
					dis_temp.push_back(ChooseDis(j,min1,min2));
				}
				else
				{
					continue;
				}
			}
			else if(i == min1)
			{
				continue;
			}
		}
	}
	dis = dis_temp;
	
}
void PR_HCM::Rend()
{
	CalcDis();
	//PrintDis();

	for(int i=0;i<num_iterations;i++)//
	{
		Choosetwo();
		Mergingcluster();
		UpdateDis();
		num_cluster--;
		PrintDis();
	}

	
}

⌨️ 快捷键说明

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