8
關於如何使用PyMC將兩個Normal分佈擬合爲數據,有a question on CrossValidated。的Cam.Davidson.Pilon答案是使用伯努利分佈數據分配到兩條法線之一:如何在PyMC中建模3個法線的混合物?
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)
mean2 = Normal("mean2", 0, 0.001)
@deterministic
def mean(ber = ber, mean1 = mean1, mean2 = mean2):
return ber*mean1 + (1-ber)*mean2
現在我的問題是:如何與法線辦呢?
基本上,問題是你不能再使用伯努利分佈和1伯努利。但如何做到這一點呢?
編輯:隨着CDP的建議下,我寫了下面的代碼:
import numpy as np
import pymc as mc
n = 3
ndata = 500
dd = mc.Dirichlet('dd', theta=(1,)*n)
category = mc.Categorical('category', p=dd, size=ndata)
precs = mc.Gamma('precs', alpha=0.1, beta=0.1, size=n)
means = mc.Normal('means', 0, 0.001, size=n)
@mc.deterministic
def mean(category=category, means=means):
return means[category]
@mc.deterministic
def prec(category=category, precs=precs):
return precs[category]
v = np.random.randint(0, n, ndata)
data = (v==0)*(50+ np.random.randn(ndata)) \
+ (v==1)*(-50 + np.random.randn(ndata)) \
+ (v==2)*np.random.randn(ndata)
obs = mc.Normal('obs', mean, prec, value=data, observed = True)
model = mc.Model({'dd': dd,
'category': category,
'precs': precs,
'means': means,
'obs': obs})
具有以下抽樣程序的痕跡好看也。解決了!
mcmc = mc.MCMC(model)
mcmc.sample(50000,0)
mcmc.trace('means').gettrace()[-1,:]
謝謝。我想到了分類和dirichlet,令我困惑的是'return ber * mean1 +(1-ber)* mean2'的含義。我用提案更新了這個問題,你能告訴我這是否是正確的方法嗎? –
@ user538603已更新! –
好的,這確實有幫助。我添加了一個完整的代碼示例,我在您的幫助下提出了這個示例,但它仍然沒有按照它應該的方式收斂。 –