python高斯函数表达式_编写集成高斯函数的Python函数的最佳方法是什么?

好吧,你似乎对几件事感到很困惑 . 让我们从头开始:你提到了"multidimensional function",然后继续讨论通常的单变量高斯曲线 . 这不是一个多维函数:当你集成它时,你只集成一个变量(x) . 区别是很重要的,因为有一个名为"multivariate Gaussian distribution"的怪物,它是一个真正的多维函数,如果是集成的,需要整合两个或多个变量(使用我之前提到的昂贵的蒙特卡罗技术) . 但你似乎只是在谈论常规的单变量Gaussian,它更容易使用,集成,以及所有这些 .

单变量高斯分布有两个参数 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 的正态分布 sigma , mu , n 由...给出”)到目前为止,这么好;这符合你所拥有的功能 . 请注意,这里唯一的真实变量是 x :其他三个参数对于任何特定的高斯都是固定的 .

现在有一个数学事实:可以证明所有高斯曲线具有相同的形状,它们只是稍微移动了一点 . 所以我们可以使用 N(x|0,1,1) ,称为"standard normal distribution",并将结果转换回一般的高斯曲线 . 因此,如果你有 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)))) .

好的,这应该是足够的背景解释 . 回到你的(编辑过的)帖子 . 你说"The erf(z) in scipy.special would require me to define exactly what t is initially" . 我不明白你的意思; 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程序集调整内部循环以获得纯粹的速度时,我似乎记得加法,减法或乘法每个需要大约4个CPU周期,除以36,并且指数大约是200.那是几年前的事情,所以拿这些数字来说是一粒盐;仍然,它说明了它们的相对复杂性 . 同样,计算蛮力的方式是一个非常糟糕的主意;在编写 exp(x) 的良好实现时,您可以采取一些技巧,使其比一般的 a**b 样式取幂更快,更准确 .

我从未使用常数pi和e的numpy版本;我一直坚持使用普通的旧数学模块的版本 . 我不知道你为什么喜欢这两个 .

我'm not sure what you'正在接受 quad() 电话 . quad(gen_gauss, -inf, inf, (10,2,0)) 应该将重正化的高斯从负无穷大加到无穷大,并且应该总是吐出10(你的归一化因子),因为高斯在实线上积分为1 . 任何远离10的答案(我不会指望自_1841809之后的10个只是近似值,毕竟)意味着某些东西被搞砸了......很难说在没有知道实际回报值和可能的内部运作的情况下搞砸了什么 quad() .

希望这已经揭开了一些混乱的神秘面纱,并解释了为什么错误功能是您问题的正确答案,以及如果您感到好奇,如何自己完成 . 如果我的解释不清楚,我建议先快速浏览一下维基百科;如果您还有疑问,请不要犹豫 .

你可能感兴趣的:(python高斯函数表达式)