我用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]])>>> Zarray([[ 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)) # 定义Sigmoid函数 sig = np.minimum(sig, 0.9999) # 设置上限 sig = np.maximum(sig, 0.0001) # 设置下限 return sig
结果,我的损失开始看起来像这样
但是训练和测试损失都很好地收敛了,并且我在一个小数据集上使用逻辑回归获得了大约90%的准确率。