LSH local sensitive hash,来自于 mining of massive datasets
包括lsh的详细介绍以及针对不同距离函数的LSH。
作用:
解决的问题:相似性计算,避免两两计算,提供一组Hash函数,将相似的pair放在一个bucket里面,降低计算规模。
约束:
Hash函数的要求:
1.相似的pair比不相似的paire更容易成为candidate
2.识别candidate paire的效率要比从所有pair中识别candidate pair效率高(利用minhash)
3.combinable 技术可以更好的降低false positive/negative
4.combinable 技术识别candidate pair时间更少
Local sensitive hash function: 是一组hash函数F, 如果f(x) = f(y),说明x,y是candiadte pair。 如果f(x) != f(y),x,y不是candidate pair。
LSH函数集合将原始的特征规模降低为|F|,也就是Hash函数的个数。
LSH需要符合如下约束,d是距离度量函数,d1 < d2, p1 > p2:
if d(x,y) <= d1, p(f(x) = f(y)) >= p1
if d(x,y) >= d2, p(fx) = f(y)) <= p2
则称为(d1,d2,p1,p2)-sensitive
这两个约束说明两个问题:
1.如果x,y的距离小于d1, x,y成为candidate pair的概率要最小为 p1,尽量保证距离小的以大概率成为pair。
2.如果x,y的距离大于d2,x,y成为candidate pair概率最大伪p2, 保证距离大的以极小的概率成为pair。
这就要求,随着距离正大,成为pair的概率要降低,符合常识。
我理解d1,d2的约束是为了概念更严格,因为有的时候d1p2一定成立
combining tech:
LSH提供hash function,保证candidate pair能在一起,而 combine 技术可以更好的延伸这个概念
combine技术有两种: and-construct or-constrauct,其实也就是band tech.
F为lsh集合, F'是针对F进行combile技术结果:
and-construct:将F中r个hash 函数作为一组,保证fi(x)=fi(y), i=1,2...r,也就是r个hash值都相等才算相等,显然限制更加严格 (d1,d2,p1^r, p2^r) p1^r < p1,进一步降低candidate pair的个数
or-construct :将F中r和hash函数作为一组,保证fi(x)=fi(y)中有一个为真则为真,i=1,2...r,限制变少(d1,d2,1-(1-p1)^r, 1-(1-p2)^r),也就是(1-p1)^r表示都不想等的概率。
两者结合起来,1-(1-p1^r)^m, r*m=hash函数个数
之前的博文中也提到了类这样的技术,min-hash 和banding技术的集合:
先利用and-construct,保证只有极其相似hash值相同概率才高,降低candidate pair的规模,然后利用 or-construct技术,保证整体上相似的pair至少在某个band里面成为candidate pair
整体来讲,LSH 就是基于距离度量函数提供一组hash函数,满足上面提到的约束,保证越相似的pair hash值相同的概率越高,能够成为candidate pair,同一hash值里面的元素少,降低整体的计算规模,同时利用and/or-construct,一方面降低计算规模,另一方面保证lsh的整体召回率,也就是相似pair至少会在某个band里面成为candidate pair。
LSH for different distance measure:
目前的问题是针对不同的距离度量函数,提供不同local sensitive hash函数,符合上面的条件
1.jaccard 距离,见 http://blog.csdn.net/hxxiaopei/article/details/7977248
jaccard的距离的LSH之前已经说过不再具体介绍,min-hash
2.哈明距离
计算x,y里面不同bit的个数。
这个也很简单,hash函数集合F中,fi(x) = xi即可。
其实这个和simhash的后续处理一致
3.cosin 相似性
jaccard/哈名距离 主要是基于特征字面值进行处理,相等或者不相等。而cosin计算的是夹角,而非计算两个向量里相同元素的个数。
比如[1,2,3,4,5][10,20,30,40,50]的cosin值为1,夹角为0。
假定d(x,y)表示向量x,y的相似性,对应cos中的夹角theta.
LSH函数这样定义:假定x,y的特征维数为N,random的选择K个N维度向量V={v1,v2...vk}
定义 d(v1,x)表示v1,x的夹角,基于V,定义LSH集合 F={f1,f2...fk},其中 fi(x)=sign, sign= {-1,+1},如果x与vi的夹角>90,sign=-1; 如果x与vi的夹角<=90,则sign = -1;
基于F的定义,
d(x,y)=0,表示两个x,y相等,则无论V取值如何fi(x) =fi(y)的概率p = 1.
d(x,y)=pi/2,表示x,y夹角为90度,则fi(x)=fi(y)的概率为1-pi/(2*pi) = 1-0.5=0.5
d(x,y)=pi,表示x,y的夹角为180,则fi(x)=fi(y)的概率为0
上面是三个比较特殊的夹角,针对normal的d(x,y),则有:
fi(x)=fi(y)的概率p1= 1-d(x,y)/pi,符合LSH的约束。
(d1,d2,1-d1/pi, 1-d2/pi)-sensitive
每个特征点,经过LSH处理,生成K维的{-1,+1}的向量,利用and-construct or-construct进一步优化即可
这里需要考虑的是如何选择K特征向量V,论文提高考虑要服从高斯分布。
4.欧式距离
欧式距离,L2-norm,计算两个点在欧式空间的距离。这个同cosin相似性一样,不能通过字面的相等不相等来计算。
比如[1,1,1]、[2,2,2] 的距离小于[1,1,1]、[10,10,10]的距离。
假定d(x,y)表示向量x,y的距离,值越大,相似性越低。
LSH的定义为:选择一条直线,水平或者垂直方向(针对多维数据,则取相应的直线),对直线按照宽度为a等分,利用用户在这个维度上的值,计算应该落在那一块,针对LSH 集合F,
fi(x) = (xi, a)~xi/a
基于F的定义,我们将情况分成2个部分:
1,x,y与直线平行:
d(x,y)为x,y的距离,d(x,y)< a,fi(x)=fi(y)的概率至少为p=(a-d(x,y))/a = 1 - d(x,y)/a:
d=0, 则p = 1
d = a/2,则p=0.5
p= 0.1a, 则 p = 0.9
p = a, 则p = 0
2.x,y与直线有夹角theta
如果d > a时,是有可能落在同一bucket中,比如下图的y,m。
根据cos法则,落在水平直线上的距离为d*cos(theta),如果距离刚好是a,可以计算出theta,则落在一个bucket的概率最多为1-theta/90,如果d*cos(theta)
如果d=2a,则theta=60,p=1/3
如果d=sqrt(a),则theta=45,p=1/2
则为(a/2, 2a, 1/2,1/3)-sensitive,符合d1>d2, p2< p1的约束。
解释一下,如果距离小于a/2,至少以p=1/2的概率落在一起,如果d变小,落在一个bucket的概率曾江;如果d>2a,则最多1/3的概率落在一起,如果d变大,摞在一起的概率一定降低
这说明一个事情,d1p2的成立条件是[0,d1][d2,~],大多数情况下(jaccard,hamming,cos),如果d1p2对任何d1
不过在实际使用中,我们定义LSH 集合F,F = {f1,f2....fk},fi(x)为x的第i维在对应直线上的bucke id,具体a的大小 依赖于业务,如果d一定,那么越大,落在一起的概率就越高,无论d1还是d2
如果d(x,y) < d~a/2,则fi(x)=fi(y)的概率p=(a-d)/a = 0.5
|
|
| m. z.
| x. y.
|
|--------------|--------------|--------------|--------------|--------------|--------------|--------------|