使用多组数据对相同模型进行采样

时间:2017-08-28 08:40:38

标签: pymc3

我正在尝试使用相同的pymc3模型来拟合许多(~100)数据集。由于我发现无法重用模型,因此我将其创建为新的。这是基本代码:

for i in range(100):
  Y = data[i]
  mod = pm.Model()
  with mod:
    p = pm.Uniform('p',lower=0.1,upper=3 ,testval=2)
    Y_obs = pm.Binomial('Y_obs',n=100,p=z,observed=Y)
    err = 1
    try:
      trace = pm.sample(5000)
      err = 0
      result.append(trace)
  del mod
  if err == 0:
    del trace

使用这种方法,随着时间的推移,这个过程变慢,我的ram使用接缝会增加,直到看起来很满,这很可能是减速的原因。

是否有更好的方法将同一模型适用于不同的数据集?

1 个答案:

答案 0 :(得分:0)

看起来您的代码遇到的大部分问题都与python有关 - 您可以通过从函数返回来重用模型:

def my_model(y_obs):
    with pm.Model() as model:
        p = pm.Uniform('p', lower=0.1, upper=3, testval=2)
        pm.Binomial('Y_obs', n=100, p=p, observed=Y)
    return model

然后您可以遍历数据

result = []
for y_obs in data:
    with my_model(y_obs):
        result.append(pm.sample(5000))

诊断内存问题需要了解有关数据的更多信息。您可以尝试一次性采样 - 例如

with pm.Model() as model:
    p = pm.Uniform('p', lower=0.1, upper=3, shape=len(data))
    pm.Binomial('Y_obs', n=100, p=p, observed=data)
    trace = pm.sample(5000)

这应该可以加快速度,但对记忆无益。