无法使用 Pymc 3.11.4 加载之前保存的跟踪以供将来推理

问题描述 投票:0回答:1

我正在尝试实现一个简单的分层贝叶斯推理。我使用 Pymc 推断简单线性模型 y = mx 的参数“m”。我想保存跟踪以便稍后加载。稍后加载跟踪的目的是推断另一个参数 c,该参数现在是不同数据集的新模型 y = mx+c 的一部分,同时使用先前跟踪中已经估计的 m 后验(我不确定这是如何实现的)是可能的,但那是另一个问题)。我已尝试使用以下代码来保存跟踪。

import pymc3 as pm
import numpy as np
import random
import arviz as az
import matplotlib.pyplot as plt


np.random.seed(0)

x_data = np.linspace(1, 100, 100)
y_data = 2 * x_data + np.random.uniform(0, 0.9, 100)  

with pm.Model() as linear_model:
    m = pm.Normal('m', mu=0, sigma=10)  
    
    y_pred = m * x_data
    likelihood = pm.Normal('y_obs', mu=y_pred, sigma=1.0, observed=y_data)  
    
    trace = pm.sample(2000, tune=1000)  

    pm.save_trace(trace, 'my_trace_file',overwrite=True)

保存跟踪有效。但是当我尝试使用以下代码加载跟踪时,我收到错误“TypeError:上下文堆栈上没有模型。”

trace = pm.load_trace('my_trace_file')
print("Posterior mean of m:", trace['m'].mean())

任何帮助或提示都会非常有帮助,因为我是用于参数估计和使用 Pymc3 的贝叶斯推理的新手。

bayesian pymc mcmc hierarchical-bayesian arviz
1个回答
0
投票

模型上下文是

with pm.Model() as linear_model:
    ...

不幸的是,PyMC 尚未提供一种简单易用的方法将模型保存到文件中(就像

arviz
对于推理数据所做的那样)。不过,有这个
ModelBuilder
。我认为,如果您遵循此示例,您应该能够从文件加载模型,然后将其用作加载存储的推理数据的上下文。像这样的存根:

from pymc_experimental.model_builder import ModelBuilder

class MyModel(ModelBuilder):
    # add more stuff here
    ...

...

# do stuff and save inference

...

在另一个脚本中,您应该能够加载并重用您的推理模型/数据。


fname = "my_model.nc"
saved_model = MyModel.load(fname)

# now use the model in this context
with saved_model:
    trace = pm.load_trace('my_trace_file')
© www.soinside.com 2019 - 2024. All rights reserved.