2016-01-19 19 views
4

這裏帶結果的例子:限制在與SciPy的np.inf

我通過高斯分佈整合(畝= 800,標準差= 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

我在這裏看不到問題。你意識到第二個積分是_supposed_爲零,對嗎? (你在一個對稱的時間間隔內整合一個奇數函數,PDF的x倍) –

+1

不,它應該是分佈的預期值,在他的情況下,它是800.這似乎是一個整合的問題方法。如果你用1代替你的期望值,你會得到正確的結果 – Christoph

+0

這不是假設的意思嗎? – Farseer

回答

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

請注意,當域爲無限時,不能使用'points'。 –

0

看起來這種行爲是預期的。

當積分極限非常大時 - 從-inf到inf,quad很難在800左右找到相對較小的凹凸,所以積分結果將爲零。

當平均值較小時,它的工作原理是因爲第一個分割點quad在給定範圍內爲零,所以當平均值較小時,積分將在第一次分割時找到正值。 (可能它使用某種梯形整合,我不確定)。所以解決這個問題的辦法是:或給積分限制一個實數(使我們的搜索空間變得更小)或者確保其中一個分組會在範圍內找到正值(例如確保平均值在零)。