2

我正在 pymc3 中进行一些贝叶斯建模,并想使用 plot_posterior (来自 arviz 包)绘制后验分布。生成的图在水平轴上笨拙地错位,我想将它移到精确地绘制在 -3 和 +3 之间。不幸的是,我无法计算出我应该传递给函数以指定它的内容。

arviz.plot_posterior 的文档指定参数“coords”具有定义“要绘制的 var_names 的坐标。传递给 Dataset.sel”大概这是我需要指定水平轴范围的内容,但它没有说明我期望什么样的价值。

我已经检查了 Dataset.sel 的文档,它指出它期望的第一个参数是“一个 dict,其键与标量、切片或刻度标签数组给出的维度和值相匹配。” 我对此的解释是,键是与变量名称匹配的字符串,而值是刻度线的一些可迭代结构。

我的变量名为“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_postterior 的猜测是这样的:

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

它给了我错误“ValueError:维度或多索引级别 ['m'] 不存在”

大概我走在正确的轨道上,但我无法更准确地定义该函数需要哪些参数。感谢您的任何帮助,您可以提供。

编辑:我已经弄清楚如何扩展轴本身(诀窍是 ax = mpl.pyplot.axes(xlim = (-3.0, 3.0)))但我仍然不知道如何扩展变量的绘图本身。

4

1 回答 1

5

这实际上是您可以直接进入 matplotlib 的内容:pm.plot_posterior将返回一个轴,该轴具有大多数显示属性的 getter 和 setter:

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

在此处输入图像描述

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)

在此处输入图像描述

你可以用它coords来减少它:

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

在此处输入图像描述

于 2019-06-04T14:12:10.097 回答