有一个无限的整数数据流,如何从中随机地抽取k个整数出来?

这是一个经典的数据流采样问题,我们一步一步来分析。

当k=1时

我们先考虑最简单的情况,k=1,即只需要随机抽取一个样本出来。抽样方法如下:

  1. 当第一个整数到达时,保存该整数
  2. 当第2个整数到达时,以1/2的概率使用该整数替换第1个整数,以1/2的概率丢弃改整数
  3. 当第i个整数到达时,以1i\dfrac{1}{i}的概率使用第i个整数替换被选中的整数,以11i1-\dfrac{1}{i}的概率丢弃第i个整数

假设数据流目前已经流出共n个整数,这个方法能保证每个元素被选中的概率是1n\dfrac{1}{n}吗?用数学归纳法,证明如下:

  1. 当n=1时,由于是第1个数,被选中的概率是100%,命题成立
  2. 假设当n=m(m>=1)时,命题成立,即前m个数,每一个被选中的概率是 1m\dfrac{1}{m}
  3. 当n=m+1时,第m+1个数被选中的概率是 1m+1\dfrac{1}{m+1}, 前m个数被选中的概率是1m(11m+1)=1m+1\dfrac{1}{m} \cdot (1-\dfrac{1}{m+1})=\dfrac{1}{m+1},命题依然成立

由1,2,3知n>=1时命题成立,证毕。

当k>1时

当 k > 1,需要随机采样多个样本时,方法跟上面很类似,

  1. 前k个整数到达时,全部保留,即被选中的概率是 100%,
  2. 第i个整数到达时,以k/ik/i的概率替换k个数中的某一个,以1ki1-\dfrac{k}{i}的概率丢弃,保留k个数不变

假设数据流目前已经流出共N个整数,这个方法能保证每个元素被选中的概率是kN\dfrac{k}{N}吗?用数学归纳法,证明如下:

  1. 当n=m(m<=k)时,被选中的概率是100%,命题成立
  2. 假设当n=m(m>k)时,命题成立,即前m个数,每一个被选中的概率是 1m\dfrac{1}{m}
  3. 当n=m+1时,第m+1个数被选中的概率是 km+1\dfrac{k}{m+1}, 前m个数被选中的概率是1m[km+1(11k)+1km+1]=1m+1\dfrac{1}{m} \cdot [\dfrac{k}{m+1} \cdot (1-\dfrac{1}{k})+1-\dfrac{k}{m+1}]=\dfrac{1}{m+1},命题依然成立

由1,2,3知n>=1时命题成立,证毕。

参考资料

results matching ""

    No results matching ""