在我的数据中注意到一些 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
答案 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