2012-10-18 10 views
6

Wyniki uzyskane z DPGMM nie są tym, czego się spodziewam. Np .:sklearn.mixture.DPGMM: Nieoczekiwane wyniki

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

Spodziewałem się, że wynik będzie bardziej podobny do wanilii GMM; to jest dwa gaussianów (wokół wartości 1 i 6), z nierównomiernymi wagami (jak [0,625, 0,375]). Spodziewałem się, że "nieużywani" Gaussianie będą mieli masy zbliżone do zera.

Czy używam modelu nieprawidłowo?

Próbowałem też zmienić alfę bez żadnego szczęścia.

+0

Jakiś konkretny powód, dla którego używasz wersji 0.12? – Rohit

Odpowiedz

1

nie duża różnica w wersji 0.14.1 z sklearn. Użyję następujący kod do drukowania modelu DPGMM:

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) 

Funkcja ta filtruje redundantnych (pusty) komponenty, tj te nie są wykorzystywane w przewidzenia, a środki drukujące, obciążniki i covariations.

Jeśli ktoś zrobić kilka prób z danymi z PO pytaniu, można znaleźć dwa różne wyniki:

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

i

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

wtedy można się domyślać, że nieoczekiwane przyczyny wynik leżeć w tym, że niektóre z wyników pośrednich (w naszym przypadku 1,2) migrują pomiędzy klasami, a metoda nie jest w stanie wywnioskować poprawnych parametrów modelu. Jednym z powodów jest to, że klastry paramether, alfa jest zbyt duży dla naszych klastrów, zawierających tylko 3 elementy każda, możemy spróbować lepiej przez zmniejszenie tej paramether, 0.1 dadzą bardziej stabilne wyniki:

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

Ale przyczyna leży w W przypadku niewielkich klastrów metoda ta jest niemożliwa do wnioskowania o strukturze stohastycznej metody DPGMM. Rzeczy stają się lepsze, i sposób zachowują się zgodnie z oczekiwaniami, jeśli rozszerzymy uwag właściwie 4 razy:

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

Podsumowując, należy uważać metodą paramethers montażu i świadomy faktu, że niektóre metody ML nie działają dobrze w przypadku małe lub wypaczone zbiory danych.

Powiązane problemy