在数据流处理中的一个常见问题就是数据采样问题。我们希望从流中选择一个子集,以便能够对它进行查询并给出统计性上对整个流具有代表性的结果。
一、蓄水池采样
具体问题是我们要从数据流中随机抽取k个元素。如果数据流长度m事先已经知道,那这个问题就非常简单,每个元素以k/m的概率选取即可。但这个问题要求m未知,那就不太好搞了。这个问题的解法是保存一个k大小的窗口。数据流的前k个元素依次加入到窗口。对于数据流第i个元素(i>k),以k/i的概率替换窗口中的某个元素。最终窗口的元素出现概率均为k/m。
下面使用数学归纳法给出该算法合理性的简单证明。
1.假设i=1,元素被选中的概率为1;
2.设前i个元素被选中的概率为k/i。对于第i+1个元素,我们以k/i+1的概率替换窗口中的元素。其中k/i为某个元素在第i+1个元素来到前被选中的概率。如果第i+1个元素替换窗口内的元素,则以1/k的概率从窗口选一个元素去除,将第i+1个元素添加进去。计算出的结果表明元素仍存在窗口的概率为k/(i+1)。得证。
二、一个实际例子(来自mining m

本文探讨了在数据流处理中的采样问题,重点介绍了蓄水池采样方法。当数据流长度未知时,通过保持一个固定大小的窗口,以特定概率替换元素,确保最终窗口内元素的概率均等。文中还通过一个搜索引擎查询流的例子,说明了错误的采样方法可能导致统计偏差,并提出正确的采样策略——按用户而非查询进行采样。
最低0.47元/天 解锁文章
2635

被折叠的 条评论
为什么被折叠?



