Random Sample - Reservoir

Problem

给出一串元素流,设长度为 n n可以是未知或是无限的。从中随机抽取 s 个样本,要求在任何n=k,ks的时刻, k 中任何一个大小为s的子集被选中的概率都相同。

Randomly select s items from a set R of size n>s , where n is unknown, such that each member of R should have an equal probability of being selected.


Reservoir Sampling

设当前接收到的元素个数为 k ,当ks时,将所有前 s 个元素加入集合R
k>s 时,生成随机数 r[1,k]

  • 如果 rs , 则将该元素加入集合 R ,并替换R中位置 r 的元素;
  • 否则,丢弃该元素。
# To initialize an array a to k random elements 
# of S (which is of length n), both 0-based:

   a[0] ← S[0]
   for i from 1 to k - 1 do
       r ← random [0 .. i]
       a[i] ← a[r]
       a[r] ← S[i]
   for i from k to n - 1 do
       r ← random [0 .. i]
       if (r < k) then a[r] ← S[i]

分析:
该算法的时间复杂度为O(n),空间复杂度为 O(s)

Limitation

该算法需要 k 为一个实现已知的常数,若k的大小与 n 相关,而n一开始未知的话就无法使用。
此外,该算法需要维护一个集合 R ,集合R的数据需要保存在主存中。当采样数据过多时可能就不适用。

Reservoir sampling makes the assumption that the desired sample fits into main memory, often implying that k is a constant independent of n.


Proof

使用归纳法证明。

  • n=s+1 时,易得每个元素留在 R 中的概率为ss+1=sn;
  • n>s 时,假设 n 个元素中,每个元素留在R的概率为 sn
  • n=n+1 时,第 n+1 个元素 an+1 进入 R 的概率为sn+1,而前 n 个元素ai,1in留在 R 中的概率为snnn+1=sn+1.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值