原代码
def sigmoid(x):result = 1 / (1 + np.exp(-x))return result
问题:当-x值过大,会导致溢出错误
改进后代码
def improved_sigmoid(x):# 创建一个与输入x相同大小的空数组来存储结果result = np.zeros_like(x)# 找到输入x中所有大于0的元素positive_mask = x >= 0# 对大于0的元素,使用常规计算# 这里 exp(-x) 不会下溢result[positive_mask] = 1 / (1 + np.exp(-x[positive_mask]))# 对小于0的元素,使用优化过的公式# 避免 exp(-x) 上溢# sigmoid(x) = e^x / (1 + e^x)negative_mask = x < 0exp_x = np.exp(x[negative_mask])result[negative_mask] = exp_x / (1 + exp_x)return result
证明:
1/(1+e^(-x))
=1/(1+1/e^x)
=1/(e^x + 1 /e^x)
=ex/(ex +1)