`
wss71104307
  • 浏览: 222982 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Reservoir Sampling

阅读更多

随即抽样问题:

 

    要求从N个元素中随机的抽取k个元素,其中N无法确定。

 

  是在 《计算机程序设计与艺术》 中看到的这个题目,书中只给出了解法,没给出证明。

 

  解决方法是叫Reservoir Sampling (蓄水池抽样)

 

 

                       Init : a reservoir with the size: k

 

                       for   i= k+1 to N

                              M=random(1, i);

                              if( M < k)

                                      SWAP the Mth value and ith value

                        end for

 

 

证明:

 

每次都是以 k/i 的概率来选择
例: k=1000的话, 从1001开始作选择,1001被选中的概率是1000/1001,1002被选中的概率是1000/1002,与我们直觉是相符的。
 
接下来证明:
     假设当前是i+1, 按照我们的规定,i+1这个元素被选中的概率是k/i+1,也即第 i+1 这个元素在蓄水池中出现的概率是k/i+1
     此时考虑前i个元素,如果前i个元素出现在蓄水池中的概率都是k/i+1的话,说明我们的算法是没有问题的。
   
对这个问题可以用归纳法来证明:k < i <=N
   1.当i=k+1的时候,蓄水池的容量为k,第k+1个元素被选择的概率明显为k/(k+1), 此时前k个元素出现在蓄水池的概率为 k/(k+1), 很明显结论成立。
   2.假设当 j=i 的时候结论成立,此时以 k/i 的概率来选择第i个元素,前i-1个元素出现在蓄水池的概率都为k/i。  
      证明当j=i+1的情况:
      即需要证明当以 k/i+1 的概率来选择第i+1个元素的时候,此时任一前i个元素出现在蓄水池的概率都为k/(i+1).
前i个元素出现在蓄水池的概率有2部分组成, ①在第i+1次选择前得出现在蓄水池中,②得保证第i+1次选择的时候不被替换掉
       ①.由2知道在第i+1次选择前,任一前i个元素出现在蓄水池的概率都为k/i
       ②.考虑被替换的概率:  
首先要被替换得第 i+1 个元素被选中(不然不用替换了)概率为 k/i+1,其次是因为随机替换的池子中k个元素中任意一个,所以不幸被替换的概率是 1/k,故
       前i个元素中任一被替换的概率 = k/(i+1) * 1/k = 1/i+1
       则没有被替换的概率为:   1 - 1/(i+1) = i/i+1
综合① ②,通过乘法规则
得到前i个元素出现在蓄水池的概率为 k/i * i/(i+1) = k/i+1
  故证明成立

分享到:
评论
2 楼 wss71104307 2010-10-20  
米牛牛 写道
谢谢!

另外关于最后一段的证明、是否可以将【前i个元素】改为【池中元素】?


。。。。。
①.由2知道在第i+1次选择前,任一前i个元素出现在蓄水池的概率都为k/i
       ②.考虑被替换的概率:  
首先要被替换得第 i+1 个元素被选中(不然不用替换了)概率为 k/i+1,其次是因为随机替换的池子中k个元素中任意一个,所以不幸被替换的概率是 1/k,故
       前i个元素(池中元素)中任一被替换的概率 = k/(i+1) * 1/k = 1/i+1
       则(池中元素中)没有被替换的概率为:   1 - 1/(i+1) = i/i+1
综合① ②,通过乘法规则
得到前i个元素出现在蓄水池的概率为 k/i * i/(i+1) = k/i+1
  故证明成立

对的就是这个意思
1 楼 米牛牛 2010-10-13  
谢谢!

另外关于最后一段的证明、是否可以将【前i个元素】改为【池中元素】?


。。。。。
①.由2知道在第i+1次选择前,任一前i个元素出现在蓄水池的概率都为k/i
       ②.考虑被替换的概率:  
首先要被替换得第 i+1 个元素被选中(不然不用替换了)概率为 k/i+1,其次是因为随机替换的池子中k个元素中任意一个,所以不幸被替换的概率是 1/k,故
       前i个元素(池中元素)中任一被替换的概率 = k/(i+1) * 1/k = 1/i+1
       则(池中元素中)没有被替换的概率为:   1 - 1/(i+1) = i/i+1
综合① ②,通过乘法规则
得到前i个元素出现在蓄水池的概率为 k/i * i/(i+1) = k/i+1
  故证明成立

相关推荐

    开源项目-miku-rsampling.zip

    这个项目的核心是实现Reservoir Sampling算法,这是一种在大数据集上进行无偏随机抽样的算法,尤其适用于内存限制的环境。下面我们将深入探讨Reservoir Sampling算法、其原理以及在命令行中的应用。 Reservoir ...

    random sampling with reservior

    本文探讨了在数据集大小未知的情况下进行随机抽样的问题,并提出了一种高效的方法——水库抽样算法(Reservoir Sampling Algorithm)。该算法能够在一次遍历过程中,利用常数空间复杂度选取一个不放回的随机样本,...

    Algorithm-RandomPicker.zip

    例如,在大数据集上进行随机选择时,一次性加载所有数据可能不切实际,这时就需要采用更高效的策略,如 reservoir sampling 或者使用伪随机数序列。 Reservoir Sampling 是一种在未知大小的数据流中进行随机采样的...

    关于数据挖掘取样方式的若干分析.pdf

    均匀取样的验证方法主要包括reservoir sampling和Bernoulli sampling。Reservoir sampling通过生成均匀的取样集,以特定概率选中数据流中的元素,并在样本集大小超过预设值时,以相同的概率替换掉旧样本,保持样本集...

    machine learning C# 机器学习

    它特别适用于那些数据量太大以至于无法一次性加载到内存中的情况,可以通过 Reservoir Sampling 技术高效地选取代表性样本。 7. 机器学习资源与教育:文档提到了机器学习相关的教程和资源,包括 Syncfusion 出版社...

    VitterReservoirSampling:Vitter 的水库采样算法

    Vitter的水库采样算法(Reservoir Sampling)是一种在大数据集上进行随机抽样的高效算法,由Jeffrey Scott Vitter于1985年提出。这个算法在处理大数据流时特别有用,因为它允许在固定内存空间内对任意大小的数据流...

    数据挖掘取样方法研究.pdf

    该文档中提到了几种具有代表性的取样算法,包括蓄水池取样(reservoir sampling)、简洁取样(concise sampling)、计数取样(count sampling)、链式取样(chain-sampling)和DV取样(DVsampling)等。蓄水池取样常...

    LeetCode最全代码

    ...The number of questions is increasing recently. Here is the classification of all `468` questions. ...I'll keep updating for full summary and better solutions....|-----|---------------- | --------------- |...

    抽样:Clojure中的随机抽样

    本文将深入探讨Clojure中实现随机抽样的方法,主要关注Reservoir Sampling和Stream Sampling两种策略。 首先,让我们了解什么是随机抽样。随机抽样是指在不破坏总体分布的前提下,从一个较大的数据集中抽取一部分...

    大数据技术之高频面试题.docx

    大数据技术之高频面试题 大数据技术是指处理和分析大量数据的技术,包括数据存储、数据处理、数据分析和数据...* Down sampling可以使用多种算法和技术,例如随机采样、 Stratified Sampling和Reservoir Sampling等。

    求解 AUC 优化问题的对偶坐标下降方法1

    OAM(Online Active Margin)是使用reservoir sampling技术的在线方法,虽然在AUC性能上有优势,但存在收敛速度慢和参数选择困难的问题。文章通过理论分析证明了OAM是AUC-DCD的一个特例,并通过实验展示了AUC-DCD在...

    Rust实现的 水库采样(算法R)

    本项目专注于一个特定的算法实现,即“水库采样(Reservoir Sampling)”,它是一种在未知大小的大数据集中进行随机采样的方法。Rust语言的实现使得这个算法在处理大量数据时能保持高效和稳定。 水库采样算法R是一...

    本Demo将演示一段随机挑选函数代码的性能升级之旅

    3. **利用概率统计**:如果x非常大,而y相对较小,可以使用概率方法,如“ reservoir sampling”算法,这是一种在线算法,能够在O(n)的时间复杂度内从n个元素中随机抽取k个不重复的元素。 4. **优化数据结构**:...

    微软面试15题

    18. 随机选取关键字:使用 reservoir sampling 技术,可以在流式数据中实现O(1)时间复杂度的随机采样。 19. 判断平方数:可以使用牛顿迭代法或其他平方根估算方法。 20. 生成随机整数:通过调用给定函数多次,利用...

    抽奖系统源码

    对于加权抽奖,可能需要使用更复杂的随机数生成策略,例如Fisher-Yates洗牌算法或Weighted Reservoir Sampling算法。 5. **概率控制**:如果奖品有不同概率,需要确保抽中的概率符合设定。这需要在随机数生成时考虑...

    基于计算机网络的大数据随机样本模型建立研究.pdf

    通过设定一定的抽样比例(如T/5行数据),并采用蓄水池理论算法(reservoir sampling algorithm),实现每行数据的随机抽样。该方法允许在不重复采集的情况下,每个样本具有相同的选中概率。同时,模型还支持主动...

    斯坦福大学Robert Sedgewick《算法4 》源码

    8. **随机化算法**:如鸽巢原理、快速幂运算、Reservoir Sampling等,展示了随机化方法在解决计算问题中的独特优势。 9. **图论与网络流**:如最大流问题、最小割问题,以及Ford-Fulkerson算法和Edmonds-Karp算法的...

    微软谷歌等各大公司面试题目

    18. **随机选取关键字**:使用 reservoir sampling 技术。 19. **判断平方数**:可以通过检查平方根的整数部分是否等于原始数。 20. **生成随机整数**:利用已有的随机数生成器,通过组合和映射达到目标范围。 21...

    算法作业 SA15011143 张艺玮1

    它使用了一种称为“Reservoir Sampling”的方法,通过随机抽取并替换集合中的元素,最终得到一个近似于原集合大小的平方根的样本大小。这种方法对于大数据集尤其有用,因为它可以在不存储整个集合的情况下得到近似值...

    高级随机算法

    在实现过程中,可以使用哈希函数快速确定样本,这种方法被称为 reservoir sampling,特别适用于在线处理大数据流。直接读取后台数据源不仅简化了过程,还能确保采样的实时性和一致性。 这些随机算法的高效实现往往...

Global site tag (gtag.js) - Google Analytics