我正在尝试使用 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 采用以下形状约定:
(draw,)
(chain, draw)
(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))