2017-07-31 52 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关系。卡在接近积分的乐趣挑战。我很幸运,我的成绩不可能一次下调,否则我的老数学教师会非常愤怒。 –