从未知长度的流中随机抽样

时间:2017-12-30 11:46:10

标签: statistics probability

假设我需要从N>> K元素的实时流中随机采样K个元素,其中我只有有限的内存,并且我事先不知道N.可以有一个理论上合理的算法,即符合从集合中随机抽样的技术含义吗?

我知道可以有一个算法可以满足一些关于随机抽样的直觉,但问题是,它是否正式合理?

换句话说,我怎样才能证明我提出的算法确实会在这样的设置中产生随机样本?

例如,如果我可以证明我的算法产生K个元素,其中流中的每个元素都包含在K / N的概率中 - 这是一个合理的证据吗?

2 个答案:

答案 0 :(得分:1)

存在算法,请参阅Wikipedia article on reservoir sampling

是的,您需要证明您的样本具有统一的概率(并且您可能希望它们也是独立的)。这正是链接页面中算法R的证明。

答案 1 :(得分:0)

我们需要样本k个元素。

  1. 对于流中的前k个数据(从第1个到第k个),我们将保留它。

  2. 对于后面的第i个元素(i> k),
  3. ,我们将有一些概率p选择或不选择它。同样,当我们选择保留新的ith元素时,我们需要从前k个数据中踢出一个元素。然后我们有以下公式:

$ k / i(1-p / k)= p $

说明:左侧大小k / i是流中第一个i元素的概率。 (1-p / k)是每个元素不会被踢出的概率。因此,乘法将代表每个元素(从第1个到第ith个)将被存储的概率,并且该值应等于p,即我们保持第i + 1个元素的概率。

求解完这个方程后,我们得到p = k /(1 + N),这是我们保留新数据的可能性。而1/​​1 + N是我们将原始k中的数据踢出的概率。