用于检测异常值的高斯混合

机器算法验证 机器学习 聚类 异常值 高斯混合分布
2022-03-25 05:09:38

我正在尝试制作一个简单的异常值检测程序,该程序能够正确或几乎正确地识别数据集中可能是潜在异常值的值,因为它们不属于相同的其余值的分布数据集。

  1. 我不能使用分类或回归等监督技术,因为我没有获得任何历史的、标记的数据来训练模型,所以我将使用无监督技术,比如聚类。

  2. 我打算使用 k-means 聚类,但我阅读了多篇文章说 k-means 对异常值的效果非常糟糕,其中一些人建议我尝试使用高斯混合模型。

我知道高斯混合模型通过创建代表不同分布的不同集群来工作。我正在使用 Spark 的(Apache)版本的高斯混合模型,这给了我与我的问题相关的两列:一个预测列,它为我提供了数据集中的数据点已分配到的集群,以及一个概率列,这是一列,它为我提供了每个值必须分配给每个集群的概率。使用这种方法,我如何确定异常值?

我认为将较低集群(点数最少的集群)上的那些值标记为异常值,但这不是一个好方法,因为在没有异常值的情况下,总会有一个集群比其他集群小因为 GMM 不会均匀地分布集群中的值。我可以使用任何替代方法吗?

2个回答

JMP 软件提供了一种智能的方法来实现这一点。在 GMM 拟合中,有一个可以检查的“离群值簇”选项。对此的描述如下:

离群值聚类选项假定分布均匀,并且对离群值的敏感度低于标准正态混合方法。这适合集群以捕获不属于任何正常集群的异常值。落入离群值集群的观测值的分布被假定为在包含观测值的超立方体上是均匀的。

那么这是什么意思?好吧,它只是一个额外的潜在因素(分布),具有在期望步骤期间更新的先验(与其他混合成分相同)。自然,不落在合法高斯簇附近的数据点最终更有可能成为[稀疏]均匀分布的一部分。

它工作得很好,类似于通过 DBSCAN 聚类发现异常值,除了预先调整和调查设置超参数的情况较少......但坦率地说,它并没有真正比只在没有它的情况下拟合 GMM 并采取类似最低的东西更神奇0.5% 分位数的点或类似(分位数 % 然后成为超参数)。这里唯一的区别是算法的输出选择它们作为拟合的结果。但是请注意,组成员资格结果会随着潜在单元的数量而变化(在 GMM 的情况下这是一个超参数),所以你要么付钱给 Peter 要么付钱给 Paul……没有什么可以告诉你什么是异常值做出某种假设或预先设置超参数。

只是一个想法,不使用高斯过程:

如果您的数据集不是太大,您可以使用层次聚类和创建不平衡树的链接方法。然后树的较细的分支将代表异常值。

我碰巧知道singleR的hclust()函数方法的链接方法往往会产生不平衡的树。你会称它为hclust(dist(mydata), method = "single")