- //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();
- }
|