如果我们有像这样的分位数的离散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"时,你指的是"样本",而不是实际的概率密度函数;当你写"matching_discrete_cdf"时,你指的是"百分函数"(PPF(,它是cdf的倒数。抛开术语上的混乱不谈,这个想法是合理的:通过PPF转换统一样本来为自定义分布生成样本是一种标准方法。
插值会稍微扭曲分布,原始分布的分位数1.000e-04和9.999e-01将成为生成数的最小值和最大值(原始分布在这些限制之外的可能性很小(。但这应该是可以接受的,而且考虑到您所拥有的数据,这是不可避免的。也许用三次插值代替线性插值?
如果你真的想要PDF而不是样本,PDF是CDF的衍生物。我会对CDF值使用三次样条插值(插值单变量样条(,然后取其导数。