文章目录

  • 应用场景
  • 算法步骤
  • 算法原理
  • 代码实现

应用场景

主要用于解决大数据流中的随机抽样问题,即:当内存有限,数据长度很大,甚至未知,那么如何从中随机选取k个数据,并且要求是等概率。

算法步骤

水塘抽样的步骤是,只遍历一次,每次都考虑一个问题:当前元素是否被选中,选中后替换之前选中的哪一个元素。

采样过程:
step1:首先将前k个元素全部选取。
step2:对于第i个元素(i>k),以概率k/i来决定是否保留该元素,如果保留该元素的话,则随机丢弃掉原有的k个元素中的一个(即原来某个元素被丢掉的概率是1/k)。

算法原理

假设我们要遍历的数据规模为nnn。

(1)首先,我们来考虑前kkk个元素:

 遍历前kkk个元素时,我们以p=1p=1p=1的概率将该元素(或者与该元素相关联的信息,例如索引)加入result。当遍历到k+1k+1k+1个元素时,第k+1k+1k+1个元素被保留的概率是k/(k+1)k/(k+1)k/(k+1),对于此时result中的元素,它们任何一个被剔除的概率是1/k1/k1/k,所以,对于前kkk个元素,它们在这一次遍历中被剔除的概率为
kk+1×1k\frac{k}{{k + 1}} \times \frac{1}{k} k+1k​×k1​

相对应的,对于前kkk个元素中的任一个,它们在第k+1k+1k+1次遍历中被保留的概率为
1−kk+1×1k1 - \frac{k}{{k + 1}} \times \frac{1}{k}1−k+1k​×k1​

所以,当遍历到第nnn个元素时,前kkk个元素中的任一个被保留的概率为
1×(1−kk+1×1k)×(1−kk+2×1k)×⋯×(1−kn−1×1k)×(1−kn×1k)=kn1 \times (1 - \frac{k}{{k + 1}} \times \frac{1}{k}) \times (1 - \frac{k}{{k + 2}} \times \frac{1}{k}) \times \cdots \times (1 - \frac{k}{{n - 1}} \times \frac{1}{k}) \times (1 - \frac{k}{n} \times \frac{1}{k})= \frac{k}{n}1×(1−k+1k​×k1​)×(1−k+2k​×k1​)×⋯×(1−n−1k​×k1​)×(1−nk​×k1​)=nk​

(2)其次,我们来考虑前kkk个元素之后的所有元素:

 对于第i个元素(i>k),以概率k/i来决定是否保留该元素。并且在之后的每一次遍历中,该元素被剔除的概率都为
ki+m×1k\frac{k}{{i+m}} \times \frac{1}{k} i+mk​×k1​
 mmm表示该次遍历为第i个元素之后的第mmm次遍历

所以,第i个元素(i>k)最终被保留的概率为
ki×(1−ki+1×1k)×(1−ki+2×1k)×⋯×(1−kn−1×1k)×(1−kn×1k)=kn\frac{k}{i} \times (1 - \frac{k}{{i + 1}} \times \frac{1}{k}) \times (1 - \frac{k}{{i + 2}} \times \frac{1}{k}) \times \cdots \times (1 - \frac{k}{{n - 1}} \times \frac{1}{k}) \times (1 - \frac{k}{n} \times \frac{1}{k})= \frac{k}{n} ik​×(1−i+1k​×k1​)×(1−i+2k​×k1​)×⋯×(1−n−1k​×k1​)×(1−nk​×k1​)=nk​

 这种随机采样方法不需要事先知道问题的规模大小,当遍历到第m(m>k)个元素时,前m个元素中的任一个被保留的概率均为k/mk/mk/m,当遍历到第n(n>k)个元素时,前n个元素中的任一个被保留的概率均为k/nk/nk/n。

 一般的随机抽样方法需要事先知道数据规模,再用随机数从n个元素中随机抽样k个。但当数据规模特别大且难以用现有的存储空间保存它时,我们无法事先知道数据规模,这时水塘抽样算法就很适合解决这种问题。

代码实现

// 从长度为n的nums数组中随机选取k个数(水塘抽样)public int[] Reservoir(int[] nums,int k){int[] res=new int[k];Random random=new Random();for(int i=0;i<nums.length;i++){//前k个数直接加入resif(i<k) res[i]=i;//对于第i个数,以k/i的概率让它留下来else if(random.nextInt(i+1)<k)//从现有res中随机选一个数踢出去,用留下来的数替换它res[random.nextInt(k)]=i;}return res;}

水塘抽样算法(Reservoir Sampling Algorithm)相关推荐

  1. 水塘抽样(Reservoir sampling)

    水塘抽样(Reservoir sampling) 题目:给出一个数据流,这个数据流的长度很大或者未知.并且对该数据流中的数据只能访问一次.请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等. ...

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

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

  3. 蓄水池抽样算法 Reservoir Sampling

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

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

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

  5. labuladong的算法小抄pdf_随机算法:水塘抽样算法

    读完本文,你可以去力扣拿下如下题目: 382.链表随机节点 398.随机数索引 -----------我最近在 LeetCode 上做到两道非常有意思的题目,382 和 398 题,关于水塘抽样算法( ...

  6. Streaming的算法Reservoir Sampling

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

  7. 蓄水池抽样(Reservoir Sampling)

    蓄水池抽样解决的问题是当不知道N的大小时从N个数中等概率抽取k个数. 要理解这个问题,首先从抽取一个数来看. 在知道数字总数N的大小的情况下,我们可以很容易的用C运行库的rand函数随机的获得一个数字 ...

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

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

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

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

最新文章

  1. 线下活动【西安站】用Leangoo做Scrum敏捷开发实战课(免费)
  2. 点到线段的距离计算方法
  3. Redis list 之增删改查
  4. 产品问答 | PM该陪技术加班吗?要怎样培养技术认知?
  5. mysql首次安装后原始密码存放位置
  6. Java开发和嵌入式开发该如何选择
  7. 非阻塞式异步Java 8和Scala的Try / Success / Failure
  8. 支付宝当面付接口如何计算优惠
  9. 【HDU - 5883】The Best Path(判断欧拉回路)
  10. 从对集合数据去重到Distinct源码分析
  11. 力扣453.最小操作次数使数组元素相等
  12. 快速安装Pytorch
  13. 短视频运营小技巧,掌握推荐机制很重要,吸粉引流也不难
  14. 统一诊断服务(UDS)否定响应也可以被抑制
  15. Codeforces936B. Sleepy Game
  16. 计算 m 的 n 次幂
  17. 平均电流型LED降压恒流驱动器 常用恒流IC
  18. 在线查看.doc,.docx,.ofd,.PDF,.WPS以及Office文档的在线解析方式。
  19. css打印适应纸张_css控制打印样式
  20. 通过css实现单选按钮效果

热门文章

  1. AC-DMIS测量程序应用举例
  2. 基于Cisco PacketTrancer的企业/校园双核心热备+WLC、AC无线控制器的无线网络拓扑规划
  3. 【论文笔记06】智能合约的合约安全和隐私安全研究综述
  4. 如何解决百度网盘的下载速度?
  5. 金融基础知识笔记(二)
  6. Django网站实战——手把手带大家制作一个经典的网站
  7. 【新手向】keras如何计算top5
  8. Charles在夜神抓包APP无法联网
  9. 怎么转换英文音频成文字?英文音频转文字app分享
  10. python的坏处_六星教育:爬虫还分好坏?恶意爬虫到底会给你生活造成多大危害?...