Как передать координаты в функцию arviz / pymc3 plot_posterior (аналогично xarray.Dataset.sel) - PullRequest
1 голос
/ 04 июня 2019

Я занимаюсь байесовским моделированием в pymc3 и хотел бы построить апостериорное распределение с помощью plot_posterior (которое поставляется из пакета arviz). Получившийся график неуклюже смещен по горизонтальной оси, и я хотел бы сместить его так, чтобы он был нанесен точно между -3 и +3. К сожалению, я не могу понять, что я должен передать функции, чтобы указать это.

В документации для arviz.plot_posterior указывается, что аргумент "координаты" имеет определение "Координаты отображаемых переменных. Передано в Dataset.sel". Предположительно, это то, что мне нужно, чтобы указать диапазон для горизонтальной оси, но это не так. не говорите, какую ценность он ожидает.

Я проверил документацию для Dataset.sel, и в нем говорится, что первый аргумент, который он ожидает, это «Диктовка с ключами, совпадающими с размерами и значениями, заданными скалярами, срезами или массивами меток тиков». Моя интерпретация этого заключается в том, что ключи - это строки, соответствующие имени (ам) переменной (ей), а значения представляют собой некоторую итеративную структуру отметок.

Моя переменная называется 'm' и была создана из следующего кода:

with pymc3.Model() as m1:
    m = pymc3.Normal('m', mu = 0, sigma = 1)
    obs = pymc3.Normal('obs', mu = m, sigma = 1, observed = numpy.random.randn(3))
    trace = pymc3.sample(1000, tune = 500, cores = 1)

Мое предположение о том, что plot_posterior ожидает, это:

plot_posterior(trace, coords = {'m': [-3.0, -2,0, -1,0, 0.0, 1.0, 2.0, 3.0]})

Это дало мне ошибку "Ошибка значения: измерения или многоиндексные уровни ['m'] не существуют"

Предположительно, я на правильном пути, но я просто не могу найти более точное определение того, какие аргументы нужны этой функции. Спасибо за любую помощь, вы можете предоставить.

edit: я работал над расширением самих осей (хитрость - ax = mpl.pyplot.axes (xlim = (-3.0, 3.0))), но я до сих пор не знаю, как расширить графики самой переменной.

1 Ответ

1 голос
/ 04 июня 2019

Это на самом деле то, для чего вы можете перейти прямо к matplotlib: pm.plot_posterior вернет ось, которая имеет геттеры и сеттеры для большинства атрибутов отображения:

ax, = pymc3.plot_posterior(trace)
ax.set_xlim(-3, 3)

enter image description here

Аргумент coords предназначен для многомерных случайных величин.Если ваша модель выглядела так:

with pymc3.Model() as m1:
    m = pymc3.Normal('m', mu = 0, sigma = 1, shape = 4)
    obs = pymc3.Normal('obs', mu = m, sigma = 1, observed = numpy.random.randn(3, 4))
    trace = pymc3.sample(1000, tune = 500, cores = 1)

, тогда ваш график будет иметь все 4 измерения m:

pymc3.plot_posterior(trace)

enter image description here

Вы можете использовать coords, чтобы сократить это:

pymc3.plot_posterior(trace, coords={'m_dim_0': [0, 2]})

enter image description here

...