博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法学习之---蓄水池抽样问题
阅读量:5077 次
发布时间:2019-06-12

本文共 1094 字,大约阅读时间需要 3 分钟。

问题怎样在无限大的数据流中随机选取K个数据,保证当前遍历过的i个元素中每个元素被选中的概率均为 k/i?从而对于n个元素,每个元素被选中的概率均为 k/n。

解:对于前k个元素,我们直接选中放入一个虚拟的蓄水池中,对于第 k+1 个元素。我们用 k/(k+1) 的概率选中它。一旦选中了。就随机替换掉蓄水池中的某一个元素,这样前 k 个被选中的元素在第 k+1 个元素到来时依旧被选中的概率即为它不被替换掉的概率:

p = 1*(1-被替换掉的概率q)

         q = k/(k+1) * 1/k               #即前k个元素中某个元素被替换时,某个被替换的概率为 1/k

这样 p = k/(k+1)

     对于当前被遍历到的第 k+1 个元素,它被放到蓄水池中的概率就是它被选中的概率。即 k/(k+1),由于仅仅要它被选中,就一定会替换掉蓄水池中的某个元素而留在水池中。

     同理,对于第 m +1 个元素(m>>k)的到来。前m个元素被选中的概率均为 k/m。进行第 m+1 次选择时,前 m 个元素依旧保留在蓄水池中的概率为:

p = k/m * { 1 - [ k/(m+1) * 1/k ] } = k/(m+1)            #即 p=之前在水池中的概率*(1 - 被第m+1个元素替换替换掉的概率 )

或者 p = k/m * { (m+1-k)/(m+1) + [ k/(m+1) * (k-1)/k ] } = k/(m+1)    #即 p=之前在水池中的概率*(第m+1个元素未被选中的概率 + 第m+1个元素被选中可是替换了其它k-1个元素的概率)

代码实现时,遍历到第 i 个元素时(i>k),能够直接生成一个 (1,i)之间的随机数 r ,假设 r<=k,那么就让当前第 i 个元素替换蓄水池中的第 r 个元素就可以,把选中和替换哪一个元素融合为一步了,概率是不变的。即被选中的概率为 k/i。蓄水池中的 k 个元素每个被替换的概率也为 1/k 。

Init : a reservoir with the size: k        for i= k+1 to N            R=random(1, i);            if( R < k)                 SWAP the R th value and i th value       end for

參考:http://blog.csdn.net/lxmky/article/details/7951099

转载于:https://www.cnblogs.com/jhcelue/p/7206807.html

你可能感兴趣的文章
互联网模式下我们更加应该“专注”
查看>>
myeclipse集成jdk、tomcat8、maven、svn
查看>>
查询消除重复行
查看>>
Win 10 文件浏览器无法打开
查看>>
HDU 1212 Big Number(C++ 大数取模)(java 大数类运用)
查看>>
-bash: xx: command not found 在有yum源情况下处理
查看>>
[leetcode]Minimum Path Sum
查看>>
内存管理 浅析 内存管理/内存优化技巧
查看>>
hiho1079 线段树区间改动离散化
查看>>
【BZOJ 5222】[Lydsy2017省队十连测]怪题
查看>>
第二次作业
查看>>
【input】 失去焦点时 显示默认值 focus blur ★★★★★
查看>>
Java跟Javac,package与import
查看>>
day-12 python实现简单线性回归和多元线性回归算法
查看>>
Json格式的字符串转换为正常显示的日期格式
查看>>
[转]使用 Razor 进行递归操作
查看>>
[转]Android xxx is not translated in yyy, zzz 的解决方法
查看>>
docker入门
查看>>
Android系统--输入系统(十一)Reader线程_简单处理
查看>>
监督学习模型分类 生成模型vs判别模型 概率模型vs非概率模型 参数模型vs非参数模型...
查看>>