编写集成高斯函数的Python函数的最佳方法是什么?

时间:2009-02-04 03:49:20

标签: python scipy gaussian integral

在尝试使用scipy的quad方法来集成高斯(假设有一个名为gauss的高斯方法)时,我遇到了将所需参数传递给高斯并留下四边形来对正确变量进行积分的问题。有没有人有一个如何使用四维w /多维函数的好例子?

但是这引发了一个更加宏大的问题,即关于整合高斯的最佳方法。我没有在scipy中找到高斯整合(令我惊讶)。我的计划是编写一个简单的高斯函数并将其传递给quad(或者现在可能是一个固定宽度的积分器)。你会做什么?

编辑:固定宽度意味着类似trapz的东西,它使用固定的dx来计算曲线下的区域。

到目前为止我得到的是一个方法make___gauss,它返回一个lambda函数,然后可以进入quad。通过这种方式,我可以在积分之前使用我需要的平均值和方差来生成正常函数。

def make_gauss(N, sigma, mu):
    return (lambda x: N/(sigma * (2*numpy.pi)**.5) *
            numpy.e ** (-(x-mu)**2/(2 * sigma**2)))

quad(make_gauss(N=10, sigma=2, mu=0), -inf, inf)

当我尝试传递一般高斯函数(需要用x,N,mu和sigma调用)并使用四边形填充某些值时

quad(gen_gauss, -inf, inf, (10,2,0))

参数10,2和0不一定匹配N = 10,sigma = 2,mu = 0,这提示了更广泛的定义。

scipy.special中的erf(z)需要我准确定义最初的t,但很高兴知道它就在那里。

5 个答案:

答案 0 :(得分:32)

答案 1 :(得分:13)

scipy附带“错误函数”,又称高斯积分:

import scipy.special
help(scipy.special.erf)

答案 2 :(得分:3)

我假设你正在处理多元高斯;如果是这样,SciPy已经拥有了你正在寻找的功能:它被称为MVNDIST(“MultiVariate Normal DISTribution”。)SciPy文档一如既往,非常糟糕,所以我甚至找不到函数埋藏的地方,但是{{ 3}}。文档很容易成为SciPy中最糟糕的部分,并且让我在过去一直没有结束。

单变量高斯只使用旧的错误函数,其中有许多实现可用。

至于攻击问题一般,是的,正如James Thompson所提到的,你只想编写自己的高斯分布函数并将其提供给quad()。但是,如果可以避免广义集成,那么这样做是个好主意 - 特定函数的专用集成技术(如MVNDIST使用)将比标准的蒙特卡罗多维集成快得多,这可能非常慢高精度。

答案 3 :(得分:3)

高斯分布也称为正态分布。 scipy norm模块中的cdf函数可以满足您的需求。

from scipy.stats import norm
print norm.cdf(0.0)
>>>0.5

http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html#scipy.stats.norm

答案 4 :(得分:2)

为什么不总是从-infinity到+ infinity进行整合,以便您始终知道答案? (开玩笑!)

我的猜测是,SciPy中还没有高斯函数的唯一原因是它的写入功能很简单。关于编写自己的函数并将其传递给四元组以集成声音的建议非常好。它使用公认的SciPy工具来实现这一点,它为您提供最少的代码工作量,并且即使他们从未见过SciPy,它对其他人来说也是非常易读的。

固定宽度积分器究竟是什么意思?你的意思是使用与QUADPACK使用的算法不同的算法吗?

编辑:为了完整性,这里有类似于我试用的高斯平均值为0且标准偏差为1从0到+无穷大的东西:

from scipy.integrate import quad
from math import pi, exp
mean = 0
sd   = 1
quad(lambda x: 1 / ( sd * ( 2 * pi ) ** 0.5 ) * exp( x ** 2 / (-2 * sd ** 2) ), 0, inf )

这有点难看,因为高斯函数有点长,但写起来仍然很简单。