Lecture 4 Hashing with real numbers and their big-data applications
在第一讲中,我们对Hash的印象是通过计算若干bit进行的快速访存方式。不过,在过去的几年里,大数据算法以有趣的方法使用着Hashing,即把Hash看做实数。例如,我们可能会把IP地址映射到[0,1]区间上。准确的来说,是[0,1]区间上的有理数。
估计一个大集合的元素个数
假设router想要记录上个小时内不同的IP地址的访问次数。但是为了知道哪些访问是不同的,似乎就得把所有见过的IP都存下来,这个开销太大了。
想法:选择k个随机哈希函数 h 1 , . . . , h k h_1,...,h_k h1,...,hk将128bit映射到[0,1]上的随机实数。维护k个寄存器,初始为0;当IP地址x到来时,计算 h i ( x ) h_i(x) hi(x),如果 h i ( x ) h_i(x) hi(x)比当前存储在第i个寄存器的值小,则将其更新为 h i ( x ) h_i(x) hi(x).
令 Y i Y_i Yi为结束时第i个寄存器的内容,其为一个随机变量,因为哈希函数是随机的。假设不同的IP地址数量为N,我们希望用 Y i Y_i Yi来估算N.
定理: E Y i = 1 N + 1 , V a r Y i = 1 ( N + 1 ) 2 EY_i =\frac{1}{N+1}, Var Y_i =\frac{1}{(N+1)^2} EYi=N+11,VarYi=(N+1)21.
直觉上,N个随机[0,1]的最小值应该在1/N左右
注意到 P r [ Y i ≤ z ] = ( 1 − z ) N Pr[Y_i\leq z]=(1-z)^N Pr[Yi≤z]=(1−z)N,因此使用尾分布, E [ Y i ] = ∫ 0 1 ( 1 − z ) N d z = 1 N + 1 E[Y_i]=\int_0^1 (1-z)^N dz=\frac{1}{N+1} E[Yi]=∫01(1−z)Ndz=N+11
由于我们随机选择了k个随机哈希函数,因此 Y i Y_i Yi独立同分布。求其平均 Y ‾ \overline{Y} Y即为对1/N+1一个比较好的估计(方差缩小到 1 ( N + 1 ) 2 k \frac{1}{(N+1)^2k} (N+1)2k1)。考虑切比雪夫不等式, P r ( ∣ X − E X ∣ ≥ c σ ) ≤ 1 c 2 Pr(|X-EX|\geq c\sigma)\leq \frac{1}{ c^2} Pr(∣X−EX∣≥cσ)≤c21,因此取 1 / k = ϵ 2 1/k=\epsilon^2 1/k=ϵ2时标准差是 ϵ / N + 1 \epsilon/N+1 ϵ/N+1,从而估计的近似比在 ϵ \epsilon ϵ的概率是常数。
当然,我们现在都假设哈希函数是完全随机的。下面我们证明将其改为之前定义的逐对独立族,我们的估计也至多改变常数倍。
引理:容斥bound
∑ i P r [ A i ] − ∑ i , j P r [ A i ∧ A j ] ≤ P r [ A 1 ∨ A 2 . . . ∨ A n ] ≤ ∑ i P r [ A i ] \sum_i Pr[A_i]-\sum_{i,j} Pr[A_i\wedge A_j]\leq Pr[A_1\vee A_2...\vee A_n]\leq \sum_i Pr[A_i] ∑iPr[Ai]−∑i,jPr[Ai∧Aj]≤Pr[A1∨A2...∨An]≤∑iPr[Ai]
由于相互独立性,我们有:
1
≥
P
r
[
∃
x
:
h
(
x
)
≤
1
N
]
≥
N
×
1
N
−
(
N
2
)
1
N
2
≥
1
2
1\geq Pr[\exists x: h(x)\leq \frac{1}{N}]\geq N\times \frac{1}{N}-\binom{N}{2} \frac{1}{N^2}\geq \frac{1}{2}
1≥Pr[∃x:h(x)≤N1]≥N×N1−(2N)N21≥21
使用一些其他技巧,我们可以证明对于2-pairwise id family,至少有1/2的概率让N个Hash的min落在区间
[
1
3
N
,
3
N
]
[\frac{1}{3N},\frac{3}{N}]
[3N1,N3]中,这也是一个不错的估计。利用这个bound,我们可以计算使得k个min落在界
[
1
3
x
,
3
x
]
[\frac{1}{3x},\frac{3}{x}]
[3x1,x3]中的最大似然x。
估计文件相似度
在网络上如何检测两个文件是否相似?考虑similarity hashing的方法,可以为两个文件做画像,但同时保留一些语法成分。
把文件看成出现在其中的单词集合,Jaccard 相似度定义为 ∣ A ∩ B ∣ ∣ A ∪ B ∣ \frac{|A\cap B|}{|A\cup B|} ∣A∪B∣∣A∩B∣,因此越接近1越相似。
Idea:选择一个随机哈希函数,把单词集合映射到[0,1]中。定义集合A的hash是 min h ( x ) , x ∈ A \min h(x), x\in A minh(x),x∈A. 我们注意到 P r [ h a s h ( A ) = h a s h ( B ) ] Pr[hash(A)=hash(B)] Pr[hash(A)=hash(B)]恰好就是Jaccard相似度:注意到如果元素 x ≠ y x\neq y x=y,那么当哈希函数实值时, P r [ h ( x ) = h ( y ) ] = 0 Pr[h(x)=h(y)]=0 Pr[h(x)=h(y)]=0. 因此,hash相等当且仅当恰好是 A ∩ B A\cap B A∩B中的元素达到了最小值,而一共是对 A ∪ B A\cup B A∪B个元素求了hash值,因此 P r [ h a s h ( A ) = h a s h ( B ) ] = ∣ A ∩ B ∣ ∣ A ∪ B ∣ Pr[hash(A)=hash(B)]=\frac{|A\cap B|}{|A\cup B|} Pr[hash(A)=hash(B)]=∣A∪B∣∣A∩B∣.
由于我们关注的是重复文件,我们定义文件重复,如果其距离 ≥ 0.9 \geq 0.9 ≥0.9. 那么,我们只要计算k对hash,并且标记这对文件,如果有 0.9 − ϵ 0.9-\epsilon 0.9−ϵ比例的hash碰撞了。根据Chernoff bound,当 k = Ω ( 1 / ϵ 2 ) k=\Omega(1/\epsilon^2) k=Ω(1/ϵ2)时,这将所有 ≥ 0.9 \geq 0.9 ≥0.9相似度的文件都标记了,而且不标记 < 0.9 − 3 ϵ <0.9-3\epsilon <0.9−3ϵ的文件。
当然,回到现实情况,我们要考虑k-pairwise Hash. Indyk证明了只需要使用 Ω ( log ( 1 / ϵ ) ) \Omega(\log (1/\epsilon)) Ω(log(1/ϵ))-wise Hash即可以精度 ϵ \epsilon ϵ分辨Jaccard近似度。