#python #bayesian #pymc3 #arviz
Вопрос:
Я изучаю байесовский вывод по книге Bayesian Analysis with Python
. Однако при использовании plot_ppc
я получил AttributeError
и предупреждение
/usr/локальный/Хранилище/миниконда/база/envs/kaggle/lib/python3.9/пакеты сайтов/pymc3/выборка.py:1689: Предупреждение пользователя: параметр выборки меньше, чем nchains раз ndraws, некоторые рисунки и/или цепочки могут не быть представлены в возвращенных предупреждениях о задних прогнозных выборках.предупреждать(
Модель является
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'
Я получил ошибку атрибута: объект «InferenceData» не имеет атрибута «отчет».
Версия ArviZ: 0.11.2 Версия PyMC3: 3.11.2 Версия Aesara/Theano: 1.1.2 Версия Python: 3.9.6 Операционная система: macOS Big Sur Как вы установили PyMC3: conda
Ответ №1:
Вы переходите return_inferancedata=True
к pm.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
Функция, однако, ожидает MultiTrace
объект.
Хорошей новостью является то, что from_pymc3
возвращает InferenceData
объект, поэтому вы можете решить эту проблему одним из двух способов:
- Самое простое решение-просто удалить
from_pymc3
вызовы, так как он возвращаетсяInferenceData
, что у вас уже есть из-заreturn_inferencedata=True
. - Установить
return_inferencedata=False
(вы также можете удалить этот аргумент, но в документации указано , что в будущем он будет установлен по умолчаниюTrue
, поэтому для подтверждения в будущем лучше явно установить его значениеFalse
). Это вернетMultiTrace
значение, которое можно передатьfrom_pymc3
.
Комментарии:
1. Спасибо тебе, Николас. 2 — е решение сработало. Тем не менее, я все равно хотел бы попробовать 1-е решение.
2. 1 — е решение также сработало. Еще раз спасибо вам !