在 python 中从离散 CDF 计算离散 PDF

Calculating discrete PDF from discrete CDF in python

如果我们有像

这样的分位数的离散 cdf
quantiles = array([1.000e-04, 1.000e-03, 1.000e-02, 2.000e-02, 3.000e-02, 4.000e-02,
   5.000e-02, 6.000e-02, 7.000e-02, 8.000e-02, 9.000e-02, 1.000e-01,
   2.000e-01, 3.000e-01, 4.000e-01, 5.000e-01, 6.000e-01, 7.000e-01,
   8.000e-01, 9.000e-01, 9.100e-01, 9.200e-01, 9.300e-01, 9.400e-01,
   9.500e-01, 9.600e-01, 9.700e-01, 9.800e-01, 9.900e-01, 9.990e-01,
   9.999e-01])

创建反向映射线性插值有效吗?即从cdf分位数,我们估计满足cdf条件的随机变量的值p(x < a) = p_a。然后我们得到从 0 到 1 的均匀分布值并生成有问题的随机变量(想想 cdf 图上从 y 轴到 x 轴的映射)。来自此的 PDF 会是一个很好的近似值吗?

f = interp1d(quantiles, matching_discrete_cdf, kind='linear')
uni_rv = stats.uniform.rvs(loc=percentiles.min(), 
         scale=percentiles.max() - percentiles.min(), size=nof_items)
pdf = f(uni_rv)

我假设当你写 "pdf" 时,你的意思是 "sample" 而不是实际的 probability density function;当你写 "matching_discrete_cdf" 时,你的意思是 "percent point function" (PPF),它是 CDF 的倒数。除了术语混淆,这个想法是合理的:通过 PPF 转换统一样本来生成自定义分布的样本是一种标准方法。

插值会稍微扭曲分布,原始分布的分位数 1.000e-04 和 9.999e-01 将成为生成数的最小值和最大值(原始分布有超出这些限制的可能性很小)。但这应该是可以接受的,并且鉴于您拥有的数据,这是不可避免的。也许使用三次插值而不是线性插值?

如果您真的想要 PDF 而不是样本——PDF 是 CDF 的派生物。我会对 CDF 值使用三次样条插值 (InterpolatedUnivariateSpline), and then take its derivative.