CDN笔记一 Locality Sensitive Hashing算法

本篇笔记基于文章Similarity search in high dimensions via hashing。

历史

locality-sensetive hashing 局部敏感哈希,简称为LSH,最早由Indyk于1998年提出 [ 1 ] ^{[1]} ,1999年被用于解决高维度海量数据的近似查找 [ 2 ] ^{[2]}

近邻查找

先来看看什么是k-NN和 ϵ \epsilon -NN问题。

k-NN问题指对于一个点集P和一个特定点q,寻找点集P中距点q最近的k个点。

ϵ \epsilon -NN问题指对于一个点集P和一个特定点q,假定点集P距离点q最近的点为p,寻找点集P中所有与点q距离在d(p,q)到 ( 1 + ϵ ) d ( p , q ) (1+\epsilon)d(p,q) 的点。

LSH算法

我们知道哈希算法目标是减少冲突方便快速查找。当维度很高,数据量很大的情况下,对于kNN问题,尽管一一匹配查找是线性的时间复杂度,计算成本也相当高。后续有人提出了KD tree,SR tree等等基于树形结构的搜索方案,但只能适用于低维度数据。

LSH算法可以快速有效地近似查找高维度海量数据。原理很简单,如果两个数据在高维空间中距离相近,则他们的哈希值有很大概率是一样的,反之如果两个数据在高维空间中距离较远,则他们的哈希值一样的概率非常小。

LSH哈希函数的定义如下:
p B ( q , r 1 ) P r [ h ( q ) = h ( p ) ] p 1 若p \in B(q,r_1),则Pr[h(q) = h(p)] \geq p_1
p B ( q , r 2 ) P r [ h ( q ) = h ( p ) ] p 2 若p \notin B(q,r_2),则Pr[h(q) = h(p)] \leq p_2
B(q,r) 表示以q为圆心,半径为r的空间,且 r 1 r 2 r_1 \leq r_2 p 1 p 2 p_1 \geq p_2
在这里插入图片描述

哈曼顿距离下的LSH哈希函数

一般我们用欧式距离作为距离,也即l2 norm。这篇文章中用哈曼顿距离,l1 norm。作者解释实验两者kNN的结果差不多(据说其实是当时欧式距离下的哈希函数还不知道)。作者做了两个假设:使用L1 norm进行度量,所有坐标被正整数化。

这里做了一个取巧,将哈曼顿距离转化为汉明距离后,求的实际上是汉明距离下的LSH。真正针对曼哈顿距离和欧式距离的LSH会在几年后提出。

汉明距离的定义是两个相同长度字符串不同的位数,比如说011和010,不同为一位,距离为1。

先将哈曼顿距离转化为汉明距离,令C为坐标中最大的坐标值,n为空间维度。对于点 p ( x 1 , x 2 ) p(x_1,x_2) ,转化为一个长度为nC的一元二进制向量: v ( p ) = U n a r y ( x 1 ) U n a r y ( x 2 ) v(p) = Unary(x_1)Unary(x_2) Unary(x)是一串长度为C的二进制汉明码,前x位为1,后C-x位为0,比如C=4,x=2,Unary(2) =1100。

定义一族哈希函数H:
对于 h H h \in H ,如果 v ( p ) v(p) 第r位为1,则h(p,r) = 1,如果 v ( p ) v(p) 第r位为0,则h(p,r) = 0。
其中r是1到nC之前随机产生的正整数。

例子:
v ( p ) = 11001000 v(p) = 11001000
对于某一族 g 1 = h 1 , h 2 g_1={h_1,h_2} h 1 h_1 抽取第一位, h 2 h_2 抽取第四位,那么这一个哈希表中总共有4个哈希堆,00,01,10,11,则点P属于10这一个bucket。

来看看这族哈希函数是否满足LSH:
考虑两个长度为nl的一元向量p和q,汉明距离为d,则它们被哈希成相同哈希值的概率为 n l d n l \frac{nl-d}{nl} ,转化为概率与距离的关系是一条下降的线段,满足LSH哈希函数的定义。

Reference:
[1] Approximate nearest neighbors: towards removing the curse of dimensionality
[2] Similarity search in high dimensions via hashing

猜你喜欢

转载自blog.csdn.net/thormas1996/article/details/83323691