Sigmoid函数在较大的正输入时返回1

我用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.minimumnp.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

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

this

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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注