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)
知道为什么吗?
这里发生了几件事。
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)
| 归档时间: |
|
| 查看次数: |
1125 次 |
| 最近记录: |