如何确定多少个簇?聚类算法中选择正确簇数量的三种方法
聚类是一种无监督机器学习方法,可以从数据本身中识别出相似的数据点。对于一些聚类算法,例如 K-means,需要事先知道有多少个聚类。如果错误地指定了簇的数量,则结果的效果就会变得很差(参见图 1)。
这种情况下,s 变为负数,接近 -1。
在许多情况下,不知道数据中有多少个簇。但是弄清楚有多少簇可能是我们首先要执行聚类操作的原因。如果有数据集相关的领域内知识可能有助于确定簇的数量。但是这假设需要知道目标类(或至少有多少类),而在无监督学习中无法确认,所以我们需要一种方法,它可以在不依赖目标变量的情况下告诉我们簇的数量。
确定正确的簇数量的一种可能的解决方案是暴力测试的方法。我们尝试不同数量的簇的聚类算法。然后找到最优的聚类结果,但是这种方式的需要花费大量的资源。在本文中,我们首先介绍两个流行的指标来评估簇质量。然后介绍了三种方法来找到最佳簇数量:
- 肘部法 The elbow method
- 轮廓系数的优化 The optimization of the silhouette coefficient
- 间隔量统计 The gap statistic
聚类结果的质量
在使用不同的方法来确定最佳聚类数之前,首先要了解如何定量评估聚类结果的质量。想象以下场景,相同的数据集分为三个簇(参见图 2)。左侧的聚类定义良好,而右侧的聚类识别不佳。
这是为什么?聚类的目标是对聚类中的数据点进行分组,以便 (1) 聚类内的点尽可能相似,(2) 属于不同聚类的点尽可能不同。这意味着,在理想的聚类中,簇内的变化很小,而簇间的变化很大。因此,一个好的聚类质量度量应该能够定量地总结(1)和/或(2)。
一种这样的质量指标是inertia(惯性)。这被计算为数据点与其所属聚类中心之间的平方距离之和。inertia量化了簇内的变化。
另一个流行的指标是silhouette coefficient(轮廓系数),它试图总结簇内和簇间的变化。在每个数据点,我们计算到该数据点所属的聚类中心的距离(称为a),以及到次优聚类中心的距离(称为b)。在这里,次好的簇是指不是当前数据点簇的最接近的簇。然后基于这两个距离 a 和 b,该数据点的轮廓 s 计算为 s=(b-a)/max(a,b)。
在理想聚类下,距离 a 与距离
一旦在所有数据点计算 s,s 的平均值就确定了轮廓系数。可以为每个簇单独计算轮廓系数,也可以为所有数据点计算轮廓系数。接近 1 的轮廓系数表明聚类算法能够将数据划分为分离良好的聚类。
肘部法则
inertia是簇数 k 的递减函数。它的下降速度在最佳聚类数 K 上下是不同的。当 k<K 时,inertia迅速下降,而当 k>K 时,inertia下降很慢。因此,通过在 k 范围内绘制inertia,可以确定曲线在 K 处弯曲或弯头的位置。图 4 显示了图 1 中示例的惯性图。我们可以清楚地看到弯曲或弯头, 在 k = 6。所以我将inertia翻译成了惯性是非常贴切的。
这种方法有些主观,因为不同的人可能会在不同的位置识别肘部。在我们图 4 的示例中,有些人可能会争辩说 k=4 是肘部。此外,肘部可能并不总是很明显,我们将在后面看到。
肘部法的用例可以在自然语言问题中看到,以使用 KNIME 分析平台确定社交网络中的最佳主题数量。由于没有 KNIME 节点来计算inertia,因此在此示例中使用 Java Snippet 节点来计算inertia。这是用于计算inertia的代码片段。
完整文章:
https://www.overfit.cn/post/c25bfe782db74e1aa44b345af4ec01e8