LSH-局部敏感哈希在k-NN算法中的应用

本内容整理自coursera,欢迎交流转载。

1.KD-Tree算法的局限性

在前一篇博客里,我介绍了KD-Tree来简化最邻近查找算法,降低了计算量,但是KD-Tree真的是最好的吗?有没有对于k-NN算法更好的找到最邻近数据的方法呢?
先来说一下KD-Tree不好的地方,首先算法效率不高;第二,问题需要在高维数据求解。
如何理解“高维”呢?在前一篇博客里,我们的数据集只有X和Y两个特征,但是在实际应用中,每个数据可能有成千上万个特征,者带来的后果是我们初次估计最邻近数据后,我们的“圆圈”是高维空间的高维曲面,首先每个节点的范围不好确定,其次剪枝可能只能减除很少的一部分,这就使得KD-Tree看起来没有那么美好了。
我们该如何改进呢?
首先思考如下问题:
我们确实需要找到很准确的最邻近点吗?
如果需要,那我们对于我们特征的选取有十足的自信吗?
如果有,我们对于我们选取的数据之间距离的度量确信是最合适的吗?
其实,首先,我们对于距离的度量有很多种选取方法,我们采用的未必合适;其次,我们对于特征的表达常常是没有十足把握的,因此很多情况下我们是不需要找到最准确的最邻近的,比方说,你维护一个新闻网站,你想给用户推送他可能感兴趣的新闻,那么你需要准确的找到和用户在阅读文章最近邻的文章吗?不需要!原因就是上面提到的。
因此,很多情况下我们能找到近似最好的结果就可以了。

2.LSH(local sensitive hashing)

回想我们在回归里讲过的,给餐馆评价分成好和坏的例子:
《LSH-局部敏感哈希在k-NN算法中的应用》
我们使用最小二乘法找到一条分界线,把数据分类。之后我们仅仅根据这条线来区分评价的好坏。
LSH的基本思想和这个有相似之处:
LSH的基本思想是:将原始数据空间中的两个相邻数据点通过相同的映射或投影变换(projection)后,这两个数据点在新的数据空间中仍然相邻的概率很大,而不相邻的数据点被映射到同一个桶的概率很小。也就是说,如果我们对原始数据进行一些hash映射后,我们希望原先相邻的两个数据能够被hash到相同的桶内,具有相同的桶号。对原始数据集合中所有的数据都进行hash映射后,我们就得到了一个hash table,这些原始数据集被分散到了hash table的桶内,每个桶会落入一些原始数据,属于同一个桶内的数据就有很大可能是相邻的,当然也存在不相邻的数据被hash到了同一个桶内。因此,如果我们能够找到这样一些hash functions,使得经过它们的哈希映射变换后,原始空间中相邻的数据落入相同的桶内的话,那么我们在该数据集合中进行近邻查找就变得容易了,我们只需要将查询数据进行哈希映射得到其桶号,然后取出该桶号对应桶内的所有数据,再进行线性匹配即可查找到与查询数据相邻的数据。换句话说,我们通过hash function映射变换操作,将原始数据集合分成了多个子集合,而每个子集合中的数据间是相邻的且该子集合中的元素个数较小,因此将一个在超大集合内查找相邻元素的问题转化为了在一个很小的集合内查找相邻元素的问题,显然计算量下降了很多。

那么我们如何找到这些分界线呢?最简单的随机分界线可以吗?听起来这很不靠谱。但是其实是可以的,为什么呢?试想,我们有两个数据距离很近,那么这两个数据之间的夹角应该很小:
《LSH-局部敏感哈希在k-NN算法中的应用》
因此,我们随机放置一条直线,会把这两个离的很近的数据分成两类的概率是很小的,小概率事件的错误是可以忍受的,并且这可以简化算法,还是很有优势的。

3.Reducing search cost through more bins

我们可以放置多条直线,每个类都用相对于每条直线的分类确定,如下图:【这句话是说,比如三条线,bin index[0, 0, 0]指的是这个区域的数据相对于线1,2,3归类都是0,[1,1,0]表示对线1,2归类为1,对线3归类为0,以此类推】
《LSH-局部敏感哈希在k-NN算法中的应用》

编码结果如下:
《LSH-局部敏感哈希在k-NN算法中的应用》

4. 提高查找质量

很显然,LSH是无法找到准确的最邻近数据的,只能找到近似临近的数据集,有时候仅仅在一个类里【比方[1,1,0]】找效果会比较不理想,因此有必要讨论一下提高查找质量的方法。
一个简单的办法是查找相邻的类里的数据。
《LSH-局部敏感哈希在k-NN算法中的应用》

算法总结:
h线线

5.进一步提高——multiple tables

之前提过,一条随机直线把2个距离很近的数据分成不同类的概率很小,把这个概率记为 δ ,那么2条随机直线都把这2个数据分成不同类的概率是 δ2 ,因此如下图情况,找遍3个类都找不到准确最近邻数据的概率是 δ2
《LSH-局部敏感哈希在k-NN算法中的应用》
现在,我们换个方法。前面的方法我们是一次性安置2条随机直线,然后寻找临近的2个类,现在我们放置3次随机直线,每次只查找一个类:
《LSH-局部敏感哈希在k-NN算法中的应用》
那么,对于每个table,准确最邻近数据不在同一类的概率是 1(1δ)2=2δδ2 ,在三张表中均不在同一类的概率 (2δδ2)3 .
比较一下两种方法:
《LSH-局部敏感哈希在k-NN算法中的应用》
《LSH-局部敏感哈希在k-NN算法中的应用》
目前看来差距不是很大,但是如果分更多的类呢?
如果我们随机放置h条直线,第一种方法找h+1个类无法找到最邻近数据的概率 1P(same bin)P(1 bin away)=1(1δ)hh(1δ)h1 ,而第二种方法找h+1个table依旧无法找到最近邻的概率是 [1(1δ)h]h+1 ,作图比较:
《LSH-局部敏感哈希在k-NN算法中的应用》
此时,发现第二种方法远好于第一种!

    原文作者:哈希算法
    原文地址: https://blog.csdn.net/u014303046/article/details/54016361
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