在参数空间中以跳跃的数量级定义指数先验

时间:2014-07-22 12:53:44

标签: python bayesian pymc mcmc pymc3

我想为参数定义指数优先级,如下所示

enter image description here

因此我在pymc中用

定义了它
@pm.stochastic
def MASS(value=math.pow(10,15), rate = math.pow(10,15)):
    """mass is a stochastic parameter with exponential distribution.p(M)~exp(-M/10^15)"""
    return pm.exponential_like(value, rate)
@pm.potential
def MASS_bound(MASS=MASS):
    if ((MASS >= math.pow(10,13)) and (MASS < math.pow(10,16))):
       return 0.0
    else:
       return -np.inf

我也希望它满足

的约束

enter image description here

但是当我运行我的MCMC代码MASS时发生的变化非常缓慢,而我希望它在1e+131e16之间更快地改变三个数量级。我如何定义我的先验以便在参数空间中进行相当大的改变?

1 个答案:

答案 0 :(得分:0)

我认为如果我在[1e-2,10]范围之间定义它,然后为了在log-likelihood中使用它只是将它与1e15相乘以获得所需的顺序,那么先验将看起来像指数幅度进一步分析

import pymc as pm
import numpy as np
M0=1e15

@pm.stochastic(dtype=np.float, observed=False, trace=True)
def ma(name='ma',value=0.1, rate = 1):
    """mass is a stochastic parameter with exponential distribution.p(M)~exp(-M/10^15)"""
    return pm.exponential_like(value, rate)
@pm.potential
def ma_bound(ma=ma):
    if ((ma >= 0.01) and (ma < 10)):
       return 0.0
    else:
       return -np.inf

M=pm.MCMC([ma,ma_bound])
M.sample(15000,5000,50)