1

我正在尝试使用 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 数组,它应该只给出一个数字作为输出

谢谢!

4

1 回答 1

0

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

  • 一维数组表示标量变量的单个链的绘制:(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))
于 2020-07-18T02:55:22.767 回答