1

我使用 EMCEE Python 包为 MCMC 编写了以下代码

log_prior函数中,我定义了 EMCEE 的参数范围在它们之间而不是在它们之外移动。但问题是,在结果中我看到例如od0具有类似的值,即使0.640.68 < od0 < 0.70我也有这个问题b

我想知道如何强制 EMCEE 恰好在我定义的范围之间。该模型对值非常敏感,我只想在 0.68 < od0 < 0.70不大于或小于此值之间进行探索。

def log_prior(H0, od0, c, b, M): 
    if  not 0.68 < od0 < 0.70 and  60 < H0 < 80  and   -20 < M < -18.5 and 0.045 < b < 0.065 :
        #return 0.0
        return -np.inf
    mu = 0.878
    sigma = 0.0004
    return np.log(1.0/(np.sqrt(2*np.pi)*sigma))-0.5*(c-mu)**2/sigma**2

没有Gaussian prior代码是:

 def log_prior(H0, od0, c, b, M): 
        if  0.68 < od0 < 0.70 and  60 < H0 < 80  and   -20 < M < -18.5 and 0.045 < b < 0.065 :
            return 0.0
        return -np.inf
4

2 回答 2

0

要在其先验范围内获得每个参数的最佳拟合值,只需将先验范围放在括号 () 中,即

def log_prior(H0, od0, c, b, M): 
    if  (0.68 < od0 < 0.70 and  60 < H0 < 80  and   -20 < M < -18.5 and 0.045 < b < 0.065) :
        return 0.0
    return -np.inf

希望这对你有用。请让我进一步了解。

于 2020-03-28T14:53:15.777 回答
0

在逻辑语句中使用括号。例如,对于od0 = 0.64, H0 = 50, 先验应该是-inf

not 0.68 < od0 < 0.70 and  60 < H0 < 80  
>> False

所以先验给出了一个负对数概率,但如果你添加括号:

not (0.68 < od0 < 0.70 and  60 < H0 < 80) 
>> True

这推动了之前的正确值-inf

于 2019-12-09T15:29:04.087 回答