计算跨正态分布的函数期望

Calculating expectation of functions across normal distribution

我想计算正态分布中某些函数的期望值。

一个例子:

mu = 100
k = 100
sigma = 10
val, err = quad(lambda x: norm.pdf((x - mu) / sigma) * x if x > k else 0, -math.inf, math.inf)
print(val)

这会打印出 4.878683842492743e-288,这显然不是正确答案。

我假设这是因为 SciPy 无法整合高斯。我该如何解决这个问题?理想情况下,我想要一种方法,它允许人们在 Gaussian 中集成各种函数,并且不特定于我输入的示例。

谢谢!

我认为这是正交的问题(有时它并没有真正适应),并且不喜欢if语句。

所以我会建议这样的事情(从 k 积分到无穷大):

def f(x):
    return 1/sigma*norm.pdf((x - mu) / sigma)*x

val, err = quad(f,  k, math.inf)

注意,正如 Jimmy 暗示的那样,高斯的正确形式需要 1/sigma。

进行此积分的另一种方法是强制 quad 在某些点上小心。我最喜欢的方式是做类似

的事情
import numpy as np
from scipy.integrate import quad 

#this is the Gaussian. Note that *0.5*(np.sign(x-k)+1) is 0 for x<k and 1 otherwise.
def f(x):
    return 1/(np.sqrt(2*np.pi)*sigma)*np.exp(- 0.5*( (x-mu)/sigma )**2 ) *x*0.5*(np.sign(x-k)+1)
    
#use this to integrate from in (-1,1)
def G(u):
    x=u/(1-u**2)
    return f(x)*(1+u**2)/(1-u**2)**2

quad(G,-1,1,points=np.linspace(-0.999,0.999,25)) 

我建议阅读 this 以了解如何优化此类积分。