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

📄 mergecenter.cpp

📁 k均值聚类方法的c代码
💻 CPP
字号:
#include<iostream.h>
#include<fstream.h>
#include<math.h>
#include<stdlib.h>

#define jingdu 0.1

class MergerCenter
{
private:
	float center[2][4];//原先的聚类中心;
	float center_new[2][4];
	float source[600];
	float data[150][4];
	int clustering1[150];
	int clustering2[150];
	ofstream outfile;

public:
	MergerCenter();
	~MergerCenter();
	void PutinData();
	void classfiy(int,int);
	void FirstMerger();
	void ClassJudge(int);
	void MakeNewCenter();
	void SecondMerger();
	void ThirdMerger();
	void AllMerger();


};

MergerCenter::MergerCenter()
{
	int i,j;
	for(i=0;i<2;i++)
		for(j=0;j<4;j++)
		{
			center[i][j]=0;
			center_new[i][j]=0;
		}
	for(i=0;i<600;i++)
		source[i]=0;
	for(i=0;i<150;i++)
		for(j=0;j<4;j++)
			data[i][j]=0;
	for(i=0;i<150;i++)
	{
		clustering1[i]=0;
		clustering2[i]=0;
	}
	outfile.open("result.txt");
	cout=outfile;

}

MergerCenter::~MergerCenter()
{
	outfile.close();
}

void MergerCenter::PutinData()
{
	int count = 0;

	float temp=0;
	int i=0,j=0;
	ifstream in("data.txt");
	if(!in)
	{
		cout<<"Can't Open the file"<<endl;
		exit(1);
	}
	while(in>>temp)
	{
		source[count]=temp;
		count++;
	}

    for(i=0;i<150;i++)
		for(j=0;j<4;j++)
	{
		data[i][j]=source[i*4+j];
	}
	in.close();
}

void MergerCenter::classfiy(int increase,int isAll)
{
	int i,j;
	bool flag;
	/*将clustering中数据清0*/
	for(i=0;i<150;i++)
	{
		clustering1[i]=0;
		clustering2[i]=0;
	}

	for(j=0;j<4;j++)
	{
		center[0][j]=data[0][j];
		center[1][j]=data[1][j];
	}
    while(1)
	{
		flag = true;
		for(i=0+increase-isAll;i<50+increase;i++)
		{
			ClassJudge(i);   //分成2类;更新clustering1,2中的数据

		}
		/*根据clustering1,2中的数据求出center_new*/
		MakeNewCenter();
		for(j=0;j<4;j++)
		{
			if(center[0][j]!=center_new[0][j]||center[1][j]!=center_new[1][j])
			{
				flag=false;
				break;
			}
		}
		if(!flag)  //更新center
		{
			for(j=0;j<4;j++)
			{
				center[0][j]=center_new[0][j];
				center[1][j]=center_new[1][j];
			}
		for(i=0;i<150;i++)
		{
			clustering1[i]=0;
			clustering2[i]=0;
		}
			
		}
		else
		{
			cout<<"第一类中心点的数据为";//显示;
			cout<<'(';
			for(j=0;j<4;j++)
			{
				cout<<center[0][j];
				if(j!=3)
					cout<<',';
				else
					cout<<')';
			}
			cout<<endl;
			cout<<endl;
			cout<<"第二类中心点的数据为";//显示;
			cout<<'(';
			for(j=0;j<4;j++)
			{
				cout<<center[1][j];
				if(j!=3)
					cout<<',';
				else
					cout<<')';
			}
			cout<<endl;
			cout<<endl;
			break;
		}
	}//end while(1)
}

void MergerCenter::ClassJudge(int i)
{
	int row,lie;
	float average1 = 0;//平方和开方;
	float average2 = 0;
	float sum1 = 0;  //平方和
	float sum2 = 0;
	int count1 = 0;//clustering1非0个数
	int count2 = 0;
	for(lie=0;lie<4;lie++)
	{
		sum1+=(data[i][lie]-center[0][lie])*(data[i][lie]-center[0][lie]);
		sum2+=(data[i][lie]-center[1][lie])*(data[i][lie]-center[1][lie]);
	}
	average1 = (float)sqrt(sum1);
	average2 = (float)sqrt(sum2);
	for(row = 0;row < 150;row++)
	{
		if(clustering1[row]!=0)
			count1++;
		else 
			break;
	}
	for(row = 0;row < 150;row++)
	{
		if(clustering2[row]!=0)
			count2++;
		else 
			break;
	}
	if(average1<average2)
		clustering1[count1]=i+1;
	else
		clustering2[count2]=i+1;
}

