2016-10-29 120 views
0

我在pymc模型迭代,簡化什麼是真正的pymc

import pymc as pm 
a = pm.Normal('a', 0,5) 
b = pm.Normal('b', 0,5) 
cnt = 0 

@pm.deterministic 
def mu(a=a, b=b): 
    global cnt 
    cnt += 1 
    return a + b*x # x and y were loaded from csv 
y_hat = pm.Normal('y', mu, 1, observed=True, value=y) 

mc = pm.MCMC([a,b,mu,y_hat]) 
mc.sample(100) 
print (cnt) 

結果:在模型運行

240 

後,我希望cnt爲100,但打印出來給大約240(不是每個採樣都返回相同的數值,但大概是這個數字)。我認爲pymc可能在前幾次中進行了一些調整,但運行數千次迭代後,cnt總是比mcmc迭代大2倍。

  • 這是什麼原因?
  • 我可以使用手動調整來控制它嗎?

回答

0

評估次數mu的次數與任何MCMC運行中的迭代次數無關。我不希望他們是等同的。你在做什麼?

+0

我正在嘗試擬合一個動態模型,其中'mu'實際上是一組需要運行幾秒鐘的差分方程。因此,運行幾千次迭代需要一天的時間,並且如果'mu'被評估的更多,那麼擬合參數('y)會使它有時爲3天。 – DeanLa

+0

我會建議分析這些數據,看看這麼長時間。它是一個非常大的數據集? MCMC不能很好地適應大數據。如果是這樣的話,你可以看看PyMC3,其中包括非抽樣方法推理,即變分推理。 –

+0

數據很小。模型本身很長。在「pymc」範圍之外的一次運行是時間消費者 - 它是一個動態模型,約1000個時間戳上有大約200個隔間。 – DeanLa