蓄水池抽样问题(随机抽样问题)


问题描述:要求从N个元素中随机的抽取k个元素,其中N无法确定。

这种应用的场景一般是数据流的情况下,由于数据只能被读取一次,而且数据量很大,并不能全部保存,因此数据量N是无法在抽样开始时确定的;但又要保持随机性,于是有了这个问题。

这里的核心问题就是“随机”,怎么才能是随机的抽取元素呢?我们设想,买彩票的时候,由于所有彩票的中奖概率都是一样的,所以我们才是“随机的”买彩票。那么要使抽取数据也随机,必须使每一个数据被抽样出来的概率都一样。

 

问题解答:

在考虑问题过程中,可以具体化,在100个数据中可以等概率抽取了10个数据,当又来了20个数据时,怎样能等概率的抽取10个数据,所以在面临每个数据时,可能存在一次等概率的选取;另一种思考方向是当k=1时,简化为怎样随机的选取一个元素,如下面这个实际问题。

问题起源于编程珠玑Column 12中的题目10,其描述如下:

How could you select one of n objects at random, where you see the objects sequentially but you do not know the value of n beforehand? For concreteness, how would you read a text file, and select and print one random line, when you don’t know the number of lines in advance?

问题定义可以简化如下:在不知道文件总行数的情况下,如何从文件中随机的抽取一行?

给出解决方案:在扫描第i个行时,以1/i的概率选择该行,选择意味着选取当前行并替换前面已经选到的那行。即,扫描到第一行时,选择;扫描到第二个行时,以1/2的概率替换第一个行;扫描到第三个行时,以1/3的概率替换前面选取的行,以此类推,直至扫描完一遍后,选取到的行号恰好是等概率的。

证明:设行号为[1…N],即证明选取每行的概率为1/N。设1<= i <=N,选取到第i行的事件为第i次选取了第i行且后面每次选择过程中均没有选中。概率为


证毕。也可以用数学归纳法证明。

 

所以当随机选取k行时,就是最开始的问题。从上面的解决方案中得到启发,给出下面的选取策略:先选取前面的k行,从第k+1行开始,以k/i的概率选取一行并替换前面选到的k行中的一行,其中i为当前行号,i >= k+1。这样的选取过程也可以做到随机等概率。

证明:设行号为[1…N],即证明选取每行的概率为k/N。当i > k时,选取第i行的概率为k/i。计算最终扫描完后选取到第i行的概率,即第i行在最终选取的k行中的概率。这一事件发生是第i次扫描时选中该行,并且以后每次扫描一行时,那一行或者没有选中或者选中但替换的不是第i行,直至第N行。概率


        当1<= i <=k时,即,是取上面的i=k得p=k/n。

综上,可得随机选取k行是等概率。证毕。

 

上述问题,存在不同的变种,结合实际的背景出现不同的形式。但均可以抽象为蓄水池抽样问题,又叫随机抽样问题。下面给出一些其他的形式:

1、在一个长度N未知的链表中随机选取k个元素,要求仅扫描链表一次且选取k个元素是等概率的。

2、从实时的搜素词中随机抽出k个词。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值