【发布时间】:2011-07-25 02:46:09
【问题描述】:
有人可以解释计数草图算法的工作原理吗?例如,我仍然无法弄清楚如何使用哈希。我很难理解this paper。
【问题讨论】:
标签: algorithm streaming frequency-analysis
有人可以解释计数草图算法的工作原理吗?例如,我仍然无法弄清楚如何使用哈希。我很难理解this paper。
【问题讨论】:
标签: algorithm streaming frequency-analysis
此流式算法实例化以下框架。
找到一种随机流算法,其输出(作为随机变量)具有期望的期望,但通常具有高方差(即噪声)。
为了减少方差/噪声,并行运行多个独立副本并合并它们的输出。
通常 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,其中Y 是as 总和的变化,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
+++
+--
-+-
--+
我会把新的计算留给你。
【讨论】:
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 位内存!幸运的是,正如你所说,我们可以少得多(四个独立)来计算草图。
Count Sketch 是一个probabilistic data structure,可让您回答以下问题:
读取元素流a1、a2、a3、...、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。另一个有趣的事情是,这个值总是被高估(如果你找到了这个值,它很可能比实际值大,但肯定不会更小)。
【讨论】: