基于分布的python随机抽样

Mar*_*ruf 0 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)
Run Code Online (Sandbox Code Playgroud)

从源代码我们可以很容易地看到它实际上做了什么(以下是链接中代码的主要部分),

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]
Run Code Online (Sandbox Code Playgroud)

这种抽样方法随机选择了一个指标。在这种情况下,有可能选择一个非常不可能的人口成员。比如说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 中取出 1 个成员。

所以也许这个问题可以通过以下方式提出,

如何根据一些正态分布和总体频率从总体中抽样成员。(暂时,让我们把它严格到正态分布)

我在库python.random和np.random库中都搜索了函数,但没有得到任何有用的东西。非常感谢您的想法或建议,如果可能,还可以编写代码。

小智 5

使用 numpy 你有 numpy.random.normal ( https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.normal.html ),它允许你从正态分布中生成数字。

例如,要从均值 5.0 和标准差 1.0 的正态分布中生成 100 个随机数,请使用:

numpy.random.normal(loc=5.0,scale=1.0,size=100)
Run Code Online (Sandbox Code Playgroud)

列表中提供了许多其他发行版:

https://docs.scipy.org/doc/numpy/reference/routines.random.html