首页 > 解决方案 > 为python中的列表定义数值稳定的sigmoid函数的最佳方法

问题描述

对于标量变量x,我们知道如何在 python 中写出数值稳定的 sigmoid 函数:

def sigmoid(x):
    if x >= 0:
        return 1. / ( 1. + np.exp(-x) )
    else:
        return exp(x) / ( 1. + np.exp(x) )

对于一个标量列表,z = [x_1, x_2, x_3, ...]假设我们事先不知道每个标量的符号x_i,我们可以推广上述定义并尝试:

def sigmoid(z):
    result = []
    for x in z:
        if x >= 0:
            result.append(1. / ( 1. + np.exp(-x) ) )
        else:
            result.append( exp(x) / ( 1. + np.exp(x) ) )
    return result

这似乎有效。但是,我觉得这可能不是最 Pythonic 的方式。我应该如何改进“清洁度”的定义?说,有没有办法使用理解来缩短函数定义?

如果有人问过这个问题,我很抱歉,因为我在 SO 上找不到类似的问题。非常感谢您的时间和帮助!

标签: pythonsigmoid

解决方案


np.where你是对的,你可以通过使用numpy来做的更好if

def sigmoid(x):
    return np.where(x >= 0, 
                    1 / (1 + np.exp(-x)), 
                    np.exp(x) / (1 + np.exp(x)))

这个函数接受一个 numpy 数组x并返回一个 numpy 数组:

data = np.arange(-5,5)
sigmoid(data)
#array([0.00669285, 0.01798621, 0.04742587, 0.11920292, 0.26894142,
#       0.5       , 0.73105858, 0.88079708, 0.95257413, 0.98201379])

推荐阅读