Scikit-learn: Der EM-Algorithmus in GMM schlägt für eindimensionale Datensätze mit 0.16.1 fehl (aber gut mit 0.15.2)

Erstellt am 13. Mai 2015  ·  4Kommentare  ·  Quelle: scikit-learn/scikit-learn

Das Anpassen einer eindimensionalen Gaußschen Verteilung mit GMM.fit() erzeugt einen Laufzeitfehler bei Verwendung von scikit-learn Version 0.16.1, erzeugt jedoch geeignete Parameter bei Verwendung von 0.15.2.

Ein kurzes Beispiel zur Veranschaulichung des Problems:

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_)

Das Ausführen dieses Beispielcodes mit scikit-learn 0.15.2 führt zu einer korrekten Ausgabe:

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

Genau derselbe Code mit scikit-learn 0.16.1 liefert jedoch diesen Traceback:

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.

Ich habe verschiedene Werte der Parameter n_init, n_iter und covariance_type ausprobiert. Ich habe auch verschiedene Datensätze ausprobiert. All dies führt zu diesem Fehler oder ähnlichem bei Verwendung von 0.16.1, aber bei Verwendung von 0.15.2 gibt es überhaupt keine Probleme. Das Problem scheint mit den Anfangsparametern zusammenzuhängen, die bei der Erwartungsmaximierung verwendet wurden, daher ist es möglich, dass dies mit diesem Problem zusammenhängt: #4429

Falls dies nützliche Informationen sind, ich habe eine virtuelle Anaconda-Umgebung mit einer Neuinstallation von scikit-learn verwendet, die wie folgt eingerichtet ist (für Version 0.16.1):

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

Hilfreichster Kommentar

Dies ist wahrscheinlich ein Problem mit der Datenform.
Ist Ihr X 1 ndim oder 2 ndim?
Es kann eine unbeabsichtigte Verhaltensänderung zwischen 0,15 und 0,16 geben, aber ich denke, wir haben beschlossen, dass wir in Zukunft keine 1ndim-Eingabe unterstützen werden, daher sollte Ihre Eingabeform X.shape = (n_samples, 1) .
Du kannst tun

X = X.reshape(-1, 1)

Ansonsten ist es etwas mehrdeutig, wenn Sie ein Sample oder ein Feature meinen.

Alle 4 Kommentare

Dies ist wahrscheinlich ein Problem mit der Datenform.
Ist Ihr X 1 ndim oder 2 ndim?
Es kann eine unbeabsichtigte Verhaltensänderung zwischen 0,15 und 0,16 geben, aber ich denke, wir haben beschlossen, dass wir in Zukunft keine 1ndim-Eingabe unterstützen werden, daher sollte Ihre Eingabeform X.shape = (n_samples, 1) .
Du kannst tun

X = X.reshape(-1, 1)

Ansonsten ist es etwas mehrdeutig, wenn Sie ein Sample oder ein Feature meinen.

Ja, sobald ich die Eingabedaten umforme, funktioniert es einwandfrei. Vielen Dank!

Hallo, der obige Code behebt den Fehler, aber das Verhalten ist meiner Meinung nach anders. Ich führe diesen Tutorial-Code aus, aber nachdem ich die Eingabedaten umgeformt habe, kann ich den Plot nicht reproduzieren.

Gibt es etwas, das ich ändern kann (Parameter, vielleicht), damit ich das gleiche Ergebnis habe? Vielen Dank!

@imadie

in dem Tutorial, auf das verwiesen wird, ändern Sie die folgenden Zeilen in

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

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen