k-means确定初始中心值的方法

KMeans算法是最常用的聚类算法,主要思想是:在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数。

KMeans算法本身思想比较简单,但是合理的确定K值和K个初始类簇中心点对于聚类效果的好坏有很大的影响。

总结了一下,大概有以下几种方法。

1.随机选择,选择批次距离尽可能远的K个点

(1)随机选一个点作为一个类簇的初始中心点

(2)然后选取距离这个点最远的点作为第二个点

(3)之后选与前两个点距离和最远的点作为第三个点,一次类推。(有的说法是选择与前两个点最近距离最大的点作为第三个点)

(4)递归依次选择接下来的点

2.选用层次聚类或者Canopy算法进行初始聚类,然后利用这些类簇的中心点作为KMeans算法初始类簇中心点。

  常用的层次聚类算法有BIRCH和ROCK,在此不作介绍,下面简单介绍一下Canopy算法,主要摘自Mahout的Wiki:
  首先定义两个距离T1和T2,T1>T2.从初始的点的集合S中随机移除一个点P,然后对于还在S中的每个点I,计算该点I与点P的距离,如果距离小于T1,则将点I加入到点P所代表的Canopy中,如果距离小于T2,则将点I从集合S中移除,并将点I加入到点P所代表的Canopy中。迭代完一次之后,重新从集合S中随机选择一个点作为新的点P,然后重复执行以上步骤。
  Canopy算法执行完毕后会得到很多Canopy,可以认为每个Canopy都是一个Cluster,与KMeans等硬划分算法不同,Canopy的聚类结果中每个点有可能属于多个Canopy。我们可以选择距离每个Canopy的中心点最近的那个数据点,或者直接选择每个Canopy的中心点作为KMeans的初始K个类簇中心点。

还有其它选择初始中心点的方法,比如随机生成几个数,然后计算样本点均值,拿这些点除以均值得到初始中心点等。

不过效果比较好的应该是使用一些层次聚类算法做预处理然后选取初始中心点了。

你可能感兴趣的:(数据挖掘,机器学习)