K均值属于比较简单的聚类问题,所谓的聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D分成K个子集,要求每个子集内部的元素之间的相异度尽可能的小,而不同子集的元素相异度尽可能的大。其中每一个子集叫做一个簇。
传统K均值的计算过程:
1.从D中随机取K个元素,作为K个簇的各自的中心。
2.计算剩下的元素到各个中心点的相异度(一般按照欧式距离的远近),将这些元素归纳到相异度最低的簇。
3.根据聚类结果,重新计算K个簇各自的中心,计算方法是取簇中所有元素各自维度的算数平均数(一般为簇内所有元素点到簇中心的距离和的平均数)。
4.将D中所有的元素按照新的中心重新聚类。
5.重复第4步,直到聚类结果不再变化。
6.将结果输出。
K-Means++算法
K-Means主要有两个最重大的缺陷------都和初始值有关:
(1)K是事先给定的,这个K值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适。
(2)K-Means算法需要用初始随机种子点来搞,这个随机种子点太重要,不同的随机种子点会有得到完全不同的结果。
K-Means++算法步骤:
1.先从数据集D中随机挑选一个点当“种子点”。
2.对于每个点,我们都计算其和最近的一个“种子点”的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。
3,然后,再取一个随机值,用权重的方式来取计算下一个“种子点”。这个算法的实现是,先取一个能落在Sum(D(x))中的随机值Random,然后用Random-=D(x),直到其《=0,此时的点就是下一个“种子点”。
4.重复第2,3步直到所有的K个种子点都被选出来。
5.进行K-Means算法。
关于K值选取的问题:
聚类数的确定没有个确切的方法。
K值可以先用系统聚类法,看谱系图然后得出大致分几类。然后多试几个K值,确定个最好的。
系统聚类法见链接:http://www.cnblogs.com/yangmier/archive/2012/04/09/2438447.html