1

我正在通过书学习贝叶斯推理Bayesian Analysis with Python。但是,在使用时plot_ppc,我得到AttributeError了警告

/usr/local/Caskroom/miniconda/base/envs/kaggle/lib/python3.9/site-packages/pymc3/sampling.py:1689:用户警告:样本参数小于nchains乘以ndraws,一些平局和/或链可能不会在返回的后验预测样本中表示 warnings.warn(

模型是

shift = pd.read_csv('../data/chemical_shifts.csv')

with pm.Model() as model_g:
    μ = pm.Uniform('μ', lower=40, upper=70)
    σ = pm.HalfNormal('σ', sd=10)
    y = pm.Normal('y', mu=μ, sd=σ, observed=shift)
    trace_g = pm.sample(1000, return_inferencedata=True)

如果我使用以下代码

with model_g:
    y_pred_g = pm.sample_posterior_predictive(trace_g, 100, random_seed=123)
    data_ppc = az.from_pymc3(trace_g.posterior, posterior_predictive=y_pred_g) # 'Dataset' object has no attribute 'report'

我得到“数据集”对象没有属性“报告”。

如果我使用以下代码

with model_g:
    y_pred_g = pm.sample_posterior_predictive(trace_g, 100, random_seed=123)
    data_ppc = az.from_pymc3(trace_g, posterior_predictive=y_pred_g) # AttributeError: 'InferenceData' object has no attribute 'report'

我得到了 AttributeError: 'InferenceData' 对象没有属性 'report'。

ArviZ 版本:0.11.2 PyMC3 版本:3.11.2 Aesara/Theano 版本:1.1.2 Python 版本:3.9.6 操作系统:MacOS Big Sur 你是如何安装 PyMC3 的:conda

4

1 回答 1

4

您正在传递return_inferancedata=Truepm.sample(),根据PyMC3 文档,它将返回一个InferenceData对象而不是一个MultiTrace对象。

return_inferencedatabool, default=False

    Whether to return the trace as an arviz.InferenceData (True) object or a MultiTrace (False) Defaults to False, but we’ll switch to True in an upcoming release.

from_pymc3但是,该函数需要一个MultiTraceobject

好消息是它from_pymc3返回一个InferenceData对象,因此您可以通过以下两种方式之一解决此问题:

  1. 最简单的解决方案是简单地删除from_pymc3调用,因为它返回InferenceData,您已经拥有了return_inferencedata=True.
  2. 设置return_inferencedata=False(您也可以删除该参数,但文档指出将来它将默认为True,因此为了将来证明最好将其显式设置为False)。这将返回一个MultiTrace可以传递给from_pymc3.
于 2021-08-11T04:27:07.473 回答