【问题标题】:Explaining The Count Sketch Algorithm解释计数草图算法
【发布时间】:2011-07-25 02:46:09
【问题描述】:

有人可以解释计数草图算法的工作原理吗?例如,我仍然无法弄清楚如何使用哈希。我很难理解this paper

【问题讨论】:

    标签: algorithm streaming frequency-analysis


    【解决方案1】:

    此流式算法实例化以下框架。

    1. 找到一种随机流算法,其输出(作为随机变量)具有期望的期望,但通常具有高方差(即噪声)。

    2. 为了减少方差/噪声,并行运行多个独立副本并合并它们的输出。

    通常 1 比 2 更有趣。这个算法的 2 实际上有点不标准,但我只讲 1。

    假设我们正在处理输入

    a b c a b a .
    

    有了三个计数器,就不需要散列了。

    a: 3, b: 2, c: 1
    

    让我们假设我们只有一个。有八种可能的功能h : {a, b, c} -> {+1, -1}。这是结果表。

     h  |
    abc |  X = counter
    ----+--------------
    +++ | +3 +2 +1 =  6
    ++- | +3 +2 -1 =  4
    +-- | +3 -2 -1 =  0
    +-+ | +3 -2 +1 =  2
    --+ | -3 -2 +1 = -4
    --- | -3 -2 -1 = -6
    -+- | -3 +2 -1 = -2
    -++ | -3 +2 +1 =  0
    

    现在我们可以计算期望了

                (6 + 4 + 0 + 2) - (-4 + -6 + -2 + 0)
    E[h(a) X] = ------------------------------------ = 24/8 = 3
                                 8
    
                (6 + 4 + -2 + 0) - (0 + 2 + -4 + -6)
    E[h(b) X] = ------------------------------------ = 16/8 = 2
                                 8
    
                (6 + 2 + -4 + 0) - (4 + 0 + -6 + -2)
    E[h(c) X] = ------------------------------------ =  8/8 = 1 .
                                 8
    

    这里发生了什么?例如,对于a,我们可以分解X = Y + Z,其中Yas 总和的变化,Z 是非as 总和。根据期望的线性,我们有

    E[h(a) X] = E[h(a) Y] + E[h(a) Z] .
    

    E[h(a) Y] 是每次出现a 的项的总和,即h(a)^2 = 1,因此E[h(a) Y]a 的出现次数。另一个术语E[h(a) Z] 为零;即使给定h(a),每个其他哈希值也同样可能是正负一,因此预期贡献为零。

    事实上,散列函数不需要是统一随机的,好在:没有办法存储它。散列函数成对独立就足够了(任何两个特定的散列值都是独立的)。对于我们的简单示例,以下四个函数的随机选择就足够了。

    abc
    
    +++
    +--
    -+-
    --+
    

    我会把新的计算留给你。

    【讨论】:

    • 哇!仅仅发布了几个小时的问题,就有人对算法提出了更清晰的解释!非常感谢!!! :D
    • 你好@insomniac。这是否意味着我们需要事先知道集合,比如 O,其中 a、b 和 c 是 O 的元素?
    • @neilmarion 知道一个超集就足够了——可能有太多不同的项目来保持一个统一的随机散列函数。例如,如果数据项是 n 位向量,那么一开始我们可以选择一个随机的 n 位向量 r 并让 h(x) = 1 如果 r.x = 0 mod 2 并且 h(x) = -1 如果r.x = 1 mod 2,其中 .表示点积。
    • (我不确定成对随机性是否足以使有关方差的论点起作用,但这是可以使用的散列函数的风格。)
    • @insomniac 实际上,实用的哈希函数实际上可以很容易地成为“均匀随机”,即P[h(x)=y]=1/u 如果1 <= y <= u。问题是相互独立,从某种意义上说,P[h(x_1) = y_1 and ... and h(x_n) = y_n] = P[h(x_1) = y_1]...P[h(x_n) = y_n],正如你所说,需要n log u 位内存!幸运的是,正如你所说,我们可以少得多(四个独立)来计算草图。
    【解决方案2】:

    Count Sketch 是一个probabilistic data structure,可让您回答以下问题:

    读取元素流a1a2a3、...、an,其中可能有很多重复元素,您随时可以回答以下问题:如何到目前为止,你见过很多 ai 元素吗?


    只需维护从ai 到您迄今为止看到的那些元素的数量的映射,您就可以随时清楚地得到准确的答案。记录新的观察需要 O(1),检查给定元素的观察计数也是如此。但是,存储此映射需要 O(n) 空间,其中 n 是不同元素的数量。


    Count Sketch 将如何帮助您?与所有概率数据结构一样,您牺牲了空间的确定性。 Count Sketch 允许您选择两个参数:结果的准确性 (ε) 和错误估计的概率 (δ)。

    为此,您选择dpairwise-independent hash functions 的系列。这些复杂的词意味着它们不会经常发生碰撞(实际上,如果两个哈希都将值映射到空间 [0, m] 那么碰撞概率大约为 1/m^2)。这些哈希函数中的每一个都将值映射到空间 [0, w],因此您创建了一个 d * w 矩阵。

    当您读取该元素时,您计算该元素的每个 d 哈希值并更新草图中的相应值。这部分与Count Sketch和Count-min Sketch相同。

    Insomniac 很好地解释了 Count Sketch 的想法(计算期望值),所以我只想指出,使用 Count-min Sketch,一切都变得更加简单。您只需计算要获取的值的 d 哈希值并返回其中的最小值。令人惊讶的是,这提供了强大的准确性和概率保证,您可以find here

    增加散列函数的范围会增加结果的准确性,而增加散列的数量会降低错误估计的概率: ε = e/wδ=1/e^d。另一个有趣的事情是,这个值总是被高估(如果你找到了这个值,它很可能比实际值大,但肯定不会更小)。

    【讨论】:

    • 那么,count-sketch 和 min-count-sketch 算法都解决了相同的问题,但方式(略有)不同?
    猜你喜欢
    • 2018-03-17
    • 2013-01-08
    • 1970-01-01
    • 2022-01-05
    • 2019-05-05
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多