今天在写机器学习实战第五章 程序清单5-5的程序时,遇到这个问题:
RuntimeWarning: overflow encountered in exp
return 1.0/(1 + np.exp(-x))
原因在于sigmoid函数,当x是一个非常小的负数时,exp(-x)会过大,导致溢出,下面进行优化:
**原式分子分母同乘exp(x)**这个很小的数(原式大小不变),可以防止数据溢出
优化前:
def sigmoid(x):
return 1.0/(1 + np.exp(-x))
优化后:
def sigmoid(x):
'''
当x是一个非常小的负数时,exp(-x)会过大,导致溢出,下面进行优化:
原式分子分母同乘exp(x)这个很小的数,可以防止数据溢出
'''
if x >= 0:
return 1.0/(1 + np.exp(-x))
else:
return np.exp(x)/(1 + np.exp(x))