Python中sigmoid函数中报: RuntimeWarning: overflow encountered in exp

sigmoid 函数中使用 numpy.exp 的时候,遇到了 RuntimeWarning: overflow encountered in exp 。

原因:因为参数值inx很大时,exp(inx)可能会发生溢出,

有一种解决方式是对sigmoid函数实现的优化:如https://blog.csdn.net/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

猜你喜欢

转载自blog.csdn.net/guyu1003/article/details/108470391