如何从总体中随机抽样?

机器算法验证 随机生成 随机性
2022-04-03 06:09:41

您如何看待以下执行随机抽样的方法:

  1. 使用量子随机发生器生成与个体一样多的浮点数(0 到 1 之间)(每个值仅出现一次)。
  2. 将花车分配给个人。
  3. 根据花车的顺序对个人进行排序。
  4. 根据需要选择个人。

既然发电机质量好,用这种方法有风险吗?

1个回答

从理论上讲,这是一个很好的方法。 要了解原因,我们需要检查两件事。

  1. 所有的人都以平等的机会被选中吗?是的,因为分配给每个人的花车分布是相同的(它们在[0,1))。

  2. 选择是独立的吗?是的,因为分配给个人的浮点数是独立的(大概:这是“高质量”随机数生成器的一部分)。

然而,这种方法在计算时间和内存资源方面往往效率低下。它需要O(nlog(n))时间和O(n)从人群中选择的记忆n. 两者通常都可以改进,有时甚至是很大的改进。

通用算法首先考虑您需要抽样的总体数量。如果超过人口的一半,则识别不在样本中的个体并选择其余的个体(代价为O(n)时间)。这让我们只能识别出不超过一半的人口,比如说k在......之外n个人(与2kn)。让他们的标识符在一个数组中population[0..n-1]

i = 0
selection = new set
while (i < k) {
    x = random float in [0,1)
    j = int(x * (n-i))
    adjoin population[j] to selection
    population[j] = population[n-1-i]
    i++
}
return selection

关键步骤——将最后一个个体复制population[n-i-i]到最近选择的个体腾出的空间中population[j]——实际上并不需要整个population[]数组都在 RAM 中:您可以使用k而是指针。这使得计算时间O(klog(k))而不是O(k)但减少了存储需求O(n)O(k),这对于从离线存储的大量人群中进行的少量选择来说可能很重要。

该算法有效的证明是归纳的。显然它适用于n=1. 对于一般n>1, 并假设random float程序是一个好的过程,那么在第一步 (a) 每个人都以相等的概率被选择,并且 (b) 该选择独立于下一步,即选择k1来自人群的个体n1. 因为这(归纳地)被认为是正确的,所以我们完成了。