首先 我们要知道这种算法到底是干嘛的?
它通常用于解决大数据流中的数据的随机抽样问题。进一步简化来说 当内存无法加载全部数据的时候 如何从包含位置大小的数据流中随机选取K个数据,并且要保证每个数据被抽取到的概率相等。

首先,针对不同的K 我们需要有不同的策略:

当K=1的时候
我们需要保证 假设数据流含有N个数 每个数被抽到的概率应该为1/N
应该这样做:
数据流中第i个数被保留的概率为 1/i 。只要采取这种策略,只需要遍历一遍数据流就可以得到采样值,并且保证所有数被选取的概率均为 1/N 。
为什么这种策略可以?
记住 我们每次最后只保留一个数
遇到第一个数的时候 我们现在只有一个数 保留他的概率100%
遇到第二个数 我们有1/2的概率保留(也就是说替换为)第二个数 这也就意味着有11/2的概率保留第一个数 两者概率均为1/2
遇到第三个数 我们有1/3的概率保留第三个数,那么我们留下第一个数的概率为1/2
(1-1/3) 留下第二个数的概率也为1/2*(1-1/3)
…所以就按照这种策略 我们能保证所有被选数的抽取概率都是1/N

当K>1的时候
我们需要保证 假设数据流含有N个数 每个数被抽到的概率应该为K/N.
那么我们应该这样做:
对于前k个数,我们全部保留,对于第i(i>k)个数,我们以 [公式] 的概率保留第i个数,并以 [公式] 的概率与前面已选择的k个数中的任意一个替换。
为什么这种策略可以?
就跟之前一样 对于前K个数 我们一定是全部都保留下来
对于第K+1个数 我们以K/(K+1)的概率保留他(但是替换谁呢?)
对于第K+2个数 我们以K/(K+2)的概率保留她

至于为什么 如何去证明,请参见:
水塘抽样(Reservoir Sampling)

下面是这种抽样方法的具体实现:

//if k ==1
public int reserviorSampling(int[] nums) { //data streamint N = nums.length;int res = nums[0];Random rand = new Random();for (int i = 1; i < N; i++) {int random =  rand.nextInt() % i; //the range of this will be 0 to i-1, if (random == 0) { //there is the possibility of 1/ires = nums[i];}}return res;
}//if k > 1, then we need to use
public int[] reserviorSampling(int[] nums, int K) { //data streamint N = nums.length;int[] res = new int[K];for (int i = 0; i < K; i++) {res[i] = nums[i];}Random rand = new Random();for (int i = 1; i < N; i++) {int random =  rand.nextInt() % i; //the range of this will be 0 to i-1, if (random < K) { //the psosition of index=random will have the possibility of k/i change into this new value: nums[i]res[random] = nums[i];}}return res;
}

什么是储蓄池抽样(Reservoir Sampling)算法?相关推荐

  1. 水塘采样(Reservoir sampling)算法

    最近看了Flink中的rangePartition使用了水塘采样算法,因此参考维基百科详细了解了一下.采样的关键在于对每个元素的选取需要是等概率的.水塘采样其目的在于从包含n个项目的集合S中选取k个样 ...

  2. 蓄水池抽样算法 Reservoir Sampling

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

  3. Reservoir Sampling 蓄水池采样算法

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

  4. 蓄水池采样(Reservoir Sampling)

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

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

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

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

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

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

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

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

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

  9. 水塘抽样(Reservoir sampling)

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

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

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

最新文章

  1. php通知websocket,php实现websocket实时消息推送
  2. CF1146F - Leaf Partition(树形dp)
  3. Java基础学习-Path环境变量的配置
  4. Exchange Server 2013多域名证书申请
  5. linux select 服务器,Linux下用select()实现异步的Echo服务器
  6. 多线程中对全局变量(整型类型)是否需要同步操作
  7. 【原】iphone6来了,我该做点什么(兼容iphone6的方法)
  8. eda交通灯控制器波形输入_EDA交通灯课程设计十字路口交通灯控制器设计.doc
  9. java list去重工具_开发常用小工具类:list集合去重
  10. 美丽的花蝴蝶 动人的海豚音 天后[Mariah Carey玛丽亚·凯莉]全集
  11. 拉格朗日插值法总结模板(1~n)
  12. Python实现简易搜索引擎
  13. 调用微信方法报错errMsg:chooseImage:fail, the permission value is offline verifying
  14. 【IOI2018】组合动作
  15. 双11购书大优惠!独家优惠券,折后再减,赶紧来抢啊!
  16. oracle的驱动是什么文件,oracle数据库驱动在哪个文件夹
  17. 2.2 多线程:concurrent.futures实现线程池
  18. WinForm常用控件
  19. Element Table 单元格中嵌套表格(Table) 合并行效果
  20. JS: break 终止循环 continue跳过循环体中不想执行的语句

热门文章

  1. Linux搭建小型服务器——文件共享以及邮件服务器
  2. SOAP Action介绍
  3. ssci源刊里有开源期刊吗_2020年SCI期刊影响因子重磅发布!你投过的期刊涨了吗?...
  4. 产品经理干久了,有哪些后遗症?
  5. Gos —— 实现系统调用
  6. 数据分析——帆软report
  7. 内定抽奖小程序_微信抽奖助手怎么中奖 无需作弊照样中奖
  8. 数据分析师简介、工作任务、技能栈
  9. RecyclerView侧滑删除按钮
  10. 论文阅读Reasoning with Latent Structure Refinement for Document-Level Relation Extraction