3

我正在尝试在使用 emcee 之前使用高斯,但似乎无法完全弄清楚。基本上我想更换

def lnprior(theta):
     a, b, c = theta
     if 1.0 < a < 2.0 and 1.0 < b < 2.0 and 1.0 < c < 2.0:
        return 0.0
     return -np.inf

使用可以从具有 mu 和 sigma 的高斯分布中采样“a”的东西。我该怎么做?像这样?

def lnprior(theta):
     a, b, c = theta
     if 1.0 < b < 2.0 and 1.0 < c < 2.0:
        return 0.0
     if 0<a<20:
         mu=10
         sigma=1
         s=np.random.normal(mu, sigma)
         return s
     return -np.inf

但这似乎不对?

4

2 回答 2

6

以下方法似乎对我有用

def lnprior(theta):
    a, b, c = theta
    #flat priors on b, c
    if not 1.0 < b < 2.0 and 1.0 < c < 2.0:
        return -np.inf
    #gaussian prior on a
    mu = 10
    sigma = 1
    return np.log(1.0/(np.sqrt(2*np.pi)*sigma))-0.5*(a-mu)**2/sigma**2
于 2018-04-24T13:32:53.030 回答
4

isinwe之前的答案是正确的答案,我只会尝试解释为什么它是正确的。

先前的角色

在这个问题中,有一个统一先验的示例(与文档中的示例非常相似),如果 的值theta在某些约束范围内,则返回 0,否则返回负无穷大。

这是正确的,因为此先验将用于计算后验概率:

后刺

然而,由于这个概率往往是非常小的数字,最好避免太多的舍入误差来使用它们的对数,这意味着:

对数后验


单变量先验

因此,统一的先验如下:

前面的例子

如果满足条件,将始终有一个常数,否则为零。因为这里只有比例是相关的,所以可以忽略归一化常数。因此,当取对数时,当满足条件时,对数为零,否则为负无穷大。


多个先验

在多个先验的情况下,它们被相乘,一旦取对数就变成一个和。也就是说,在像示例这样的统一先验的情况下,除非同时满足两个条件,否则先验的对数将为零,-inf+0=-inf

在更复杂的先验组合的情况下,我们需要回退到对先验的正确解释,即总和。因此,在手头的情况下,先验必须返回三个先验对数中的每一个的总和,这正是isinwe 的答案以一种有效的方式完成的,如果统一先验的贡献已经是,则避免评估高斯-inf

作为一般规则,最好先检查统一先验,如果条件不满足则返回-inf,如果条件满足,则评估所有其他更复杂的先验并返回它们的总和(因为均匀先验可以近似为零)。

于 2018-05-10T16:46:52.707 回答