基于分布

时间:2018-06-14 14:58:19

标签: python random statistics distribution

在进入主题之前,让我们先来看看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.randomnp.random库中搜索了函数,但无法获得任何有用的信息。非常感谢您的想法或建议,如果可能的话,也会提供相应的代码。

1 个答案:

答案 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