取样问题 总数n事先不知道,等概率取样 (编程珠玑chapter12 课后题10)

如何在事先不知道文本文件行数n的情况下读取该文件,从中随机选择并输出一行?

(事先不知道n的大小,但是一次可以看到这n个对象)

蓄水池抽样(Reservoir Sampling)问题

证明如下:

    问题: 证明当前任意一行为取出行的概率为1/i,i为当前扫描到的行号,也即每一行取出的概率相等

   我们用数学归纳法来证明,

当i=1时,当前只浏览了第一行,因此第一行为取出行的概率为1/1=1,符合直接取出的条件

当i=k时,有前k行为取出行的概率为1/k,我们要证明的是,当i=k+1时,前k+1行每一行被取出的概率均相等,且为1/(k+1)。当扫描到第k+1行时,我们以1/(k+1)概率替换choice,易知,第k+1行为choice的概率即为1/(k+1),对于第k行,其为choice的概率是 第k行为取出行的概率 * 第k+1行没有被取出的概率即,

ccd657dd47ac68b074c63865.jpg

   对于第k行的证明同样可应用到前k-1行,对于其中第m行其为choice的概率是 第m行为取出行的概率 * 第m+1行没有被取出的概率 * … *第k+1行没有被取出的概率,即

451065ca2276f219f01fe765.jpg

  由此证得当i=k+1时,所有行的取出概率为1/(k+1)。证毕。

可以对其进行扩展,即如何从未知或者很大样本空间随机地取k个数?

类比下即可得到答案,即先把前k个数放入蓄水池,对第k+1,我们以k/(k+1)概率决定是否要把它换入蓄水池,换入时随机的选取一个作为替换项,这样一直做下去,对于任意的样本空间n,对每个数的选取概率都为k/n。也就是说对每个数选取概率相等。

证明我们仍然使用数学归纳法:

  问题,证明对于任意样本号n,n>=k,每个样本作为取出样本的概率相等,即k/n。

  证明:

  当n=k时,由我们把前k个数放入蓄水池可知,每个样本的取出概率均相等,即k/k=1。   设当前样本号为n,其每个取出样本概率均相等,即为k/n,我们要证明的是这种情况对于n+1也成立。

  由于我们以k/(n+1)决定是否把n+1放入蓄水池,那么对于n+1其出现在蓄水池中的概率就是k/(n+1),对于前n个元素中的任意元素m(k+1<=m<=n),其出现在蓄水池中的概率为 m出现在蓄水池中的概率 * [(m+1被选中的概率*m没被m+1替换的概率 + m+1没被选中的概率)*(m+2被选中的概率*m没被m+2替换的概率 + m+2没被选中的概率)*…*(n+1被选中的概率*m没被n+1替换的概率 + n+1没被选中的概率)],即

3228b846a9a246566963e565.jpg

2280442434ddf46c8544f965.jpg

2283be33e6f913a7184cff65.jpg

b9fc8829834818a19b250a65.jpg

  可见,对于n+1每个样本取出概率也相等,即为k/(n+1)。证毕。

from:

http://hi.baidu.com/jrckkyy/blog/item/2562320a70edee27b0351d56.html

转载于:https://www.cnblogs.com/growup/archive/2012/02/07/2341912.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值