水库抽样算法是一个典型的空间亚线性算法。在很多时候我们要在海量数据中进行均匀的抽样,由于我们要取样的是海量数据,以至于只能遍历一次。
水库抽样的要求是,每一时刻取到的样本都是前面已经流过的全部数据的均匀抽样。

算法描述

从N(未知)个元素中随机的抽取k个元素,遍历一次,保证每个元素抽到的概率相同(k/n);

具体做法

1、初始化数组A,大小为k;
2、遍历1~k放入数组A;
3、从k+1开始,当接收到第i个数据t时,随机数j∈[1,i],若j<=k,则使用t替换A[j]。

算法原理

1、因为生成的随机数j的范围是[1,i],而当数字j小于等于k时,才会被替换进数组A,所以对于每个新到来的元素i,它是以ki\frac{k}{i}ik​的概率被收入集合的。
2、当第i+1个元素到来时,被替换进数组的概率是Pi=ki+1P_{i}=\frac{k}{i+1}Pi​=i+1k​,而此时,前一个元素i被从中替换出来的概率为Po=1kP_{o}=\frac{1}{k}Po​=k1​。
则当第i+1个元素到来时第i个元素被替换出去的概率为Pi∗PoP_{i}*P_{o}Pi​∗Po​,那么没有被替换出来的概率为Pnrep=1−Pi∗Po=ii+1P_{nrep}=1-P_{i}*P_{o}=\frac{i}{i+1}Pnrep​=1−Pi​∗Po​=i+1i​。
3、那么当第i+2,i+3…个元素到来时,第i个元素没有被替换出来的概率为i+1i+2\frac{i+1}{i+2}i+2i+1​,i+2i+3\frac{i+2}{i+3}i+3i+2​…
4、若最终元素i被选入集合中,意味着一直遍历到n时,期间所有的替换,i都没有被替换出来,其概率为:
ki×ii+1×i+1i+2×i+2i+3×...×n−1n=kn\frac{k}{i}\times\frac{i}{i+1}\times\frac{i+1}{i+2}\times\frac{i+2}{i+3}\times... \times\frac{n-1}{n}=\frac{k}{n} ik​×i+1i​×i+2i+1​×i+3i+2​×...×nn−1​=nk​

算法证明

也可以用数学归纳法进行证明:看这里。

Reservoir sampling相关推荐

  1. 蓄水池采样(Reservoir Sampling)

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

  2. Streaming的算法Reservoir Sampling

    转载自   这是一个惊艳了我的算法题 Reservoir Sampling( Reservoir sampling )  这是我在今年求职过程中面试的时候被问到的,因为之前很少接触Streaming的 ...

  3. 蓄水池抽样算法 Reservoir Sampling

    2018-03-05 14:06:40 问题描述:给出一个数据流,这个数据流的长度很大或者未知.并且对该数据流中数据只能访问一次.请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等. 问题求 ...

  4. Reservoir Sampling 蓄水池采样算法

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

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

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

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

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

  7. 蓄水池取样(Reservoir sampling)

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

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

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

  9. 蓄水池采样算法(Reservoir Sampling)原理,证明和代码

    有一个在大数据下很现实的例子: "给出一个数据流,这个数据流的长度很大或者未知.并且对该数据流中数据只能访问一次.请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等." ...

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

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

最新文章

  1. python 中type和object的关系
  2. 面试:知道 CopyOnWriteArrayList 吗?
  3. Sublime Text 无法使用Package Control或插件安装失败的解决方法
  4. 福玛特机器人评测_深度爆料扫地机器人地宝福玛特D820评测好不好?怎么样呢?内幕曝光测评...
  5. svn merger的时候 报远程主机强迫_SVN与Git比较的优缺点差异
  6. Exceeded maximum number of retries. Exceeded max scheduling attempts 3 for instance
  7. 拥抱时序数据库,构筑IoT时代下智慧康养数据存储底座
  8. 计算机平面和应用,计算机平面设计中软件的相互结合与应用
  9. 安卓原生页面与react-native页面相互跳转实现
  10. 精美摘抄,献给每一位喜欢文学的人
  11. Unity URP 渲染管线着色器编程 104 之 镜头光晕(lensflare)的实现
  12. linux灵活提取ip脚本
  13. 【TensorFlow】DNNRegressor 的简单使用
  14. WiFi底层通信接口@Netlink
  15. 优客365网站导航开源版 v1.5.2
  16. 成功解决百度网盘下载文件时遇到 下载总进度一直处于99.9%,显示一直下载不下来的问题
  17. 测试排期估时多长合理?
  18. 用IP地址签发SSL证书
  19. Dev C++ 安装及使用方法教程-超详细
  20. DiskGenius分区时提示:磁盘“**”的分区已更改,请先保存分区表,然后执行本操作解决方法

热门文章

  1. uniCloud云函数中通过传统方式操作数据库的-增删改查
  2. 1000qps的JVM内存设置多大的内存
  3. 英语的动词分类_13
  4. Kafka-eagle监控平台
  5. 7-2 正负数统计 (100 分)
  6. mysql 定时器 每天凌晨1点执行_mysql 定时脚本(event),类似oracle的job
  7. 纵有疾风起,人生不言弃
  8. 古诗词中“草”的意象
  9. C++连接打印机(windows API)
  10. python绘制国际象棋棋盘