python - Predict_proba 不适用于我的高斯混合模型(sklearn,python)

标签 python scikit-learn mixture-model gmm

运行Python 3.7.3

我制作了一个简单的 GMM 并将其拟合到一些数据。使用predict_proba方法,返回的是1和0,而不是属于每个高斯的输入的概率。

我最初在更大的数据集上尝试过这个,然后尝试获取一个最小的示例。

from sklearn.mixture import GaussianMixture
import pandas as pd

feat_1 = [1,1.8,4,4.1, 2.2]
feat_2 = [1.4,.9,4,3.9, 2.3]
test_df = pd.DataFrame({'feat_1': feat_1, 'feat_2': feat_2})

gmm_test = GaussianMixture(n_components =2 ).fit(test_df)

gmm_test.predict_proba(test_df) 
gmm_test.predict_proba(np.array([[8,-1]]))

我得到的数组只是 1 和 0,或者几乎是(10^-30 或其他)。

除非我错误地解释了某些内容,否则返回应该是每个的概率,例如,

gmm_test.predict_proba(np.array([[8,-1]])) 

当然不应该是[1,0]或[0,1]。

最佳答案

您给出的示例给出了奇怪的结果,因为您只有 5 个数据点,但仍然使用 2 个混合组件,这基本上导致了过度拟合。

如果您检查组件的均值和协方差:

print(gmm_test.means_)
>>> [[4.05       3.95      ]
     [1.66666667 1.53333333]]

print(gmm_test.covariances_)
>>> [[[ 0.002501   -0.0025    ]
      [-0.0025      0.002501  ]]
     [[ 0.24888989  0.13777778]
      [ 0.13777778  0.33555656]]]

由此可以看出,第一个高斯基本上是用一个非常小的协方差矩阵拟合的,这意味着除非一个点非常接近它的中心(4.05,3.95),否则属于这个高斯的概率总是可以忽略不计.

为了让您相信尽管如此,您的模型仍按预期工作,请尝试以下操作:

epsilon = 0.005    
print(gmm_test.predict_proba([gmm_test.means_[0]+epsilon]))
>>> array([[0.03142181, 0.96857819]])

一旦您增加epsilon,它只会返回array([[0., 1.]]),就像您观察到的那样。

关于python - Predict_proba 不适用于我的高斯混合模型(sklearn,python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56993070/

相关文章:

python - 将 TFIDF 特征向量从 sklearn 传递到 SGDClassifier

python - 从html中提取数组元素

python - 如何保存经过训练的模型(Estimator)并将其加载回以使用 Tensorflow 中的数据对其进行测试?

python - 如何使用具有自定义功能的 sklearn 管道?

R:计算特殊定义的Skew-T分布的概率密度函数

matlab - Matlab 中的 Ezcontour 缺少轮廓

machine-learning - 房屋区域的 ML/密度聚类。每个维度都有两种或多种成分的混合物

python - Python 中的日期时间错误

python - 当用户尝试更改对象的值时使用描述符类引发 RuntimeError

sockets - sklearn.datasets fetch_olivetti_faces IOError : [Errno socket error] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl. c:661)