在我的数据中,注意到一些南方人出乎意料地出现了.(并扩大和限制他们触摸的一切)做了一些仔细的调查,并产生了一个最小的工作示例:
>>> import numpy
>>> from scipy.special import expit
>>> expit(709)
1.0
>>> expit(710)
nan
Run Code Online (Sandbox Code Playgroud)
Expit是反向logit.Scipy文档在这里.这告诉我们:
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)
Run Code Online (Sandbox Code Playgroud)
但这会慢一点,因为额外的操作和python开销.
我使用numpy 1.8.-0和scipy 0.13.2
我用 Python 编写了以下函数来计算标量、向量或矩阵的 sigmoid 函数。
def sigmoid(z):
sig = 1.0/(1.0 + np.exp(-z))
return sig
Run Code Online (Sandbox Code Playgroud)
对于相对较大的 z 正值,e^-z返回一个非常小的值接近零 (0),因此 sig 的值四舍五入为 1。我的最终目标是确定逻辑回归算法的成本函数。由于 sigmoid 正好返回 1,因此log(1-1)返回 'nan'。我怎样才能解决这个问题,让我的 sigmoid() 函数返回正确的值而不是四舍五入e^-z到 0?
当我使用均值和标准差对输入特征进行归一化时,效果很好。但是有没有办法让它在更大的 z 值下工作?
另外,我在 Matlab 上尝试了相同的方法,并且在没有标准化的情况下也能正常工作。
>>> Z = np.array([[60, 100],[20, 80]])
>>> Z
array([[ 60, 100],
[ 20, 80]])
>>> np.exp(-Z)
array([[8.75651076e-27, 3.72007598e-44],
[2.06115362e-09, 1.80485139e-35]])
>>> 1.0/(1.0 + np.exp(-Z))
array([[1., 1.],
[1., 1.]])
Run Code Online (Sandbox Code Playgroud)