如何将坐标传递给 arviz / pymc3 函数 plot_posterior(类似于 xarray.Dataset.sel)

Sam*_*m_W 2 python pymc3 arviz

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

arviz.plot_posterior 的文档指定参数“coords”具有定义“要绘制的 var_names 的坐标。传递给 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)
Run Code Online (Sandbox Code Playgroud)

我对 plot_posterior 期望的猜测是:

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

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

大概我在正确的轨道上,但我无法挖掘出这个函数需要什么参数的更精确的定义。感谢您的任何帮助,您可以提供。

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

col*_*oll 5

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

ax, = pymc3.plot_posterior(trace)
ax.set_xlim(-3, 3)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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)
Run Code Online (Sandbox Code Playgroud)

那么您的情节将具有以下所有 4 个维度m

pymc3.plot_posterior(trace)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

你可以用它coords来减少它:

pymc3.plot_posterior(trace, coords={'m_dim_0': [0, 2]})
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明