2012-10-18 10 views
6

I risultati che ottengo da DPGMM non sono quelli che mi aspetto. Es .:sklearn.mixture.DPGMM: risultati imprevisti

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

Mi aspettavo che il risultato fosse più simile alla GMM alla vaniglia; cioè, due gaussiani (attorno ai valori 1 e 6), con pesi non uniformi (come [0,625, 0,375]). Mi aspettavo che i gaussiani "inutilizzati" avessero pesi vicini allo zero.

Sto utilizzando il modello in modo errato?

Ho anche provato a cambiare alfa senza fortuna.

+0

Qualsiasi motivo specifico per cui si sta utilizzando la versione 0.12? – Rohit

risposta

1

Non una grande differenza con la versione 0.14.1 di sklearn. Userò seguente codice per il modello DPGMM stampa:

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) 

Questa funzione filtra i componenti redundand (vuoto), vale a dire quelli che non sono utilizzati in prevedere e mezzi di stampa, i pesi e covariations.

Se si fanno diversi tentativi con i dati di domanda OP, si possono trovare due risultati diversi:

>>> 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]] 

e

>>> 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]] 

allora si può intuire che le cause dei risultati inaspettati stanno nel fatto che alcuni dei risultati intermedi (1.2 nel nostro caso) migrano tra le classi e il metodo non è in grado di dedurre parametri di modello corretti. Una ragione è che paramether clustering, alfa è troppo grande per le nostre cluster, contenente solo 3 elementi ciascuno, possiamo provare meglio riducendo tale paramether, 0.1 darà risultati più stabili:

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

Ma la causa principale risiede nella natura stohastic del metodo DPGMM, il metodo non è in grado di inferire la struttura del modello in caso di cluster di piccole dimensioni. Le cose diventano meglio, e il metodo si comportano più come previsto, se estendiamo osservazioni 4 volte:

>>> 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]] 

In conclusione, essere cauti con metodo paramethers montaggio, e consapevoli del fatto che alcuni metodi ML non funzionano bene in caso di set di dati piccoli o distorti.