在进入主题之前,让我们先来看看python的默认采样方法,
>>> import random
>>> c=[1,2,3,100,101,102,103,104,105,106,109,110,111,112,113,114]
>>> random.sample(c,1)
[103]
>>> random.sample(c,1)
[3]
>>> random.sample(c,1)
[3]
>>> random.sample(c,1)
[2]
>>> random.sample(c,1)
[3]
>>> random.sample(c,1)
[2]
>>> random.sample(c,1)
[106]
>>> random.sample(c,1)
[3]
>>> random.sample(c,1)
[105]
>>> random.sample(c,1)
[110]
>>> random.sample(c,1)
[103]
>>> random.sample(c,1)
从source code我们可以很容易地看到它实际上做了什么(下面是链接中代码的主要部分),
selected = set()
selected_add = selected.add
for i in xrange(k):
j = _int(random() * n)
while j in selected:
j = _int(random() * n)
selected_add(j)
result[i] = population[j]
这种抽样方法随机选择了一个指数。在这种情况下,有可能选择非常不可能的人口成员。比如上例中的1
。
但是,让我们专注于一个更现实的场景。我们假设您有16个数字,表示来自0-15
的某个标签的频率。
freq array = [1, 2, 3, 100, 100, 100, 102, 102, 102, 100, 99, 50, 20, 1, 2, 3]
每个位置的索引代表标签类型。从上面的列表中可以看出,标签0上的总人口数为1,标签3上的总人口数为100,标签2的总人口数为3等。
现在,如果你想从群体中选择5个成员,我们是否可以生成一个新列表,告诉我应该根据某些分布从X
标签中获取Y
个成员。 (暂时,让我们假设正态分布),
样本:(可能不是答案)
new_array = [0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]
这意味着我们应该从标签4-7中选择一名成员。
所以也许这个问题可以通过以下方式提出来,
如何根据一些正态分布和人口频率对人口中的成员进行抽样。 (目前,我们将其严格规范为正态分布)
我在python.random
和np.random
库中搜索了函数,但无法获得任何有用的信息。非常感谢您的想法或建议,如果可能的话,也会提供相应的代码。
答案 0 :(得分:2)
使用numpy你有numpy.random.normal(https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.normal.html),它允许你从正态分布中生成数字。
例如,从正态分布生成100个随机数,平均值为5.0,标准差为1.0:
numpy.random.normal(loc=5.0,scale=1.0,size=100)
列表中提供了许多其他发行版:
https://docs.scipy.org/doc/numpy/reference/routines.random.html