我想为参数定义指数优先级,如下所示
因此我在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
我也希望它满足
的约束
但是当我运行我的MCMC代码MASS
时发生的变化非常缓慢,而我希望它在1e+13
和1e16
之间更快地改变三个数量级。我如何定义我的先验以便在参数空间中进行相当大的改变?
答案 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)