假设我需要从N>> K元素的实时流中随机采样K个元素,其中我只有有限的内存,并且我事先不知道N.可以有一个理论上合理的算法,即符合从集合中随机抽样的技术含义吗?
我知道可以有一个算法可以满足一些关于随机抽样的直觉,但问题是,它是否正式合理?
换句话说,我怎样才能证明我提出的算法确实会在这样的设置中产生随机样本?
例如,如果我可以证明我的算法产生K个元素,其中流中的每个元素都包含在K / N的概率中 - 这是一个合理的证据吗?
答案 0 :(得分:1)
存在算法,请参阅Wikipedia article on reservoir sampling。
是的,您需要证明您的样本具有统一的概率(并且您可能希望它们也是独立的)。这正是链接页面中算法R的证明。
答案 1 :(得分:0)
我们需要样本k个元素。
对于流中的前k个数据(从第1个到第k个),我们将保留它。
,我们将有一些概率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中的数据踢出的概率。