在给定位置获取链条概率的正确方法

时间:2019-06-13 14:57:31

标签: python bayesian mcmc emcee

我正在尝试使用贝叶斯定理进行一些统计分析。因此,我想将以前的MCMC运行的后验用作新的后验。我正在python 3.6中使用emcee软件包

我尝试在后链上使用get_lnprob函数来获取给定位置的概率。我也尝试过使用不可能性,但这只是给了我每个步骤的每个步行者的概率矩阵,但不包括位置信息。

我以前使用的采样器的先验概率和高斯概率均相同,现在获取了一些链(用于2维,10个助步器,100个步幅)

然后我要像下面这样使用先验链构建新的后验:

logprior = chain
def post_new(x, data, logprior, cov, length, c_raw):
    lp = logprior.get_lnprob(x)
    print(lp)
    if not np.isfinite(lp):
        return -np.inf
    return lp + like(x, data, cov, length, c_raw)

其中x是我的(长度2)位置矢量,logprior是我从上次运行中获得的链,而like(args)是我的数据集的对数似然性

然后我要运行此文件:

sampler = emcee.EnsembleSampler(nwalkers, ndim, post_new, args=(data, logprior, cov, length, c_raw))
sampler.run_mcmc(p0, 1000)

我期望get_lnprob函数在我的旧后验/新先验分布的位置x处给出对数概率。 但是,即使当我在空间中传递明确的位置,例如

logprior.get_lnprob([0.5,0.5])

我收到以下错误:

  File "iterative.py", line 95, in <module>
    print(prior_new.get_lnprob(pos))
  File "(...)\lib\site-packages\emcee\sampler.py", line 116, in get_lnprob
    return self.lnprobfn(p, *self.args, **self.kwargs)
TypeError: __call__() takes 2 positional arguments but 7 were given

据我了解,get_lnprob函数期望我给它提供2个参数(我做了什么?)却收到了7个?

我在这里做什么错了?

0 个答案:

没有答案