Python中ECDF(经验分布函数)更优实现方式及相关公式咨询
ECDF 实现方案优化说明
现有实现的准确性说明
你当前的两行NumPy实现是经验分布函数(ECDF)的标准右连续版本,对应公式:
$\hat{F}n(x) = \frac{1}{n}\sum{i=1}^n I{X_i \leq x}$
其中$I{\cdot}$是指示函数,满足条件时取1,否则取0。如果你的使用场景不需要处理特殊边界、重复值或者小样本校正,这个实现的计算结果是完全准确的。
更优实现方案与对应公式
针对不同的使用场景,有几个优化方向:
1. 小样本边界校正方案
样本量较小时,原始实现的边界点(最大值对应的y=1、最小值左侧y=0)会存在估计偏差,可以根据需求选择统计界常用的校正公式:
- 左连续版本(对应$I{X_i < x}$):
y = np.arange(len(x)) / float(len(x)) - 中位数校正版本(常用于QQ图绘制,避免边界点偏差):
y = (np.arange(1, len(x) + 1) - 0.5) / float(len(x)) - 拉普拉斯校正版本(小样本尾部估计更稳健):
y = np.arange(1, len(x) + 1) / float(len(x) + 1)
2. 高重复值场景优化实现
如果输入向量存在大量重复值,原始实现会保留大量冗余的重复x值,可以用去重+累积计数的方式提升效率,结果和原始实现完全一致:
x_sorted, counts = np.unique(np.sort(X), return_counts=True) y_vals = np.cumsum(counts) / len(X)
3. 工业级鲁棒实现(推荐)
Scipy 1.7.0及以上版本内置了经过充分测试的ecdf实现,自动处理空值、重复值,支持任意点的ECDF值查询,不需要手动排序:
import numpy as np from scipy.stats import ecdf X = np.random.normal(size=1000) # 计算ECDF ecdf_result = ecdf(X) # 获取排序去重后的x值和对应累积概率 x_sorted = ecdf_result.cdf.quantiles y_vals = ecdf_result.cdf.probabilities # 直接计算任意输入点的ECDF值 print(ecdf_result.cdf.evaluate([0, 1, 2]))
内容的提问来源于stack exchange,提问作者Tal Bar
相关产品推荐
相关产品推荐

