蓄水池抽样算法学习和应用

简介:

从一个问题引出

如何随机从n个对象中(这n个对象是按序排列的,但是在此之前你是不知道n的值的)随机选择一个对象?
具体来说,如何在实现不知道文本文件行数的情况下读取该文件,从中随机选择并输出一行?

这是《编程珠玑》中的一个习题,如果我们知道n的值,那么问题就可以简单的用一个大随机数rand()%n得到一个确切的随机位置,那么该位置的对象就是所求的对象,选中的概率是1/n。
现在并不知道n的值,
我们总是选择第一个对象,以1/2的概率选择第二个,以1/3的概率选择第三个,以此类推,以1/m的概率选择第m个对象。当该过程结束时,每一个对象具有相同的选中概率,即1/n。

针对读取文本文件的例子,我们总选择第1行,并以概率1/2选择第2行,以1/3的概率选择第3行,
依此类推,在这一过程结束时,每一行的选中概率是相等的,都是1/n,其中n是文件的总行数。

给出伪代码:

1
2
3
4
5
i= 0
while  more input lines
     with probaility  1 /++i
       choice= this  input line
print choice

这个问题可以抽象到更普遍的情况,就是蓄水池抽样问题。

 

蓄水池抽样问题

从n个元素中随机抽取k个元素,但n的个数无法事先确定。
在实际应用中,往往会遇到很大数据流的情况。因此,我们无法先保存整个数据流然后再从中选取,而是期望有一种将数据流遍历一遍就得到所选取的元素,并且保证得到的元素是随机的算法。
上面的问题就是k=1的的蓄水池抽样问题。

看一下解决蓄水池抽样问题的算法:

1.先选取n个元素中的前k个元素,保存在集合A中;

2.即从第k+1个元素开始,
每次先以k/(k+1)概率选择该元素,以k/(k+2)的概率选择第k+2个元素,
以此类推,以k/m的概率选择第j个对象(k+1<=m<=n)。
如果第m个元素被选中,则从A中随机选择一个元素并用元素m替换它;否则直接淘汰元素m;
最终每个对象被选中的概率均为k/n。

证明如下:

 

蓄水池抽样算法的典型应用

给定一个长度为N且没有重复元素的数组arr和一个整数M,实现函数等概率随机打印arr中的M个数。

首先在0~n-1中随机得到一个位置a,打印arr[a],然后把arr[a]和数组最后位置的arr[n-1]交换;
然后在0~n-2中随机得到一个位置b,然后把arr[b]和数组最后位置的arr[n-2]交换,

arr:{0,1,2,3,...,b,...,n-2},n-1,

依此类推,直到打印m个数即可。




本文转自邴越博客园博客,原文链接:http://www.cnblogs.com/binyue/p/3779186.html,如需转载请自行联系原作者
相关文章
|
24天前
|
机器学习/深度学习 存储 算法
sklearn应用线性回归算法
sklearn应用线性回归算法
24 0
|
1月前
|
存储 算法 测试技术
ArrayList集合的两个实例应用,有趣的洗牌算法与杨辉三角
ArrayList集合的两个实例应用,有趣的洗牌算法与杨辉三角
23 1
|
1月前
|
算法 前端开发 数据可视化
数据结构与算法在前端开发中的实际应用
本文将探讨数据结构与算法在前端开发中的实际应用,重点介绍在处理大规模数据、优化性能和提升用户体验方面的具体场景和解决方案。
|
2月前
|
机器学习/深度学习 数据采集 搜索推荐
Paper Digest | 突破个性化推荐数据稀疏性:长尾增强的图对比学习算法研究
本文提出了一种新的长尾增强的图对比学习方法(LAGCL),该方法促使模型同时兼顾头部节点与尾部节点之间的知识,并通过长尾增强技术来使模型产出更均匀更准确的节点表征,从而改进基于 GNN 的推荐任务。
|
1月前
|
机器学习/深度学习 算法 数据库
KNN和SVM实现对LFW人像图像数据集的分类应用
KNN和SVM实现对LFW人像图像数据集的分类应用
33 0
|
5天前
|
机器学习/深度学习 算法 前端开发
Scikit-learn进阶:探索集成学习算法
【4月更文挑战第17天】本文介绍了Scikit-learn中的集成学习算法,包括Bagging(如RandomForest)、Boosting(AdaBoost、GradientBoosting)和Stacking。通过结合多个学习器,集成学习能提高模型性能,减少偏差和方差。文中展示了如何使用Scikit-learn实现这些算法,并提供示例代码,帮助读者理解和应用集成学习提升模型预测准确性。
|
6天前
|
机器学习/深度学习 算法 Python
使用Python实现集成学习算法:Bagging与Boosting
使用Python实现集成学习算法:Bagging与Boosting
17 0
|
6天前
|
数据采集 算法 数据可视化
R语言聚类算法的应用实例
R语言聚类算法的应用实例
81 18
R语言聚类算法的应用实例
|
6天前
|
算法 数据可视化 数据挖掘
R语言社区主题检测算法应用案例
R语言社区主题检测算法应用案例
|
7天前
|
机器学习/深度学习 算法
R语言使用Metropolis- Hasting抽样算法进行逻辑回归
R语言使用Metropolis- Hasting抽样算法进行逻辑回归

热门文章

最新文章