一、原始LSH
1、概述
LSH主要用来解决高维空间中点的近似最近邻搜索问题,即Approximate Nearest Neighbor。LSH将原始空间中的点嵌入到Hamming空间中,即原始空间中点的表达形式转换成Hamming空间中点的表达形式,原始空间中的距离度量转换成Hamming空间中的距离度量。这样,原始空间的e-NNS(定义见下文)问题就转变成Hamming空间中的e-KNN问题了。LSH方法提高了空间使用率,其搜索时间与维度线性相关的,与空间规模次指数相关,大大缩短了搜索时间。适用于解决不需要精确解,只需要得到近似解的问题。
2、相关概念
(1)哈希桶(Hash Bucket):哈希表中同一个位置可能存有多个元素,以应对哈希冲突问题。这样,哈希表中的每个位置表示一个哈希桶。
(2)e-NNS问题:对于一个查询子q,返回空间中的一个点p,使得d(q,p) <= (1+e)d(q,P),d(q,p)表示查询子与空间中点p的距离,d(q,P)表示查询子距空间点集P中最近点之间的距离。
(3)局部敏感:称一个函数族H={h:S->U}是(r1,r2,p1,p2)局部敏感的,如果满足下面两个条件(D为空间距离度量,Pr表示概率):
1)若空间中两点p和q之间的距离D(p,q)<r1,则Pr(h(p)=h(q))>p1
2)若空间中两点p和q之间的距离D(p,q)>r2,则Pr(h(p)=h(q))<p2
条件在r1 < r2,p1 > p2的条件下有意义。
通俗来讲,就是距离较近的点映射到同一个位置的概率大,距离较远的点映射到同一个位置的概率小。这对下面将点集映射得到候选结果集的操作很重要,能保证得到的候选结果集是可用的。
3、算法思想
定义一系列Hash函数h1,h2,…,hn,随机选取其中的k个函数组成函数g(x),不妨设选的是h1到hk,则g(x)=(h1(x),h2(x),…,hk(x)),像这样选取L个的g函数:g1(x),g2(x),…,gl(x),每个函数对应一个哈希表。对于原始空间中的每一个点p,通过每个g函数分别映射到L个哈希桶中。这样,每个点都会在L个哈希表的某个哈希桶中出现。查询时,给定了查询子q,利用L个g函数同样对q进行映射,将与q落在同一个哈希桶中的点作为候选结果集,计算q与候选结果集中的点之间的距离,并从中选出1个或K个距离最近的点。
简单的讲,就是讲原始的点集按距离分成不同的类,查询与q距离较近的点集时,只需比较和q在同一类中的点集,而不需要比较全部点集。从而节省了搜索时间。
4、算法步骤(L1准则下的欧几里得空间嵌入Hamming空间中)
因为许多符号不好打,并且内容较多,如果有需要详细步骤的,可以发邮件。gynvsnash@gmail.com
里面包括算法步骤和算法分析。
二、
p-stable LSH
LSH是用局部敏感的方法解决近似最近邻搜索的问题。在原始的LSH方法中,通过将原始空间嵌入到Hamming空间中,将d维空间转换成d'=Cd维的Hamming空间(C是指原始空间中点的坐标的最大值,具体情况参见上一部分中的第4节-算法步骤),使用(r,(1+e)r,1-r/d',1-(1+e)r/d')-敏感哈希函数来解决(r,e)-Neighbor问题。而后来提出的p-stable LSH算法中,不需要将原始空间嵌入到Hamming空间中,可以直接在欧几里得空间下进行局部敏感哈希运算。
1、背景介绍
p-stable LSH应用在d维lp-norm下的欧几里得空间中,0<p<=2。p-stable LSH是LSH的进化版本,要解决的问题相同,而使用的方法和应用环境不同。因此,下面重点介绍p-stable LSH的应用环境,对于LSH的细节参见第一部分。
p-stable LSH使用的(R,cR,p1,p2)-敏感哈希中,c=1+e,并且不失一般性,设R=1。下面的工作主要是确定在1(即R)和c(即cR)下的p1与p2。
2、概念解释
p-stable LSH之所以会叫这个名字,是因为该算法应用到p-stable distribution(p-稳定分布)的概念。下面给出的就是p-稳定分布的概念:
Def 1 : 一个分布D称为p-稳定分布,如果对于任意n个实数v1,v2,…,vn和符合D分布的n个独立同分布随机
变量X1,X2,…,Xn,都存在一个p>=0,使得变量
和
具有相同的分布,此处X是一个符合D分布的随机变量。
![LSH和p-stable <wbr>LSH LSH和p-stable <wbr>LSH](https://i-blog.csdnimg.cn/blog_migrate/6cd42a1dca47a44b909f2675c82f875c.jpeg)
![LSH和p-stable <wbr>LSH](https://i-blog.csdnimg.cn/blog_migrate/84d5f1c42c3e1aafa9dc770ae6a7c15d.jpeg)
p-稳定分布不是具体的分布,而是满足某条件的分布族。当p=1时,代表是标准柯西分布,密度函数为
;当p=2时,代表是标准正态分布(高斯分布),密度函数为
。
![LSH和p-stable <wbr>LSH LSH和p-stable <wbr>LSH](https://i-blog.csdnimg.cn/blog_migrate/5d720dd95dfcfa8b157d80515fd9da50.jpeg)
![LSH和p-stable <wbr>LSH LSH和p-stable <wbr>LSH](https://i-blog.csdnimg.cn/blog_migrate/21a49a6448098803718b6672cf58e4d8.jpeg)
p-stable分布有一个重要的应用,就是可以估计给定向量v在欧几里得空间p-norm下长度,记为||v||p。方法是对于取定的d维向量v,从p-稳定分布中抽取d个随机变量组成d维向量a,计算a与v的点积a.v(点积的概念是将向量对应位置的元素相乘后所有乘积之和),根据p-stable的定义,由于a.v=
,因此a.v与||v||pX是同分布的(X是p-
stable分布的一个随机变量)。选取若干个向量a,计算多个
a.v的值,称为向量
v的“概略(sketch)”,利用
v的“sketch”可以用来估算||
v||p的值。
![LSH和p-stable <wbr>LSH LSH和p-stable <wbr>LSH](https://i-blog.csdnimg.cn/blog_migrate/c403807460955a8ff9051c018cdf007f.jpeg)
3、局部敏感哈希函数
在p-stable LSH中,
a与
v的点积
a.v不用来估计||
v||p的值,而是用来生成哈希函数族,且该哈希函数族是局部敏感的(即空间中距离较近的点映射后发生冲突的概率高,空间中距离较远的点映射后发生冲突的概率低)。大体方法是将一条直线分成等长且长度为r的若干段,给映射到同一段的点赋予相同的hash值,映射到不同段的点赋予不同的hash值。(
a.v1-
a.v2)是映射后的距离,而其值与||
v1-
v2||pX同分布,因此,原始距离(
||
v1
-
v2
||p)较小时,映射后的距离也小,因此使用点积来生成哈希函数族可以保持局部敏感性。
哈希函数族的形式为:
,其中b是(0,r)里的随机数,r为直线上分段的段长。哈希族中的函数根据
a和b的不同建立函数索引。
![LSH和p-stable <wbr>LSH LSH和p-stable <wbr>LSH](https://i-blog.csdnimg.cn/blog_migrate/a83895defb9324687334cbea8492b253.jpeg)
从哈希函数族中随机选取一个哈希函数,现在估计两个向量
v1和
v2在该哈希函数下映射后发生冲突的概率。定义符合p-stable分布的随机变量绝对值的概率密度函数为fp(t),设c=||
v1-
v2||p,则
a.v1-
a.v2与cX同分布,X为p-stable分布下的随机变量。给出概率的计算公式如下,之后会有详细分析。
![LSH和p-stable <wbr>LSH LSH和p-stable <wbr>LSH](https://i-blog.csdnimg.cn/blog_migrate/aad74ea311443b6d0901df2469412866.jpeg)
因为|
a.v1-
a.v2|=||
v1-
v2||p|X|=c|X|,X为p-stable分布下的随机变量,|X|的概率密度函数为fp(t)。若要向量
v1和
v2映射后发生冲突,需要满足如下条件:
v1和
v2通过与
a进行点积运算分别映射到一段长度为r线段后,再通过加b运算,能使映射后的点在同一条线段上。
以下是对该概率公式正确性的证明:
设点
a.v1在点M处,点
a.v2在点N处,此处设N点在靠近Q的位置。
(一)b对映射后点的影响
在加b后,
因为b>0,因此加b后点会后移。不失一般性,设r=1,则有以下两种情况:
(1)若映射到同一条线段上,不妨设为线段PQ(P为前端点,Q为后端点),设|MN|=t,|NQ|=m,则若要保证加b后点M和点N仍在同一条线段中,则要满足0<b<=m(此时加b后M,N仍在线段PQ中),或者t+m<=b<r(此时加b后点M,N落入下一条线段中)。
(2)若映射到不同线段上,但|MN|<r(此时必在相邻线段中),不妨设相邻两条线段为PQ和QR,设|MQ|=m,则|QN|=t-m,则若要保证加b后点M和点N仍在同一条线段中,则要满足m<b<r-(t-m)。
可以看到,不管是那种情况,b的取值范围都是r-t,而b是(0,r)内的随机数,因此取得满足条件b的概率是(r-t)/r=1-t/r。现在只需讨论向量v1和v2经过a的点积映射后的距离为t的概率(因为讨论b是设|MN|=t,即b是在向量映射后距离为t的情况下讨论的),即求
|
a.v1
-
a.v2
|=||
v1
-
v2
||p|X|=c|X|=t的概率。
(二)点积对映射后点的影响
因为随机变量|X|的概率密度函数为fp(x),而这里要求的是c|X|=t的概率。在这里有一个误区,要注意的是,c|X|=t的概率并不是Pr(|X|=t/c)=fp(t/c),这是因为|X|是连续随机变量,不能通过某点的概率来生成其密度函数,虽然密度函数的意义是fp(x)=Pr(|X|=x),但反过来是不成立的。因此,要求c|X|=t的概率,只能通过密度函数的定义来解决。
密度函数的大致定义是:对于随机变量X的分布函数F(x),如果存在函数f(x),使得F(x)是f(x)在全部定义域内(一般就可取负无穷到正无穷,随机变量取不到的地方概率为0)的积分,那么f(x)就称为X的概率密度函数。F(x)=Pr(X<x),f(x)=Pr(X=x)。这里再强调一遍,对于连续型随机变量,第二个式子的反过来没有意义,因为连续型随机变量在某点的概率恒为0。而分布函数代表的是某段区域内概率之和,因此,第二个式子反过来推导是有意义的。
因此,要求c|X|=t的概率,可用如下方法:设随机变量Y=c|X|,则原始问题转化成求Y=t的概率。设|X|的分布函数为Fp(t),Y的分布函数为Gp(t),则Gp(t)=Pr(Y<t)=Pr(c|X|<t)=Pr(|X|<t/c)=Fp(t/c),因此,c|X|=t的概率为Gp'(t)=Fp'(t/c)=1/c*fp(t/c),这样,经过点积映射后,两向量在线上点的距离等于t的概率便求出来了。
至此,我们得到了原始空间中的两个向量经过点积运算后映射到线段上的距离为t的概率以及在距离为t的前提下加b后能落在同一线段上的概率。因为如果两个向量经过点积后映射到线段上的距离大于r,且b是(0,r)上的随机数,因此这种情况下不论b取多少,两点都不可能落入同一条线段上。因此,t的取值范围是(0,r)。综上所述,该概率公式得证。
在上概率公式中,对于给定的r,概率p(c)是关于c的单调递减函数。即,c=||
v1-
v2||越大,映射后发生冲突的概率就越小,这符合局部敏感哈希函数的要求。因此,所选取的哈希函数族是局部敏感哈希函数族,并且是(r1,r2,p1,p2)-敏感的,其中p1=p(1),p2=p(c),r2/r1=c。c>1时,满足p1>p2,r1<r2。
以上就是对p-stable LSH的讨论,它通过涉入稳定分布和点积的概念,实现了LSH算法在欧几里得空间下的直接应用,而不需要嵌入Hamming空间。p-stable LSH中,度量是欧几里得空间下的lp准则,即向量
v1与
v2的距离定义为||
v1-
v2||p,然后通过设定的哈希函数将原始点映射到直线的等长线段上,每条线段便相当于一个哈希桶,与LSH方法类似,距离较近的点映射到同一哈希桶(线段)中的概率大,距离较远的点映射到同一哈希桶中的概率小,正好符合局部敏感的定义。