Numpy Pure Function用于性能,缓存

Numpy Pure Function用于性能,缓存,第1张

Numpy Pure Function用于性能,缓存

这些功能已经存在于scipy中。乙状结肠功能可用

scipy.special.expit

In [36]: from scipy.special import expit

expit
向量化S型函数比较:

In [38]: x = np.linspace(-6, 6, 1001)In [39]: %timeit y = sigmoid(x)100 loops, best of 3: 2.4 ms per loopIn [40]: %timeit y = expit(x)10000 loops, best of 3: 20.6 µs per loop

expit
比自己实现公式还快:

In [41]: %timeit y = 1.0 / (1.0 + np.exp(-x))10000 loops, best of 3: 27 µs per loop

逻辑分布的CDF是S形函数。它可以作为的

cdf
方法使用
scipy.stats.logistic
,但
cdf
最终会调用
expit
,因此使用该方法毫无意义。您可以使用该
pdf
方法来计算Sigmoid函数的导数,也可以使用
_pdf
开销较小的方法,但是“自己滚动”的方法更快:

In [44]: def sigmoid_grad(x):   ....:     ex = np.exp(-x)   ....:     y = ex / (1 + ex)**2   ....:     return y

时序(x的长度为1001):

In [45]: from scipy.stats import logisticIn [46]: %timeit y = logistic._pdf(x)10000 loops, best of 3: 73.8 µs per loopIn [47]: %timeit y = sigmoid_grad(x)10000 loops, best of 3: 29.7 µs per loop

如果要使用的值太短了,请谨慎执行。指数函数很容易溢出。

logistic._cdf
比我快速实现的功能更强大
sigmoid_grad

In [60]: sigmoid_grad(-500)/home/warren/anaconda/bin/ipython:3: RuntimeWarning: overflow encountered in double_scalars  import sysOut[60]: 0.0In [61]: logistic._pdf(-500)Out[61]: 7.1245764067412855e-218

使用

sech**2
1/cosh**2
)的实现比上面的要慢一些
sigmoid_grad

In [101]: def sigmoid_grad_sech2(x):   .....:     y = (0.5 / np.cosh(0.5*x))**2   .....:     return y   .....:In [102]: %timeit y = sigmoid_grad_sech2(x)10000 loops, best of 3: 34 µs per loop

但是它可以更好地处理尾巴:

In [103]: sigmoid_grad_sech2(-500)Out[103]: 7.1245764067412855e-218In [104]: sigmoid_grad_sech2(500)Out[104]: 7.1245764067412855e-218


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5643901.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存