【发布时间】:2019-02-24 15:35:39
【问题描述】:
我在 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.]])
【问题讨论】:
-
它从不四舍五入,你能举个例子吗?具体来说,使函数 round 的
z的输入值是多少? -
函数返回 1 并没有“错误”,只是你已经达到了机器精度限制。您的成本函数应该受到“保护”,要么具有 sigmoid 的最小值 (
log(1 - max(sigmoid(z), EPSILON))),要么在有条件的基础上定义它,这样如果sigmoid(z) == 1(或sigmoid(z) > 1 - EPSILON)则成本为零。 -
@EPo:嗨,从控制台添加了一个 sn-p。我不确定我做错了什么或解释错了什么。
-
@jdehesa:您好,感谢您的解释,这是有道理的!我会试试这个。
-
查看question,了解如何稳健地实施 sigmoid。
标签: python machine-learning logistic-regression sigmoid