如何在 Python 中计算 logistic sigmoid 函数?

新手上路,请多包涵

这是逻辑 sigmoid 函数:

在此处输入图像描述

我知道x。我现在如何在 Python 中计算 F(x)?

假设 x = 0.458。

F(x) = ?

原文由 Richard Knop 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 420
2 个回答

这应该这样做:

 import math

def sigmoid(x):
  return 1 / (1 + math.exp(-x))

现在您可以通过调用来测试它:

 >>> sigmoid(0.458)
0.61253961344091512

更新:请注意,上面的内容主要是将给定表达式直接一对一地转换为 Python 代码。它 没有 经过测试,也没有被认为是一个数字上合理的实现。如果您知道您需要一个非常健壮的实现,我相信还有其他人实际上已经考虑过这个问题。

原文由 unwind 发布,翻译遵循 CC BY-SA 3.0 许可协议

它也可以在 scipy 中找到: http ://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.logistic.html

 In [1]: from scipy.stats import logistic

In [2]: logistic.cdf(0.458)
Out[2]: 0.61253961344091512

这只是另一个 scipy 函数的昂贵包装器(因为它允许您缩放和转换逻辑函数):

 In [3]: from scipy.special import expit

In [4]: expit(0.458)
Out[4]: 0.61253961344091512

如果您关心性能,请继续阅读,否则只需使用 expit

一些基准测试:

 In [5]: def sigmoid(x):
  ....:     return 1 / (1 + math.exp(-x))
  ....:

In [6]: %timeit -r 1 sigmoid(0.458)
1000000 loops, best of 1: 371 ns per loop

In [7]: %timeit -r 1 logistic.cdf(0.458)
10000 loops, best of 1: 72.2 µs per loop

In [8]: %timeit -r 1 expit(0.458)
100000 loops, best of 1: 2.98 µs per loop

正如预期的那样 logistic.cdfexpit 慢(很多)。 expit 仍然比 python sigmoid 函数慢,因为它是用 C 编写的通用函数( http://docs.scipy.org/doc/numpy /reference/ufuncs.html ),因此有调用开销。此开销大于 expit 的计算加速,这是在使用单个值调用时由其编译性质给出的。但是当涉及到大数组时,它变得可以忽略不计:

 In [9]: import numpy as np

In [10]: x = np.random.random(1000000)

In [11]: def sigmoid_array(x):
   ....:    return 1 / (1 + np.exp(-x))
   ....:

(您会注意到从 math.expnp.exp 的微小变化(第一个不支持数组,但如果您只有一个值要计算,速度会快得多))

 In [12]: %timeit -r 1 -n 100 sigmoid_array(x)
100 loops, best of 1: 34.3 ms per loop

In [13]: %timeit -r 1 -n 100 expit(x)
100 loops, best of 1: 31 ms per loop

但是当你真的需要性能时,一种常见的做法是在 RAM 中保存一个 sigmoid 函数的预计算表,并以一些精度和内存换取一些速度(例如: http ://radimrehurek.com/2013/09 /word2vec-in-python-part-two-optimizing/ )

另外,请注意 expit 自版本 0.14.0 以来实现在数值上是稳定的: https ://github.com/scipy/scipy/issues/3385

原文由 Théo T 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题