2012-10-18 69 views
6

我從DPGMM得到的結果並不符合我的預期。例如:sklearn.mixture.DPGMM:意外的結果

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

我預計結果會更像香草GMM;即兩個高斯(約值1和6),具有非均勻權重(如[0.625,0.375])。我預計「未使用」的高斯人的權重接近於零。

我是否錯誤地使用模型?

我也試過改變阿爾法沒有任何運氣。

+0

您使用0.12版本的具體原因是什麼? – Rohit

回答

1

與sklearn版本0.14.1沒有太大的區別。我將用下面的代碼用於打印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) 

該函數濾除redundand(空)成分,即那些不用於預測,和打印裝置,重量和共變。

如果一個人做多次嘗試與OP的問題,可以發現兩種不同的結果數據:

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

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

那麼可以猜測,出人意料的結果的原因在於以下事實:一些中間結果(本例中爲1.2)在類之間遷移,並且方法無法推斷出正確的模型參數。其中一個原因是羣集paramether,阿爾法是太大了我們的集羣,只含有3元每個,我們可以通過減少這種paramether嘗試更好,0.1將更加穩定的結果:

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

但根本原因還在於DPGMM方法具有較強的自相似性,但在小羣集情況下推導模型結構的方法是不可比擬的。事情變得更好,方法的行爲更符合市場預期,如果我們延長的觀測4次:

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

總之,要小心方法擬合paramethers,並意識到的事實,一些ML方法不中的情況下很好地工作小的或傾斜的數據集。