首页 > 解决方案 > 高斯混合:最小值必须小于或等于最大值

问题描述

在我的探索性分析中,我目前正在使用高斯混合模型通过绘制每个手机模型(总共 4 个独特模型)的等高线图来排除异常值。我正在使用这 2 个变量 ( r_max, b_max) 来检测一个点是否是异常值。

这是我的数据集(180 行,4 列):

r_max | b_max | SPAD | model
255.0 | 46.0  | 35.1   | Redmi 5A
198.0 | 36.0  | 32.5   | Vivo 1820
237.0 | 77.0  | 35.8   | CPH1920
255.0 | 79.0  | 30.1   | SM-M105F

这是我创建等高线图的代码:

for ph in final_df.model.unique():

    dataf = final_df[final_df.model==ph]
    
    dataf = dataf[['r_max',  'b_max', 'SPAD', 'model']]

    dataf = dataf[['r_max', 'b_max']].values
    #dataf = np.array(dataf).reshape(-1,1)

    # fit gaussian mixture model 
    gmm = mixture.GaussianMixture()
    gmm.fit(dataf)

    X, Y = np.meshgrid(np.linspace(0, 300), np.linspace(0, 300))
    XX = np.array([X.ravel(), Y.ravel()]).T
    Z = gmm.score_samples(XX)
    Z = Z.reshape(X.shape)
    CS = plt.contour(X, Y, -Z, norm=LogNorm(vmax=500), levels=np.logspace(0, 3, 10))
    CB = plt.colorbar(CS, shrink= 1.0, extend = 'both')
    plt.scatter(dataf[:,0], dataf[:,1], marker = "x", cmap='viridis')
    plt.title(f"{ph} : r_max vs b_max")
    #ax.set_title(f"{feats[idx]} vs SPAD")
    plt.show()

我可以为除 CPH1920 之外的所有模型创建图。在这一行:

CS = plt.contour(X, Y, -Z, norm=LogNorm(vmax=500), levels=np.logspace(0, 3, 10))

我收到此错误:

ValueError: min value must be less than or equal to max value

我为 Redmi 5A 获得的输出示例: 在此处输入图像描述

我不确定我是否理解正确,但紫色圆圈之外的点是异常值,对吗?

下一个问题,我如何提取哪些数据点是异常值?我想知道哪些点被认为是异常值,所以我可以在我的 EDA 数据集中排除它们。如果> 0.5是异常值,是否有某种方法可以计算每个点成为异常值的概率然后设置阈值?

希望有人可以在这里提供一些帮助,任何帮助表示赞赏!

标签: pythonscikit-learnmixture-modelgmm

解决方案


按照评论中的要求,我只会回答有关如何排除异常值的问题。您已经在代码中为等高线图使用了所需的一切。该函数gmm.score_samples采用数据点数组并返回 GMM 下的概率数组。现在您可以按照您的建议简单地将它们设置为阈值:

threshold = 0.5
probs = gmm.score_samples(dataf)
not_outliers = dataf[probs > threshold]

该数组no_outliers现在应该只包含高于阈值的数据点。您必须尝试一下应该设置多高。


推荐阅读