Пример, который вы привели, дает вам странные результаты, потому что у вас есть только 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.]])
, как вы заметили.