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(蓄水池采样) in Data Streams

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

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

蓄水池采样算法(Reservoir Sampling)

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

蓄水池抽样(Reservoir Sampling)

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

Reservoir Sampling - 蓄水池抽样

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

Reservoir Sampling 蓄水池抽样

Reservoir Sampling:从N个数中随机抽取k个元素,保证每个元素被选中的概率相等,N不知道有多大。 分析:这个问题称为蓄水池抽样,经典方法: Init : a reservo...
  • hqh45
  • hqh45
  • 2016-05-22 22:19
  • 271

Reservoir Sampling - 蓄水池抽样

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

Sampling 蓄水池抽样算法

昨天面试,面试官问了我一道这样的题,没有回答出来,现在来总结一下。 Sampling 蓄水池抽样 主要是用来解决等概率选取问题,如果给你一个数组的数据,但是不知道的他的长度,而且每个数据只能访问一...

有关蓄水池抽样(Reservoir Sampling)

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

蓄水池抽样

如何等概率的从N个元素中选取出K个元素? 这个问题就是一个蓄水池抽样(Reservoir Sampling),算法可以如下描述:  Init : a reservoir with ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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