2017-07-31 17 views
2

私は、特定の値、すなわちpr(x> a)を超える確率変数の事象の確率を見出そうとしています。ここで、aはある定数であり、通常はxの平均xは標準的なガウス分布ではない。だから私は他の確率密度関数に合って、xのpdfをaからinfに取って欲しかった。これはスパイクのモデリングの問題であるため、これを極値解析の問題とみなし、ワイブル分布が適切かもしれないことがわかりました。確率密度のリーマン和

極値分布に関して、ワイブル分布は非常に「実装が容易ではない」積分を持っているため、私はScipyからpdfを得てRiemann-sumを行うことができたと考えました。私はまた、カーネル密度を単純に評価し、pdfを取得し、リーマン和で同じことを行い、積分を近似することもできると考えました。

私はPythonでリーマンサムを行うためのきちんとした方法を提供したスタック上のQを見つけました。私はそのコードを自分の問題に合わせて修正しました。しかし、積分を評価すると、私は奇妙な数を得て、何かがKDEやリーマン和関数のどちらかに間違っていることを示します。

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]) 

次のようになります:scipyのダウンロードマニュアルに従って

2つのシナリオ、ワイブルと最初、次のように

enter image description here

ともKDEの方法を試し

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

LY次の関数を介して実行:ワイブルの場合

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

積分を数値的に計算することは大きな問題ですが、目標が実際にテール確率を計算するのであれば、Weibull分布のScipyクラスにはすでに 'cdf'メソッドがあります。 –

答えて

1

ワイブル分布を持つ非常に「-容易ではないに実装できる」一体

えっ!

Weibull distributionは非常によくあなたがから選ぶしたい場合はもちろん、ss.weibull_min.cdf(x_grid,p[0], p[1], p[2])があり、

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

(OK、それわかりやすくするために2作る)の積分はかなりワンライナーで実装すると、CDFを定義しています標準ライブラリ

+0

ありがとう! cdf/pdfの関係をどうやって忘れることができるか信じられません。代わりにインテグラルを近似するという面白い課題に挑戦しました。私のユニグレードは一度セットすることはできません幸運です、そうでなければ私の古い数学の教師は非常に怒っているだろう。 –

関連する問題