Scipy expit:出乎意料的行为。 NaN的

时间:2014-02-25 06:46:39

标签: python math numpy scipy

在我的数据中注意到一些 nan 出乎意料地出现了。 (并扩大和 naning 他们触及的一切) 做了一些仔细的调查并制作了一个最小的工作实例:

>>> import numpy
>>> from scipy.special import expit
>>> expit(709)
1.0
>>> expit(710)
nan

Expit是反向logit。 Scipy documentation here。 这告诉我们: expit(x) = 1/(1+exp(-x))

所以1+exp(-709)==1.0以便expit(709)=1.0看起来相当合理,四舍五入exp(-709)==0
但是,expit(710)发生了什么?
expit(710)==nan意味着1+exp(-710)==0,这意味着:exp(-710)=-1根本不正确。

发生了什么事?

我正在修理它:

def sane_expit(x):
    x = np.minimum(x,700*np.ones_like(x)) #Cap it at 700 to avoid overflow
    return expit(x)

但这会慢一点,因为额外的操作和python开销。

我正在使用numpy 1.8.-0和scipy 0.13.2

1 个答案:

答案 0 :(得分:3)

  

发生了什么事?

该函数显然没有编码来处理如此大的输入,并且在内部计算期间遇到溢出。

数字710的重要性在于math.exp(709)可以表示为float,而math.exp(710)则不能:

In [27]: import math

In [28]: math.exp(709)
Out[28]: 8.218407461554972e+307

In [29]: math.exp(710)
---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
----> 1 math.exp(710)

OverflowError: math range error

可能值得filing a bug against SciPy