使用 arviz 和 pymc3 mcmc 的有效样本大小二维数组

effective sample size 2d array using arviz and pymc3 mcmc

我正在尝试使用 pymc3 和 arviz 获取 2D mcmc 链的有效样本大小

import pymc3 as pm3
!pip install arviz 
import arviz as az

ess = az.ess(samples)

以上代码适用于 1D,但不适用于 2D,我看到有一个 az.convert_to_dataset 可能有用,但我不知道如何使用它?

样本将是一个 N x 2 数组,它应该只给出一个数字作为输出

谢谢!

使用数组时,ArviZ 假定以下形状约定:

  • 1d数组表示标量变量单链的绘制:(draw,)
  • 二维数组表示一个标量变量的多个链的绘制:(chain, draw)
  • 3d+数组表示绘制多个多维变量链:(chain, draw, *shape)

我不确定为什么 2d 情况不适合你,我怀疑这可能是因为没有足够的平局来计算 ess

为确保您的尺寸得到正确解释,我建议执行 idata = az.convert_to_inference_data(ary) 然后检查 idata.posterior 以查看生成对象的尺寸。然后您可以调用 az.ess(idata) 以获得有效样本量。


编辑:如果我正确理解了您的评论,您将生成一个形状为 (draw=N, parameter_dim=2) 的数组,因为您只对单个链进行采样。由于这是一个二维数组,它会被解释为具有 N 链条和 2 绘制,这应该打印出链条多于绘制的警告。您可以重塑数组以匹配 ArviZ 约定:

idata = az.convert_to_inference_data(np.expand_dims(samples, 0))
# or what is the same (we just choose the name of the variable)
idata = az.from_dict({"position": np.expand_dims(samples, 0)})

这将生成一个 (1, N, 2) 数组,其尺寸将被 ArviZ 理解。我也已经将转换添加到 InferenceData,因为拥有 InferenceData 将允许您调用任何 ArviZ 函数,而不必再关心尺寸。


如果您的数组是 (2, N),在扩展轴之前添加转置应该可以解决问题:

idata = az.convert_to_inference_data(np.expand_dims(samples.T, 0))