机器学习系列-k均值

K-means原理

聚类属于无监督学习,以往的回归、朴素贝叶斯、SVM等都是有类别标签y的,也就是说样例中已经给出了样例的分类。而聚类的样本中却没有给定y,只有特征x。 K-means也是聚类算法中最简单的一种。在聚类问题中,给我们的训练样本是x(1),...,x(m),每一个x(i)Rn,没有 y。K-means算法是将样本聚类成k个簇(cluster),具体算法如下:
1. 随机选取k个聚类中心μ1,μ2,...,μk
2. 重复下面过程直至收敛{
对于每个样例i,计算属于哪个类
c(i):=arg minj||x(i)μj||2
对于每一个类j,将质心更新为该类所有样例的重心
}
K是我们事先给定的聚类数,c(i)代表样例ik个类中距离最近的那个类,c(i)的值是1到k中的一个。质心μ(i)代表我们对属于同一个类的样本中心点的猜测,拿星团模型来解释就是要将所有的星星聚成k个星团,首先随机选取k个宇宙中的点(或者k个星星)作为k个星团的质心,然后第一步对于每一个星星计算其到k个质心中每一个的距离,然后选取距离最近的那个星团作为c(i),这样经过第一步每一个星星都有了所属的星团;第二步对于每一个星团,重新计算它的质心μ(i)(对里面所有的星星坐标求平均)。重复迭代第一步和第二步直到质心不变或者变化很小。下图展示了对n个样本点进行K-means聚类的效果,这里k取2。
机器学习系列-k均值
K-means面对的第一个问题是如何保证收敛,前面的算法中强调结束条件就是收敛,可以证明的是K-means完全可以保证收敛性。下面我们定性的描述一下收敛性,我们定义畸变函数(distortion function)如下:

J(c,μ)=i=1m||x(i)μc(i)||2
J函数表示每个样本点到其质心的距离平方和。K-means是要将J调整到最小。假设当前J没有达到最小值,那么首先可以固定每个类的质心μ(i),调整每个样例的所属的类别c(i)来让J函数减少,同样,固定c(i),调整每个类的质心μ(i)也可以使J减小。这两个过程就是内循环中使J单调递减的过程。当J递减到最小时,μc也同时收敛。(在理论上,可以有多组不同的μc值能够使得J取得最小值,但这种现象实际上很少见)。由于畸变函数J是非凸函数,意味着我们不能保证取得的最小值是全局最小值,也就是说k-means对质心初始位置的选取比较感冒,但一般情况下k-means达到的局部最优已经满足需求。但如果你怕陷入局部最优,那么可以选取不同的初始值跑多遍k-means,然后取其中最小的J对应的μc输出。

K-means的优点

  1. 算法能根据较少的已知聚类样本的类别对树进行剪枝确定部分样本的分类;
    1. 为克服少量样本聚类的不准确性,该算法本身具有优化迭代功能,在已经求得的聚类上再次进行迭代修正剪枝确定部分样本的聚类,优化了初始监督学习样本分类不合理的地方;
    2. 由于只是针对部分小样本可以降低总的聚类时间复杂度。

K-means的缺点

  1. 对于离群点和孤立点敏感;
  2. k值选择;
  3. 初始聚类中心的选择;
  4. 只能发现球状簇。