我已经使用EMCEE Python软件包为MCMC编写了以下代码
在log_prior
函数中,我定义了EMCEE在它们之间而不是在它们之外移动的参数范围。
但是问题是,在结果中,我看到例如od0
具有类似0.64
的值,而该值不在0.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
答案 0 :(得分: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
的正确值驱动到先验
答案 1 :(得分: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
希望这对您有用。请让我进一步了解。