自学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
答案 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)
答案 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的答案很好,但这里还有别的东西需要考虑。
对于w0
和w1
上的无信息先验,我会首先进行眼球运动,然后使用有限制的制服。
显然你的w1
大约是1/15 = .07,所以像.04到1.2的范围可能会这样。
w0
将在-80/15 = -5.3的范围内,所以像-7到-3这样的东西可以做到。
我之所以这样说是因为exp
可以很容易地去香蕉,所以你必须要小心你喂它。
如果你的逆logit函数的值太接近0或1,那么逻辑回归肯定会中断。
答案 3 :(得分:0)
出于好奇,您是否在致电thin
时使用sample
参数?有一个与此相关的错误,这可能是罪魁祸首。
此外,在任何情况下都不值得减薄。