分层抽样只读一次文件

read file only once for Stratified sampling

如果不知道每个子种群(阶层)的分布(或size/probability),也不知道总种群规模,是否可以只读一次文件就可以分层抽样?谢谢

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

此致, 林

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

如此反复:

读取一条记录

找出它在哪个子种群中,并获取代表该子种群的水库采样的数据结构,必要时创建它。

使用该数据结构和读取的记录对该子种群进行水库采样。

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

如果您希望在不同的 classes 记录中最终得到 N 个样本中的 k 个样本以形成分层样本,我认为除了保留每个样本中的 k 个样本之外没有什么比class 然后从中进行下采样。假设你可以,我给你一个组织好的初始记录块,这样分层样本将保留少于 k/2 的一些 class。现在我跟随那个有大量记录的块,所有这些 class,现在明显不足。在这种情况下,最终的随机样本应该比 class 多得多 k/2 ,并且(如果它真的是随机的)应该有一个非常小但非零的概率超过 k/2 这些随机选择的记录来自第一个块。但事实上,我们从第一个块中保留的记录永远不会超过 k/2,这意味着使用此抽样方案的概率恰好为零,因此每个 class 中保留少于 k 的记录将不起作用最坏的情况。

这是一个作弊方法。假设我们可以按照我们选择的任何顺序读取记录,而不是按顺序读取记录。如果您查看 Whosebug,您会看到(相当人为的)基于密码学的方法,用于生成 N 项的随机排列,而无需在任何时候将 N 项保存在内存中,因此您可以这样做。现在保留一个包含 k 条记录的池,以便在任何时候池中项目的比例都是一个分层样本,只有在您被迫这样做时才从池中添加或删除项目以保持比例正确。我认为你可以这样做,因为当你刚刚观察到另一项 class X 时,你需要添加一项 class X 以保持比例正确。因为你随机浏览了记录为了我声称你有一个随机分层样本。显然,您有一个分层样本,因此唯一偏离随机性的可能是针对特定 class 的项目 selected。但是请考虑 select 项的排列,其中 class 项与实际选择的排列顺序不同,但 class 项的 select 项顺序不同。如果 class 的项目被 selected 的方式存在偏差(可能存在),因为偏差会根据排列以不同的方式影响 class 的不同项目select所有这些不同排列之间的随机选择的结果是总效果是无偏的。

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

  1. 计算新项目成为结果集一部分的几率,并使用随机数来确定该项目是否应该成为结果的一部分。
  2. 如果要保留该项目,请确定是否应将其添加到集合中或替换现有成员。如果它应该替换现有成员,请使用随机数来确定它应该替换哪个现有成员。根据您计算随机数的方式,这可以与上一步相同,也可以是新的。

对于分层抽样,此算法所需的唯一修改是确定项目属于哪个层。每个层的结果列表应分开保存。