我有一个具有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
是我的函数,在给定参数值和观察到的数据的情况下,该函数返回该模型的对数似然率。由于某些原因,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
我想知道是否有人知道我做错了什么?
最佳答案
根据the docs:
电位具有一个重要属性logp
,即它们的当前对数
给定它们的值的概率或概率密度值
父母。唯一感兴趣的其他附加属性是parents
,
包含潜在父母的字典。
因此,您log_l
的父母是log_l
的参数:
In [11]: list(log_l.parents.keys())
Out[11]: ['experiment', 'parameter2', 'parameter3', 'parameter1', 'parameter4',
'parameter6', 'parameter5']
根据this answer(我的重点):
当一个随机变量被定义为另一个随机变量的函数时,
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
。关于python - PYMC2 ZeroProbability错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51885175/