快速找到函数均值的方法?
Fast way to find the mean of a function?
我正在编写代码来评估传递的函数的均值,但事先不知道函数形式。我有下面的代码确实有效,使用 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.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是一个函数(它是标准化的normal),所以你要稍微整理一下才能调用它:
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 调用了 "private" 函数(它们不完全是私有的,但前下划线意味着它是模块内部的).
我正在编写代码来评估传递的函数的均值,但事先不知道函数形式。我有下面的代码确实有效,使用 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.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是一个函数(它是标准化的normal),所以你要稍微整理一下才能调用它:
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 调用了 "private" 函数(它们不完全是私有的,但前下划线意味着它是模块内部的).