📄 main.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 + -