为 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值