【问题标题】:python random sampling based on a distribution基于分布的python随机抽样
【发布时间】: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.randomnp.random 库中的函数,但找不到任何有用的东西。非常感谢您的想法或建议,如果可能的话,也可以提供代码。

【问题讨论】:

  • np.random.normal(0, 1, 100) 为您提供来自具有mu = 0sigma = 1 的正态分布的size = 100 样本。
  • @Graipher 感谢您的评论。是的,它确实。但它是否解决了问题中提到的问题?所以现在问题变成了,我们如何才能在freq_array的基础上改变mu and sigma
  • 这是你的问题吗?那你应该这么说。
  • @Graipher 抱歉,不清楚。但是整个解释都在示例中给出。我已经更新了问题。

标签: python random statistics distribution


【解决方案1】:

使用 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)

这里有很多其他的发行版:

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

【讨论】:

  • 你能告诉我如何计算上述每个标签的人口频率meanstandard deviation based吗?
  • @Maruf 使用 numpy.average: values = np.arange(len(freq_array)); mu = np.average(values, weights=freq array)。标准开发有点难:sigma = np.sqrt(np.average((values-mu)**2, weights=freq array)).
猜你喜欢
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
相关资源
最近更新 更多