2017-08-28 71 views
1

我想使用相同的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 

使用這種方法的過程中隨着時間變得更慢,我的內存使用量的接縫增加,直到它似乎充滿了其中最有可能是慢下來的原因。

有沒有更好的方法來適應不同的數據集相同的模型?

回答

0

它看起來像極了你的代碼的麻煩的是蟒蛇相關的 - 你可以從函數返回它重用模型:

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) 

這應該會加快速度,但對內存沒有太大的幫助。

相關問題