注意到我的数据中突然出现了一些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
可能值得一试。