Python:来自概率密度函数数组的归一化累积分布函数

时间:2021-03-11 15:31:29

标签: python arrays probability probability-density

对于连续变量 x 及其概率密度函数 p(x),我有一个 x 值的 numpy 数组 x 和相应 p(x) 值的 numpy 数组 p。 p(x) 没有标准化,即在 p(x) 对 x 的图中,图形下的面积不是 1。我想计算累积分布函数 cdf 的值的相应数组。这就是我目前的做法,使用梯形规则来近似积分:

p_norm = p/np.trapz(p,x)
cdf = np.array([np.trapz(p_norm[:n],x[:n]) for n in range(len(p_norm))])

结果并不完全准确; cdf 的最终值接近 1 但不完全是 1。

是否有更准确、更简单的方法来规范化 p 并找到 cdf?我认为在某些模块中可能有特定的功能;也许是一个面向统计的模块,具有相关参数(方差、置信区间等)的功能?

1 个答案:

答案 0 :(得分:0)

离散数据点的积分方法

变量 x 仅在您有连续函数形式时才是连续的。如果你有一个 几个离散值(如果你要制作一个离散值的 numpy 数组,就会这样),然后 数组不再连续,因为它无法解析两个连续离散之间的点 x 的值。

因此,假设您实际上拥有 xp 的离散数据点数组,这里 是我的建议。

先熟悉几种数值积分的方法

1.使用 scipy.integrate

集成

您可以使用“给定固定样本的积分函数的方法”下列出的任何方法。

INSIGHT 这里重要的是:在trapezoidal ruleinterpolate 使用 straight line 表示连续两点之间的空间。如果你可以 使用更高阶的多项式(阶 ~ 2、3、4 等)然后可以为您提供更好的结果 一体化。辛普森规则使用二阶多项式 Simpson's Rule - Wolfram MathWorld

<头>
Simpson's Rule gif
辛普森法则使用二次多项式对曲线下的面积进行积分 展示辛普森法则如何应用于整合的动画

来源Wikipedia

给定固定样本的函数积分方法

   trapezoid            -- "Use trapezoidal rule to compute integral."
   cumulative_trapezoid -- "Use trapezoidal rule to cumulatively compute integral."
   simps                -- "Use Simpson's rule to compute integral from samples."
   romb                 -- "Use Romberg Integration to compute integral from
                           (2**k + 1) evenly-spaced samples."

? 另请参阅此示例:Calculating the area under a curve given a set of coordinates, without knowing the function

2.曲线下面积 (AUC) 使用 sklearn.metrics.auc

积分本质上是曲线下的面积 (AUC)。 Scikit-learn 库提供了一个简单的 替代计算 AUC。在实践中,这也使用梯形规则,所以,我做 看不到任何理由为什么这应该与您已经拥有的有任何/很大不同 使用 numpy.trapz

3.考虑使用其他方法

3.1. Romberg 集成

scipy.integrate.romb(y, dx=1.0, axis=- 1, show=False)

参考文献