//k-means 算法
void k_means(vector<point_t>dataset,int k,int looptimes)
{
vector<point_t> centroid; //存放中心点
int n =1;
int len = dataset.size();
//1.随机选择K个质点
centroid = RandomSeceleK(dataset,k);
//打印中心点(质点)
for(int i=0;i<k;i++)
{
cout<<"x:"<<centroid[i].x<<"\ty:"<<centroid[i].y<<"\tc:"<<centroid[i].cluster<<endl;
}
//循环迭代
for(int i = 0;i<looptimes;i++)
{
//2.计算所有样本点到聚类中心的距离,根据远近聚类
dataset = DistanceCluster(dataset,centroid,k);
//3.更新质心,迭代聚类
centroid = UpdateCentroid(dataset,centroid,k);
}
//打印所有点聚类情况
for(int i=0;i<dataset.size();i++)
{
cout<<dataset[i].cluster<<endl;
}
//打印最后更新质心
for(int i=0;i<k;i++)
{
cout<<"x:"<<centroid[i].x<<"\ty:"<<centroid[i].y<<"\tc:"<<centroid[i].cluster<<endl;
}
//写入到文件保存
fstream clustering;
clustering.open("clustering.txt",ios::out);
for(int i=0;i<len;i++)
{
clustering<<dataset[i].x<<","<<dataset[i].y<<","<<dataset[i].cluster<<"\n";
}
clustering.close();
}
|