重新审视 k-Means:使其更好工作的 3 种方法

Revisiting k-Means: 3 Approaches to Make It Work Better

重新审视 k-Means:使其更好工作的 3 种方法
图片作者 | ChatGPT

引言

k-Means 算法是无监督机器学习的基石,以其简单性和在将数据划分为预定数量的簇方面的效率而闻名。其直接的方法——将数据点分配给最近的质心,然后根据分配点集的平均值更新质心——使其成为大多数数据科学家学习的第一个算法之一。它是一个主力,能够为数据集的底层结构提供快速而有价值的见解。

然而,这种简洁性也带来了一系列限制。标准的 k-Means 在处理现实世界数据的复杂性时常常会遇到困难。其性能可能对质心的初始位置敏感,需要预先指定簇的数量,并且它从根本上假设簇是球形且大小均匀的。这些假设在实际应用中很少成立,导致结果不理想甚至产生误导。

幸运的是,在 k-Means 被依赖的许多年里,数据科学界已经开发了多种巧妙的修改和扩展来解决这些不足之处。这些曾经的“技巧”,如今已成为核心的扩展,增强了 k-Means 的鲁棒性和适用性,将其从一个简单的教科书算法转变为一个实用的数据分析工具。

本教程将探讨三种在实际应用中使 k-Means 更好地工作的最有效技术,具体来说是:

  1. 使用 k-means++ 进行更智能的质心初始化
  2. 利用轮廓系数(silhouette score)找到最佳簇数量
  3. 应用核技巧(kernel trick)来处理非球形数据

让我们开始吧。

1. 使用 k-means++ 进行更智能的质心初始化

标准 k-Means 算法最大的弱点之一是它依赖于随机质心初始化。质心初始位置不佳会导致多种问题,包括收敛到次优的聚类解决方案,以及需要更多迭代才能收敛,这会增加计算时间。想象一下,所有初始质心都随机放置在一个密集的数据区域内——算法可能很难正确识别出位于更远处的不同簇。这种敏感性意味着对同一数据运行相同的 k-Means 算法每次都可能产生不同的结果,使得该过程的可靠性降低。

引入 k-means++ 算法是为了克服这个问题。k-means++ 不是 完全 随机放置,而是使用一种更智能、仍然是概率性的方法来播种初始质心。该过程首先 从数据点中 随机选择第一个质心。然后,对于每个后续的质心,它以 与其最近的现有质心成比例的概率 选择一个数据点。这种程序会固有地偏向那些距离已选中心更远的点,从而实现更分散、更具策略性的初始放置。这种方法增加了找到更好的最终聚类解决方案的可能性,并通常减少了收敛所需的迭代次数。

在实践中实现这一点非常简单,因为大多数现代机器学习库——包括 Scikit-learn——都已将 k-means++ 集成作为默认的初始化方法。只需指定 init='k-means++',您就可以利用这些方法,而无需进行复杂的编码。

输出

如惯性(数据点到其质心的平方距离之和)的差异所示,在此案例中,k-means++ 的性能明显优于随机初始化。

2. 使用轮廓系数(Silhouette Score)找到最佳簇数量

k-Means 的一个明显限制性挑战是要求在运行算法之前指定簇的数量 k。在许多现实场景中,最佳簇数量是未知的。选择不正确的 k 可能导致数据被过度分割成无意义的微簇,或者被过度分割,将不同的模式组合在一起。虽然存在帮助确定最佳簇数量的方法,如“肘部法则”(elbow method),但它们可能模棱两可且难以解释,尤其是在方差的视觉图中没有明显的“肘部”时。

一种更鲁棒、更量化的方法是使用 轮廓系数。该指标通过衡量簇的分离程度来评估给定聚类解决方案的质量。对于每个数据点,轮廓系数是根据两个值计算的:

  1. 内聚性(cohesion)——与同一簇中其他点的平均距离
  2. 分离性(separation)——与最近邻簇中点的平均距离

本质上,我们衡量数据点与其自身簇中的其他数据点的相似程度,以及它们与其它簇中数据点的差异程度。直观地说,这正是成功的 k-Means 聚类解决方案应该最大化的。

这些分数范围从 -1 到 +1,其中 高值 表示该点与其自身的簇匹配良好,而与邻近簇匹配不佳。

为了找到最佳的 k,您可以对一系列不同的 k 值运行 k-Means 算法,并计算每个值的平均轮廓系数。产生最高平均分数的 k 值通常被认为是最佳选择。这种方法提供了一种更具数据驱动性的方式来确定簇的数量,超越了简单的启发式方法,并实现了更自信的选择。

让我们看看使用 Scikit-learn 计算 2 到 10 的 k 值范围内的轮廓系数的结果,确定哪个值是最佳的,并绘制结果以与这些结果进行比较。

输出

Figure 1: Silhouette scores for various numbers of clusters (for k values from 2 to 10)

图 1:不同簇数量的轮廓系数(k 值从 2 到 10)

我们可以看到,5 是最佳的 k 值,轮廓系数为 0.5508。

3. 使用核 k-Means 处理非球形簇

k-Means 最令人沮丧和不切实际的限制可能是它假设簇是 凸且各向同性 的,这意味着它们大致是球形的并且大小相似。这是因为 k-Means 根据到中心点的距离来定义簇,这本质上会创建球状边界。当面对包含复杂、细长或非线性形状的现实世界数据时,标准的 k-Means 无法正确识别这些模式。例如,它将无法分离两个同心圆的数据点,因为它可能会用一条直线将它们分开。

为了解决这个问题,我们可以采用 核技巧,这是支持向量机工作原理中的一个核心概念。核 k-Means 的工作原理是通过隐式地将数据投影到一个更高维度的空间,在这个空间中,簇可能变得线性可分或更接近球形。这是通过使用 核函数(如径向基函数 RBF)来实现的,它可以在这个更高维度的空间中计算数据点之间的相似性,而无需显式计算它们的新坐标。通过在转换后的特征空间中进行操作,核 k-Means 可以识别出具有复杂、非球形形状的簇,这是标准算法无法检测到的。

虽然 Scikit-learn 没有直接的 KernelKMeans 实现,但其 SpectralClustering 算法提供了一种强大的替代方案,可以有效地实现类似的结果。谱聚类(Spectral clustering)使用数据的连通性来形成簇,并且在寻找非凸簇方面特别有效。它可以被视为一种核 k-Means,并且是实现此目的的绝佳工具。让我们来看看。

输出

Figure 2: Sample non-spherical data

图 2:示例非球形数据

Figure 3: Comparison of clustering on non-spherical data

图 3:非球形数据上的聚类比较

几乎不需要指出的是,谱聚类——作为核 k-Means 的替代方案——在此场景下优于其标准对应物。

总结

虽然 k-Means 算法通常被介绍为一种基础聚类技术,但它的用途超出了入门示例。通过结合一些巧妙的方法,我们可以克服其最主要的限制,并使其适应现实世界数据的混乱、复杂性。这些增强表明,即使是基础算法,只要经过适当的修改,仍然可以保持高度相关性和强大。

  • 使用 k-means++ 进行初始化可以提供更鲁棒的起点,从而获得更好、更一致的结果。
  • 轮廓系数提供了一种量化方法来确定最佳簇数量,消除了算法关键参数之一的猜测。
  • 通过诸如谱聚类之类的技术利用核方法,可以使 k-Means 打破其球形簇的假设,并识别数据中复杂的模式。

不要过快地否定 k-means;通过应用这些实用技术,您可以释放其全部潜力,并从数据中获得更深入、更准确的见解。

暂无评论。

发表评论

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。