根据分布生成随机数的最通用方法如下:
- 生成以 0 和 1 为界的统一随机数(例如,
random.random())。
- 取该数字的逆 CDF(逆累积分布函数)。
结果是一个服从分布的数字。
在您的情况下,您已经很好地了解了逆 CDF (ICDF(x)) 的外观,因为它已经由您的几个参数确定,如下所示:
- ICDF(0.05) = 第 5 个百分位
- ICDF(0.25) = 第一个四分位数
- ICDF(0.5) = 中位数
- ICDF(0.75) = 第三四分位数
- ICDF(0.95) = 第 95 个百分位
但是,您尚未确定分别对应于 ICDF(0) 和 ICDF(1) 的最小值和最大值;因此你必须估计它们。然后,您可以通过插值填充逆 CDF 的缺失点。最简单的示例是线性插值,但其他更复杂的示例包括将曲线或样条拟合到逆 CDF 的点,例如 Catmull–Rom 样条。但是请注意,正确地说,逆 CDF 必须是单调非减的。
另一方面,如果您可以访问基础数据点,而不仅仅是箱形图,则可以使用 other methods。示例包括内核密度估计、直方图或回归模型(特别是对于时间序列数据)。另见Generate random data based on existing data。
以下示例:
import numpy
import scipy.interpolate as intrp
# Generate 100 random values based on 5 percentiles,
# minimum, and maximum
interp=intrp.interp1d([0.05,0.25,0.5, 0.75,0.95],[mn,p5,q1,p50,q3,p95,mx])
values=interp(numpy.random.random(size=100))
# Generate 100 random values based on 5 percentiles,
# extrapolating at ends
interp=intrp.interp1d([0.05,0.25,0.5, 0.75,0.95],
[p5,q1,p50,q3,p95],fill_value="extrapolate")
values=interp(numpy.random.random(size=100))