Reservior Sampling(蓄水池采样) in Data Streams

原创 2016年05月30日 18:39:27

引言

在统计学习里面,采样通常分为两类,unbiased Sample(无偏采样)和biased Sample(有偏采样)。本文介绍的蓄水次采样就是一种无偏采样算法。它的特点是在对不知道样本总体个数或者样本总体个数太大,大到无法全部存放在内存中的情况下,可以保证每个样本被选取的概率是一样的,为K/N,其中K为“蓄水池”的大小,N为当前数据流中包含的样本个数。

算法描述

假设有一个数据流,其中包含的样本个数未知。现在有一个长度为K的缓存,现在需要从这个数据流中采样K个样本,满足:数据流中每个样本被选中的概率一样。算法过程如下:

  1. 数据流前K个样本直接依次放入到缓存中。n:表示当前处理过的样本个数
  2. 当n>k时,每个样本以k/n的概率被选中,一旦该样本被选中,则需要从原本被选中的K个样本随机选择一个样本丢弃,腾出空间存放新的被选中的样本。n++。
  3. 如此重复过程2即可。

算法的伪码如下:

void reserviorSample(...){
   data:current data from data stream
   i:Int
   n:the number of data
   s[1:K]:array which is used to store sampled data
   data=get(datastream);
   if(n<=K){
     s[n]=data;
   }else{
     i=rand(n);
     if(i<k){
       s[i]=data;
     }
   }
   n++;
}

结论:当前处理了n个流数据点后,任何数据点被保存在蓄水池中的概率是一样的,都是K/n。

算法证明

证明的方法有很多,可以使用归纳法对保存在蓄水池中的某一个样本做归纳推理即可。
现使用直接推理法:
当n<=K时,证明tirval。
当n>K时,对于当前的数据点data,我们考虑它被采样选中的概率。根据算法的描述,可知,当前状态下data被选中的概率:

P(data is sampled)=Kn

那么对于data来说,在采样结束后,最终能够被保存在蓄水池中的概率:
P(data is sampled at last)=Knnn+1N1N=KN

证毕

结论

采样算法在现实生活的应用十分广泛。尤其在现今的数据时代,合理的采样可以使得我们在有限的计算资源下更好的获取数据的分布情况,从而为决策、模型学习提供帮助。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Reservior Sampling (蓄水池抽样算法)

蓄水池抽样问题是,从一个长度为n的流中随机选取k个元素,使得n个元素中的每个元素都以相同的概率被采样到,通常情况下n是一个未知的很大的数目,而且无法将其载入主存中。...
  • chouisbo
  • chouisbo
  • 2017年02月13日 11:12
  • 195

Reservior Sampling(蓄水池采样) in Data Streams

引言在统计学习里面,采样通常分为两类,unbiased Sample(无偏采样)和biased Sample(无偏采样)。本文介绍的蓄水次采样就是一种无偏采样算法。它的特点是在对不知道样本总体个数或者...
  • Mr_Lyang
  • Mr_Lyang
  • 2016年05月30日 18:39
  • 932

【算法】LeetCode上一些经典好题(update@0617)

LeetCode从15年末也就是大四的时候开始陆陆续续的刷了150多道题,今年因为马上要找工作了,所以又开始刷起来,觉得有必要记录一下做一些题目时的想法,和记录下一些好的题目和discuss里好的方法...
  • haolexiao
  • haolexiao
  • 2016年12月06日 15:26
  • 1045

蓄水池抽样算法 (Reservoir Sampling Algorithm)

蓄水池抽样算法简介 蓄水池抽样算法随机算法的一种,用来从 N 个样本中随机选择 K 个样本,其中 N 非常大(以至于 N 个样本不能同时放入内存)或者 N 是一个未知数。其时间复杂度为 O(N)...
  • DT1105461889
  • DT1105461889
  • 2016年12月29日 21:06
  • 423

面试题 从很长的数据流等概率随机采样 蓄水池抽样 Reservoir Sampling

题目:有一个网页抓取器每秒钟抓取一个网页,定义一个API,每次调用的时候要等概率的从目前已经抓取的网页中随机选取一个,应该怎么实现?分析:这题题目定义有一定迷惑性,最直接的思路貌似应该是先保存当前采集...
  • yangliuy
  • yangliuy
  • 2015年02月24日 11:47
  • 4741

Apache Sqoop使用

前言: 使用sqoop之前,一定要注意版本兼容性。所以在安装或者在使用Sqoop之前一定要关注下这块的内容,以免由于不兼容导致并非指令无法使用等情况。比如:我的HBase为1.2.1,hadoop为...
  • Mr_Lyang
  • Mr_Lyang
  • 2016年10月23日 10:44
  • 244

python学习第三章(字典dict)

python字典结构及其相关使用方法
  • Mr_Lyang
  • Mr_Lyang
  • 2016年07月04日 20:17
  • 427

蓄水池采样算法(Reservoir Sampling)

蓄水池采样算法:问题描述:采样问题经常会被遇到,比如: 从 100000 份调查报告中抽取 1000 份进行统计。 从一本很厚的电话簿中抽取 1000 人进行姓氏统计。 从 Google 搜索 “Ke...
  • DatingLi
  • DatingLi
  • 2017年03月12日 15:09
  • 285

大数据工程师必备之蓄水池抽样算法

做大数据的同学经常会有这样的需求: 给出一个数据流,这个数据流的长度很大或者未知。并且对该数据流中数据只能访问一次。请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等。 或者也可以这么说...
  • bitcarmanlee
  • bitcarmanlee
  • 2016年10月01日 22:47
  • 3123

HBase数据导入方法总结(续)

引言本文将接着上一篇博文继续介绍剩下的几种HBase数据导入方法。分别是: MapReduce Job(TableReducer) Importtsv(unbulk load) bulk load(I...
  • Mr_Lyang
  • Mr_Lyang
  • 2016年07月17日 22:08
  • 890
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Reservior Sampling(蓄水池采样) in Data Streams
举报原因:
原因补充:

(最多只允许输入30个字)