AI 基础
什么是 K-Means 聚类?
K-Means 聚类是一种 无监督学习 算法,在所有无监督学习算法中,K-Means 聚类可能是最广泛使用的,得益于其强大和简单。K-Means 聚类到底是如何工作的?
答案很简单,即 K-Means 聚类通过 创建一个参考点(质心) 来实现对数据点进行分类,然后 将数据点分配到类簇 中。虽然这是 K-Means 聚类的一个快速定义,但让我们花点时间更深入地了解 K-Means 聚类及其工作原理。
定义聚类
在我们检查用于执行 K-Means 聚类的算法之前,让我们花点时间定义聚类。
聚类只是将物品分成组,聚类算法就是将物品放入这些组中。在数据科学的意义上,聚类算法 旨在做两件事:
- 确保簇中的所有数据点彼此相似。
- 确保不同簇中的所有数据点彼此不相似。
聚类算法根据某种相似度度量将物品分成组。这通常是通过找到数据集中不同组的“质心”来实现的,尽管不仅限于此。有很多不同的聚类算法,但所有聚类算法的目标都是相同的,即确定数据集中的内在组。
K-Means 聚类
K-Means 聚类是一种最古老、最常用的聚类算法之一,它基于 矢量量化 进行操作。空间中有一个点被选为原点,然后从原点到数据集中的所有数据点画出矢量。
一般来说,K-Means 聚类可以分为五个不同的步骤:
- 将所有实例放入子集中,子集的数量等于 K。
- 找到新创建的簇分区的平均点/质心。
- 根据这些质心,将每个点分配到特定的簇中。
- 计算每个点到质心的距离,并将点分配到距离质心最小的簇中。
- 在点被分配到簇之后,找到簇的新质心。
上述步骤重复进行,直到训练过程完成。

在初始阶段,质心被放置在数据点之间。
图片来源:Weston.pace 经过维基媒体共享资源,GNU 自由文档许可证(https://commons.wikimedia.org/wiki/File:K_Means_Example_Step_1.svg)
或者,在质心被放置之后,我们可以认为 K-Means 聚类是在两个不同的阶段之间交替进行的:标记数据点和更新质心。

在第二步中,使用诸如欧几里得距离等距离度量来计算哪个质心与给定点最近,然后将点分配到该质心的类中。图片来源:Weston.pace 经过维基媒体共享资源,GNU 自由文档许可证(https://commons.wikimedia.org/wiki/File:K_Means_Example_Step_2.svg)
在数据点标记阶段,每个数据点都被分配一个标签,将其放入最接近的质心的簇中。最接近的质心通常使用平方欧几里得距离来确定,尽管也可以使用其他距离度量,如曼哈顿距离、余弦距离和杰卡德距离,具体取决于输入聚类算法的数据类型。

在第三步中,质心被移动到所有数据点的平均位置。然后重新分配类别。图片来源:Weston.pace 经过维基媒体共享资源,CC BY-SA 3.0(https://commons.wikimedia.org/wiki/File:K_Means_Example_Step_3.svg)
在质心更新步骤中,质心通过找到簇中所有数据点的平均距离来计算。
如何选择合适的 K 值
考虑到 K-Means 聚类是一种无监督算法,类的数量在事先是未知的,那么如何决定合适的类数/合适的 K 值?
选择合适的 K 值的一种技术称为“肘部技术”。肘部技术包括运行 K-Means 聚类算法以获得一系列不同的 K 值,并使用准确度度量(通常是平方和误差),来确定哪些 K 值能给出最佳结果。平方和误差是通过计算簇的质心和簇中的数据点之间的平均距离来确定的。
“肘部技术”这个术语来自这样一个事实:当你将 SSE 与不同的 K 值绘制成图时,得到的线图通常具有“肘部”形状,即 SSE 在前几个 K 值中迅速下降,但之后就趋于平稳。在这种情况下,位于肘部的 K 值是最佳的 K 值,因为在此值之后,收益迅速减少。
Mini-Batch K-Means 聚类
随着数据集的增长,计算时间也会增长。基本的 K-Means 聚类在大型数据集上运行时可能需要很长时间,因此,已经对 K-Means 聚类进行了修改,以减少算法的空间和时间成本。
Mini-Batch K-Means 聚类是 K-Means 聚类的一种变体,其中被考虑的数据集的大小是有限的。普通的 K-Means 聚类一次性操作整个数据集/批次,而 Mini-Batch K-Means 聚类 将数据集分成子集。从整个数据集中随机采样 mini-batch,并且对于每个新迭代,选择一个新的随机样本并利用它来更新质心的位置。
在 Mini-Batch K-Means 聚类中,簇是通过 mini-batch 值和学习率的组合来更新的。学习率在迭代过程中减少,它是放入特定簇中的数据点数量的倒数。学习率减少的效果是新的数据的影响减少,并且当经过多次迭代后没有簇的变化时,收敛就实现了。
关于 Mini-Batch K-Means 聚类有效性的研究表明,它可以成功地减少计算时间,代价是稍微降低簇的质量。
K-Means 聚类的应用
K-Means 聚类可以安全地用于任何可以将数据点分成不同组/类的情况。以下是 K-Means 聚类的一些常见用例。
K-Means 聚类可以应用于文档分类,根据文档的特征(如主题、标签、词语使用、元数据等)对文档进行分组。它还可以用于根据活动模式(如帖子和评论)将用户分类为机器人或非机器人。K-Means 聚类还可以根据健康监测中的关注级别(如合并症、年龄、患者史等)将人分成组。
K-Means 聚类也可以用于更开放的任务,如创建推荐系统。像 Netflix (NFLX ) 这样的系统的用户可以根据观看模式分成组,并推荐类似的内容。K-Means 聚类可以用于异常检测任务,突出潜在的欺诈或有缺陷的物品。K-Means 聚类也可以用于更开放的任务,如创建推荐系统。像 Netflix 这样的系统的用户可以根据观看模式分成组,并推荐类似的内容。K-Means 聚类可以用于异常检测任务,突出潜在的欺诈或有缺陷的物品。g 也可以用于更开放的任务,如创建推荐系统。像 Netflix 这样的系统的用户可以根据观看模式分成组,并推荐类似的内容。K-Means 聚类可以用于异常检测任务,突出潜在的欺诈或有缺陷的物品。












