快速查找函数均值的方法吗?

时间:2015-05-21 11:58:15

标签: python scipy

我正在编写代码来评估它传递的函数的平均值,但是事先不知道函数形式。我使用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

1 个答案:

答案 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中调用了“私有”函数(它们不是完全私有的,但预先下划线意味着它是模块内部的。)