如何将正态分布与 numpy 和 scipy 集成?

inv*_*tus 2 python numpy scipy

尝试整合正态分布

import numpy as np
import scipy
Run Code Online (Sandbox Code Playgroud)

这不起作用,会引发类型错误:

def f_np(x):
  return np.random.normal(size=x)

integrate.quad(f_manual, -np.inf, np.inf)

mtrand.pyx in numpy.random.mtrand.RandomState.normal()

_common.pyx in numpy.random._common.cont()

TypeError: 'float' object cannot be interpreted as an integer

Run Code Online (Sandbox Code Playgroud)

但如果我手动输入pdf,它就会起作用:

def f_manual(x):
   return 1/(1 * np.sqrt(2 * np.pi)) * np.exp(-(x - 0)**2 / (2 * 1**2) )

integrate.quad(f_manual, -np.inf, np.inf)

(0.9999999999999997, 1.017819145094224e-08)
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

use*_*654 5

这里发生了几件事。

np.random.normal从正态分布中抽取样本。size 参数指定您想要的样本数量。如果指定 10,您将得到一个包含 10 个样本的数组。如果你指定一个元组,就像(4, 5)你会得到一个 4x5 数组。另外,np.inf是一个浮点数,并且np.random.normal需要一个整数或整数元组作为大小参数。

您拥有的f_manual是一个确定性函数(即 PDF),它返回值 处的 PDF 值x

这是两件不同的事情。

scipy有一个返回高斯 PDF 的函数:scipy.stats.norm.pdf

import scipy.stats
scipy.integrate.quad(scipy.stats.norm.pdf, -np.inf, np.inf)
# (0.9999999999999998, 1.0178191320905743e-08)
Run Code Online (Sandbox Code Playgroud)

scipy还有一个 CDF 函数,返回从 -inf 到 x 的积分:

scipy.stats.norm.cdf(np.inf)
# 1.0

scipy.stats.norm.cdf(0)
# 0.5
Run Code Online (Sandbox Code Playgroud)