文章插图
时间复杂度为O(n),空间复杂度为O(n).
2.4 蓄水池抽样从N个元素中随机等概率取出k个元素,N长度未知 。它能够在o(n)时间内对n个数据进行等概率随机抽取 。如果数据集合的量特别大或者还在增长(相当于未知数据集合总量),该算法依然可以等概率抽样.
伪代码:
文章插图
上述伪代码的意思是:先选中第1到k个元素,作为被选中的元素 。然后依次对第k+1至第N个元素做如下操作:
每个元素都有k/x的概率被选中,然后等概率的(1/k)替换掉被选中的元素 。其中x是元素的序号 。
proof:
每次都是以 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
故证明成立
如果m被选中,则随机替换水库中的一个对象 。最终每个对象被选中的概率均为k/n,证明如下:
证明:第m个对象被选中的概率=选择m的概率*(其后元素不被选择的概率+其后元素被选择的概率*不替换第m个对象的概率),即
文章插图
文章插图
因此,蓄水池抽样因为不需知道n的长度,可用于机器学习的数据集的划分,等概率随机抽样分为测试集和训练集 。
————————————————
原文链接:https://blog.csdn.net/qq_26399665/JAVA/article/details/79831490
【洗牌 面试遇到shuffle算法时,用这三种就够了】
推荐阅读
- 招聘|如何面试管理人员
- 一道头条面试题:如何实现 LRU 原理?
- 搞懂Android应用启动过程,再也不怕面试官了
- 空军|钓鱼遇到以下几种怪事,这是有征兆的吗?
- 职业教育|发朋友圈羡慕工资按时发放,被公司开除,网友:那是你没遇到00后
- iOS经典面试题
- 如果遇到暴雨洪水如何避免溺水 洪水过后会大旱吗
- 面试|太真实!职场的自尊能给我们带来什么?
- 翡翠|不要把翡翠认错了,当遇到这类物质时,不要多说赶快走开
- 如果mysql磁盘满了,会发生什么?还真被我遇到了