Andrew Ng 机器学习笔记 12 :聚类

在监督式学习中,我们针对一组标记的训练数据提出一个适当的假设。相比之下,在无监督学习案例中,我们面对的是一组无标记的训练数据,使用算法分析出数据的结构。

K均值 (K-means)算法

在聚类问题中,我们有未加标签的数据。我们希望有一个算法能够自动的把这些数据分成有紧密关系的子集,或是簇。K均值 (K-means)算法是现在最为广泛使用的聚类方法。

K均值是一个迭代方法,它要做两件事情:

  1. 簇分配。
  2. 移动聚类中心。

K-Means 第1步:簇分配:

  • 遍历所有的样本。
  • 计算每一个点最接近的中心,将其分配到最近的聚类中心。

K-Means 第2步:移动聚类中心:

  • 找出属于每个聚类中心的点,计算出它们的均值位置。
  • 把聚类中心移动到当前的均值位置。

K-Means 第3步:重复执行上面两步

  • 一直迭代下去,聚类中心和样本簇不再改变时,K均值方法就收敛了。

K-Means的规范化描述

K均值算法接受两个输入:

  • 参数K:从数据中聚类出的簇的个数。
  • 训练集: x ( 1 ) , x ( 2 ) , , x ( m )

因为这是非监督学习,我们的数据集中不需要y,同时在非监督学习的 K均值算法里,我们约定 x ( i ) 是一个n维向量,这就是“训练样本是n维而不是n+1维”的原因(按照惯例,排除 x 0 = 1 这一项)。

K均值算法:

第一步:随机初始化 K 个聚类中心,记作 μ 1 , μ 2 一直到 μ k

第二步:

K均值内部循环执行以下步骤:

  • 簇分配

    首先对于每个训练样本,我们用变量 c ( i ) 表示K个聚类中心中最接近 x ( i ) 的那个中心的下标(具体的类别),这就是簇分配。

    大写的 K 表示所有聚类中心的个数,小写的 k 则表示某个聚类中心的下标。

    我们希望的是:在所有 K 个中心中,找到一个k使得 x i μ k 的距离是 x ( i ) 到所有的聚类中心的距离中最小的那个,这就是计算 c ( i ) 的方法。

    这里还有另外的表示 c ( i ) 的方法:我用范数的形式 | | x ( i ) μ k | | 来表示,这是第 i 个训练样本到聚类中心 μ k 的距离。

    接下来我要做的是找出k的值,让这个式子 | | x ( i ) μ k | | 最小,然后将 c ( i ) 赋值为 k

    出于惯例,人们更喜欢用距离的平方 | | x ( i ) μ k | | 2 来表示 x ( i ) 距聚类中心 μ k 的距离。

  • 移动聚类中心

    对于每个聚类中心: k 从1循环到 K ,将 μ k 赋值为这个簇的均值。

异常情况

如果存在一个没有点分配给它的聚类中心,通常在这种情况下,我们就直接移除那个聚类中心,并重新随机找一个聚类中心。(但是直接移除那个中心,是更为常见的方法。不过在实际过程中,这个问题不会经常出现。)

K均值的代价函数

以下便是K均值算法需要最小化的代价函数:

J ( c ( 1 ) , , c ( m ) , μ 1 , , μ K ) = 1 m i = 1 m | | x ( i ) μ c ( i ) | | 2

K均值的目标就是要最小化代价函数:

min c ( 1 ) , , c ( m ) , μ 1 , , μ K J ( c ( 1 ) , , c ( m ) , μ 1 , , μ K )

在K均值算法中,有时候也叫做失真代价函数(distortion cost function)。

随机初始化

  • 确保 K < m

    当运行 K 均值方法时,你需要有一个聚类中心数值 K K 值要比训练样本的数量 m 小,即 K < m

  • 随机初始化

    随机挑选K个训练样本,然后我要做的是设定 μ 1 , , μ k 让它们等于这 K 个样本。

运行K均值方法,你可能会得到这样的聚类结果:

但是如果你运气特别不好,随机初始化K均值方法也可能会卡在不同的局部最优上面:

我们能做的是:初始化K均值很多次,并运行K均值方法很多次,通过多次尝试来保证我们最终能得到一个足够好的结果。一个尽可能局部或全局最优的结果。

  • 如果你运行K均值方法时,所用的聚类数相当小。比如聚类数是从2~10之间的任何数的话,做多次的随机初始化,通常能够保证你能有一个较好的局部最优解,保证你能找到更好的聚类数据。
  • 但是如果K非常大的话,比如K比10大很多,就不太可能会有太大的影响。事实上,这种情况下有可能你的第一次随机初始化就会给你相当好的结果。

肘部法则 (Elbow Method)

对于肘部法则,我们所需要做的是改变K的值(也就是聚类类别的总数)。

我们用K值为1~N 来运行K-均值聚类算法。这就意味着所有的数据会分到1~N个类里。然后分别计算他们的代价函数(或者说计算畸变) J

在这里,你会发现这样一种模式:K从1变化到2、再从2到3时,畸变值迅速下降;然后在3的时候,到达一个肘点。此后畸变值就下降得非常慢。这样看起来,也许使用3个类是聚类数目的正确选择。这是因为那个点是曲线的肘点。就是说畸变值快速地下降,直到K=3这个点,在这之后就下降得非常慢,那么我们就选K=3。

简单小结一下肘部法则:它是一个值得尝试的方法,但事实证明肘部法则并不那么常用,其中一个原因是如果你把这种方法用到一个聚类问题上,事实上你最后得到的曲线通常看起来是更加模棱两可的。

猜你喜欢

转载自blog.csdn.net/lk3030/article/details/79950550