【问题标题】:PYMC2 ZeroProbability errorPYMC2 零概率错误
【发布时间】:2019-01-23 21:26:40
【问题描述】:

我有一个具有统一先验的 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&lt;parameter4) 我收到此错误:

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

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

【问题讨论】:

  • 这里的问题是:你为什么用pymc而不是pymc3?
  • 我首先尝试使用 pymc3,但是在采样过程中我需要所有参数值都是浮点数或整数,以便 calculate_probability 函数起作用,而且我不知道如何将 theano 对象转换为浮点数。您是否建议这种类型的模型在 pymc3 中更容易处理?
  • 是的,pymc3 应该更容易。也许这个网站可以帮助你 discourse.pymc.io 这个:“我不知道如何将 theano 对象转换为浮点数”

标签: python pymc log-likelihood


【解决方案1】:

每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 &gt; parameter4。

【讨论】:

  • 太好了,谢谢,这应该可以了!我一直在玩代码并将if 4&lt;5: return -np.inf 放入 log_l 函数中,它实际上给出了相同的错误。我想知道你是否知道为什么 pymc 对返回 -np.inf 的函数不满意?
  • @Ale:返回-np.inf 意味着父变量的某些值(即parameter4 和parameter5)是不可能的(即,概率为零)。 PyMC 希望变量的所有值(由它们的分布域定义)都是可能的,即使是不可能的。如果您希望值是不可能的,则必须将它们构建到分布的定义中(例如pm.Uniform('parameter5', 0.005, parameter4)),而不是事后。
  • 现在我明白了。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2013-11-18
  • 2022-01-09
  • 2021-09-23
  • 1970-01-01
  • 2011-07-14
  • 2015-05-14
  • 2020-10-25
  • 1970-01-01
相关资源
最近更新 更多