2012-10-18 33 views
6

Kết quả tôi nhận được từ DPGMM không phải là những gì tôi mong đợi. Ví dụ:sklearn.mixture.DPGMM: Kết quả không mong muốn

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

Tôi mong đợi kết quả sẽ giống với GMM vani; có nghĩa là, hai gaussians (khoảng giá trị 1 và 6), với trọng số không đồng nhất (như [0.625, 0.375]). Tôi hy vọng các gaussians "chưa sử dụng" có trọng số gần bằng không.

Tôi có sử dụng mô hình không chính xác không?

Tôi cũng đã thử thay đổi alpha mà không có bất kỳ may mắn nào.

+0

Bất kỳ lý do cụ thể nào bạn đang sử dụng phiên bản 0.12? – Rohit

Trả lời

1

Không khác biệt lớn với phiên bản 0.14.1 của sklearn. Tôi sẽ sử dụng mã sau đây cho mô hình DPGMM in:

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) 

Chức năng này lọc ra redundand linh kiện (trống), tức là những người không được sử dụng trong dự đoán, và các phương tiện in ấn, trọng lượng và covariations.

Nếu một thực hiện một số cố gắng với dữ liệu từ OP câu hỏi, người ta có thể tìm thấy hai kết quả khác nhau:

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

sau đó người ta có thể đoán rằng nguyên nhân kết quả bất ngờ nằm ​​trong thực tế là một số kết quả trung gian (1,2 trong trường hợp của chúng ta) di chuyển giữa các lớp và phương thức không thể suy ra các paramethers mô hình chính xác. Một lý do được rằng phân nhóm paramether, alpha là quá lớn cho các cụm của chúng tôi, chỉ chứa 3 yếu tố, mỗi chúng ta có thể cố gắng tốt hơn bằng cách giảm paramether này, 0.1 sẽ cho kết quả ổn định hơn:

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

Nhưng nguyên nhân gốc rễ nằm trong tính chất cứng rắn của phương pháp DPGMM, phương pháp không bền vững để suy ra cấu trúc mô hình trong trường hợp các cụm nhỏ. Mọi thứ trở nên tốt hơn, và phương pháp hành xử như mong đợi, nếu chúng ta mở rộng quan sát 4 lần:

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

Tóm lại, hãy cẩn thận với phương pháp paramethers phù hợp, và nhận thức được thực tế là một số phương pháp ML không làm việc tốt trong trường hợp bộ dữ liệu nhỏ hoặc bị lệch.

Các vấn đề liên quan