仅对“分层抽样”

时间:2016-06-07 04:03:51

标签: algorithm random random-sample resampling

如果不知道每个子群体(层数)的分布(或大小/概率),也不知道总人口规模,是否可以通过只读取一次文件进行分层抽样?感谢。

https://en.wikipedia.org/wiki/Stratified_sampling

的问候, 林

2 个答案:

答案 0 :(得分:1)

假设文件中的每条记录都可以被识别为在特定的子群体中,并且您提前知道您希望从每个子群体中可以容纳的子群体中获得的随机样本的大小,一个允许您为该子群体进行水库采样的数据结构(https://en.wikipedia.org/wiki/Reservoir_sampling#Algorithm_R)。

如此重复:

阅读记录

找出它所在的子群体并获得表示该子群体的水库采样的数据结构,并在必要时创建它。

使用该数据结构和读取记录对该子群体进行储层采样。

最后,对于每个看到的子群体,您将得到一个水库采样数据结构,其中包含来自该群体的随机样本。

对于你希望在不同类别的记录中形成分层样本的N个样本中的k个的情况,我认为你不能比保留每个类的k然后从中进行下采样更好。假设您可以和我一起组织一个初始记录块,以便分层样本的某些类保持少于k / 2。现在我跟随这个块有大量的记录,所有这些类,现在明显不足。在这种情况下,最终的随机样本应该远远超过这个类的k / 2,并且(如果它实际上是随机的)应该有一个非常小但非零的概率,超过那些随机选择的记录的k / 2来自第一个街区。但事实上我们从来没有从第一个块中保留超过k / 2的这些记录意味着这个采样方案的概率正好为零,因此在最坏的情况下保持少于每个类的k将不起作用。

这是一种欺骗方法。假设我们不是按顺序读取记录,而是按照我们选择的任何顺序读取记录。如果您查看stackoverflow,您将看到(相当人为的)基于加密的方法,用于生成N个项目的随机排列,而不会在任何时候在内存中保留N个项目,因此您可以执行此操作。现在保留一个k记录池,以便在任何时候池中项目的比例都是分层样本,只有当你被迫这样做才能保持比例正确时,才能在池中添加或删除项目。我认为你可以这样做,因为你需要添加一个X类项目,以便在你刚刚观察到另一个X类项目时保持比例正确。因为你以随机顺序查看记录我声称你有一个随机的分层样本。很明显,你有一个分层的样本,所以唯一的偏离可以在为特定类选择的项目中。但是考虑选择不属于该类的项目的排列与实际选择的排列顺序相同,但是以不同的顺序选择该类的项目。如果选择该类的项(因为可能存在)的方式存在偏差,因为偏差将以不同的方式影响该类的不同项,这取决于所选择的排列,所有这些之间的随机选择的结果排列是总效应是无偏见的。

答案 1 :(得分:1)

如果您能够将结果保存在内存中,那么在一次通过中进行采样很简单。它由两部分组成:

  1. 计算新项目成为结果集一部分的几率,并使用随机数来确定该项目是否应该是结果的一部分。
  2. 如果要保留该项目,请确定是应将其添加到集合中还是替换现有成员。如果它应替换现有成员,请使用随机数来确定应替换哪个现有成员。根据您计算随机数的方式,这可以与上一步相同,也可以是新的。
  3. 对于分层抽样,此算法所需的唯一修改是确定项目属于哪个层。每个阶层的结果清单应该分开。