【问题标题】:Outlier detection using Gaussian mixture使用高斯混合检测异常值
【发布时间】:2018-06-17 19:38:48
【问题描述】:

在一个 numpy 数组中,我的 17 个特征中的每一个都有 5000 个数据点,从而产生一个 5000 x 17 的数组。我正在尝试使用高斯混合找到每个特征的异常值,但我对以下问题感到困惑:1)我的 GaussiasnMixture 应该使用多少个组件? 2) 我应该将 GaussianMixture 直接拟合到 5000 x 17 的数组上还是分别拟合到每个特征列上,从而产生 17 个 GaussianMixture 模型?

clf = mixture.GaussianMixture(n_components=1, covariance_type='full')
clf.fit(full_feature_array)

clf = mixture.GaussianMixture(n_components=17, covariance_type='full')
clf.fit(full_feature_array)

for feature in range(0, full_feature_matrix):
    clf[feature] = mixture.GaussianMixture(n_components=1, covariance_type='full')
    clf.fit(full_feature_array[:,feature)

【问题讨论】:

    标签: python detection gaussian mixture


    【解决方案1】:

    选择组件数量以使用高斯混合模型对分布进行建模的任务是模型选择的一个实例。这不是那么简单,并且存在许多方法。一个很好的总结可以在这里找到https://en.m.wikipedia.org/wiki/Model_selection。最简单和最广泛使用的一种是执行交叉验证。

    通常可以将异常值确定为属于方差最大的一个或多个分量。您可以将此策略称为无监督方法,但是仍然很难确定截止方差应该是多少。更好的方法(如果适用)是一种监督方法,您可以使用无异常值数据(通过手动删除异常值)训练 GMM。然后,您可以使用它来将异常值分类为似然分数特别低的异常值。使用监督方法的第二种方法是训练两个 GMM(一个用于异常值,一个用于使用模型选择的内部值),然后对新数据执行两类分类。关于您关于训练单变量与多变量 GMM 的问题 - 很难说,但出于异常值检测的目的,单变量 GMM(或等效的具有对角协方差矩阵的多变量 GMM)可能就足够了,并且与一般多变量 GMM 相比需要训练更少的参数,所以我会从那开始。

    【讨论】:

    • 这个答案仍然不能完全回答我的问题:没有监督方法是可能的,答案很笼统。
    • 您没有(也永远不会)通过无监督异常值检测获得具体的单一解决方案答案的原因是不存在单一的最佳模型选择方法。我提到了交叉验证,因为它是一种常见且易于应用的方法。关于将异常值检测为属于最高方差模式的异常值,我的回答与您在没有任何额外信息的情况下一样好。在异常值和内部值之间做出决定的截止点是误报率和误检率之间的权衡。您通常必须自己设置此决策点。
    • 更正:“假检测”应为“假阴性”
    • 最后一点。我假设离群值在向量空间中的分布比内点更大。大多数情况下都是这种情况,但并非全部。因此,这取决于您对内部/异常分布有一些先验知识。您还可以将异常值视为在某种意义上“孤立”的点,您可以尝试使用无监督聚类(例如 K 均值)来检测这些点,然后将异常值分类为属于少于 N 个点的聚类的那些。同样,在没有监督训练的情况下,您必须猜测 K 和 N 的好值。
    • 如果您对我的回答不满意,您可以尝试在 Cross Validated 上发帖,但我确信您会收到类似的内容。
    【解决方案2】:

    使用高斯混合模型 (GMM),任何位于低密度区域的点都可以被视为异常值 - 也许挑战在于如何定义低密度区域 - 例如,您可以说低于第 4 分位数密度的任何点都是异常值。

    densities = gm.score_samples(X)
    density_threshold = np.percentile(densities, 4)
    anomalies = X[densities < density_threshold]
    

    关于选择组件的数量 - 查看 AIC 或 BIC 提供的“信息标准”,考虑到不同的组件数量 - 他们通常在这种情况下达成一致。越低越好。

    gm.bic(x)
    gm.aic(x)
    

    或者,BayesianGaussianMixture 将零作为那些不必要的集群的权重。

    from sklearn.mixture import BayesianGaussianMixture
    bgm = BayesianGaussianMixture(n_components=8, n_init=10) # n_components should be large enough
    bgm.fit(X)
    np.round(bgm.weights_, 2)
    

    输出

    array([0.5 , 0.3, 0.2 , 0. , 0. , 0. , 0. , 0. ])
    

    所以这里贝叶斯 gmm 检测到有三个簇。

    【讨论】:

      猜你喜欢
      • 2013-06-11
      • 1970-01-01
      • 2015-04-10
      • 2019-01-04
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      相关资源
      最近更新 更多