在sigmoid
函数中使用 numpy.exp
的时候,遇到了 RuntimeWarning: overflow encountered in exp
。
原因:因为参数值inx很大时,exp(inx)可能会发生溢出,
有一种解决方式是对sigmoid函数实现的优化:如https://blog.youkuaiyun.com/CY_TEC/article/details/106083366
def sigmoid(inx):
if inx>=0: #对sigmoid函数的优化,避免了出现极大的数据溢出
return 1.0/(1+exp(-inx))
else:
return exp(inx)/(1+exp(inx))
这样做可以保证exp(inx)值始终小于1,避免极大溢出。
但,个人总感觉这样有点怪,作者也说会出现下溢风险。所以查到一种方式,用scipy.special模块中的expit代替numpy中的exp,如下:
from scipy.special import expit
def sigmoid(z):
""" 假设函数:logistics的假设函数是sigmoid函数
用expit函数来代替np中的exp
"""
return expit(z)
expit函数,也称为logistic sigmoid函数,定义为expit(x)= 1 /(1 + exp(-x))。 它是logit函数的反函数。
参数:x:ndarray
ndarray的元素应用expit函数
输出:
out:ndarray
与x形状相同的ndarray,它的元素是对应元素输入expit函数的结果
参考:https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.special.expit.html