【问题标题】:Generate random values from boxplot从箱线图生成随机值
【发布时间】:2020-05-01 15:34:17
【问题描述】:

比方说,我有一个现有的 BoxPlot:

median: 5, 
q1: 2
q3: 6
5% percentile: 1
95% percentile: 2

我想根据这个分布生成 1,000,000 个随机值。

有没有办法做到这一点?

我可以生成偏态正态分布,因此另一种方法是将箱线图值转换为偏态分布的值,但考虑到密度随着 alfa 的变化而变化,我不知道如何着手。

【问题讨论】:

  • 您的示例中的“q1”和“q3”是什么?
  • 嗨:四分位 1,四分位 3

标签: python random boxplot normal-distribution


【解决方案1】:

根据分布生成随机数的最通用方法如下:

  • 生成以 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))

【讨论】:

    猜你喜欢
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    相关资源
    最近更新 更多