使用高斯先验的司仪

spn*_*ola 3 python statistics bayesian 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
Run Code Online (Sandbox Code Playgroud)

使用可以从具有 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
Run Code Online (Sandbox Code Playgroud)

但这似乎不对?

isi*_*nwe 5

以下方法似乎对我有用

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
Run Code Online (Sandbox Code Playgroud)


Ori*_*ril 5

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

之前的角色

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

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

后刺

然而,由于这个概率往往很小,因此最好避免在使用对数时出现太多舍入误差,这意味着:

对数后验


单变量先验

因此,统一先验如下:

先前的例子

如果满足条件,则始终有一个常数,否则为零。由于此处仅与比例相关,因此可以忽略归一化常数。因此,取对数时,满足条件时对数为零,否则为负无穷大。


多重先验

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

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

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