python - 为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 上找不到类似的问题。非常感谢您的时间和帮助!
解决方案
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])
推荐阅读
- python - 视图 ProjectManagementapp.views.product_insert_view 没有返回 HttpResponse 对象。它返回 None 而不是
- javascript - rss 格式不正确(无效令牌) - ReactJS
- flutter - 如何将数据传递给有状态的小部件
- laravel - Laravel:生产路径和本地路径的区别;需要使用公共/
- python - 如何使用 cpython 将结构数组传递给 DLL 函数?
- python - 如何在python中将字典与字典分组?
- c# - 如何从 Azure Functions v2 中的请求正文获取图像数据并转换为 Stream
- javascript - 询问 javascript 粘贴事件以获取图像数据
- javascript - 如何检查使用了 Raspberry Pi 上的哪些引脚
- reactjs - Onclick 选择的 MenuItem 无法正常工作