LSH之1

包括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的约束是为了概念更严格,因为有的时候d1<d2,p1 不一定大于p2(欧氏距离),加上d1,d2的约束,在dx ~[0,d1], dy~[d2,无穷]这两个集合里,dx < dy,p1>p2一定成立 

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函数,符合上面的条件
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)<a,则theta变大,概率变低。随着d的变大,概率降低
     如果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变大,摞在一起的概率一定降低    
 这说明一个事情,d1<d2,则p1>p2的成立条件是[0,d1][d2,~],大多数情况下(jaccard,hamming,cos),如果d1<d2,则p1>p2对任何d1<d2关系都成立。但是在欧式距离不一定。这是因为LSH F集合导致的。

不过在实际使用中,我们定义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.
|
|
|
|
|
|
|--------------|--------------|--------------|--------------|--------------|--------------|--------------|

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lsh是Locality Sensitive Hashing(局部敏感哈希)的缩写,是一种用于高效处理海量数据的近似近邻搜索技术。而Python是一种广泛使用的编程语言,拥有丰富的科学计算、机器学习和数据处理库。所以,我们可以利用Python来实现LSH算法。 要实现LSH算法,首先需要理解LSH的核心思想。LSH利用哈希函数将数据点映射到不同的桶中,使得相似的数据点具有更高的概率被映射到相同的桶中。通过在相同的桶中进行近似近邻搜索,可以在大规模数据集中高效地找到相似的数据。 在Python中,我们可以使用NumPy和Scikit-learn等库来进行LSH算法的实现。首先,我们需要选择合适的哈希函数,并使用该函数将数据点映射到不同的桶中。然后,我们可以根据实际需求设计相似度度量和查询算法,以在桶中找到近似近邻。 具体步骤如下: 1. 导入所需的库,如NumPy和Scikit-learn。 2. 定义LSH函数,选择合适的哈希函数并实现哈希操作。 3. 载入数据集,并使用LSH函数将数据点映射到不同的桶中。 4. 实现相似度度量函数,通过计算数据点之间的距离或相似度来评估它们的相似程度。 5. 实现查询算法,通过在桶中搜索近似近邻来寻找相似的数据点。 6. 将LSH算法应用于实际问题,比如近似最近邻搜索,数据去重等。 需要注意的是,在实际应用中,LSH算法的性能往往取决于哈希函数的选择和参数的调优。因此,我们可以通过实验和调试来优化LSH算法的性能,并根据实际需求进行调整。 总之,利用Python可以实现LSH算法,并通过各种科学计算和数据处理库提供的功能来进行优化和扩展。这样就可以在海量数据集上高效地进行相似度搜索和数据处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值