蓄水池算法

本文详细介绍了蓄水池算法及其在大数据量下的分布式实现。蓄水池算法允许在数据流中仅遍历一次的情况下,以恒定概率随机选择不重复的样本。分布式蓄水池算法通过将数据集分成多个部分,在每部分独立应用蓄水池算法,最终合并结果。文章通过推导证明了算法的正确性和效率,并提供了实现细节。
摘要由CSDN通过智能技术生成

1.蓄水池算法

给定一个数据流,数据流长度N很大,且N直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出m个不重复的数据。

我们需要找到一种随机的方式使的每个样本被取出的概率为 C N − 1 m − 1 C N m = m N \frac{C^{m-1}_{N-1}}{C^{m}_{N}}=\frac{m}{N} CNmCN1m1=Nm

采用的方式是前m个样本全部取出,对于大于m的样本i,以 m i \frac{m}{i} im的概率选择该元素,并从现有的m个样本随机一个位置替换。

推导

考虑 i ≤ m i\leq m im i > m i \gt m i>m两种情况:

  • 计算 i < = m i<=m i<=m的的某个样本x最终被取出的概率

    • i = m + 1 i=m+1 i=m+1,i样本被取出的概率 m m + 1 \frac{m}{m+1} m+1m,替换样本x的概率为 m m + 1 ∗ 1 m = 1 m + 1 \frac{m}{m+1}*\frac{1}{m}=\frac{1}{m+1} m+1mm1=m+11,则对于m+1个样本不替换x的概率为 1 − 1 m + 1 = m m + 1 1-\frac{1}{m+1}=\frac{m}{m+1} 1m+11=m+1m
    • i = m + 2 i=m+2 i=m+2,i样本被取出的概率 m m + 2 \frac{m}{m+2} m+2m,替换样本x的概率为 m m + 2 ∗ 1 m = 1 m + 2 \frac{m}{m+2}*\frac{1}{m}=\frac{1}{m+2} m+2mm1=m+21,则对于m+2个样本不替换x的概率为 1 − 1 m + 2 = m + 1 m + 2 1-\frac{1}{m+2}=\frac{m+1}{m+2} 1m+21=m+2m+1
  • ⋯ \cdots

    • i = N i=N i=N,i样本被取出的概率 m N \frac{m}{N} Nm,替换样本x的概率为 m N ∗ 1 m = 1 N \frac{m}{N}*\frac{1}{m}=\frac{1}{N} Nmm1=N1,则对于N个样本不替换x的概率为 1 − 1 N = N − 1 N 1-\frac{1}{N}=\frac{N-1}{N} 1N1=NN1
  • i < = m i<=m i<=m的的某个样本x最终被取出的概率 m m + 1 ∗ m + 1 m + 2 . . . N − 1 N = m N \frac{m}{m+1}*\frac{m+1}{m+2}...\frac{N-1}{N}=\frac{m}{N} m+1mm+2m+1...NN1=Nm

  • 计算 i > m i>m i>m的的某个样本x最终被取出的概率

    • 初始样本x(假设第n个样本)被取出的概率为 m n \frac{m}{n} nm
    • i = n + 1 i=n+1 i=n+1,样本x被替换的概率 m n + 1 ∗ 1 m = 1 n + 1 \frac{m}{n+1}*\frac{1}{m}=\frac{1}{n+1} n+1mm1=n+11,样本x不被替换的概率 1 − 1 n + 1 = n n + 1 1-\frac{1}{n+1}=\frac{n}{n+1} 1n+11=n+1n
    • i = N i=N i=N,样本x被替换的概率 m N ∗ 1 m = 1 N \frac{m}{N}*\frac{1}{m}=\frac{1}{N} Nmm1=N1,样本x不被替换的概率 1 − 1 N = N − 1 N 1-\frac{1}{N}=\frac{N-1}{N} 1N1=NN1
  • i > m i>m i>m的的某个样本x最终被取出的概率 m n ∗ n n + 1 . . . N − 1 N = m N \frac{m}{n}*\frac{n}{n+1}...\frac{N-1}{N}=\frac{m}{N} nmn+1n...NN1=Nm

2.分布式蓄水池算法

考虑很大的数据量,采用分布式的蓄水池算法利用K台机器从N个样本随机m个数据:

1.将大数据集分为K个数据流,记作 N 1 , N 2 , … , N K N_1,N_2,\dots,N_K N1,N2,,NK,每台机器对应一个数据流并抽样m个数据。
2.取[1,N]的m个随机数 d 1 , d 2 , … , d m d_1,d_2,\dots,d_m d1,d2,,dm,对于每个随机数,判断其所在的数据流 N k N_k Nk,在数据流 N k N_k Nk中等概率选择一个样本,最终从N个数据集选出m个数据。

推导

在分支流一次抽取中,其中每个样本被选择的概率:
p ( n k ) = m N k × 1 m = 1 N k p(n_k)=\cfrac{m}{N_k}\times \cfrac{1}{m}=\cfrac{1}{N_k} p(nk)=Nkm×m1=Nk1

每个样本被选择的概率:
P ( n k ) = m × N k N K × p ( n k ) = m × N k N K × 1 N k = m N K P(n_k)=m\times\cfrac{N_k}{N_K}\times p(n_k)=m\times\cfrac{N_k}{N_K}\times\cfrac{1}{N_k}=\cfrac{m}{N_K} P(nk)=m×NKNk×p(nk)=m×NKNk×Nk1=NKm

m表示随机抽取m个随机数,乘 N k N K \cfrac{N_k}{N_K} NKNk表示m个随机数在 N k N_k Nk数据流的个数,最后乘 p ( n k ) p(n_k) p(nk)表示分支流样本 n k n_k nk被抽中的概率。

3.参考

蓄水池抽样算法(Reservoir Sampling)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值