为 Kmeans 聚类选择 K 值

Posted

技术标签:

【中文标题】为 Kmeans 聚类选择 K 值【英文标题】:Selecting the K value for Kmeans clustering [duplicate] 【发布时间】:2019-12-09 16:42:29 【问题描述】:

我将构建一个用于异常值检测的 K-means 聚类模型。为此,我需要确定需要选择的最佳集群数量。

目前,我尝试使用肘部方法来做到这一点。我绘制了误差平方和与簇数 (k) 的关系图,但是,我得到了如下图,它混淆了肘点的识别。

我需要知道,为什么我会得到这样的图表,以及如何确定最佳聚类数。

【问题讨论】:

看起来您的数据不适合 k-means。它是否具有分离良好的球形星团? 【参考方案1】:

K-means 不适用于异常值检测。这一直在这里弹出。

    K-means 被概念化为“纯”数据,没有错误点。所有测量都应该来自数据,并且仅会因一些高斯测量误差而变化。有时这可能会产生一些更极端的值,但即使这些也是来自真实集群的真实测量值,不应被删除。 众所周知,K-means 本身在数据点属于集群的嘈杂数据上效果很好 它倾向于将大型真实集群一分为二,然后位于真实集群中间的点与 k-means 中心之间的距离很大 它倾向于将异常值放入自己的聚类中(因为这样会降低 SSQ),然后实际的异常值会有一个距离,甚至为 0。

而是使用实际的异常值检测算法,例如 Local Outlier Factor、kNN、LOOP 等,而不是在考虑噪声数据的情况下概念化

【讨论】:

我的方法是使用纯数据构建一个 k-means 集群,然后使用百分位数识别不在阈值平方误差值内的异常值。它不能用于识别异常值吗? 这是一种半监督的方法。它可能适用于 k-means 完美运行的玩具数据所有集群具有相同方差的情况。例如上面的第 3 点仍然适用!在更一般的半监督环境中,使用真实数据,我假设一类 SVM 的工作效果要好得多 我对上述 k-means 聚类模型做了一些修改,并使用标记的数据集测试了常规准确度,并对局部异常因子 (LOF) 做了同样的事情。 LOF 的准确性较低,因为它会产生很多误报(将正常数据检测为异常值)。这可能是什么原因? 过度拟合和错误标签。也许您的标签并未标注所有异常?【参考方案2】:

请记住,肘部方法不只是“给出”k 的最佳值,因为 k 的最佳值取决于解释。

肘部方法背后的理论是,我们同时希望最小化一些误差函数(即误差平方和),同时选择一个较低的 k 值。

因此,肘部方法表明,k 的良好值将位于图上类似于肘部的点。即误差很小,但在k局部增大时并没有急剧减小。

在您的情节中,您可以争辩说 k=3 和 k=6 都类似于肘部。通过选择 k=3,您会选择一个小的 k,我们看到 k=4,而 k=5 在最小化误差方面并没有做得更好。 k=6 也是如此。

【讨论】:

感谢您的回答,但我需要知道的是为什么图表会这样?如果我选择 k=3,则误差会更高,如果我选择 k=6,则聚类数会更高。我不知道这是否是因为我的功能集有问题。 如前所述,最佳 k 没有真正的答案。此外,你不能指望情节看起来像一个光滑的肘部。您的数据可能包含 3 个大型可行集群,其中每个集群都可以进一步分为 2 个子集群,从而使 6 个集群也成为可行的选择。在将数据与肘部图进行比较时,您可以尝试对数据进行 PC 绘图,以查看集群的数量是否可行。

以上是关于为 Kmeans 聚类选择 K 值的主要内容,如果未能解决你的问题,请参考以下文章

R语言Kmeans聚类抽取聚类簇:fpc包clusterboot函数通过bootstrap重采样的方法评估Kmeans聚类的稳定性fpc包的kmeansruns函数通过CH准则和ASW获取最优K值

聚类算法 - kmeans

八:聚类算法K-means(20191223-29)

机器学习算法之KMeans聚类

K-means 与KNN 聚类算法

基于K-means聚类算法的图像分割