void MergerCenter::MakeNewCenter()
{
	int row,lie;
	int i,j;
	int count1 = 0; // clustering1中非0数据;
	int count2 = 0;
	for(row = 0;row < 150;row++)
	{
		if(clustering1[row]!=0)
			count1++;
		else 
			break;
	}
	for(row = 0;row < 150;row++)
	{
		if(clustering2[row]!=0)
			count2++;
		else 
			break;
	}
	for(i=0;i<2;i++)
		for(j=0;j<4;j++)
		{
			center_new[i][j]=0;
		}
   for(lie=0;lie<4;lie++)
   {
	   for(row=0;row<count1;row++)
	   {
			center_new[0][lie]+=data[clustering1[row]-1][lie];
	   }
      center_new[0][lie]=center_new[0][lie]/count1;

   }

   for(lie=0;lie<4;lie++)
   {
	   for(row=0;row<count2;row++)
	   {
			center_new[1][lie]+=data[clustering2[row]-1][lie];
	   }
      center_new[1][lie]=center_new[1][lie]/count2;
   }

}

void MergerCenter::FirstMerger()
{
	int i;
	cout<<"前50组数据:"<<endl;
	cout<<endl;
	classfiy(0,0);
	cout<<"前50组数据分在第一类的组数为:";
	for(i=0;i<150;i++)
	{
		if(clustering1[i]!=0)
		{
			cout<<clustering1[i]<<' ';
		}
		else
			break;
	}
	cout<<endl;
	cout<<endl;
	cout<<"前50组数据分在第二类的组数为:";
	for(i=0;i<150;i++)
	{
		if(clustering2[i]!=0)
		{
			cout<<clustering2[i]<<' ';
		}
		else
			break;
	}
	cout<<endl;
	cout<<endl;

}

void MergerCenter::SecondMerger()
{
	int i;
	cout<<"第51到100组数据:"<<endl;
	cout<<endl;
	classfiy(50,0);
	
	cout<<"第51到100组数据分在第一类的组数为:";
	for(i=0;i<150;i++)
	{
		if(clustering1[i]!=0)
		{
			cout<<clustering1[i]<<' ';
		}
		else
			break;
	}
	cout<<endl;
	cout<<endl;
	cout<<"第51到100组数据分在第二类的组数为:";
	for(i=0;i<150;i++)
	{
		if(clustering2[i]!=0)
		{
			cout<<clustering2[i]<<' ';
		}
		else
			break;
	}
	cout<<endl;
	cout<<endl;
}

void MergerCenter::ThirdMerger()
{
	int i;
	cout<<"第101到150组数据:"<<endl;
	cout<<endl;
	classfiy(100,0);

	cout<<"第101到150组数据分在第一类的组数为:";
	for(i=0;i<150;i++)
	{
		if(clustering1[i]!=0)
		{
			cout<<clustering1[i]<<' ';
		}
		else
			break;
	}
	cout<<endl;
	cout<<endl;
	cout<<"第101到150组数据分在第二类的组数为:";
	for(i=0;i<150;i++)
	{
		if(clustering2[i]!=0)
		{
			cout<<clustering2[i]<<' ';
		}
		else
			break;
	}
	cout<<endl;
	cout<<endl;
}

void MergerCenter::AllMerger()
{
	int i;
	cout<<"总150组数据:"<<endl;
	classfiy(100,100);
	cout<<"总150组数据分在第一类的组数为:";
	for(i=0;i<150;i++)
	{
		if(clustering1[i]!=0)
		{
			cout<<clustering1[i]<<' ';
		}
		else
			break;
	}
	cout<<endl;
	cout<<endl;
	cout<<"总150组数据分在第二类的组数为:";
	for(i=0;i<150;i++)
	{
		if(clustering2[i]!=0)
		{
			cout<<clustering2[i]<<' ';
		}
		else
			break;
	}
	cout<<endl;
	cout<<endl;
}


void main()
{
	MergerCenter merger;
	merger.PutinData();
	merger.FirstMerger();
	merger.SecondMerger();
	merger.ThirdMerger();
	merger.AllMerger();
}

⌨️ 快捷键说明

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