我该怎么做才能从我拥有的数据分布中生成随机样本?
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 离线。
我有关于机器处于活动状态的分钟数的数据。从这些数据中,我得到以下分布图,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 离线。