计算1 /(1 + exp(x))python

时间:2015-11-25 15:36:05

标签: python numpy floating-point scipy expansion

我想为(可能很大)x计算1 /(1 + exp(x))。这是0和1之间表现良好的函数。我可以做到

import numpy as np
1.0/(1.0+np.exp(x))

但是在这个天真的实现中,np.exp(x)可能只会返回0或无穷大的大x,具体取决于符号。 python中是否有可以帮助我的功能?

我正在考虑实施一系列扩展和系列加速,但我想知道这个问题是否已经解决了。

2 个答案:

答案 0 :(得分:5)

您可以使用scipy.special.expit(-x)。它将避免1.0/(1.0 + exp(x))生成的溢出警告。

答案 1 :(得分:2)

从根本上说,您受到浮点精度的限制。例如,如果您使用的是64位浮点数:

fmax_64 = np.finfo(np.float64).max  # the largest representable 64 bit float
print(np.log(fmax_64))
# 709.782712893

如果x大于约709,那么您将无法使用64位浮点数来表示np.exp(x)(或1. / (1 + np.exp(x)))。

您可以使用扩展精度浮点数(即np.longdouble):

fmax_long = np.finfo(np.longdouble).max
print(np.log(fmax_long))
# 11356.5234063

np.longdouble的精确度可能会因您的平台而异[{3}},这样您就可以使用x值达到约11356:

func = lambda x: 1. / (1. + np.exp(np.longdouble(x)))
print(func(11356))
# 1.41861159972e-4932

除此之外,您需要重新考虑如何计算扩展,或者使用支持任意精度算术的on x86 it is usually 80 bit之类的东西。然而,与numpy相比,这通常会带来更差的运行时性能,因为不再可能进行矢量化。