算法概述
本文中的Neighbour-Sensetive-Hashing(NSH)算法主要应用于处理kNN问题,通过将更多位的哈希码用来区分邻近的数据项,使得相邻数据项之间的汉明距离更远,所以当k值较小时,NSH相比于其他传统算法,拥有更高的精确度。
此时,此算法需要对各个数据项进行一种特殊的转变——NST,是的生成的哈希码满足以下3个性质:
1. 连续性;
2. 单调递增;
3. 两个数据项之间的汉明距离大于原始距离。
参数m的选取
为了达到上述目的,此算法提出了一个“多重枢纽变换”(Multi-Pivoted Transformation),即从所有数据项中,选取m个作为枢纽,计算每个点到这些枢纽的汉明距离,结果为一个m维向量,由这m个汉明距离组成。
显然,m越大,算法的准确度越高,但是运行时间越长;m越小,算法的运行时间越短,但是准确度越低。选取一个大小合适的参数m,对于这个算法有着巨大的意义。
作者提出的一个选择m的方法为,m = c * b。c为一个1~10之间的任意数,b为二进制哈希码的位数。作者提出,将c从1变化到10,分别求出m,并挑选一部分数据项作为测试项,分别测试不同m值时代码的效率,然后选择使代码效率最高的参数m。
可以改进的地方:
在作者的方法中,在任何情况下都需要进行10次评估,才能选出最合适的m,这相当于将代码执行了10次,大大降低算法的效率。
虽然作者通过选取部分数据项进行测试,减少了参加测试的数据项的数量,进而减少选取参数m的耗时,但这也有可能导致选取的m对于全体数据项而言,并不是最合适的参数。
m个枢纽点的选取
对于如何选取m个枢纽点,作者提出了三种方案:
1. 平均策略:在距离最远的点之间,每隔固定的距离选择一个枢纽点;
2. 随机策略:在所有数据项中,随机的选择m个枢纽点;
3. k-means策略:调用k-means函数,将所有数据项分成m个点群,并选出相应的种子点。
作者对于以上三种方法的准确性进行了评估:
随机策略在稀疏图中的准确性很差,在密集图中的准确性相对于其他两者较差。其余两者的准确度十分接近,k-means策略略好一点。
可以改进的地方:
平均策略在时间复杂度方面相比于k-means策略拥有较为明显的优势,但是在准确性上稍有不如,可以加一个评价函数,在合适的情况下选取合适的策略,使得算法兼具这两者的优势。
不适用于K值较大时的情况
这个算法用哈希码中更多的位数来区分邻近的数据项,使得邻近数据项之间的距离更远、区分度更大,以此来提高k值较小时的查找精确度。
可以改进的地方:
在此算法中,用来区分距离较远的数据项的哈希码位数相应的变少,导致远端的数据项难以区分,似乎都在一起。因此,当k值较大时,这个算法就几乎没有可行性。