1

我有一个具有统一先验的 6 个参数的模型:

parameter1 = pm.Uniform('parameter1',0.01,1)
parameter2 = pm.Uniform('parameter2',0,2)
parameter3 = pm.DiscreteUniform('parameter3',1,50)
parameter4 = pm.Uniform('parameter4',0,1.75)
parameter5 = pm.Uniform('parameter5', 0.005, 0.25)
parameter6 = pm.Uniform('parameter6', 0.005, 0.15)

我有一个返回对数似然值的自定义似然函数:

@pm.potential
def log_l(experiment=experiment,parameter1=parameter1,parameter2=parameter2,parameter3=parameter3,parameter4=parameter4,parameter5=parameter5,parameter6=parameter6):

    if parameter5<parameter4:
        return -np.inf

    parameters=[parameter1, parameter2, parameter3]

    log_l=calculate_probability(parameters, t_m, tol, n_integration, parameter4, parameter5, parameter6, experiment.decon_all[freq,:,:])

    return log_l

calculate_probability在给定参数值和观察数据的情况下,返回此模型的对数似然度的 my 函数在哪里。由于某种原因,当 MCMC 采样时:

model = pm.MCMC([parameter1,parameter2,parameter3,parameter4,parameter5,parameter6,log_l])
model.sample(100)

并且程序满足 if 条件 ( parameter5<parameter4) 我收到此错误:

pymc.Node.ZeroProbability: Potential log_l forbids its parents' current values

我想知道是否有人知道我可能做错了什么?

4

1 回答 1

1

根据文档

潜力有一个重要的属性,logp即他们当前概率的对数或给定其父项值的概率密度值。唯一感兴趣的其他附加属性是parents,包含潜在父母的字典。

所以你的父母log_llog_l

In [11]: list(log_l.parents.keys())
Out[11]: ['experiment', 'parameter2', 'parameter3', 'parameter1', 'parameter4', 
          'parameter6', 'parameter5']

根据这个答案(我的重点):

当一个随机变量被定义为另一个随机变量的函数时, PyMC 会检查父分布的值是否不会导致子分布的值不可能

返回log_l意味着-np.inf父变量的某些值是不可能的。因此,PyMC 引发了一个ZeroProbability异常。


所以不是通过使用来约束模型

if parameter5<parameter4:
    return -np.inf

parameter5你可以定义

parameter4 = pm.Uniform('parameter4', 0, 1.75)
parameter5 = pm.Uniform('parameter5', parameter4, 0.25)

以确保parameter5 > parameter4.

于 2018-08-16T21:30:25.137 回答