2017-07-31 134 views
2

我試圖找出一個隨機變量事件超過特定值的概率,即pr(x> a),其中a是某個常數,通常遠高於x的平均值,並且x不是任何標準的高斯分佈。所以我想要擬合一些其他的概率密度函數,並把x的PDF從a到inf的積分。由於這是尖峯建模的問題,我認爲這是一個極值分析問題,並且發現威布爾分佈可能是合適的。Riemann概率密度的總和

關於極值分佈,威布爾分佈有一個非常「不易實現」的積分,因此我想我可以從Scipy得到pdf,並做一個黎曼和。我還認爲,我也可以簡單地評估內核密度,得到pdf,並按照黎曼和來做相同的估計,以近似積分。

我在Stack中發現了一個Q,它提供了一個在Python中完成Riemann和的簡潔方法,並且我調整了代碼以適應我的問題。但是當我評估積分時,我會得到奇怪的數字,表明KDE或Riemann求和函數有問題。

兩個場景中,第一與威布爾,按照SciPy的文檔:

x = theData 
x_grid = np.linspace(0,np.max(x),len(x)) 

p = ss.weibull_min.fit(x[x!=0], floc=0) 
pd = ss.weibull_min.pdf(x_grid,p[0], p[1], p[2]) 

看起來像這樣:

enter image description here

,然後也嘗試了KDE方法如下

pd = ss.gaussian_kde(x).pdf(x_grid) 

其中我後續立法院通過以下功能運行:

def riemannSum(a, b, n): 
    dx = (b - a)/n 
    s = 0.0 
    x = a 
    for i in range(n): 
     s += pd[x] 
     x += dx 
    return s * dx   
print(riemannSum(950.0, 1612.0, 10000)) 
print(riemannSum(0.0, 1612.0, 100000)) 

在韋伯的情況下,它給了我

>> 0.272502150549 
>> 18.2860384829 

,並在KDE的情況下,我得到

>> 0.448450460469 
>> 18.2796021034 

這是顯然是錯的。整個事物的積分應該給我1和18.2+是相當遙遠的。

我在假設我能用這些密度函數做什麼時錯了嗎?還是我做的黎曼和功能的一些錯誤

+1

仔細看看這個和你的黎曼總和代碼:https://en.wikipedia。org/wiki/Riemann_sum –

+1

數值計算積分是一個很大的問題,但如果你的目標實際上是計算尾部概率,威布爾分佈的Scipy類已經有一個'cdf'方法。 –

回答

1

威布爾分佈有一個非常「不容易實現」整體

咦?

Weibull distribution已經非常明確的CDF,所以實施整體是相當多的一行(好吧,讓兩個用於清晰度)

def WeibullCDF(x, lmbd, k): 
    q = pow(x/lmbd, k) 
    return 1.0 - exp(-q) 

,當然,還有ss.weibull_min.cdf(x_grid,p[0], p[1], p[2]),如果你想從挑標準庫

+0

謝謝!無法相信我能如何忘記cdf/pdf關係。卡在接近積分的樂趣挑戰。我很幸運,我的成績不可能一次下調,否則我的老數學教師會非常憤怒。 –