这是逻辑 sigmoid 函数:
我知道x。我现在如何在 Python 中计算 F(x)?
假设 x = 0.458。
F(x) = ?
原文由 Richard Knop 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是逻辑 sigmoid 函数:
我知道x。我现在如何在 Python 中计算 F(x)?
假设 x = 0.458。
F(x) = ?
原文由 Richard Knop 发布,翻译遵循 CC BY-SA 4.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.cdf
比 expit
慢(很多)。 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.exp
到 np.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 许可协议
2 回答5k 阅读✓ 已解决
2 回答1k 阅读✓ 已解决
4 回答937 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
这应该这样做:
现在您可以通过调用来测试它:
更新:请注意,上面的内容主要是将给定表达式直接一对一地转换为 Python 代码。它 没有 经过测试,也没有被认为是一个数字上合理的实现。如果您知道您需要一个非常健壮的实现,我相信还有其他人实际上已经考虑过这个问题。