2012-10-18 28 views
6

डीपीजीएमएम से मिलने वाले परिणाम मैं अपेक्षा नहीं करता हूं। उदा .: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]]) 

मुझे उम्मीद है कि परिणाम वेनिला जीएमएम के समान होगा; वह है, दो गौसियन (मूल्य 1 और 6 के आसपास), गैर-वर्दी भार (जैसे [0.625, 0.375]) के साथ। मुझे उम्मीद है कि "अप्रयुक्त" गॉसियनों के पास शून्य के करीब वजन होगा।

क्या मैं गलत तरीके से मॉडल का उपयोग कर रहा हूं?

मैंने बिना किसी किस्मत के अल्फा को बदलने का भी प्रयास किया है।

+0

कोई विशिष्ट कारण आप 0.12 संस्करण का उपयोग कर रहे हैं? – Rohit

उत्तर

1

sklearn के संस्करण 0.14.1 के साथ कोई बड़ा अंतर नहीं है। अर्थात

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: मैं मुद्रण DPGMM मॉडल के लिए निम्न कोड का प्रयोग करेंगे।

एक ओपी सवाल है, एक मिल सकता है दो अलग-अलग परिणाम से डेटा के साथ कई की कोशिश करता करते हैं:

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

लेकिन मूल कारण में निहित है डीपीजीएमएम विधि की स्टोहोस्टिक प्रकृति, विधि छोटे समूहों के मामले में मॉडल संरचना को कम करने के लिए अबाधित है। हालात बेहतर हो जाते हैं, और विधि की उम्मीद के रूप में अधिक से व्यवहार करते हैं, अगर हम टिप्पणियों 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 के साथ सावधान रहना, और इस तथ्य से वाकिफ है कि कुछ एमएल तरीकों के मामले में अच्छी तरह से काम नहीं करते छोटे या तिरछे डेटासेट्स।