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

📄 main.cpp

📁 用C++实现的聚类
💻 CPP
字号:
#include<fstream>
#include<iostream>
#include<math.h>
#include<vector>
#include"means.h"
using namespace std;
	int i=0;
	int counter=0;
	float x,y;
	float _x=0;
		float _y=0;
	float x2=0.01,y2=-0.01;
	

	
class point
{
public:
	float x;
	float y;
	//int flag;
};

class kmeans         //定义聚类
{
public:
	float averX;
	float averY;
	kmeans();
	vector < point > means;
	
	
	void aver(vector<point> & p);
};


	
kmeans::kmeans(){
	averX=0;
	averY=0;
}

void kmeans::aver(vector<point>&p)
{
	averX=0;
		averY=0;
	for(int i=0;i<p.size ();i++)
	{
		
		averX+=(p[i].x/(p.size()));
		averY+=(p[i].y/(p.size()));
	}
	//p++;
}
kmeans a,b;
		kmeans _a,_b;

	point p;
void caculate()
	{
		
		if(counter==1000) return;
		for(i=0;i<_a.means.size();i++)
		{
			float delta1=sqrt((_a.means[i].x-_x)*(_a.means[i].x-_x)+(_a.means[i].y-_y)*(_a.means[i].y-_y));//到第一类中心的距离
			float delta2=sqrt((_a.means[i].x-x2)*(_a.means[i].x-x2)+(_a.means[i].y-y2)*(_a.means[i].y-y2));//到第二类中心的距离
			if(delta1<=delta2)
				a.means.push_back(_a.means[i]);
			else b.means.push_back(_a.means[i]);
		}
		for(i=0;i<_b.means.size();i++)
		{
			float delta1=sqrt((_b.means[i].x-_x)*(_b.means[i].x-_x)+(_b.means[i].y-_y)*(_b.means[i].y-_y));
			float delta2=sqrt((_b.means[i].x-x2)*(_b.means[i].x-x2)+(_b.means[i].y-y2)*(_b.means[i].y-y2));
			if(delta1<=delta2)
				a.means.push_back(_b.means[i]);
			else b.means.push_back(_b.means[i]);

		}
		
		_a.means .clear ();
		_b.means .clear ();
		for(i=0;i<a.means .size ();i++)//把a的内容放入_a中
		{
			_a.means .push_back (a.means [i]);
		}
		for(i=0;i<b.means .size ();i++)//把b的内容放入_b中
		{
			_b.means .push_back (b.means [i]);
		}
		
		a.means .clear ();
		b.means.clear ();
		_a.aver(_a.means );
		_b.aver(_b.means );
		if( ( sqrt((_a.averX-_x)*(_a.averX-_x)+(_a.averY-_y)*(_a.averY-_y))+sqrt((_b.averX-x2)*(_b.averX-x2)+(_b.averY-y2)*(_b.averY-y2)) ) <0.00000000001)
			return;
		_x=_a.averX;
		_y=_a.averY;
		x2=_b.averX;
		y2=_b.averY;
		counter++;
		
		caculate();
		
	}
void main()
{
	ifstream in("dataset.txt");
	
	while(in>>x>>y)
	{
		float delta1=sqrt((x-_x)*(x-_x)+(y-_y)*(y-_y));
		float delta2=sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2));
		if(delta1<=delta2)
		{
			p.x=x;p.y=y;
		//	a.means.push_back(p);
			_a.means.push_back(p);
			//num1++;
			//sum1x+=x;
			//sum1y+=y;
		}
		else {
			//num2++;flag=0;
			//sum2x+=x;
			//sum2y+=y;
			p.x=x;p.y=y;
		//	b.means.push_back(p);
			
			_b.means.push_back(p);
		}
	
	}
	for(i=0;i<_a.means.size();i++)//按类输出
	
		cout<<_a.means[i].x<<" "<<_a.means[i].y<<endl;
	cout<<"************************"<<endl;
	
	for(i=0;i<_b.means.size();i++)
		cout<<_b.means[i].x<<" "<<_b.means[i].y<<endl;

	

 caculate();
 cout<<endl<<endl;      

for(i=0;i<_a.means.size();i++)//输出最后一次
	
		cout<<_a.means[i].x<<" "<<_a.means[i].y<<endl;
cout<<"类型一"<<" "<<"中心坐标:"<<_x<<","<<_y<<endl;
	cout<<"------------------------------"<<endl;
	
	for(i=0;i<_b.means.size();i++)
		cout<<_b.means[i].x<<" "<<_b.means[i].y<<endl;

cout<<"类型二"<<" "<<"中心坐标:"<<x2<<","<<y2<<endl;
	
	
	

	

}

⌨️ 快捷键说明

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