CS521 Advanced Algorithm Design 学习笔记(四)Hashing with real numbers and their big-data applications

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[Yiz]=(1z)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(1z)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(XEXcσ)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[AiAj]Pr[A1A2...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} 1Pr[x:h(x)N1]N×N1(2N)N2121
使用一些其他技巧,我们可以证明对于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|} ABAB,因此越接近1越相似。

Idea:选择一个随机哈希函数,把单词集合映射到[0,1]中。定义集合A的hash是 min ⁡ h ( x ) , x ∈ A \min h(x), x\in A minh(x),xA. 我们注意到 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 AB中的元素达到了最小值,而一共是对 A ∪ B A\cup B AB个元素求了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)]=ABAB.

由于我们关注的是重复文件,我们定义文件重复,如果其距离 ≥ 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.93ϵ的文件。

当然,回到现实情况,我们要考虑k-pairwise Hash. Indyk证明了只需要使用 Ω ( log ⁡ ( 1 / ϵ ) ) \Omega(\log (1/\epsilon)) Ω(log(1/ϵ))-wise Hash即可以精度 ϵ \epsilon ϵ分辨Jaccard近似度。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值