使用 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))
我正在尝试使用 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))