我非常熟悉使用储层采样在一次数据传递中从一组未确定的长度中进行采样。在我看来,这种方法的一个限制是,在返回任何结果之前,它仍然需要遍历整个数据集。从概念上讲,这是有道理的,因为必须允许整个序列中的项目有机会替换先前遇到的项目以获得统一的样本。
有没有办法能够在评估整个序列之前产生一些随机结果?我正在考虑一种适合 python 伟大的 itertools 库的惰性方法。也许这可以在给定的容错范围内完成?如果您对这个想法有任何反馈,我将不胜感激!
为了稍微澄清一下这个问题,这张图总结了我对不同采样技术的内存与流式权衡的理解。我想要的是属于以下类别的东西流采样,我们事先不知道人口的长度。
显然,在先验不知道长度的情况下仍然获得统一的样本似乎是矛盾的,因为我们很可能将样本偏向总体的开始。有没有办法量化这种偏差?是否需要做出权衡?有人有聪明的算法来解决这个问题吗?
如果您事先知道可迭代将产生的项目总数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
或大多数水库采样代码),因此样本的切片不会是随机子样本!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)