2

我在一个 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)
4

2 回答 2

4

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

通常可以将异常值确定为属于具有最大方差的一个或多个分量的那些。您可以将此策略称为无监督方法,但是仍然很难确定截止方差应该是多少。更好的方法(如果适用)是一种监督方法,您可以使用无异常值数据(通过手动删除异常值)训练 GMM。然后,您可以使用它来将异常值分类为似然分数特别低的异常值。使用监督方法的第二种方法是训练两个 GMM(一个用于异常值,一个用于使用模型选择的内部值),然后对新数据执行两类分类。关于您关于训练单变量与多变量 GMM 的问题 - 它'

于 2018-01-08T19:54:12.260 回答
0

使用高斯混合模型 (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 检测到有三个集群。

于 2021-10-21T20:12:55.650 回答