PyMC में दो सामान्य वितरण के लिए फिटिंग मॉडल


10

चूँकि मैं एक सॉफ्टवेयर इंजीनियर हूँ और अधिक आँकड़े जानने की कोशिश कर रहा हूँ, इससे पहले कि मैं शुरू करूँ, मुझे माफ करना पड़ेगा, यह गंभीर newb क्षेत्र है ...

मैं PyMC सीख रहा हूं और कुछ वास्तव में (वास्तव में) सरल उदाहरणों के माध्यम से काम कर रहा हूं । एक समस्या जिसका मुझे काम नहीं मिल सकता है (और इसके लिए कोई संबंधित उदाहरण नहीं मिल सकता है) दो सामान्य वितरण से उत्पन्न डेटा के लिए एक मॉडल फिटिंग है।

कहो मेरे पास 1000 मान हैं; एक से उत्पन्न 500 Normal(mean=100, stddev=20)और एक से उत्पन्न 500 Normal(mean=200, stddev=20)

यदि मैं उनके लिए एक मॉडल फिट करना चाहता हूं, यानी PyMC का उपयोग करके दो साधन और एकल मानक विचलन निर्धारित करता हूं। मुझे पता है कि यह कुछ की तर्ज पर है ...

mean1 = Uniform('mean1', lower=0.0, upper=200.0)
mean2 = Uniform('mean2', lower=0.0, upper=200.0)
precision = Gamma('precision', alpha=0.1, beta=0.1)

data = read_data_from_file_or_whatever()

@deterministic(plot=False)
def mean(m1=mean1, m2=mean2):
    # but what goes here?

process = Normal('process', mu=mean, tau=precision, value=data, observed=True)

यानी, जेनरेटिंग प्रोसेस नॉर्मल है, लेकिन म्यू दो वैल्यू में से एक है। मैं अभी नहीं जानता कि मूल्य के बीच "निर्णय" का प्रतिनिधित्व कैसे किया जाता है m1या नहीं m2

शायद मैं पूरी तरह से गलत तरीके से इसे मॉडलिंग करने के लिए ले रहा हूं? क्या कोई मुझे एक उदाहरण पर इंगित कर सकता है? मैं BUGS और JAGS पढ़ सकता हूं इसलिए कुछ भी वास्तव में ठीक है।

जवाबों:


11

क्या आप पूरी तरह से निश्चित हैं कि आधा एक वितरण से आया है और दूसरा आधा दूसरे से आया है? यदि नहीं, तो हम अनुपात को एक यादृच्छिक चर के रूप में मॉडल कर सकते हैं (जो कि करने के लिए एक बहुत ही द्विअर्थी चीज है)।

निम्नलिखित है कि मैं क्या करूंगा, कुछ युक्तियां एम्बेडेड हैं।

from pymc import *

size = 10
p = Uniform( "p", 0 , 1) #this is the fraction that come from mean1 vs mean2

ber = Bernoulli( "ber", p = p, size = size) # produces 1 with proportion p.

precision = Gamma('precision', alpha=0.1, beta=0.1)

mean1 = Normal( "mean1", 0, 0.001 ) #better to use normals versus Uniforms (unless you are certain the value is  truncated at 0 and 200 
mean2 = Normal( "mean2", 0, 0.001 )

@deterministic
def mean( ber = ber, mean1 = mean1, mean2 = mean2):
    return ber*mean1 + (1-ber)*mean2


#generate some artificial data   
v = np.random.randint( 0, 2, size)
data = v*(10+ np.random.randn(size) ) + (1-v)*(-10 + np.random.randn(size ) )


obs = Normal( "obs", mean, precision, value = data, observed = True)

model = Model( {"p":p, "precision": precision, "mean1": mean1, "mean2":mean2, "obs":obs} )

2
बेशर्म पदोन्नति: मैं बस Bayes और pyMC बारे में एक ब्लॉग लेख लिखा था सचमुच 1 मिनट से पहले आप इस पोस्ट है, इसलिए मैं इसे बाहर की जाँच करने के लिए आमंत्रित करते हैं।
बेय्स

बहुत बढ़िया! दो साधनों के मिश्रण के लिए यह दृष्टिकोण बिल्कुल वही है जो मैं अपने सिर को पाने के लिए कोशिश कर रहा था।
मत्ती केलसी

मुझे यकीन नहीं है कि मैं पूरी तरह से माध्य 1 और माध्य 2 कहने के सही मॉडलिंग लाभ को समझता हूं, समान रूप से यूनिफॉर्म के बजाय वितरित किए गए हैं (समान रूप से ईमानदार होने के लिए सटीक रूप से चला जाता है, मैं "किसी और ने किया था") के बाद से गामा का उपयोग कर रहा हूं। मुझे सीखने के लिए बहुत कुछ मिला है :)
Mat kelcey

अपने मूल उदाहरण के रूप में, एक समान का उपयोग करना, तात्पर्य है कि आप पूर्ण निश्चितता के साथ जानते हैं कि इसका मतलब कुछ मूल्य से अधिक नहीं है। यह कुछ हद तक पैथोलॉजिकल है। एक सामान्य का उपयोग करना बेहतर है, क्योंकि यह सभी वास्तविक संख्याओं पर विचार करने की अनुमति देता है।
Cam.Davidson.Pilon

1
गामा की पसंद का एक गणितीय कारण है। गामा सटीक से पहले संयुग्म है , यहाँ
Cam.Davidson.Pilon

6

ऊपर चर्चा से संबंधित कुछ बिंदु:

  1. डिफ्यूज़ नॉर्मल बनाम यूनिफ़ॉर्म की पसंद बहुत ही अकादमिक होती है, जब तक (क) आप कंजुगेसी के बारे में चिंतित नहीं होते हैं, तो आप किस स्थिति में सामान्य या (बी) का उपयोग करेंगे, कुछ उचित मौका है कि सही मूल्य वर्दी के समापन बिंदु के बाहर हो सकता है । PyMC के साथ, संयुग्मता के बारे में चिंता करने का कोई कारण नहीं है, जब तक कि आप विशेष रूप से गिब्स नमूना का उपयोग नहीं करना चाहते हैं।

  2. एक गामा वास्तव में एक विचरण / परिशुद्धता पैरामीटर से पहले एक असंक्रामक के लिए एक बढ़िया विकल्प नहीं है। यह आपको लगता है कि अधिक जानकारीपूर्ण होने का अंत कर सकता है। एक बेहतर विकल्प मानक विचलन से पहले एक समान रखना है, फिर इसे उलटा वर्ग द्वारा बदल दें। देखें Gelman 2006 जानकारी के लिए।


1
आह fonnesbeck pymc के कोर डेवलपर्स में से एक है! क्या आप हमें एक उदाहरण दिखा सकते हैं कि बिंदु 2 को कैसे कोड किया जाए?
Cam.Davidson.Pilon

धन्यवाद fonnesbeck और, हाँ कृपया! बिंदु 2 के एक त्वरित उदाहरण के लिए :)
चटाई kelcey

1
वास्तव में मैं अनुमान लगा रहा हूँ कि आप ... gist.github.com/4404631 की तर्ज पर कुछ कर रहे हैं ?
मैट केल्सी

हाँ बिल्कुल। आप ट्रांसफॉर्मेशन को थोड़ा और बेहतर तरीके से कर सकते हैं:tau = std_dev**-2
fonnesbeck

यह पढ़ने के लिए सही जगह क्या होगी कि यह सटीक और std_dev के बीच का संबंध कहां से आता है?
user979
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.