2012-10-18 5 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

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 (빈) 구성 요소를 필터링, 즉 그가에 사용되는 예측 및 인쇄 수단, 무게와 covariations되지 않습니다.

하나 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)가 클래스간에 마이그레이션되고 메소드가 올바른 모델 매개 변수를 유추 할 수 없습니다.

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

그러나 근본 원인에있다 : 한 가지 이유는, 알파는 각각 우리가 0.1 더 안정적인 결과를 줄 것이다이 paramether을 줄여 더 시도 할 수 있습니다 불과 3 요소를 포함, 우리의 클러스터에 대한 너무 큰 것을 클러스터링 paramether입니다 DPGMM 방법의 stohastic 특성, 방법은 작은 클러스터의 경우 모델 구조를 추론하기에는 쉽지 않다. 상황이 개선되고, 예상대로 우리가 관찰 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의 방법의 경우 잘 작동하지 않는다는 사실을 알고 작거나 비뚤어진 데이터 세트.