Python的numpy.exp函数中的溢出错误 [英] Overflow Error in Python's numpy.exp function
问题描述
我想这样使用numpy.exp
:
cc = np.array([
[0.120,0.34,-1234.1]
])
print 1/(1+np.exp(-cc))
但这给了我错误:
/usr/local/lib/python2.7/site-packages/ipykernel/__main__.py:5: RuntimeWarning: overflow encountered in exp
我不明白为什么?我怎样才能解决这个问题?看来问题出在第三个数字(-1234.1)
I can't understand why? How can I fix this? It seems the problem is with third number (-1234.1)
推荐答案
正如fuglede所说,这里的问题是np.float64
无法处理与exp(1234.1)
一样大的数字.尝试改用np.float128
:
As fuglede says, the issue here is that np.float64
can't handle a number as large as exp(1234.1)
. Try using np.float128
instead:
>>> cc = np.array([[0.120,0.34,-1234.1]], dtype=np.float128)
>>> cc
array([[ 0.12, 0.34, -1234.1]], dtype=float128)
>>> 1 / (1 + np.exp(-cc))
array([[ 0.52996405, 0.58419052, 1.0893812e-536]], dtype=float128)
但是请注意,使用扩展精度存在某些怪癖.它可能无法在Windows上运行;您实际上并没有获得完整的128位精度;当数字通过纯python时,您可能会失去精度.您可以在此处了解更多信息.
Note however, that there are certain quirks with using extended precision. It may not work on Windows; you don't actually get the full 128 bits of precision; and you might lose the precision whenever the number passes through pure python. You can read more about the details here.
出于大多数实际目的,您可以将1 / (1 + <a large number>)
近似为零.也就是说,只要忽略警告并继续前进即可. Numpy会为您处理近似值(使用np.float64
时):
For most practical purposes, you can probably approximate 1 / (1 + <a large number>)
to zero. That is to say, just ignore the warning and move on. Numpy takes care of the approximation for you (when using np.float64
):
>>> 1 / (1 + np.exp(-cc))
/usr/local/bin/ipython3:1: RuntimeWarning: overflow encountered in exp
#!/usr/local/bin/python3.4
array([[ 0.52996405, 0.58419052, 0. ]])
如果您想取消该警告,则可以使用 scipy.special.expit
,正如WarrenWeckesser在对该问题的评论中所建议的:
If you want to suppress the warning, you could use scipy.special.expit
, as suggested by WarrenWeckesser in a comment to the question:
>>> from scipy.special import expit
>>> expit(cc)
array([[ 0.52996405, 0.58419052, 0. ]])
这篇关于Python的numpy.exp函数中的溢出错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!