Reservior Sampling (蓄水池抽样算法)


1. 蓄水池抽样问题描述

  Reservoir sampling is a family of randomized algorithms for randomly choosing a sample of k items from a list S containing n items, where n is either a very large or unknown number. Typically n is large enough that the list doesn’t fit into main memory.
  蓄水池抽样问题是,从一个长度为n的流中随机选取k个元素,使得n个元素中的每个元素都以相同的概率被采样到,通常情况下n是一个未知的很大的数目,而且无法将其载入主存中。


2. 蓄水池抽样的解法

  在Dictionary of Algorithms and Data Structures中该问题的定义与解法如下:

  • Definition: Randomly select k items from a stream of items of unknown length.
  • Solution: Save the first k items in an array of size k. For each item j, j > k, choose a random integer M from 1 to j (inclusive). If M ≤ k, replace item M of the array with item j.

该问题的解法一般被称为 Algorithm R 由 Jeffrey Vitter 在其论文“Random sampling with a reservoir” 中提出,其伪代码如下所示:

(*S has items to sample, R will contain the result*)
ReservoirSample(S[1..n], R[1..k])// fill the reservoir arrayfor i = 1 to kR[i] := S[i]// replace elements with gradually decreasing probabilityfor i = k+1 to nj := random(1, i)   // important: inclusive rangeif j <= kR[j] := S[i]

3. Algorithm R 算法的数学证明

采用数学归纳法进行证明:假设我们要从 nn 个元素中随机抽取 kk 个元素(0≤k≤n0 \le k \le n),使得每个元素被采样的概率等于 kn\frac{k}{n}。

令 k≤m≤nk \le m \le n:
m=km = k时,从 mm 个元素随机采样 kk 个,则 kk 个元素均被采样到,因此每个元素被采样的概率为 km=1.0\frac{k}{m} = 1.0,初始条件满足。
假设 n=m>kn = m > k时假设成立,即每个元素被采样的概率等于 km\frac{k}{m} ,则 n=m+1n = m + 1时有:
对于第 m+1m+1 个元素,其被抽样的概率为 km+1\frac{k}{m+1}。
对于在当前容积为 kk 的蓄水池中的元素,其被抽样的概率由两部分组成:
1) 如果第 m+1m+1 个元素未被采样,则此部分的概率为 km∗(1−km+1)\frac{k}{m}* (1 - \frac{k}{m+1})。
2) 如果第 m+1m+1 个元素被采样,但是在蓄水池中的元素未被第m+1m+1 个元素替换,则此部分概率为:km∗km+1∗k−1k\frac{k}{m} * \frac{k}{m+1} * \frac{k-1}{k}。
因此将1)和2)相加即可得到蓄水池中的元素被采样的概率为:

km∗(1−km+1)+km∗km+1∗k−1k

\frac{k}{m}* (1 - \frac{k}{m+1}) + \frac{k}{m} * \frac{k}{m+1} * \frac{k-1}{k}

=km∗(m+1−km+1+k−1m+1)

= \frac{k}{m}* (\frac{m+1-k}{m+1} + \frac{k-1}{m+1})

=km∗mm+1

=\frac{k}{m} * \frac{m}{m+1}

=km+1

= \frac{k}{m+1}
因此, n=m+1n = m+1, 时假设成立,所以根据归纳法可知结论对一切 n≥kn \ge k 成立。


4. leetcode 刷题

  • 382. Linked List Random Node

Reservior Sampling (蓄水池抽样算法)相关推荐

  1. 随机抽样java_Reservoir Sampling 蓄水池抽样算法,经典抽样

    随机读取数据,如何保证真随机是不可能的,因为计算机的随机函数是伪随机的. 但是在不考虑计算机随机函数的情况下,如何保证数据的随机采样呢? 1.系统提供的shuffle函数 C++/Java都提供有sh ...

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

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

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

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

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

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

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

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

  6. LeetCode Random Pick Index(蓄水池抽样算法)

    问题:给出一个数组,存在相同的数,随机输出目标数所在的下标 思路:使用蓄水池抽样算法,当第一次找到目标数时,作为选取.接着如果随机数等于0,则选取.在遍历完后,直接返回选取的值 具体代码参考: htt ...

  7. 【大数据算法】蓄水池抽样算法

    一.题目来源: 这个题目的由来是周围有人讨论到去面试(某8)的时候遇到了这个问题.另外正好HIT有个视频也有这个内容,故记录一下: 二.题目描述:     该人面试的时候问的是: 如何从二进制文件中等 ...

  8. 蓄水池采样算法的python实现_常用算法-蓄水池抽样算法

    Leetcode上遇到一道题,题目是这样的: 这道题的关键是链表的长度不知道,但是要使随机返回每个元素的概率相等,这一下就难倒我了,如果知道链表的长度k,从0到k中随机选择一个整数就好了呀,可现在不知 ...

  9. Reservoir Sampling 蓄水池采样算法

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

  10. 蓄水池抽样算法 Reservoir Sampling

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

最新文章

  1. POJ 1584 A Round Peg in a Ground Hole 判断凸多边形,点到线段距离,点在多边形内
  2. SPOJ1812(后缀自动机求n个串的最长公共子串)
  3. 操作数栈的字节码指令执行分析
  4. 【BZOJ3451】Normal【期望线性性】【点分治】【NTT卷积】
  5. oracle back log,11g闪回日志(flashback log)保留时间参数 - db_flashback_retention_target
  6. win10开移动热点让手机使用上网
  7. servlet 同版本对应的Tomcat版本 ,不同版本的web.xml写法
  8. ocr语种识别_利用OCR图文识别,快速帮你提取文字信息
  9. Springboot2.0从零开始搭建脚手架-初始化和整合MybatisPlus3.0+...
  10. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  11. 显示器、显卡的接口类型
  12. Jquery获取选中 的TR元素 和 子元素td
  13. Sequential regulatory activity prediction across chromosomes with convolutional neural networks
  14. C语言实现一元多项式的加减运算
  15. 流量无限离我们还有多远?
  16. [Maya学习内容日记]20070812
  17. 如何将国外的ftp气象大数据下载回来(by quqi99)
  18. 接入google 登录 google oauth2
  19. matlab可视化功能6,第6章MATLAB计算结果可视化
  20. vscode remote-ssh连接ubuntu子系统提示错误:WSL: VSCode server install fails on Ubuntu 19.10

热门文章

  1. 手机CPU天梯图2021年6月版
  2. EDTA 最简易安装方法
  3. 联想服务器CPU系列,联想推出采用第三代英特尔至强处理器的ThinkSystem SR860 V2服务器...
  4. PHP 计算当前时间是这一年的第几周
  5. neo4j springboot 日志_springBoot 与neo4j的简单整合示例
  6. Stata实现结构方程模型
  7. 解决The APR based Apache Tomcat Native library which allows optimal performance in production environ
  8. 肠道核心菌属——巨单胞菌属(Megamonas)
  9. 通过redmon监控管理Redis服务器的安装配置教程
  10. dell灵越笔记本后盖怎么拆_如何拆卸Dell Inspiron 15 5570笔记本电脑并安装M.2 SSD