LSH算法
如果一篇文档由100维单词组成,LSH做的事情就是通过对维度分隔,从而对不同文档进行分桶。
如果我准备对100维度分成5个部分,每个部分对应20个维度。序列号为1,2,3,4,5
按照顺序来对比,如果1号中,两个文档的特征是一样的,就分到一个桶里面,如果不一样,就继续看2号,直到5完成。
如果5个序列号中的维度特征都是不一样的,那么两个文档就不能分割到一个桶中。
为什么可以使用这个方法进行近似查询呢?
b=20,r=5(分成20个块,每块5个维度)
假设两个文档的相似度为p,那么每个维度上,两篇文档维度特征相同的概率也是p,那么:
两个文档在任意一块(注意这里用词是一块)维度特征完全相同的概率就是(0.8)的五次方为0.328
那么两个文档在所有块上都不相同的概率为(1-0.328)的20次方为0.00035
那么两个文档至少在一个块上相同的概率是0.99965
换句话讲将,如果两个文档相似度是0.8,我们认为这种情况下两个文档是相似的,这两个文档落到一个桶内的概率是0.99965。是很合理的
同理可得,如果两个文档的相似度是0.3,
两个文档在任意一块(注意这里用词是一块)维度特征完全相同的概率就是(0.3)的五次方为0.00243
那么两个文档在所有块上都不相同的概率为(1-0.328)的20次方为0.9525
那么两个文档至少在一个块上相同的概率是0.0474
换句话讲,如果两个文档相似度是0.3,我们认为两个文档的相似度是不相同的,那么两个文档分到同一个桶内的概率是0.0474,这也是很合理的。
对应的如果b越大,r越小,相应的越不准确,b越小,r越大,(思考一个极端情况,也就是我们只有一块,也就是r等于100,那么就越准确),结果越准确
我们在使用LSH算法的时候,使用了datasketch包裹,里面我们通过设定一个threshold,来影响b和r,注意这里的threshold并不是我们说的雅卡尔系数,这个系数只是和b和r有一个公式对应。
通过设定threshlod,我们来得到相应的b和r
注意,使用lsh算法之后,在同一个桶内的用户是有很大可能性是雅卡尔系数很低也就是相似度很低的情况的,这就是近似查询中近似的意思。