我试图在scipy.stats.norm生成的概率密度函数上使用蒙特卡罗积分进行标准正态分布,并且收敛到1 /(2 * sqrt(pi))而不是1。

代码:

from scipy.stats import norm
from numpy import average, pi
import math
samples = norm.rvs(loc=0, scale=1, size=10000000)
average(norm.pdf(samples, loc=0, scale=1)) - (1/(2*math.sqrt(pi)))


这将返回〜0。
有人可以解释为什么它不能收敛到1.我在这里做错了吗?

最佳答案

您正在评估一个大的,正态分布的样本的PDF,然后取这些PDF值的平均值。实际上,您正在计算相对于正态分布的正态PDF的期望值。这是一种快速的计算方法:

In [284]: from scipy.stats import norm

In [285]: norm.expect(norm.pdf)
Out[285]: 0.28209479177387786

In [286]: 1/(2*np.sqrt(np.pi))
Out[286]: 0.28209479177387814

关于python - scipy.stats.norm密度函数未积分为1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42956528/

10-16 03:11