随机抽样-蓄水池算法
来源:互联网 发布:魔兽世界 7.0 数据库 编辑:程序博客网 时间:2024/04/28 18:19
问题定义可以简化如下:在不知道文件总行数的情况下,如何从文件中随机的抽取一行?
首先想到的是我们做过类似的题目吗?当然,在知道文件行数的情况下,我们可以很容易的用C运行库的rand函数随机的获得一个行数,从而随机的取出一行,但是,当前的情况是不知道行数,这样如何求呢?我们需要一个概念来帮助我们做出猜想,来使得对每一行取出的概率相等,也即随机。这个概念即蓄水池抽样(Reservoir Sampling)。
有了这个概念,我们便有了这样一个解决方案:定义取出的行号为choice,第一次直接以第一行作为取出行 choice ,而后第二次以二分之一概率决定是否用第二行替换 choice ,第三次以三分之一的概率决定是否以第三行替换 choice ……,以此类推。
这种方法的巧妙之处在于成功的构造出了一种方式使得最后可以证明对每一行的取出概率都为1/n(其中n为当前扫描到的文件行数),换句话说对每一行取出的概率均相等,也即完成了随机的选取。
回顾这个问题,我们可以对其进行扩展,即如何从未知或者很大样本空间随机地取k个数?
类比下即可得到答案,抽取的每条记录以行号标示。即先把前k个数放入蓄水池(概率1),对第p条数据(其中p为当前扫描到的文件行数),我们以k/p概率决定是否要把它换入蓄水池,换入时随机的选取一个作为替换项,这样一直做下去,对于任意的样本空间n,对每个数的选取概率都为k/n。也就是说对每个数选取概率相等。
0 0
- 蓄水池随机抽样算法
- 随机抽样-蓄水池算法
- 蓄水池抽样算法 & 随机洗牌算法
- 随机算法之蓄水池抽样问题
- 等概率随机抽样问题 || 蓄水池抽样算法
- 随机抽样——蓄水池抽样算法(Reservoir Sampling)
- 蓄水池随机抽样
- 海量数据等概率随机抽样-蓄水池算法
- 海量数据等概率随机抽样-蓄水池算法
- 双端队列、随机队列、蓄水池抽样算法
- 蓄水池抽样算法
- 蓄水池抽样算法
- 蓄水池抽样 分类: 算法
- Sampling 蓄水池抽样算法
- 蓄水池抽样算法
- 蓄水池抽样算法
- 蓄水池抽样算法
- 蓄水池抽样算法证明
- git还原某个特定的文件到之前的版本
- Bitmap的详细操作
- ajax async的取值
- Spring之JMS之接受消息
- 小事.买房
- 随机抽样-蓄水池算法
- Android自定义相机(一)
- Node.js在MySQL中存储数据 & 创建连接池
- java 中Protect 关键字
- 博弈论
- Android Notification通知
- html 中增加title属性
- UE4使用C++创建枚举变量适用于C++与蓝图
- python 读取excel数据