2016-10-29 81 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