使用PyMC进行逻辑回归:ZeroProbability错误

时间:2014-12-30 20:42:25

标签: regression python pymc

自学PyMC我试图定义一个简单的逻辑回归。但是我得到了一个ZeroProbability错误,并且不明白为什么会发生这种情况或者如何避免它。

这是我的代码:

import pymc
import numpy as np

x = np.array([85, 95, 70, 65, 70, 90, 75, 85, 80, 85])
y = np.array([1., 1., 0., 0., 0., 1., 1., 0., 0., 1.])

w0 = pymc.Normal('w0', 0, 0.000001)    # uninformative prior (any real number)
w1 = pymc.Normal('w1', 0, 0.000001)    # uninformative prior (any real number)

@pymc.deterministic
def logistic(w0=w0, w1=w1, x=x):
    return 1.0 / (1. + np.exp(-(w0 + w1 * x)))

observed = pymc.Bernoulli('observed', logistic, value=y, observed=True)

以下是跟踪错误消息:

Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/IPython/core/interactiveshell.py", line 2883, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-2-43ed68985dd1>", line 24, in <module>
    observed = pymc.Bernoulli('observed', logistic, value=y, observed=True)
  File "/usr/local/lib/python2.7/site-packages/pymc/distributions.py", line 318, in __init__
    **arg_dict_out)
  File "/usr/local/lib/python2.7/site-packages/pymc/PyMCObjects.py", line 772, in __init__
    if not isinstance(self.logp, float):
  File "/usr/local/lib/python2.7/site-packages/pymc/PyMCObjects.py", line 929, in get_logp
    raise ZeroProbability(self.errmsg)
ZeroProbability: Stochastic observed's value is outside its support,
 or it forbids its parents' current values.

我怀疑np.exp引起了麻烦,因为当线性方程变得过高时它会返回inf。 我知道还有其他方法可以使用PyMC定义逻辑回归(her is one),但我很想知道为什么这种方法不起作用,以及如何使用Bernoulli对象来定义回归使用bernoulli_like

4 个答案:

答案 0 :(得分:3)

当您使用pymc.Normal('w0', 0, 0.000001)创建正常的随机变量时,PyMC2会使用先前分布中的随机抽取来初始化该值。由于你的先验是如此分散,这可能是一个不太可能使后验实际上为零的值。要解决此问题,只需为Normal

请求合理的初始值
w0 = pymc.Normal('w0', 0, 0.000001, value=0)
w1 = pymc.Normal('w1', 0, 0.000001, value=0)

这是a notebook with a few more details

答案 1 :(得分:0)

您必须对逻辑函数返回的概率设置某种限制。

也许像

@pymc.deterministic
def logistic(w0=w0, w1=w1, x=x):
    tol = 1e-9
    res = 1.0 / (1. + np.exp(-(w0 + w1 * x)))
    return np.maximum(np.minimum(res, 1 - tol), tol)

我认为你也忘记了exp()函数中的否定。

答案 2 :(得分:0)

@ hahdawg的答案很好,但这里还有别的东西需要考虑。

对于w0w1上的无信息先验,我会首先进行眼球运动,然后使用有限制的制服。 显然你的w1大约是1/15 = .07,所以像.04到1.2的范围可能会这样。 w0将在-80/15 = -5.3的范围内,所以像-7到-3这样的东西可以做到。

我之所以这样说是因为exp可以很容易地去香蕉,所以你必须要小心你喂它。 如果你的逆logit函数的值太接近0或1,那么逻辑回归肯定会中断。​​

答案 3 :(得分:0)

出于好奇,您是否在致电thin时使用sample参数?有一个与此相关的错误,这可能是罪魁祸首。

此外,在任何情况下都不值得减薄。

相关问题