为 emcee 中的每个参数定义自定义先验
Define a custom prior for each parameter in emcee
我有一个包含三个参数 a
、b
和 c
的函数,我想为每个参数定义不同的先验。我正在使用 emcee
包。
我先从简单的统一(非信息)开始:
def lnprior(theta):
m, b, c = theta
if 1.0 < m < 2.0 and 1.0 < b < 2.0 and 1.0 < c < 2.0:
return 0.0
return -np.inf
我想为每个参数设置不同的先验。例如,对于 a
,我希望有一个 Normal(mu,sigma) 优先级,而对于 b
,我想要一个制服,对于 c
,我想要一个 Jeffreys 优先级 (1/c)
。到目前为止,我得出以下结论:
def lnprior(theta):
a, b, c = theta
mu = 0.5 # mean of the Normal prior
sigma = 0.1 # standard deviation of the Normal prior
if not (1.0 < b < 2.0): # the bound on the uniform
return -np.inf
if c < 0.0: # the bound on the Jeffreys
return -np.inf
return .... # total log-prior to be determined
据我对对数尺度的理解,我必须将所有概率加在一起才能定义总概率(lnprior
的 return 值)。那么让我们从 a
:
上的 Normal 开始
log_Pr(a) = np.log( 1.0 / (np.sqrt(2*np.pi)*sigma) ) - 0.5*(a - mu)**2/sigma**2
;
然后 c
的优先级:
log_Pr(c) = -log(c)
.
因此总的对数先验应该是:Pr(a)+Pr(c)
。我的问题是,这种方法是否正确?
谢谢
尝试以下方法:
def lnprior(theta):
a, b, c = theta
#flat priors on b, c
if not 1.0 < b < 2.0 and c > 0:
return -np.inf
#gaussian prior on a and c
mu = 0.5
sigma = 0.1
### your prior is gaussian * (1/c), take natural log is the following:
return np.log(1.0/(np.sqrt(2*np.pi)*sigma))-0.5*(a-mu)**2/sigma**2 - np.log(c)
我有一个包含三个参数 a
、b
和 c
的函数,我想为每个参数定义不同的先验。我正在使用 emcee
包。
我先从简单的统一(非信息)开始:
def lnprior(theta):
m, b, c = theta
if 1.0 < m < 2.0 and 1.0 < b < 2.0 and 1.0 < c < 2.0:
return 0.0
return -np.inf
我想为每个参数设置不同的先验。例如,对于 a
,我希望有一个 Normal(mu,sigma) 优先级,而对于 b
,我想要一个制服,对于 c
,我想要一个 Jeffreys 优先级 (1/c)
。到目前为止,我得出以下结论:
def lnprior(theta):
a, b, c = theta
mu = 0.5 # mean of the Normal prior
sigma = 0.1 # standard deviation of the Normal prior
if not (1.0 < b < 2.0): # the bound on the uniform
return -np.inf
if c < 0.0: # the bound on the Jeffreys
return -np.inf
return .... # total log-prior to be determined
据我对对数尺度的理解,我必须将所有概率加在一起才能定义总概率(lnprior
的 return 值)。那么让我们从 a
:
log_Pr(a) = np.log( 1.0 / (np.sqrt(2*np.pi)*sigma) ) - 0.5*(a - mu)**2/sigma**2
;
然后 c
的优先级:
log_Pr(c) = -log(c)
.
因此总的对数先验应该是:Pr(a)+Pr(c)
。我的问题是,这种方法是否正确?
谢谢
尝试以下方法:
def lnprior(theta):
a, b, c = theta
#flat priors on b, c
if not 1.0 < b < 2.0 and c > 0:
return -np.inf
#gaussian prior on a and c
mu = 0.5
sigma = 0.1
### your prior is gaussian * (1/c), take natural log is the following:
return np.log(1.0/(np.sqrt(2*np.pi)*sigma))-0.5*(a-mu)**2/sigma**2 - np.log(c)