我試圖找出一個隨機變量事件超過特定值的概率,即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])
看起來像這樣:
,然後也嘗試了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+是相當遙遠的。
我在假設我能用這些密度函數做什麼時錯了嗎?還是我做的黎曼和功能的一些錯誤
仔細看看這個和你的黎曼總和代碼:https://en.wikipedia。org/wiki/Riemann_sum –
數值計算積分是一個很大的問題,但如果你的目標實際上是計算尾部概率,威布爾分佈的Scipy類已經有一個'cdf'方法。 –