局部敏感哈希算法(LocalitySensitiveHashing)
from:
阅读⽬录
局部敏感哈希(Locality Sensitive Hashing,LSH)算法是我在前⼀段时间找⼯作时接触到的⼀种衡量⽂本相似度的算法。局部敏感哈希是近似最近邻搜索算法中最流⾏的⼀种,它有坚实的理论依据并且在⾼维数据空间中表现优异。它的主要作⽤就是从海量的数据中挖掘出相似的数据,可以具体应⽤到⽂本相似度检测、⽹页搜索等领域。
1. 基本思想
局部敏感哈希的基本思想类似于⼀种空间域转换思想,LSH算法基于⼀个假设,如果两个⽂本在原有的数据空间是相似的,那么分别经过哈希函数转换以后的它们也具有很⾼的相似度;相反,如果它们本⾝是不相似的,那么经过转换后它们应仍不具有相似性。uqc
哈希函数,⼤家⼀定都很熟悉,那么什么样的哈希函数可以具有上述的功能呢,可以保持数据转化前后的相似性?当然,答案就是局部敏感哈希。
2. 局部敏感哈希LSH
局部敏感哈希的最⼤特点就在于保持数据的相似性,我们通过⼀个反例来具体介绍⼀下。
canye 假设⼀个哈希函数为Hash(x) = x%8,那么我们现在有三个数据分别为255、257和1023,我们知道255和257本⾝在数值上具有很⼩的差距,也就是说它们在三者中⽐较相似。我们将上述的三个数据通过Hash函数转换:
bpo是什么意思 Hash(255) = 255%8 = 7;
Hash(257) = 257%8 = 1;
Hash(1023) = 1023%8 = 7;
我们通过上述的转换结果可以看出,本⾝很相似的255和257在转换以后变得差距很⼤,⽽在数值上差很多的255和1023却对应相同的转换结果。从这个例⼦我们可以看出,上述的Hash函数从数值相似度⾓度来看,它不是⼀个局部敏感哈希,因为经过它转换后的数据的相似性丧失了。竖琴英文
我们说局部敏感哈希要求能够保持数据的相似性,那么很多⼈怀疑这样的哈希函数是否真的存在。我们这样去思考这样⼀个极端的条件,假设⼀个局部敏感哈希函数具有10个不同的输出值,⽽现在我们具有11个完全没有相似度的数据,那么它们经过这个哈希函数必然⾄少存在两个不相似的数据变为了相似数据。从这个假设中,我们应该意识到局部敏感哈希是相对的,⽽且我们所说的保持数据的相
似度不是说保持100%的相似度,⽽是保持最⼤可能的相似度。
对于局部敏感哈希“保持最⼤可能的相似度”的这⼀点,我们也可以从数据降维的⾓度去考虑。数据对应的维度越⾼,信息量也就越⼤,相反,如果数据进⾏了降维,那么毫⽆疑问数据所反映的信息必然会有损失。哈希函数从本质上来看就是⼀直在扮演数据降维的⾓⾊。中班家长会
3. ⽂档相似度计算
我们通过利⽤LSH来实现⽂档的相似度计算这个实例来介绍⼀下LSH的具体⽤法。
3.1 Shingling
假设现在有4个⽹页,我们将它们分别进⾏Shingling(将待查询的字符串集进⾏映射,映射到⼀个集合⾥,如字符串“abcdeeee", 映射到集合”(a,b,c,d,e)", 注意集合中元素是⽆重复的,这⼀步骤就叫做Shingling, 意即构建⽂档中的短字符串集合,即shingle集合。),得到如下的特征矩阵:
其中“1”代表对应位置的Shingles在⽂档中出现过,“0”则代表没有出现过。初一英语试卷分析
在衡量⽂档的相似度中,我们有很多的⽅法去完成,⽐如利⽤欧式距离、编辑距离、余弦距离、Jaccard距离等来进⾏相似度的度量。在这⾥我们运⽤Jaccard相似度。接下来我们就要去找⼀种哈希函数,使得在hash后尽量还能保持这些⽂档之间的Jaccard相似度,即:
我们的⽬标就是找到这样⼀种哈希函数,如果原来⽂档的Jaccard相似度⾼,那么它们的hash值相同的概率⾼,如果原来⽂档的Jaccard 相似度低,那么它们的hash值不相同的概率⾼,我们称之为Min-hashing(最⼩哈希)。
3.2 Min-hashing
Min-hashing定义为:特征矩阵按⾏进⾏⼀个随机的排列后,第⼀个列值为1的⾏的⾏号。举例说明如下,假设之前的特征矩阵按⾏进⾏的⼀个随机排列如下:
元素S1S2S3S4
他0010
peace是什么意思成功0011
我1000
减肥1011
要0101
最⼩哈希值:h(S1)=3,h(S2)=5,h(S3)=1,h(S4)=2.
为什么定义最⼩hash?事实上,两列的最⼩hash值就是这两列的Jaccard相似度的⼀个估计,换句话说,两列最⼩hash值同等的概率与其相似度相等,即P(h(Si)=h(Sj)) = sim(Si,Sj)。为什么会相等?我们考虑Si和Sj这两列,它们所在的⾏的所有可能结果可以分成如下三类:
(1)A类:两列的值都为1;
(2)B类:其中⼀列的值为0,另⼀列的值为1;
(3)C类:两列的值都为0.
特征矩阵相当稀疏,导致⼤部分的⾏都属于C类,但只有A、B类⾏的决定sim(Si,Sj),假定A类⾏有a个,B类⾏有b个,那么
directoryindexsim(si,sj)=a/(a+b)。现在我们只需要证明对矩阵⾏进⾏随机排列,两个的最⼩hash值相等的概率P(h(S
i)=h(Sj))=a/(a+b),如果我们把C类⾏都删掉,那么第⼀⾏不是A类⾏就是B类⾏,如果第⼀⾏是A类⾏那么h(Si)=h(Sj),因此P(h(Si)=h(Sj))=P(删掉C类⾏后,第⼀⾏为A类)=A类⾏的数⽬/所有⾏的数⽬=a/(a+b),这就是最⼩hash的神奇之处。
Min-hashing的具体做法可以根据如下进⾏表述:
返回到我们的实例,我们⾸先⽣成⼀堆随机置换,把特征矩阵的每⼀⾏进⾏置换,然后hash function就定义为把⼀个列C hash成⼀个这样的值:就是在置换后的列C上,第⼀个值为1的⾏的⾏号。如下图所⽰:panther
图中展⽰了三个置换,就是彩⾊的那三个,我现在解释其中的⼀个,另外两个同理。⽐如现在看蓝⾊的那个置换,置换后的Signature Matrix为:
然后看第⼀列的第⼀个是1的⾏是第⼏⾏,是第2⾏,同理再看⼆三四列,分别是1,2,1,因此这四列(四个document)在这个置换下,被哈希成了2,1,2,1,就是右图中的蓝⾊部分,也就相当于每个document现在是1维。再通过另外两个置换然后再hash,⼜得到右边的另外两⾏,于是最终结果是每个document从7维降到了3维。我们来看看降维后的相似度情况,就是右下⾓那个表,给出了降维后的document两两之间的相似性。可以看出,还是挺准确的,回想⼀下刚刚说的:希望原来documents的Jaccard相似度⾼,那么它们的hash值相同的概率⾼,如果原来documents的Jaccard相似度低,那么它们的hash值不相同的概率⾼,如何进⾏概率上的保证?Min-Hashing有个惊⼈的性质:
就是说,对于两个document,在Min-Hashing⽅法中,它们hash值相等的概率等于它们降维前的Jaccard相似度。
注:在上述例⼦中,我们还可以采取欧⽒距离等相似度量来替代Jaccard相似度,这时候LSH相应的策略也需要进⾏改变,从⽽使得最后的hash值等于降为前的相似度。油菜的英文