Dav*_*ave 6 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]]))
Run Code Online (Sandbox Code Playgroud)
我得到的数组只是 1 和 0,或者几乎是(10^-30 或其他)。
除非我错误地解释了某些内容,否则返回应该是每个的概率,例如,
gmm_test.predict_proba(np.array([[8,-1]]))
Run Code Online (Sandbox Code Playgroud)
当然不应该是[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]]]
Run Code Online (Sandbox Code Playgroud)
从这里你可以看到,第一个高斯基本上是用一个非常小的协方差矩阵拟合的,这意味着除非一个点非常接近它的中心(4.05,3.95),否则属于这个高斯的概率总是可以忽略不计。
为了让您相信尽管如此,您的模型仍按预期工作,请尝试以下操作:
epsilon = 0.005
print(gmm_test.predict_proba([gmm_test.means_[0]+epsilon]))
>>> array([[0.03142181, 0.96857819]])
Run Code Online (Sandbox Code Playgroud)
一旦你增加epsilon,它只会回报你array([[0., 1.]]),就像你观察到的那样。
| 归档时间: |
|
| 查看次数: |
4463 次 |
| 最近记录: |