我试图找出一个随机变量事件超过特定值的概率,即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'方法。 –