对于连续变量 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
?我认为在某些模块中可能有特定的功能;也许是一个面向统计的模块,具有相关参数(方差、置信区间等)的功能?
答案 0 :(得分:0)
变量 x
仅在您有连续函数形式时才是连续的。如果你有一个
几个离散值(如果你要制作一个离散值的 numpy 数组,就会这样),然后
数组不再连续,因为它无法解析两个连续离散之间的点
x
的值。
因此,假设您实际上拥有 x
和 p
的离散数据点数组,这里
是我的建议。
Newton-Cotes Formulas
| 代码:scipy.integrate.newton_cotes
这是包含使用 n
点积分的通用规则。如果我们将n
点公式表示为:newton-cotes(n)
,则
Trapezoidal Rule:n = 2
| 代码:scipy.integrate.trapezoid
Simpson's Rule:n = 3
| 代码:scipy.integrate.simpson
Simpson's 3/8 Rule:n = 4
Boole's Rule:n = 5
| 代码:有关想法,请参阅 this。
scipy.integrate
您可以使用“给定固定样本的积分函数的方法”下列出的任何方法。
INSIGHT 这里重要的是:在trapezoidal rule
你
interpolate
使用 straight line
表示连续两点之间的空间。如果你可以
使用更高阶的多项式(阶 ~ 2、3、4 等)然后可以为您提供更好的结果
一体化。辛普森规则使用二阶多项式 Simpson's Rule - Wolfram MathWorld。
辛普森法则:使用二次多项式对曲线下的面积进行积分 | 展示辛普森法则如何应用于整合的动画 |
来源: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。
sklearn.metrics.auc
积分本质上是曲线下的面积 (AUC)。 Scikit-learn 库提供了一个简单的
替代计算 AUC。在实践中,这也使用梯形规则,所以,我做
看不到任何理由为什么这应该与您已经拥有的有任何/很大不同
使用 numpy.trapz
。
sklearn.metrics.auc
auc = sklearn.metrics.auc(x, y)
scipy.integrate.romb(y, dx=1.0, axis=- 1, show=False)
scipy.integrate.romb