Scikit-learn: O algoritmo EM no GMM falha para conjuntos de dados unidimensionais usando 0.16.1 (mas bom com 0.15.2)

Criado em 13 mai. 2015  ·  4Comentários  ·  Fonte: scikit-learn/scikit-learn

Ajustar uma distribuição gaussiana unidimensional usando GMM.fit () produz um erro de tempo de execução usando scikit-learn versão 0.16.1, mas produz parâmetros apropriados usando 0.15.2.

Um pequeno exemplo para demonstrar o problema:

import sklearn
from sklearn import mixture
import numpy as np
from scipy import stats
import sys

# the version info 
print("Python version: %s.%s" %(sys.version_info.major, sys.version_info.minor))
print("scikit-learn version: %s" %(sklearn.__version__))

# some pretend data
np.random.seed(seed=0)
data = stats.norm.rvs(loc=100, scale=1, size=1000)
print("Data mean = %s, Data std dev = %s" %(np.mean(data), np.std(data)))

# Fitting using a GMM with a single component
clf = mixture.GMM(n_components=1)
clf.fit(data)
print(clf.means_, clf.weights_, clf.covars_)

Executar este código de exemplo com scikit-learn 0.15.2 produz a saída correta:

Python version: 3.4
scikit-learn version: 0.15.2
Data mean = 99.9547432925, Data std dev = 0.987033158669
[[ 99.95474329]] [ 1.] [[ 0.97523446]]

No entanto, exatamente o mesmo código usando o scikit-learn 0.16.1 fornece este rastreamento:

Python version: 3.4
scikit-learn version: 0.16.1
Data mean = 99.9547432925, Data std dev = 0.987033158669
/home/rebecca/anaconda/envs/new_sklearn/lib/python3.4/site-packages/numpy/lib/function_base.py:1890: RuntimeWarning: Degrees of freedom <= 0 for slice
  warnings.warn("Degrees of freedom <= 0 for slice", RuntimeWarning)
/home/rebecca/anaconda/envs/new_sklearn/lib/python3.4/site-packages/numpy/lib/function_base.py:1901: RuntimeWarning: invalid value encountered in true_divide
  return (dot(X, X.T.conj()) / fact).squeeze()
Traceback (most recent call last):
  File "test_sklearn.py", line 18, in <module>
    clf.fit(data)
  File "/home/rebecca/anaconda/envs/new_sklearn/lib/python3.4/site-packages/sklearn/mixture/gmm.py", line 498, in fit
    "(or increasing n_init) or check for degenerate data.")
RuntimeError: EM algorithm was never able to compute a valid likelihood given initial parameters. Try different init parameters (or increasing n_init) or check for degenerate data.

Tentei vários valores diferentes dos parâmetros n_init, n_iter e covariance_type. Também tentei uma variedade de conjuntos de dados diferentes. Tudo isso resulta neste erro ou em algo semelhante ao usar o 0.16.1, mas não há nenhum problema ao usar o 0.15.2. O problema parece estar relacionado aos parâmetros iniciais usados ​​na maximização da expectativa, então é possível que isso esteja relacionado a este problema: # 4429

Caso esta informação seja útil, eu estava usando um ambiente virtual anaconda com uma instalação limpa do scikit-learn, configurado da seguinte forma (para a versão 0.16.1):

conda create -n new_sklearn python=3.4
source activate new_sklearn
conda install sklearn
Bug

Comentários muito úteis

Provavelmente, é um problema com o formato dos dados.
O seu X 1 ndim ou 2 ndim?
Pode haver uma mudança de comportamento não intencional entre 0,15 e 0,16, mas acho que decidimos que, no futuro, não daremos suporte à entrada 1ndim, então sua forma de entrada deve ser X.shape = (n_samples, 1) .
Você pode fazer

X = X.reshape(-1, 1)

Caso contrário, é um tanto ambíguo se você quer dizer uma amostra ou um recurso.

Todos 4 comentários

Provavelmente, é um problema com o formato dos dados.
O seu X 1 ndim ou 2 ndim?
Pode haver uma mudança de comportamento não intencional entre 0,15 e 0,16, mas acho que decidimos que, no futuro, não daremos suporte à entrada 1ndim, então sua forma de entrada deve ser X.shape = (n_samples, 1) .
Você pode fazer

X = X.reshape(-1, 1)

Caso contrário, é um tanto ambíguo se você quer dizer uma amostra ou um recurso.

Sim, depois de remodelar os dados de entrada, ele funciona bem. Obrigada!

Olá, o código acima corrige o erro, mas acho que o comportamento é diferente. Estou executando o código

Existe algo que eu possa alterar (parâmetros, talvez) para que eu possa ter o mesmo resultado? Obrigado!

@imadie

no tutorial referenciado, altere as seguintes linhas para:

clf = GMM (4, n_iter = 500, random_state = 3)
x.shape = (x.shape [0], 1)
clf = clf.fit (x)

xpdf = np.linspace (-10, 20, 1000)
xpdf.shape = (xpdf.shape [0], 1)
densidade = np.exp (clf.score (xpdf))

Esta página foi útil?
0 / 5 - 0 avaliações