Algorithm 溪流水库取样证明

Algorithm 溪流水库取样证明,algorithm,random,reservoir-sampling,Algorithm,Random,Reservoir Sampling,我非常熟悉水库采样算法,我在想,如果给出了总大小N,会怎么样。在这种情况下,我们能得到什么好处?因此,以下是算法: Let n be the total size of data Let k be the total size of sample for each element from data if random(0,1) <= k/n put this element into sample -- k -- n done 设n为数据

我非常熟悉水库采样算法,我在想,如果给出了总大小
N
,会怎么样。在这种情况下,我们能得到什么好处?因此,以下是算法:

Let n be the total size of data
Let k be the total size of sample
for each element from data
    if random(0,1) <= k/n
        put this element into sample
        -- k
    -- n
done
设n为数据的总大小
设k为样本的总大小
对于来自数据的每个元素

if random(0,1)如果您想要精确的K个样本:设K为所需样本,K为迄今为止获得的样本。设N为数据的总大小,N为迄今为止采样的集合。然后检查random(0,1),这里有一个正确性证明。假定流是
1..n
,而不丧失一般性。我们归纳地证明,在{0..n}
循环中进行
m次迭代后,样本分布为
1..m
均匀随机
k
-组合
1..n
的交点

基本情况,
m=0
,很简单:样本和交叉点总是空的。给定特定
m
的归纳假设,我们现在证明它适用于
m+1
。设
S
为表示
m
迭代后集合的随机变量,
S'
为表示
m+1
迭代后集合的随机变量。将
设置为交叉点。对于所有
k
-组合
T
,我们编写

Pr(S' = T & {1..m+1})
    = Pr(S = T & {1..m}) Pr(S' = T & {1..m+1} | S = T & {1..m}),
因为
S'=T&{1..m+1}
意味着
S=T&{1..m}
。通过归纳假设和一些计算

(n choose k) Pr(S = T & {1..m})
    = ((n - m) choose (k - |T & {1..m}|)).
结合这两个方程,我们得到

(n choose k) Pr(S' = T & {1..m+1})
    = ((n - m) choose (k - |T & {1..m}|)) Pr(S' = T & {1..m+1} | S = T & {1..m}).
通过检查Dave的程序

Pr(m+1 in S' | S) = (k - |S|) / (n - m).
现在有两个案例。第一种情况是T中的
m+1

Pr(S' = T & {1..m+1} | S = T & {1..m})
    = Pr(m+1 in S' | S = T & {1..m})
    = (k - |T & {1..m}|) / (n - m)
(n choose k) Pr(S' = T & {1..m+1})
    = ((n - m) choose (k - |T & {1..m}|)) (k - |T & {1..m}|) / (n - m)
    = (n - m - 1) choose (k - |T & {1..m}| - 1)
    = (n - (m+1)) choose (k - |T & {1..m+1}|).
Pr(S' = T & {1..m+1} | S = T & {1..m})
    = Pr(m+1 not in S' | S = T & {1..m})
    = (n - m - (k - |T & {1..m}|)) / (n - m)
(n choose k) Pr(S' = T & {1..m+1})
    = ((n - m) choose (k - |T & {1..m}|)) (n - m - (k - |T & {1..m}|)) / (n - m)
    = (n - m - 1) choose (k - |T & {1..m}|)
    = (n - (m+1)) choose (k - |T & {1..m+1}|).
第二种情况是
m+1不在T

Pr(S' = T & {1..m+1} | S = T & {1..m})
    = Pr(m+1 in S' | S = T & {1..m})
    = (k - |T & {1..m}|) / (n - m)
(n choose k) Pr(S' = T & {1..m+1})
    = ((n - m) choose (k - |T & {1..m}|)) (k - |T & {1..m}|) / (n - m)
    = (n - m - 1) choose (k - |T & {1..m}| - 1)
    = (n - (m+1)) choose (k - |T & {1..m+1}|).
Pr(S' = T & {1..m+1} | S = T & {1..m})
    = Pr(m+1 not in S' | S = T & {1..m})
    = (n - m - (k - |T & {1..m}|)) / (n - m)
(n choose k) Pr(S' = T & {1..m+1})
    = ((n - m) choose (k - |T & {1..m}|)) (n - m - (k - |T & {1..m}|)) / (n - m)
    = (n - m - 1) choose (k - |T & {1..m}|)
    = (n - (m+1)) choose (k - |T & {1..m+1}|).

在这两种情况下,我们证明了
Pr(S'=T&{1..m+1})
具有正确的值。

这就是我上面给出的精确算法。但是如何证明该算法的正确性,即每个元素具有相同的概率?不,不是。你是以恒定概率取样。谢谢,这正是我想要的答案!