我该怎么做才能从我拥有的数据分布中生成随机样本?

What can I do to generate random samples from a distribution of data that I have?

我有关于机器处于活动状态的分钟数的数据。从这些数据中,我得到以下分布图,x 轴为分钟数,y 轴为计数:

现在我想创建一个模拟,其中机器处于活动状态的时间是从此分布中随机抽取的,只是我不知道该怎么做。本能地我会说我需要使用 random.expovariate(),但是我不知道我将使用什么值作为 lambda。

有人有什么想法吗?

我的数据是:

randomlist = ([ 0.,  1., 11.,  2.,  4.,  6.,  5.,  5.,  2.,  7.,  8.,  4.,  4.,
        4.,  4.,  4.,  4.,  7.,  4.,  4., 18., 14., 13.,  4.,  1., 10.,
        6.,  5.,  4.,  1.,  2.,  1.,  6.,  4.,  6., 17.,  6.,  2.,  4.,
        7., 17., 19., 18.,  4.,  9.,  4.,  7.,  4., 14., 12.,  4.,  3.,
        2.,  8.,  8.,  7.,  4.,  7.,  6.,  3.,  6.,  6., 13.,  2., 16.,
        6.,  4.,  6., 11., 10.,  6., 10.,  9.,  4.,  9.,  4.,  9.,  1.,
        5.,  4., 10.,  8.,  8.,  7.,  3., 20., 12.,  5.,  1., 11.,  8.,
        5.,  5.,  9.,  1.,  5.,  2., 12.,  3.,  6.,  3.,  4.,  8.,  1.,
        3.,  1., 14.,  5.,  4., 20.,  4., 11.,  3.,  9., 14., 37.,  4.,
       19., 31., 20., 11., 28.,  8., 16.,  5., 15.,  1.,  3., 11., 30.,
        4.,  8.,  4., 28.,  2.,  1., 22.,  1., 74.,  7., 22.,  5.,  7.,
        5.,  3.,  2.,  7.,  8., 19., 37.,  8.,  4.,  1., 12.,  3., 18.,
       11.,  7., 30.,  4., 13.,  6.,  5.,  4.,  1.,  4.,  4.,  6.,  9.,
       45.,  1.,  1.,  5.,  4.,  2.,  5.,  1.,  3.,  2., 12., 35., 33.,
        3., 20.,  4., 10.,  4.,  2.,  4.,  4.,  4.,  2.,  6.,  8.,  7.,
       11.,  3.,  7.,  2., 15.,  4.,  7., 16., 22., 38.,  8., 12.,  4.,
        5.,  2.,  6., 18.,  2.,  6., 60.,  3., 16., 10., 59.,  4.,  4.,
       15., 55.,  6., 23.,  1.,  2.,  6., 58.,  1., 18.,  2.,  3.,  2.,
       34.,  6.,  1.,  3.,  7., 13.,  1.,  5.,  5., 14.,  6., 19.,  1.,
       37.,  6., 11., 50.,  6.,  5., 29., 17.,  9.,  8., 17.,  8.,  9.,
        7.,  6.,  6.,  6.,  9.,  9.,  1.,  8.,  5., 16.,  7.,  9., 12.,
        5.,  3., 15.,  1.,  3.,  2., 18.,  6., 15., 24., 34.,  3.,  3.,
       12.,  1., 29., 16., 13., 12.,  3., 15.,  7.,  9.,  9., 10.,  3.,
       37.,  2., 10.,  4.,  8.,  1.,  8., 31.,  5.,  1.,  5., 19., 12.,
       41.,  5.,  6.,  2.,  3.,  2.,  4.,  8.,  5., 14.,  9.,  6.,  6.,
        4.,  9.,  3.,  3.,  7., 10., 14., 13., 15.,  7., 14., 31.,  6.,
        3., 19., 16., 33.,  6.,  4.,  2., 16.,  1., 18., 10., 24., 14.,
        7.,  2.,  1.,  2.,  6.,  2.,  2., 14.,  8.,  3.,  5., 37.,  6.,
        6.,  9., 21., 23.,  4.,  6., 18., 16., 23.,  3.,  9.,  4.,  9.,
        5.,  1.,  6.,  1.,  1., 23.,  8.,  6.,  1., 33.,  4.,  3., 15.,
        5.,  9., 27., 17.,  7.,  4.,  9., 47.,  7.,  6.,  4., 30.,  4.,
       27., 13., 22., 12.,  2., 21., 13.,  9.,  6., 14.,  5.,  7., 18.,
        7.,  2.,  2.,  4.,  2.,  4.,  4., 10.,  1.,  5.,  9.])

好吧,如果您想使用 np.random.expovariate(),这意味着您的数据呈指数分布。如果您对此感到满意,则可以使用 Scipy 库来拟合指数函数并推导出您的速率参数。可以找到好的 step-by-step 说明,例如。 here.

或者,如上所述,只需使用 np.random.choice()

random.choices 允许您提供权重

import random
from collections import Counter

randomList = [...]
c = Counter(randomlist)
num_samples = 100
print(random.choices(list(c.keys()), weights=list(c.values()), k=num_samples))

在我的示例中,我根据您的 randomList 计算权重,但如果您不想在脚本中执行此操作,您可以 pre-calculate 离线。