我正在尝试使用高斯优先使用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从具有µ和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这看起来不太对吧?
发布于 2018-04-24 21:32:53
下面的方法似乎对我很有效
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-05-11 00:46:53
previous answer by isinwe是正确的答案,我只会尝试解释为什么它是正确的。
先前的角色
在问题中有一个一致先验的示例(实际上类似于docs中的示例),如果theta的值在某些约束内,则返回0,否则返回负无穷大。
这是正确的,因为此先验将用于计算后验概率:

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

单变量先验
因此,统一的先验如下:

如果满足条件,则始终为常量,否则为零。由于这里只有比例是相关的,归一化常数可以忽略不计。因此,当采用对数时,当满足条件时,对数将为零,否则将为负无穷大。
多个前科
在多个先验的情况下,它们被相乘,一旦取对数,它就变成一个和。也就是说,在类似示例的一致先验的情况下,除非同时满足这两个条件,否则先验的对数将为零,-inf+0=-inf。
在更复杂的先验组合的情况下,我们需要回到对先验的正确解释,即总和。因此,在手头的情况下,先验必须返回三个先验对数中每个先验对数的和,这正是在isinwe's answer中以一种有效的方式完成的,这避免了如果均匀先验的贡献已经是-inf时计算高斯。
作为一般规则,最好首先检查一致先验,如果条件不满足,则返回-inf,如果满足条件,则评估所有其他更复杂的先验并返回它们的和(因为一致先验的贡献可以近似为零)。
https://stackoverflow.com/questions/49810234
复制相似问题