注意到我的数据中突然出现了一些nan。
(把他们接触到的一切都扩大和保育起来)
做了一些仔细的调查,得出了一个最小的工作示例:

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

expit是逆逻辑。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根本不正确。
怎么回事?
我正在修复它:
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

最佳答案

怎么回事?
显然,函数没有被编码来处理如此大的输入,在内部计算过程中会遇到溢出。
数字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

可能值得一试。

08-27 10:39