这些功能已经存在于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开销较小的方法,但是“自己滚动”的方法更快:
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)