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是一个未知的很大的数目,而且无法将其载入主存中。...

蓄水池采样算法(Reservoir Sampling)

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

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

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

random sampling with reservior

  • 2010年06月19日 00:47
  • 1.44MB
  • 下载

Reservoir Sampling 蓄水池抽样 海量数据不知道总数只能遍历一次随机抽样问题

问题起源于编程珠玑Column 12中的题目10,其描述如下:    How could you select one of n objects at random, where you s...

蓄水池抽样(Reservoir Sampling)

在不知道文件总行数的情况下,如何从文件中随机的抽取一行?   首先想到的是我们做过类似的题目吗?当然,在知道文件行数的情况下,我们可以很容易的用C运行库的rand函数随机的获得一个行数,从而随机...

有关蓄水池抽样(Reservoir Sampling)和自己的一些思考

转自http://handspeaker.iteye.com/blog/1167092 最近在校论坛上看到了一个叫蓄水池(Reservoir Sampling )抽样的问题,感觉很有...

有关蓄水池抽样(Reservoir Sampling)

最近在校论坛上看到了一个叫蓄水池(Reservoir Sampling )抽样的问题,感觉很有趣,记录如下:   题目:要求从N个元素中随机的抽取k个元素,其中N无法确定。 解法...
  • relesn
  • relesn
  • 2011年10月17日 17:40
  • 335

大数据算法MOOC笔记3:水库抽样Reservoir Sampling(蓄水池问题)

知识复习 空间亚线性算法:由于大数据算法中涉及到的数据是海量的,数据难以放入内存计算,所以一种常用的处理办法是不对全部数据进行计算,而只向内存里放入小部分数据,仅使用内存中的小部分数据,就可以得到一个...

随机抽样——蓄水池抽样算法(Reservoir Sampling)

转自:http://www.cnblogs.com/HappyAngel/archive/2011/02/07/1949762.html 问题起源于编程珠玑Column 12中的题目10,其描述...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Reservior Sampling(蓄水池采样) in Data Streams
举报原因:
原因补充:

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