
从集合中随机抽取样本很简单。但是,如何从大小未知或不确定的集合中选择一个公平的随机样本呢?这时,水库抽样法就派上用场了。[Sam Rose] 有一本图文并茂的交互式指南,详细介绍了水库抽样法的工作原理。就方法而言,它既优雅又简单,尤其适合对动态数据集进行公平抽样,例如从源源不断的日志事件中抽取样本。
虽然水库采样原理简单,但并非每个人都能完全直观地理解。这正是[Sam]的互动文章如此有用的原因;他先阐明了问题,然后以一种几乎不言自明的方式呈现解决方案。
[Sam] 用一副假想的牌来解释这个问题。如果一个人从一副未知大小的牌(可能是十张,也可能是一百万张)中一次一张地被发牌,他该如何选择一张牌,并且让每张牌都有同等的概率被选中呢?而不是先把所有牌都收集起来?
简而言之,解决方案就是每次发新牌时做出决定:保留当前牌,还是用新牌替换它。每张新牌都有1/ n的概率被保留,其中n是我们迄今为止看到的牌的数量。就是这样。无论发牌者何时停止发牌,每张被看到的牌都有相同的概率最终被选中。
[Sam] 还介绍了一些变体,以及将其应用于日志收集的实用方法,因此请亲自检查一下。
如果您对[Sam]擅长以交互方式阐释概念感到着迷,我们还有一点要推荐。我们自己的Al Williams写了一篇关于图灵机的文章;最初的“通用机器”是一种带有读写头和无限纸带的理论设备。[Sam]的文章与这篇文章完美搭配,它以交互方式精确地阐述了这种图灵机的工作原理。
原文: https://hackaday.com/2025/07/02/reservoir-sampling-or-how-to-sample-sets-of-unknown-size/