K-means聚类算法

来源:互联网 发布:google picasa mac 编辑:程序博客网 时间:2024/06/01 09:16

K-means算法又称K均值算法,它是聚类算法中最为简单的算法,也是最为常用的聚类算法。

K-means算法主要用于对已知数据集进行非监督聚类,聚类效果的好坏不仅与数据样本有关,而且与聚类质心的选取,以及质心的数目也有很大关系。

在聚类算法中,我们已知训练集{x(1),...,x(m)},我们想把这些数据聚合成一些比较集中的“聚类”。在这里,一般情况下x(i)Rn;但是没有已知y(i)。所以这是一个无监督的学习的问题。

k-means聚类算法步骤如下:

  1. 随机地初始化聚类质心μ1,μ2,...,μkRn
  2. 循环直至收敛{
    对于每一个i,设
    c(i):=argminjx(i)μj2

    对于每一个j,设
    μj:=mi=11{c(i)=j}x(i)mi=11{c(i)=j}

    }

在上述算法中,k(算法中的一个参数)是我们想要得到的聚类的个数,聚类质心μj表示的是我们猜想的当前聚类的中心位置。为了初始化聚类质心(上述算法的步骤1),我们可以随机地选择k个训练例子,并设聚类质心等于这k个例子的值。(其他的初始化方法也是可以的。)

算法的内部循环重复执行两个步骤:(i) 将每个训练样例x(i)的“赋值”给距离最近的质心μj,并且(ii)将每个聚类质心μj移动到赋给它的点的均值。图1描述了k-means算法的运行:


这里写图片描述
图1 K-means算法。训练示例用点表示,聚类质心用×表示。(a)原始数据集。(b)随机初始化聚类质心(在这个例子中,两个训练示例的选择是不相等的)。(c-f)k-means的两层迭代的描述。在每个迭代中,我们每个训练示例赋给距离最近的聚类质心,然后将已经聚类的点的均值赋给聚类质心,也就是说质心被更新了。

K-means算法能够确保收敛吗?在某种程度上答案是肯定的。特别地,我们将扭曲函数(distortion function)定义为

J(c,μ)=i=1mx(i)μc(j)2

因此J衡量的是每个训练示例x(i)到赋给的聚类质点μc(j)的距离的平方和。所以说J是递减的,而且是单调递减,只有这样J才是收敛的。另外,因为J不是凸函数,所以递减不能保证收敛到一个全局的最小值。当然一般情况下k-means算法是很好用的,但是这也免不了计算出来的最小值不是全局最小值,一个很常见的解决方法就是多跑几次,选择不同的质心及其数目。这样的话就可以得到不同的结果,最后选择一个最小的J就可以了。

参考文献:

  1. http://cs229.stanford.edu/materials.html
0 0
原创粉丝点击