这是一个结果示例:
我通过高斯分布(mu = 800,sigma = 1)与〜+ -2sigma ppf和从-inf
到+inf
的相同积分进行积分。由于某种原因,第二个积分导致零,但在实践中它应该更准确。
有人可以解释一下,为什么会出现这种异常或者我犯了错误?
代码:
from scipy.integrate import quad
import numpy as np
from scipy.stats import norm
def integrand(x):
return x*norm.pdf(x, 800, 1)
print quad(integrand, norm.ppf(0.05, 800,1), norm.ppf(0.95, 800,1))
print quad(integrand, -np.inf, np.inf)
(719.9999999999894, 5.913323331834147e-11)
(0.0, 0.0)
编辑:顺便说一句,当均值很小(例如2)时,它工作正常 - 积分结果非常接近。
答案 0 :(得分:1)
quad
使用启发式算法,使用适应性集成步骤来减少时间计算。功能是平坦的,它会更快。因此,在全球大的时间间隔内,它可能会错过峰值。
您可以通过建议“兴趣点”来帮助quad
,以帮助他找到有困难的地区:
>>> quad(integrand,0,1000)
(3.8929062783235445e-32, 7.210678067622767e-32)
>>> quad(integrand,0,1000,points=[750])
(799.9999999999993, 2.0260999142842332e-07)
您可以使用quad
关键字查看full_output
次调查的结果:
>>>quad(integrand,0,1000,full_output=True)[2]['rlist'].max()
3.8929062783235445e-32
此处quad
从不选择被积函数值超过1e-31的点,因此它为
推断该函数无处不在。
答案 1 :(得分:0)
似乎这种行为是预期的。
当积分极限如此巨大时 - 从-inf到inf,quad
很难找到800左右的相对较小的凹凸,因此积分的结果将为零。
当mean很小时它起作用的原因是因为第一个分割quad
在给定范围的中间做零,所以当mean很小时,integral将在第一次分割时找到正值。 (可能它使用某种梯形积分,我不确定)。因此,解决这个问题的方法是:或者给出实数的积分限制(使我们的搜索空间小得多)或者确保其中一个分裂将在范围内找到正值。(例如,确保均值在零附近)。