我试着用pymc3和arviz获得二维mcmc链的有效样本大小。
import pymc3 as pm3
!pip install arviz
import arviz as az
ess = az.ess(samples)上面的代码适用于1D,而不是2D,我看到有一个az.convert_to_dataset可能有用,但我不知道如何使用它?
样本将是一个nx2数组,它应该只给出一个数字作为输出。
谢谢!
发布于 2020-07-18 02:55:22
在处理数组时,ArviZ采用以下形状约定:
(draw,)
(chain, 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)形状的数组,因为您只是对一个单链进行采样。因为这是一个2d数组,所以它将被解释为有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))https://stackoverflow.com/questions/62934085
复制相似问题