0

我想为参数定义一个指数先验,如下所示

在此处输入图像描述

因此我在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。我如何定义我的先验以便在参数空间中进行相当大的更改?

4

1 回答 1

0

[1e-2,10]我发现,如果我在范围之间定义先验,然后为了在对数似然中使用它,只需将它乘以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)
于 2014-07-23T11:39:06.240 回答