机器学习(九)——均值聚类算法(k-means)

9.均值聚类算法(k-means)

在聚类的问题中,我们得到了一组训练样本集 { x ( 1 ) , . . . , x ( m ) } \{x^{(1)},...,x^{(m)}\} {x(1),...,x(m)},然后想要把这些样本划分成若干个相关的“类群(clusters)”。其中的 x ( i ) ∈ R n x^{(i)}\in R^n x(i)Rn,而并未给出分类标签 y ( i ) y^{(i)} y(i) 。所以这就是一个无监督学习的问题了。
K K K 均值聚类算法如下所示:

  1. 随机初始化(initialize)聚类重心(cluster centroids) μ 1 , μ 2 , . . . , μ k ∈ R n \mu_1, \mu_2,..., \mu_k\in R^n μ1,μ2,...,μkRn
  2. 重复下列过程直到收敛(convergence): {
    对每个 i i i,设

c ( i ) : = a r g min ⁡ j ∣ ∣ x ( i ) − μ j ∣ ∣ 2 c^{(i)}:=arg\min_j||x^{(i)}-\mu_j||^2 c(i):=argjminx(i)μj2

对每个 j j j,设
μ j : = ∑ i = 1 m 1 { c ( i ) = j } x ( i ) ∑ i = 1 m 1 { c ( i ) = j } \mu_j:=\frac{\sum_{i=1}^m1\{c^{(i)}=j\}x^{(i)}}{\sum_{i=1}^m1\{c^{(i)}=j\}} μj:=i=1m1{c(i)=j}i=1m1{c(i)=j}x(i)
}

K K K 均值聚类算法能保证收敛性么?可以的,至少在一定意义上能这么说。尤其是我们可以定义一个下面这样的函数作为失真函数(distortion function):
J ( c , μ ) = ∑ i = 1 m ∣ ∣ x ( i ) − μ c ( i ) ∣ ∣ 2 J(c,\mu)=\sum_{i=1}^m ||x^{(i)}-\mu_{c^{(i)}}||^2 J(c,μ)=i=1mx(i)μc(i)2
这样就可以用 J J J 来衡量每个样本 x ( i ) x^{(i)} x(i) 和对应的聚类重心 μ c ( i ) \mu_{c^{(i)}} μc(i)之间距离的平方和。很明显能看出 k k k 均值聚类算法正好就是对 J J J 的坐标下降过程。尤其是内部的循环体中, k k k 均值聚类算法重复对 J J J 进行最小化,当 μ \mu μ 固定的时候用 c c c 来最小化 J J J,当 c c c 固定的时候则用 μ \mu μ 最小化 J J J。这样就保证了 J J J 是单调降低的(monotonically decrease),它的值也就必然收敛(converge)。(通常这也表明了 c c c μ \mu μ 也收敛。在理论上来讲, k k k均值 可能会在几种不同的聚类之间摆动(oscillate),也就是说某些组不同值的 c c c 和/或 μ \mu μ 对应有完全相同的 J J J 值,不过在实践中这种情况几乎不会遇到。)

失真函数 J J J,是一个非凸函数(non-convex function),所以对 J J J 进行坐标下降(coordinate descent)并不一定能够收敛到全局最小值(global minimum)。也就是说, k k k 均值聚类算法可能只是局部最优的(local optima)。通常除了这个问题之外, k k k 均值聚类效果都不错,能给出很好的聚类。如果你担心陷入到某些比较差的局部最小值,通常可以多次运行 k k k 均值距离(使用不同的随机值进行来对聚类重心 μ j \mu_j μj 进行初始化)。然后从所有的不同聚类方案(clusterings)中,选择能提供最小失真(distortion) J ( c , μ ) J(c,\mu) J(c,μ) 的。

你可能感兴趣的:(机器学习,算法)