如何整合正态分布与numpy和scipy?



试图对正态分布进行积分

import numpy as np
import scipy

这不起作用,抛出类型错误:

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

但是如果我手动输入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)

知道为什么吗?

这里有几件事。

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)

scipy也有一个CDF函数,它返回从-inf到x的整数:

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

最新更新