python - Sigmoid 函数对于较大的正输入返回 1

标签 python machine-learning logistic-regression sigmoid

我用 Python 编写了以下函数来计算标量、向量或矩阵的 sigmoid 函数。

def sigmoid(z):
    sig = 1.0/(1.0 + np.exp(-z))
    return sig

对于相对较大的 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.]])

最佳答案

我通过用 np.minimum & np.maximum 包装 sigmoid 函数克服了这个问题:

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

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

this

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

关于python - Sigmoid 函数对于较大的正输入返回 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52423163/

相关文章:

python - class_weight = 'balanced' 相当于朴素贝叶斯

python - 如何覆盖 django 文件?

python - 为什么 shell 输出会转到 stderr?

machine-learning - F1 分数 vs ROC AUC

r - r中的多元逻辑回归?

machine-learning - 将多类模型的类概率转换为 0-100 范围内的分数

python - 如何通过 Office 365 REST API 检索 Internet(消息) header ?

python - 当字典被覆盖时如何修复类变量/常量?

python-3.x - EarlyStopping 忽略我定义的自定义指标。 Keras模型

machine-learning - 超过 2 theta 值的梯度下降