Scikit-learn: El algoritmo EM en GMM falla para conjuntos de datos unidimensionales usando 0.16.1 (pero está bien con 0.15.2)

Creado en 13 may. 2015  ·  4Comentarios  ·  Fuente: scikit-learn/scikit-learn

Ajustar una distribución gaussiana unidimensional usando GMM.fit () produce un error de tiempo de ejecución usando scikit-learn versión 0.16.1, pero produce parámetros apropiados usando 0.15.2.

Un pequeño ejemplo para demostrar el 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_)

La ejecución de este código de ejemplo con scikit-learn 0.15.2 produce un resultado correcto:

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

Sin embargo, exactamente el mismo código que usa scikit-learn 0.16.1 da este seguimiento:

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.

Probé varios valores diferentes de los parámetros n_init, n_iter y covariance_type. También probé una variedad de conjuntos de datos diferentes. Todos estos dan como resultado este error o similar al usar 0.16.1, pero no hay ningún problema al usar 0.15.2. El problema parece estar relacionado con los parámetros iniciales utilizados en la maximización de expectativas, por lo que es posible que esté relacionado con este problema: # 4429

En caso de que esta sea información útil, estaba usando un entorno virtual anaconda con una instalación limpia de scikit-learn, configurado de la siguiente manera (para la versión 0.16.1):

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

Comentario más útil

Esto probablemente sea un problema con la forma de los datos.
¿Es su X 1 ndim o 2 ndim?
Puede haber un cambio de comportamiento no intencional entre 0.15 y 0.16, pero creo que decidimos que en el futuro, no admitiremos la entrada 1ndim, por lo que su forma de entrada debería ser X.shape = (n_samples, 1) .
Tu puedes hacer

X = X.reshape(-1, 1)

De lo contrario, es algo ambiguo si se refiere a una muestra o una característica.

Todos 4 comentarios

Esto probablemente sea un problema con la forma de los datos.
¿Es su X 1 ndim o 2 ndim?
Puede haber un cambio de comportamiento no intencional entre 0.15 y 0.16, pero creo que decidimos que en el futuro, no admitiremos la entrada 1ndim, por lo que su forma de entrada debería ser X.shape = (n_samples, 1) .
Tu puedes hacer

X = X.reshape(-1, 1)

De lo contrario, es algo ambiguo si se refiere a una muestra o una característica.

Sí, una vez que modifico los datos de entrada, funciona bien. ¡Gracias!

Hola, el código anterior corrige el error, pero creo que el comportamiento es diferente. Estoy ejecutando este código de tutorial pero después de cambiar la forma de los datos de entrada, no puedo reproducir la trama.

¿Hay algo que pueda cambiar (parámetros, tal vez) para poder obtener el mismo resultado? ¡Gracias!

@imadie

en el tutorial al que se hace referencia, cambie las siguientes líneas a:

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)
densidad = np.exp (clf.score (xpdf))

¿Fue útil esta página
0 / 5 - 0 calificaciones