📄 k_mean.cpp
字号:
#include <iostream.h>
#include <fstream.h>
#define NUM 20
class Point1
{
public:
float x;
float y;
int flag;
};
void main()
{
Point1 point[NUM];
Point1 z1,z2,z3,z4; //样本中心点
int num1,num2;
//////////从文件sample.txt中读取样本数据 ////////////////
ifstream infile("sample.txt", ios::in);
if (!infile)
{
cout<<"打开sample.txt文件失败!"<<endl;
return;
}
infile.seekg( ios::beg );
for(int i=0;i<NUM;i++)
{
infile>>point[i].x;
infile>>point[i].y;
infile>>point[i].flag;
}
////////////////////////////////////////////////////////
z1.x=point[0].x;
z1.y=point[0].y;
z2.x=point[1].x;
z2.y=point[1].y;
bool jump; //迭代是否结束判别变量
do
{
num1=num2=0;
z3.x=z3.y=z4.x=z4.y=0;
for(i=0;i<NUM;i++)
{
if(((point[i].x-z1.x)*(point[i].x-z1.x)+(point[i].y-z1.y)*(point[i].y-z1.y))
<((point[i].x-z2.x)*(point[i].x-z2.x)+(point[i].y-z2.y)*(point[i].y-z2.y)))
point[i].flag=1;
else
point[i].flag=2;
}
for(i=0;i<NUM;i++)
{
if(point[i].flag==1)
{
z3.x+=point[i].x;
z3.y+=point[i].y;
num1++;
}
else if(point[i].flag==2)
{
z4.x+=point[i].x;
z4.y+=point[i].y;
num2++;
}
}
z3.x=z3.x/num1;
z3.y=z3.y/num1;
z4.x=z4.x/num2;
z4.y=z4.y/num2;
jump=((z1.x!=z3.x)||(z1.y!=z3.y)||(z2.x!=z4.x)||(z2.y!=z4.y));
z1.x=z3.x;
z1.y=z3.y;
z2.x=z4.x;
z2.y=z4.y;
}while(jump);
cout<<"以下为一类,中心为("<<z1.x<<" , "<<z1.y<<"):"<<endl;
for(i=0;i<NUM;i++)
{
if(point[i].flag==1)
cout<<"样本"<<i+1<<"\t";
}
cout<<endl<<"以下为一类,中心为("<<z2.x<<" , "<<z2.y<<"):"<<endl;
for(i=0;i<NUM;i++)
{
if(point[i].flag==2)
cout<<"样本"<<i+1<<"\t";
}
cout<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -