【发布时间】:2018-11-24 09:45:59
【问题描述】:
在进入正题之前,我们先来看看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 个成员,我们可以生成一个新列表,告诉我应该根据某些分布从标签 Y 中获取 X 的成员数。 (暂时假设正态分布),
一个样本:(也许不是答案)
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 库中的函数,但找不到任何有用的东西。非常感谢您的想法或建议,如果可能的话,也可以提供代码。
【问题讨论】:
-
np.random.normal(0, 1, 100)为您提供来自具有mu = 0、sigma = 1的正态分布的size = 100样本。 -
@Graipher 感谢您的评论。是的,它确实。但它是否解决了问题中提到的问题?所以现在问题变成了,我们如何才能在
freq_array的基础上改变mu and sigma -
这是你的问题吗?那你应该这么说。
-
@Graipher 抱歉,不清楚。但是整个解释都在示例中给出。我已经更新了问题。
标签: python random statistics distribution