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倍。
- 这是什么原因?
- 我可以使用手动调整来控制它吗?
我正在尝试拟合一个动态模型,其中'mu'实际上是一组需要运行几秒钟的差分方程。因此,运行几千次迭代需要一天的时间,并且如果'mu'被评估的更多,那么拟合参数('y)会使它有时为3天。 – DeanLa
我会建议分析这些数据,看看这么长时间。它是一个非常大的数据集? MCMC不能很好地适应大数据。如果是这样的话,你可以看看PyMC3,其中包括非抽样方法推理,即变分推理。 –
数据很小。模型本身很长。在“pymc”范围之外的一次运行是时间消费者 - 它是一个动态模型,约1000个时间戳上有大约200个隔间。 – DeanLa