蓄水池抽样解决的问题是当不知道N的大小时从N个数中等概率抽取k个数。

要理解这个问题,首先从抽取一个数来看。

在知道数字总数N的大小的情况下,我们可以很容易的用C运行库的rand函数随机的获得一个数字编号,从而随机的取出一个数字,但是,当前的情况是不知道N的大小,这种情况下我们需要这么做:定义取出的数字编号为choice,第一次直接以第一个数字作为取出数字 choice ,而后第二次以二分之一概率决定是否用第二个数字替换 choice ,第三次以三分之一的概率决定是否以第三个数字替换 choice ……,以此类推,可用伪代码描述如下:

  1. i= 0
  2. while more input numbers
  3. with probability 1.0/++i
  4. choice = this input number
  5. print choice

这种方法的巧妙之处在于成功的构造出了一种方式使得最后可以证明对每一个数字的取出概率都为1/n(其中n为当前输入的数字总数),换句话说对每一个数字取出的概率均相等,也即完成了随机的选取。

  证明如下:

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

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

  伪代码:

  1. Init : a reservoir with the size: k
  2. for i= k+1 to N
  3. M=random(1, i);
  4. if( M < k)
  5. SWAP the Mth value and ith value
  6. end for

证明如下:

摘自http://www.cnblogs.com/HappyAngel/archive/2011/02/07/1949762.html

转载于:https://blog.51cto.com/buptdtt/690720

蓄水池抽样(Reservoir Sampling)相关推荐

  1. 蓄水池采样(Reservoir Sampling)

    在一个给定长度的数组中随机等概率抽取一个数据很容易,但如果面对的是长度未知的海量数据流呢?蓄水池采样(Reservoir Sampling)算法就是来解决这个问题的, 它在分析一些大数据集的时候非常有 ...

  2. 蓄水池取样(Reservoir sampling)

    蓄水池取样是一系列的随机算法,用于简单随机抽样,在一个有未知项(n项)的集合中不放回抽取k项.集合的大小(n项)对于算法来说是未知的,通常所有项(n项)太大无法放入主内存里.随着时间的推移,算法不断读 ...

  3. 蓄水池采样 Reservoir Sampling

    # coding:utf8 import random# 从n个数中采样k个数 def reservoir_sampling(n, k):# 所有数据pool = [i for i in range( ...

  4. 蓄水池采样算法的python实现_蓄水池采样算法的python实现_蓄水池抽样及实现

    蓄水池抽样(Reservoir Sampling)是一个很有趣的问题,它能够在o(n)时间内对n个数据进行等概率随机抽取,例如:从1000个数据中等概率随机抽取出100个.另外,如果数据集合的量特别大 ...

  5. 蓄水池采样算法的python实现_蓄水池抽样及实现

    蓄水池抽样(Reservoir Sampling)是一个很有趣的问题,它能够在o(n)时间内对n个数据进行等概率随机抽取,例如:从1000个数据中等概率随机抽取出100个.另外,如果数据集合的量特别大 ...

  6. Reservoir Sampling 蓄水池采样算法

    https://blog.csdn.net/huagong_adu/article/details/7619665 https://www.jianshu.com/p/63f6cf19923d htt ...

  7. 蓄水池抽样算法(reservoir sampling)

    蓄水池抽样算法(reservoir sampling) 场景:在长度未知的数据流中,等概率地采样一定数量的数据.即,数据量N未知,若要求采样k个数据,采样概率保证kN\frac{k}{N}Nk​. 要 ...

  8. 蓄水池采样算法的python实现_蓄水池抽样算法(Reservoir Sampling)

    蓄水池抽样算法(Reservoir Sampling) 许多年以后,当听说蓄水池抽样算法时,邱simple将会想起,那个小学数学老师带他做"小明对水池边加水边放水,求何时能加满水" ...

  9. 图解连续学习中的蓄水池抽样算法(The Illustrated Reservoir sampling)

    图解连续学习中的蓄水池抽样算法The Illustrated Reservoir sampling 前言 什么是Reservoir Sampling? 蓄水池抽样算法(Reservoir sampli ...

  10. 机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)

    分类目录:<机器学习中的数学>总目录 蓄水池抽样算法(Reservoir Sampling Algorithm)解决了未知长度数据的均匀抽样问题,即:给定一个数据流,数据流长度NNN很大, ...

最新文章

  1. PARAMETER FILE研究
  2. iOS开发JSON字符串和字典互转
  3. 第22届清华大学电子设计大赛决赛
  4. 7.多媒体☞图像图形拍照
  5. Ambari2.7.4+HDP3.1.4下sqoop增量导入只支持append模式,mysql直接进入hive的lastmodified的不支持。下面是增量的命令。
  6. 用JSP实现学生查询
  7. 阿里云视图计算,边缘计算的主“战”场
  8. mysql源码分析书籍_从源码分析 MySQL 死锁问题入门
  9. [设计模式-结构型]组合(Composite )
  10. 未开启3389实现远程桌面
  11. android 信鸽 小米推送,小米推送通道集成指南
  12. WeNet语音识别实战
  13. linux网络重设,Linux ADSL拨号上网
  14. 制作世界人口地图json--10.4学习日记
  15. flask导出Excel报表详解
  16. aws cloudformation 堆栈集的创建和使用
  17. new Date() 获取当前时间对象(getFullYear、getMonth、getDate、getHours、getMinutes、getSeconds、getDay、getTime)
  18. 对上传图片进行处理,大图片压缩补白,小图片适度放大四周补白
  19. MOS管寄生电容是如何形成的?
  20. STM32F103读取SD卡的数据(fat文件模式)

热门文章

  1. qtcpsocket断开_2020-05-06 QT子线程使用QTcpSocket连接服务器
  2. Python入门2_之列表元组
  3. 浅析ReentrantReadWriteLock读写锁
  4. RocketMq发送延迟消息
  5. zookeeper使用及模拟注册中心原理
  6. 实战Spring Boot 2.0系列(一) - 使用Gradle构建Docker镜像
  7. Struts2 自定义验证器
  8. Android之launchMode总结
  9. 从硬盘安装在XP下装红旗linux双系统
  10. NET中class与struct的区别简析