【问题标题】:Python: normalised cumulative distribution function from array of probability density functionPython:来自概率密度函数数组的归一化累积分布函数
【发布时间】:2025-06-24 00:40:01
【问题描述】:

对于一个连续变量 x 及其概率密度函数 p(x),我有一个 x 值 x 的 numpy 数组和一个对应 p(x) 值 p 的 numpy 数组。 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?我认为某些模块中可能有特定的功能;也许是一个面向统计的模块,具有相关参数(方差、置信区间等)的函数?

【问题讨论】:

  • 你可以用p / np.sum(p)规范化p,然后CDF就是np.cumsum(p)
  • @Reti43 我认为当 x 是离散变量时有效,但当它是连续变量时无效。
  • 你有 p 的表达式,还是你有很多样本?
  • @Reti43 不,我没有 p(x) 的表达式,只有 x 值的数组和相应的 p(x) 值的数组。不过,数组中的值的数量通常很大。
  • ????尝试使用我在answer 中提到的其他一些方法。另请查看scipy.integrate.cumulative_trapezoid 以评估cdf

标签: python arrays probability probability-density


【解决方案1】:

离散数据点的积分方法

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

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

先熟悉几种数值积分方法

1。使用scipy.integrate 进行集成

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

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

Simpson's Rule: Integrating area under a curve using quadratic polynomials An animation showing how Simpson's Rule is applied for integration

来源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。使用sklearn.metrics.auc 的曲线下面积 (AUC)

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

3。考虑使用其他方法

3.1。 Romberg 集成

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

参考文献

【讨论】:

  • 你详细讨论了各种集成方法,你错过了应该规范化的关键点。很容易解决,但确实需要包含在内。
  • @Reti43 规范化是事实上的步骤的一部分(任何了解概率的人都会在集成之前或之后进行规范化——两者都有效;但我更喜欢在此之前进行规范化)。 OP 要求提供其他方法——所以我分享了那些让苹果与苹果进行比较的方法。当您使用各种方法集成某些东西时,输入必须保持相同以进行比较。此外,您已告诉 OP 正常化。再次提及它没有任何意义。
最近更新 更多