文章目录
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} CNmCN−1m−1=Nm
采用的方式是前m个样本全部取出,对于大于m的样本i,以 m i \frac{m}{i} im的概率选择该元素,并从现有的m个样本随机一个位置替换。
推导
考虑 i ≤ m i\leq m i≤m和 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+1m∗m1=m+11,则对于m+1个样本不替换x的概率为 1 − 1 m + 1 = m m + 1 1-\frac{1}{m+1}=\frac{m}{m+1} 1−m+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+2m∗m1=m+21,则对于m+2个样本不替换x的概率为 1 − 1 m + 2 = m + 1 m + 2 1-\frac{1}{m+2}=\frac{m+1}{m+2} 1−m+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} Nm∗m1=N1,则对于N个样本不替换x的概率为 1 − 1 N = N − 1 N 1-\frac{1}{N}=\frac{N-1}{N} 1−N1=NN−1
-
则 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+1m∗m+2m+1...NN−1=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+1m∗m1=n+11,样本x不被替换的概率 1 − 1 n + 1 = n n + 1 1-\frac{1}{n+1}=\frac{n}{n+1} 1−n+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} Nm∗m1=N1,样本x不被替换的概率 1 − 1 N = N − 1 N 1-\frac{1}{N}=\frac{N-1}{N} 1−N1=NN−1
-
则 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} nm∗n+1n...NN−1=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被抽中的概率。