Frequency Estimation

前言

大数据统计中的频率估计问题,即求一个元素出现的次数。和Cardinality Estimation场景相似,面临着内存开销大的问题,不适合直接存储原始数据。本篇文章介绍解决这个问题的一个算法,Count-Min Sketch

算法

Count-Min Sketch 算法是在论文An Improved Data Stream Summary:
The Count-Min Sketch and its Applications
中阐述的,下面介绍的算法流程精度均参考自该论文,相关证明请参考原文。

流程

在这里插入图片描述
算法流程:

  1. 创建二维数组,count[d, w],每一位初始化为0。
  2. d个hash函数, h 1 h_1 h1 . . . h d h_d hd : {1 . . . n} → {1 . . . w}。
  3. 输入元素( i t i_t it, c t c_t ct),更新二维数组:count[ j j j, h j h_j hj ( i t i_t it)] ← count[ j j j, h j h_j hj( i t i_t it)] + c t c_t ct,此过程如上图所示。
  4. 查询某个元素出现频率,等于 min j j j count[ j j j, h j h_j hj( i i i)]。

简单理解,Count-Min Sketch算法使用d个长度为w的一维数组,对于每个输入元素( i t i_t it, c t c_t ct),分别用d个hash函数处理,每个hash函数的处理结果进入对应的一维数组w的位置,如上图所示。由于hash函数的使用,不同元素会产生冲突,导致统计增大,为了减少这种误差,取二维数组count[ j j j, h j h_j hj( i i i)]的最小值。

精度

从上面的算法流程中,可以初略看出,二维数组的dw越大,hash冲突的概率越低,结果的精度也越高。论文An Improved Data Stream Summary:
The Count-Min Sketch and its Applications
也给出了相应的结论和证明,这里我们仅看下结论

  1. 最小值
    在这里插入图片描述
    在这里插入图片描述
    如上图(取自论文),我们取数组count[ j j j, h j h_j hj( i i i)]的最小值估算元素出现频率时,有1 − δ的信心, a ˆ i aˆ_i aˆi a i a_i ai + ε ∣ ∣ a ∣ ∣ 1 ε||a||_1 εa1
    上面的δε跟二维数组中的dw相关,如下
    在这里插入图片描述
  2. 中位数
    论文中还给出了一个和数组count[ j j j, h j h_j hj( i i i)]中位数相关的结论,如下
    在这里插入图片描述

实现及改进

实现

Count-Min Sketch的实现可以参考stream-lib CountMinSketch.javastream-lib ConservativeAddSketch.javaConservativeAddSketch做了点优化,更新时不只是count[ j j j, h j h_j hj( i t i_t it)] + c t c_t ct,不详解,查看代码。

改进

Count-Min Sketch算法的改进版本非常多,可以参考这篇Sketch调研

参考
1.An Improved Data Stream Summary: The Count-Min Sketch and its Applications
2.stream-lib CountMinSketch.java
3.stream-lib ConservativeAddSketch.java
4.Sketch调研

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值