位置敏感哈希是当前高维空间中近似近邻(Approximate Near Neighbor, ANN)搜索速度最快的解决方法,LSH在汉明空间进行搜索,E2LSH是对LSH的改进之一,在欧氏空间进行搜索。与基于树的索引方法相比,它们不但复杂度低、支持维数高,而且检索时间大大缩短。目前LSH在图像检索、复制检测和化学混合物搜索中都有应用。文献还将LSH作为与主成分分析(PCA)和K-Means类似的视觉特征到视觉单词的映射方法。

1 E2LSH缺点——随机性

LSH和E2LSH作为ANN解决方案的基础在于相似性搜索并不一定要得出精确的最近邻。在许多情况下,近似最近邻提供的结果已经比较让人满意了,关键在于它能以更小的代价完成目标。但正是这个基础使得LSH不可避免地存在一定的随机性,即不同的哈希表得出的检索结果有所不同。这样的随机性如果得不到好的控制被进一步传播,就会影响算法的性能。

2 E2LSH缺点——高内存消耗

E2LSH还存在另外一个缺点是内存消耗大,虽然和基于树的方法相比已经有所降低,但对于大规模数据集而言它消耗的内存仍然很大,甚至会超过系统内存上限。文献[12-15]已指出了这一点,但他们并没有给出改进方法。这是因为它是基于主存的方法,在每次执行检索时,需要先建立索引,而建立索引前又需要把所有数据点读入内存,这样内存消耗就很大。

3 E2LSH随机性分析

E2LSH哈希函数族由多重函数构成,函数的个数与点的冲突概率密切相关。因此,算法对参数非常敏感,不好的参数会使检索随机性较强,偏离正确的结果。好的参数则会降低随机性,增加检索准确性。
LSH的随机性主要与分段长度和两点间距离有关。而分段长度在初始化时就已经确定,点间距离又是不可调整的,所以减弱检索的随机性需要调整LSH函数族的参数。这是因为LSH虽然能使距离较近的点哈希后冲突概率较大,但是,即使两个点距离较近,它们冲突的概率并不能保证足够大。而只能保证这个概率大于1/2。
不管对于固定的点间距离还是固定的分段间隔,冲突概率都随的增大而增大,随的增大而减小。这是因为越大,就意味着表的个数越多,冲突的概率增大。而对一个表而言,增大反而增强了随机性,使数据集进行哈希后得到更多的桶,导致冲突概率下降。

4 改进之一-基于多表频繁项投票的弱随机检索方法

对于随机性的减弱,可对多表检索的结果进行融合,根据检索向量构造基准索引向量,然后由基准索引向量构造基准索引矩阵,再对基准索引矩阵进行频繁项投票得出准最终索引,最后对准最终索引进行校正得出接近真实情况的最终索引。
E2LSH在进行数据点映射时实现了数据划分,在特征空间相近的点被映射到同一个桶中。这样,利用桶映射信息只读入和查询点相关的点就可以减少内存消耗。而且,静态数据集数据点相对位置不变,不需要重复建立索引。对于数据的增删,也可以只处理相关的桶。这就是采用桶映射链降低内存消耗的基本思想。它将每个桶用一个映射表示,整个数据集用一个桶映射链表示。搜索时根据查询点的桶标志在链中先确定桶映射的位置,然后读入该桶映射数据,再计算查询点与读入桶映射中的数据点的相似度。这样可以显著降低检索程序的内存消耗。

1 方法原理

从映射的观点来看,每个可以对数据点在一个方向上进行映射。真实的近邻可能在某个方向上映射后的点距离查询点映射后的点较远,但不可能在各个方向上都“不幸”。非真实的近邻可能在某个方向上距离映射后距离查询点较近,但不可能在各个方向上都“幸运”。这样,可以通过增加来提高发现真实近邻的概率。但由于每个表都对应于一个数据集映射的结果,所以如果使用多个表进行检索需要对检索结果进行融合。

2 方法实现

多表频繁项投票法减弱随机性主要分为以下几步:
(1)通过AP(Average Precision)值及检出率从多个表中选取基准索引向量。由于检出个数及排序情况不同,仅仅利用AP值的高低难于直接反映检索结果的优劣。可以选取AP较高的结果,再在此基础上选取检出率较高的结果作为最终索引的基准索引向量。
(2)构造基准索引矩阵。由于上述基准索引向量的长度可能不同,所以需要对部分基准索引向量进行补零。补零的位置通过计算修正最小编辑距离(Modified Minimum Edit Distance, MMED)确定。MMED是指将一个向量在不同位置插入某元素补成与另外一个向量等长后两者编辑距离的最小值。
(3)计算基准索引矩阵频繁项。得出基准索引矩阵后利用4.1节的频繁项投票方法可得频繁项及其频次,频繁项即为准最终索引。
(4)用非基准索引向量对准最终索引进行索引校正,也就是寻找这些频繁项在非基准索引向量中的相对位置,来确定最终索引,这样就充分利用了距离保持信息。

5 改进之二——基于桶映射链的低内存消耗检索方法

虽然LSH算法能使检索速度大大提高,但内存消耗大是它的主要局限。虽然存在一些改进算法,在一定程度上降低了内存消耗值,但这些算法当图像规模较大时内存消耗会迅速增加,并可能超过内存上限,从而造成系统崩溃。这就难以满足大规模图像库检索的要求,需要对内存消耗进一步降低。
由于算法所使用的数据结构已经固定,我们从数据结构的存储方式进行改进,以降低内存消耗。也就是根据算法在检索时只需要对部分数据点进行运算的特点将数据集哈希结果用外存保存,仅将需要运算的点调入内存。这样就可以大大降低内存消耗。
由于E2LSH在进行哈希运算时间数据点映射到了桶中,而且距离相近的点映射到同一个桶中。所以如果检索时只读入查询点所在桶包含的数据点而不是读取全部数据点,就会显著降低内存消耗。这就需要把全体数据点用文件映射的方式组织起来。具体表示方式如下:每个桶用一个映射表示,多个桶映射组成一个链,即每个表由一个桶映射链表示,一个桶映射链就包含了全体数据点,它对应于一个哈希表其数据结构。采用这样的数据结构可使一个数据集由多个桶映射表征,进一步将每个桶映射buckMap由一个文件indexFile记录,在查询时就不需要读入所有桶映射文件,实现低内存消耗的检索。基于桶链映射低内存消耗检索方法主要过程如下:先计算查询点的buckIndex,然后根据buckIndex搜索桶映射链,找出查询点所在的桶映射,再读入该桶映射包含的数据点,最后计算精确的相似度,返回结果。
本文详细内容请下载基于多表频繁项投票和桶映射链的快速检索方法并查看。