两点之间的距离可以用两种方式来衡量,一是几何距离,二是非几何距离。很显然距离的定义满足下面的条件:
几何距离包括:
非几何距离用的就比较多了:
这里有一个重要的公理:三角形公理(Triangle Inequality),也就是距离的第四个性质。编辑距离d(x,y) = |x| + |y| - 2|LCS(x,y)|,其中LCS是longest common subsequence,最长公共子序列。
LSH的一个核心思想就是两个元素哈希值相等的概率等于两个元素之间的相似度。
下面介绍一个重要概念:Hash Family,哈希家族?不管怎么翻译,它指的是能够判断两个元素是否相等(h(x) = h(y) )的Hash函数集合。LS Hash Family,局部敏感哈希家族的定义是满足下面两个条件的哈希函数家族:
啥子意思喃?就是如果x和y离得越近,Pr[h(p)=h(q)]就越大。如果x和y离得越远,Pr[h(p)=h(q)]就越小。我们把局部敏感哈希家族记为(d1,d2,p1,p2)-sensitive。那什么样的函数满足呢?Jaccard就是。我们令S为一个集合,d是Jaccard距离,有Prob[h(x)=h(y)] = 1-d(x,y),我们就可以得到一个局部敏感哈希家族:a(1/3, 2/3, 2/3, 1/3)-sensitive。事实上,只要满足d1<d2,就可以得到一个局部敏感的哈希家族:(d1,d2,(1-d1),(1-d2))-sensitive。
(d1,d2,p1,p2)-sensitive将整个概率空间分成了三部分:<p1,p1-p2,>p2。为了有更好的区分度,我们想让p1-p2的空间尽可能小,让d2-d1尽可能大。选择合适的参数,能够有类似于下面的S曲线应该就是不错的了。可如何来做呢?
定义两种哈希函数的操作:AND和OR。
AND操作:在局部敏感哈希家族H中选出r个哈希哈数,构成哈希家族H'。对于H'家族中的h = [h1,…,hr],h(x)=h(y)当且仅当对所有的i,所有hi(x)=hi(y)都满足。这样得到的H'同样也是一个局部敏感哈希家族。并且若源哈希家族是(d1,d2,p1,p2)-sensitive,新哈希家族H'是(d1,d2,(p1)^r,(p2)^r)-sensitive。
OR操作:在局部敏感哈希家族H中选出b个哈希哈数,构成哈希家族H'。对于H'家族中的h = [h1,…,hb],h(x)=h(y)当且仅当存在i,满足hi(x)=hi(y)。这样得到的H'同样也是一个局部敏感哈希家族。并且若源哈希家族是(d1,d2,p1,p2)-sensitive,新哈希家族H'是(d1,d2,1-(1-p1)^b,1-(1-p2)^b)-sensitive。
可以看出AND操作是降低了概率,但如果选取一个合适的r,可以使下限概率接近0,而上限概率没有多大影响。类似的,OR操作是增加了概率,但如果选择一个合适的d,可以使上限概率接近1,而下限概率没有多大影响。
我们对AND操作和OR操作做级联:
AND-OR,1-(1-p^r)^b
OR-AND,(1-(1-p)^b)^r
举个例子,1-(1-p^4)^4,当p取不同值时:
p |
1-(1-p4)4 |
.2 |
.0064 |
.3 |
.0320 |
.4 |
.0985 |
.5 |
.2275 |
.6 |
.4260 |
.7 |
.6666 |
.8 |
.8785 |
.9 |
.9860 |
(1-(1-p)^4)^4,当p取不同值时:
p |
(1-(1-p)4)4 |
.1 |
.0140 |
.2 |
.1215 |
.3 |
.3334 |
.4 |
.5740 |
.5 |
.7725 |
.6 |
.9015 |
.7 |
.9680 |
.8 |
.9936 |