好吧,你似乎对一些事情很困惑。让我们从头开始:你提到了一个“多维函数”,但接着讨论通常的单变量高斯曲线。这是而不是一个多维函数:当你集成它时,你只集成一个变量(x)。区别很重要,因为是一个称为“多元高斯分布”的怪物,它是一个真正的多维函数,如果被集成,则需要集成两个或多个变量(使用前面提到的昂贵的蒙特卡罗技术)。但是你似乎只是在讨论正则的单变量高斯函数,它更容易处理,积分,以及所有这些。
单变量高斯分布有两个参数,sigma和mu,是我们将要表示的x的单变量函数。您似乎还携带了一个规范化参数n(这在一些应用程序中很有用)。标准化参数通常不包含在计算中,因为您只需在结尾处将它们加回去(记住,积分是一个线性运算符:int(n*f(x), x) = n*int(f(x), x))。但如果你愿意,我们可以随身携带;我喜欢的正态分布符号是
N(x | mu, sigma, n) := (n/(sigma*sqrt(2*pi))) * exp((-(x-mu)^2)/(2*sigma^2))
(读作“给定的sigma,mu,和n的正态分布由…)到目前为止,很好;这与你得到的函数匹配。注意,这里唯一的真正变量是x:对于任何特定的高斯函数,其他三个参数都是固定的。
现在来看一个数学事实:所有高斯曲线都有相同的形状,这是可以证明的,它们只是稍微移动了一下。所以我们可以使用N(x|0,1,1),称为“标准正态分布”,并将结果转换回一般的高斯曲线。所以如果你有N(x|0,1,1)的积分,你可以简单地计算任何高斯函数的积分。这个积分经常出现,因此它有一个特殊的名称:错误函数erf。由于一些旧的约定,它并不完全是的erf;还有一些加法和乘法因子也被携带。
如果Phi(z) = integral(N(x|0,1,1), -inf, z);也就是说,Phi(z)是标准正态分布从负无穷到z的积分,那么根据误差函数的定义
Phi(z) = 0.5 + 0.5 * erf(z / sqrt(2))。
同样,如果Phi(z | mu, sigma, n) = integral( N(x|sigma, mu, n), -inf, z);也就是说,Phi(z | mu, sigma, n)是给定参数mu,sigma,和n从负无穷到z的正态分布的积分,那么通过定义错误函数
Phi(z | mu, sigma, n) = (n/2) * (1 + erf((x - mu) / (sigma * sqrt(2))))。
好吧,这应该是足够的背景解释了。回到你的(编辑过的)帖子。你说“scipy.special中的erf(z)需要我精确定义t最初是什么”。我不知道你的意思;时间在哪里一点也不介意?希望上面的解释稍微揭开了错误函数的神秘面纱,现在更清楚了为什么错误函数是正确的函数。
您的Python代码是可以的,但是我更喜欢闭包而不是lambda:def make_gauss(N, sigma, mu):
k = N / (sigma * math.sqrt(2*math.pi))
s = -1.0 / (2 * sigma * sigma)
def f(x):
return k * math.exp(s * (x - mu)*(x - mu))
return f
使用闭包可以对常量k和s进行预计算,因此每次调用返回的函数时所需的工作更少(如果要集成它,这一点很重要,这意味着它将被多次调用)。此外,我避免使用指数运算符**,这比只写平方运算要慢,并将除法从内环中取出,用乘法代替它。我根本没看过它们在Python中的实现,但从我上次使用原始x87程序集为纯速度调整内部循环开始,我似乎还记得加法、减法或乘法s每个占用大约4个CPU周期,除以大约36,然后指数化大约200。那是几年前的事了,所以就拿这些数字来说吧;尽管如此,它还是说明了它们的相对复杂性。同样,计算exp(x)暴力方式是一个非常糟糕的主意;当编写exp(x)的良好实现时,可以使用一些技巧,使其比一般的a**b式指数运算更快更准确。
我从未使用过常量pi和e的numpy版本;我一直坚持使用普通的旧数学模块的版本。我不知道你为什么会喜欢这两个。
我不知道你要用这个电话干什么。quad(gen_gauss, -inf, inf, (10,2,0))应该把一个重新规范化的高斯从负无穷大积分到正无穷大,并且应该总是吐出10(你的规范化因子),因为高斯在实线上积分到1。任何远不到10的答案(我不希望确切地10,因为quad()毕竟只是一个近似值)意味着某个地方出了问题。。。在不知道实际返回值和quad()的内部工作方式的情况下,很难说是什么搞砸了。
希望这已经消除了一些困惑,并解释了为什么错误函数是解决问题的正确答案,以及如果你好奇的话,如何自己做这一切。如果我的解释不清楚,我建议先快速浏览一下维基百科;如果你还有问题,不要犹豫。