我正在编写代码来评估它传递的函数的平均值,但是事先不知道函数形式。我使用scipy.integrate.quad下面的代码确实有效,但它相当慢。我想知道有没有人知道更快的方式?
import numpy as np
from scipy.integrate import quad
from scipy.stats import norm
fn=norm(1,2).pdf #A Gaussian as an example (mean 1 and standard deviation 2)
mean=quad(lambda x: x*fn(x), -100, 100)[0] #Gives 0.9999... , which is good enough
答案 0 :(得分:2)
在我的电脑中,你的计算只需0.12秒:
In [59]: %prun quad(lambda x: x*fn(x), -100,100)
26740 function calls in 0.114 seconds
我得到了同样的结果:
In [59]: quad(lambda x: x*fn(x), -100,100)
Out[59]: (0.9999999999999999, 5.793858187044747e-12)
大部分原因是fn
是scipy中的有界方法,python必须解决一点,直到找到要评估的功能。你应该尝试传递一个函数。
在您的示例中,如果您允许(我导入scipy as sp
):
In [60]: fn2 = sp.stats._continuous_distns._norm_pdf
然后fn2是一个函数(它是一个标准化的正常),所以你必须整理一下来调用它:
In [61]: quad(lambda x: x*fn2((x-a)/b)/b, -100,100)
Out[61]: (1.0, 4.712371011323367e-10)
此处a
是标准偏差的均值和b
。
它快20倍:
In [62]: %prun quad(lambda x: x*fn2((x-a)/b)/b, -100,100)
805 function calls in 0.006 seconds
当然这个例子是你的例子的一个解决方案,但我要设法做的是你应该将函数传递给quad
方法,以便让它运行得更快。
请注意,在我所做的事情中,我从scipy中调用了“私有”函数(它们不是完全私有的,但预先下划线意味着它是模块内部的。)