[英]Iterative or Lazy Reservoir Sampling
我非常熟悉使用 Reservoir Sampling 从一组未确定长度的数据中一次性采样。 在我看来,这种方法的一个限制是它仍然需要遍历整个数据集才能返回任何结果。 从概念上讲,这是有道理的,因为必须允许整个序列中的项目有机会替换以前遇到的项目以实现统一样本。
有没有办法在评估整个序列之前产生一些随机结果? 我正在考虑那种很适合 python 伟大的 itertools 库的懒惰方法。 也许这可以在给定的容错范围内完成? 我很感激关于这个想法的任何反馈!
只是为了稍微澄清一下这个问题,这张图总结了我对不同采样技术的内存中与流媒体权衡的理解。 我想要的是属于Stream Sampling类别的东西,我们事先不知道人口的长度。
显然,在不知道先验长度的情况下仍然得到一个统一的样本似乎是矛盾的,因为我们很可能会将样本偏向于总体的开始。 有没有办法量化这种偏见? 是否需要进行权衡? 有没有人有一个聪明的算法来解决这个问题?
如果您事先知道可迭代population
将产生的项目population
,则有可能在您到达时(不仅是在到达结束后)产生population
样本的项目。 如果您事先不知道总体规模,这是不可能的(因为无法计算任何项目出现在样本中的概率)。
这是一个执行此操作的快速生成器:
def sample_given_size(population, population_size, sample_size):
for item in population:
if random.random() < sample_size / population_size:
yield item
sample_size -= 1
population_size -= 1
请注意,生成器按照它们在总体中出现的顺序生成项目(不是随机顺序,如random.sample
或大多数水库采样代码),因此样本的一部分不会是随机子样本!
如果事先知道人口规模,你不能只生成 sample_size 随机“指数”(在流中)并使用它来做一个懒惰的产量吗? 您不必阅读整个流。
例如,如果population_size 为100,sample_size 为3,则生成从1 到100 的随机整数集,假设您得到10、67 和72。
现在您生成流的第 10、62 和 72 个元素并忽略其余元素。
我想我不明白这个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.