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)
但这似乎不对?
以下方法似乎对我有用
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)
isinwe 之前的答案是正确的答案,我只会尝试解释为什么它是正确的。
在问题中,有一个统一先验的示例(与文档中的示例非常相似),如果 的值theta在某些约束内,则返回 0,否则返回负无穷大。
这是正确的,因为该先验将用于计算后验概率:
然而,由于这个概率往往很小,因此最好避免在使用对数时出现太多舍入误差,这意味着:
因此,统一先验如下:
如果满足条件,则始终有一个常数,否则为零。由于此处仅与比例相关,因此可以忽略归一化常数。因此,取对数时,满足条件时对数为零,否则为负无穷大。
在多个先验的情况下,它们相乘,一旦取对数就变成了总和。也就是说,在像示例这样的统一先验的情况下,除非同时满足两个条件,否则先验的对数将为零,-inf+0=-inf。
在更复杂的先验组合的情况下,我们需要回到对先验的正确解释,即总和。因此,在当前的情况下,先验必须返回三个先验对数中每一个的总和,这正是isinwe 的答案中以有效方式完成的,如果统一先验的贡献已经是,则避免评估高斯-inf。
作为一般规则,最好首先检查统一先验,如果不满足条件则返回-inf ,如果满足条件,则评估所有其他更复杂的先验并返回它们的总和(因为均匀先验可以近似为零)。