我正在尝试使用相同的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使用接缝会增加,直到看起来很满,这很可能是减速的原因。
是否有更好的方法将同一模型适用于不同的数据集?
答案 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)
这应该可以加快速度,但对记忆无益。