我试图找到一个随机变量超过特定值的事件的概率,即 pr(x>a),其中 a 是某个常数,通常远高于 x 的平均值,而 x 不是任何标准高斯分配。所以我想拟合一些其他的概率密度函数,并将 x 的 pdf 从 a 积分到 inf。由于这是对尖峰建模的问题,我认为这是一个极值分析问题,并发现威 bool 分布可能是合适的。

关于极值分布,威 bool 分布有一个非常“不容易实现”的积分,因此我认为我可以从 Scipy 获取 pdf,然后进行 Riemann-sum。我还认为我也可以简单地评估核密度,得到 pdf,然后用黎曼和做同样的事情来近似积分。

我在 Stack 上找到了一个 Q,它提供了一种在 Python 中进行黎曼求和的简洁方法,我修改了该代码以适应我的问题。但是当我计算积分时,我得到了奇怪的数字,表明 KDE 或黎曼和函数有问题。

根据 Scipy 文档,两个场景,第一个是 Weibull:

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

看起来像这样:

python - 概率密度的黎曼和-LMLPHP

然后也尝试了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))

在威 bool 的情况下,它给了我
>> 0.272502150549
>> 18.2860384829

在 KDE 的情况下,我得到
>> 0.448450460469
>> 18.2796021034

这显然是错误的。取整件事的积分应该给我 1,而 18.2+ 是相当遥远的。

我对这些密度函数可以做什么的假设有误吗?或者我在黎曼和函数中犯了一些错误

最佳答案



嗯?!

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

关于python - 概率密度的黎曼和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45420477/

10-12 21:08