2012-10-18 9 views
6

Die Ergebnisse, die ich von DPGMM bekomme, sind nicht das, was ich erwarte. Zum Beispiel:sklearn.mixture.DPGMM: Unerwartete Ergebnisse

>>> import sklearn.mixture 
>>> sklearn.__version__ 
'0.12-git' 
>>> data = [[1.1],[0.9],[1.0],[1.2],[1.0], [6.0],[6.1],[6.1]] 
>>> m = sklearn.mixture.DPGMM(n_components=5, n_iter=1000, alpha=1) 
>>> m.fit(data) 
DPGMM(alpha=1, covariance_type='diag', init_params='wmc', min_covar=None, 
    n_components=5, n_iter=1000, params='wmc', 
    random_state=<mtrand.RandomState object at 0x108a3f168>, thresh=0.01, 
    verbose=False) 
>>> m.converged_ 
True 
>>> m.weights_ 
array([ 0.2, 0.2, 0.2, 0.2, 0.2]) 
>>> m.means_ 
array([[ 0.62019109], 
     [ 1.16867356], 
     [ 0.55713292], 
     [ 0.36860511], 
     [ 0.17886128]]) 

Ich erwartete, dass das Ergebnis dem Vanille-GMM ähnlicher ist; das heißt, zwei Gaussians (um Werte 1 und 6), mit nicht-einheitlichen Gewichten (wie [0.625, 0.375]). Ich erwartete, dass die "unbenutzten" Gaussianer Gewichte nahe null haben.

Benutzt ich das Modell falsch?

Ich habe auch versucht, Alpha ohne Glück zu ändern.

+0

Gibt es einen bestimmten Grund, warum Sie die 0.12-Version verwenden? – Rohit

Antwort

1

Kein großer Unterschied mit der Version 0.14.1 von sklearn. I wird folgende Code zum Drucken DPGMM Modell verwenden:

def pprint(model, data): 
    idx = np.unique(model.predict(data)) 
    m_w_cov = [model.means_, model.weights_, model._get_covars()] 
    flattened = map(lambda x: np.array(x).flatten(), m_w_cov) 
    filtered = map(lambda x: x[idx], flattened) 
    print np.array(filtered) 

Diese Funktion filtert redundant (leer) Komponenten, das heißt diejenigen, die nicht in vorherzusagen, und Druckmittel, Gewichte und Kovariationen verwendet. man kann

>>> m = sklearn.mixture.DPGMM(n_components=5, n_iter=1000, alpha=1).fit(data) 
>>> m.predict(data) 
array([0, 0, 0, 0, 0, 1, 1, 1]) 
>>> pprint(m, data) 
[[ 0.62019109 1.16867356] 
[ 0.10658447 0.19810279] 
[ 1.08287064 12.43049771]] 

und

>>> m = sklearn.mixture.DPGMM(n_components=5, n_iter=1000, alpha=1).fit(data) 
>>> m.predict(data) 
array([1, 1, 1, 0, 1, 0, 0, 0]) 
>>> pprint(m, data) 
[[ 1.24122696 0.64252404] 
[ 0.17157736 0.17416976] 
[ 11.51813929 1.07829109]] 

dann vermutet, dass unerwartete Ergebnis Ursachen liegen in der Tatsache,

dass:

Wenn man mehrere Versuche mit Daten von OP Frage stellen, eins zwei unterschiedliche Ergebnisse finden einige der Zwischenergebnisse (in unserem Fall 1.2) wandern zwischen den Klassen, und die Methode kann keine korrekten Modellparameter ableiten. Ein Grund dafür ist, dass Clustering paramether, alpha ist zu groß für unsere Cluster, die nur drei Elemente, die jeweils, können wir besser versuchen, diese paramether reduzieren, 0.1 geben stabilere Ergebnisse:

>>> m = sklearn.mixture.DPGMM(n_components=5, n_iter=1000, alpha=.1).fit(data) 
>>> m.predict(data) 
array([1, 1, 1, 1, 1, 0, 0, 0]) 

Aber die Ursache liegt in Stohastic Natur der DPGMM-Methode, Methode ist unfähig, Modellstruktur im Falle von kleinen Clustern abzuleiten. Die Dinge werden besser, und Verfahren mehr wie erwartet verhalten, wenn wir Beobachtungen 4 mal verlängern:

>>> m = sklearn.mixture.DPGMM(n_components=5, n_iter=1000, alpha=1).fit(data*4) 
>>> pprint(m, data) 
[[ 0.90400296 5.46990901] 
[ 0.11166431 0.24956023] 
[ 1.02250372 1.31278926]] 

Abschließend mit Methode Fitting paramethers vorsichtig sein und bewusst, dass einige ML Methoden nicht funktionieren gut bei kleine oder schiefe Datensätze.

Verwandte Themen