K-means即为1967MacQueen首次提出的K均值聚类算法,在许多实践应用中取得了很好的效果,下面对k-means算法做简要介绍。
设数据集由n个对象组成,预备分成k类,初始化时,从n个数据对象 中随机选取k作为簇的初始均值,对剩余数据对象,计算其与各个簇均值的距离,从而将其指派到最相似的簇。指派完毕后,重新计算各个簇的均值,并对各个数据对象重新进行指派。如此重复直至准则函数式(所有数据对象与所在簇的均值的差的平方相加)收敛
此种聚类方法的缺陷:
  1. K值的选择与问题域相关,通常用户需选择若干个k值实验,从而得到最佳分类的数目。
  2. 由于初始化时对簇均值的选择是随机的,即使对于同一个k值,最终聚类结果一般来说也是不相同的,并且很可能导致最终结果得到的不是k个聚类。为了减少这种情况的发生,我在程序中加入了简单的处理方法:每进行一轮数据对象指派,便检查是否有空簇,随机选取一个数据对象作为空簇的新的均值。
  3. 传说对脏数据很敏感,但是我不知道如何验证。
总之,这种聚类方法比较适合对大量数据做初步聚类,一般来说聚类结果可以采用多次执行聚类分析后较稳定的结果,也就是出现次数较多的那个聚类结果。
而对于我的程序(附件里下载源码)本身,命名还是不规范(总是忧愁取啥名),代码还不够简洁,我努力改,愿下次贴代码的时候有很大的进步,也欢迎各位批判。
附件下载解压后,在VS下新建一个项目,然后在相应位置添加相应文件后编译执行。