K-means中“内部”的定义?

数据挖掘 机器学习 聚类 k-均值 异常检测
2021-10-02 04:53:40

在使用 K-means 进行聚类分析后,我有新的数据上线,我需要使用这些数据来检测异常。假设异常不在集群内。

那么,如何在 K-means 中定义“簇内”?

4个回答

严格来说,k-means 算法没有“集群内部”的定义,因此不是异常检测的理想选择。在 k-means 中,每个点都分配给 k 个簇中的一个,然后计算一个新的簇质心。

但正如之前的使用所指出的,您可以构建某种临时系统,在其中处理一组数据,然后当新数据超出质心位置的 2 个标准偏差时将其定义为异常。不要这样做!

K-Means 不适用于这种 ad-hoc 方法。如果 k 选择不当,则集群内的分布将不是正态分布。您非常非常频繁地看到点的自然分布,这些点分布在两个集群之间。例如,看看这个位置数据中的点的临时分割,用于一个月内手机用户的位置: 在此处输入图像描述

我建议你使用另一种聚类方法。想到的第一个选项是 DBSCAN。这允许人们设置噪声阈值,并且不会先验设置簇数。因此,DBSCAN 更有可能返回集群内的正态分布。这是相同数据的单个 DBSCAN 集群: 在此处输入图像描述

最后,我要指出,您提出的方法不如其他新奇和异常检测方法。您应该考虑使用具有非线性内核的单个(甚至可能多个)类支持向量机 (SVM) 进行新颖性检测。非线性内核将允许您恢复多个“集群”,而 SVM 在预测类内的点方面会做得更好。

如果它是相应 Voronoi 图的分区的一部分,则它在集群内。这是一个视觉解释,翻译为“如果一个点最接近 A 的质心(与所有其他质心相比),则该点位于集群 A 内。”

如果您的集群没有无限边界并且离群值根本不应该在任何集群中,您可能需要将您的方法改进为检测离群值的 k-means 以外的其他方法。

对于 runDosrun 带来的 Voronoi 单元,确实它们可能是无限的,因此“集群外部”的新数据实际上并不在集群之外。如果这确实是您想要做的,您可能应该查看不同的聚类算法。

如果您打算使用 k-means,您可以尝试将异常数据分类到自己的集群中。

有一些库可用于在聚类分析期间将 k-means 的边界限制到初始域。在不知道您要在什么环境中执行此操作或数据的上下文是什么的情况下,如果不专门选择某些边界,就很难定义“集群内部”。

总的来说,我会同意 AN6U5。然而,在实践中,我过去所做的是使用带有交叉验证的 k-means 和 Silhouetting 来找到历史数据的“良好”聚类。

然后我所做的是获取集群并计算它们的协方差矩阵,这样我就可以使用马氏距离。这使我能够在确定某个点是否远离我之前的示例时考虑沿每个维度的分布的实际形状。由于 Mahalanobis 距离处于标准偏差中,如果它在每个集群之外表示 3 sigma,通常会标记为进一步研究。

因为我知道从测试中生成数据的一般过程,并且我有大量已知操作条件的数据,所以我能够摆脱这个问题,所以我对我的历史数据集群非常有信心。