对于大的正输入,Sigmoid 函数返回 1

Sup*_*dar 5 python machine-learning logistic-regression sigmoid

我用 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)

eno*_*ted 5

np.minimum我通过用&包装 sigmoid 函数解决了这个问题np.maximum

def sigmoid(x):
    sig = 1 / (1 + np.exp(-x))     # Define sigmoid function
    sig = np.minimum(sig, 0.9999)  # Set upper bound
    sig = np.maximum(sig, 0.0001)  # Set lower bound
    return sig
Run Code Online (Sandbox Code Playgroud)

结果我的损失开始看起来像这样

这

但训练和测试损失都收敛得很好,而且我使用逻辑回归在一个小数据集上获得了约 90% 的准确率。