夏树的C语言篇 – 简易Kmeans类聚算法实现对点集的分组

0.写在前面

夏树大一上学期为时一周的C语言课设就在昨天周五结束了。其中印象比较深刻的就是课设中有一题运用Kmeans算法对点集实现分组的题目啦(顺便自己试着摸了下GDI的一些函数),然后今天抽出些时间来整理一下,先上最后实现的结果:

kmeans-best-grouping_1.jpg

kmeans-best-grouping_2.jpg

1.问题描述

随机生成一组位于二维坐标系的点集(15<=点集元素个数N<=65),这些点不重合,每个点的位置由x,y值决定,x,y为整数且0<x<80,0<y<40。现在想知道这些点按距离远近该分成几个组合适,已知分组值K备选范围从1-10,输入K值,请你按以下方法画出分组结果:

  • (1) 从N个数据点中随机挑选K个不同点作为K个组的初始中心起点(组中心);
  • (2) 计算所有点到K个组中心的距离(欧式距离),并把它归到距离最近的组(如果有多个组距离一样,随便选一个归入);
  • (3) 更新K个组的中心值(求出该组所有点的x平均值和y平均值,作为新的组中心);
  • (4) 重复(2)~(3)步直至新的组中心和原来的组中心差值小于指定阈值(人为设置),或超出最大重复次数(人为设置),算法结束;
  • (5) 在控制台画出K组分组结果,每组用不同数字表示,使用0,1,2,3….9分别表示10个组。

继续阅读夏树的C语言篇 – 简易Kmeans类聚算法实现对点集的分组