The Inverted Multi-Index

Artem Babenko and Victor Lempitsky,CVPR2012,被引用次数:43。发现V. Lempitsky是“Learning to Count Objects in Images”的作者,传说这是一篇行人计数必读文章。行人计数的文章是V. Lempitsky在Oxford VGG组做的,本文是在Yandex(俄罗斯的Google)。
阅读时间:2015-04-23

ANN,文章follow了PQ方法(见我另一篇博文),大致意思是对原始数据进行维度划分,在各子空间上分别做k-means,将database中的每个数据映射到各子空间的centroid上,query时通过计算数据与database的centroid距离进行排序,子空间距离度量用欧式公式,总维度上的距离采用子空间距离的第二范式。文章介绍了一种新的数据结构,称之为inverted multi-index,能产生更加精细的子空间划分,且与inverted index相比并不增加检索和预处理的耗时。本文的区别主要体现在两个方面:

  1. 维度划分时仅划分为2个子空间,计算总维度的距离采用第一范式;
  2. rank时并不排序,而是用基于优先队列multi-sequence算法,高效输出top-k检索结果。

inverted index VS inverted multi-index

The Inverted Multi-Index_第1张图片

文章上手讨论了普通倒查表与多项倒查表的区别。普通ANN,用KMeans在全维度上聚类,query时计算向量与centroids距离,然后再计算centroids内database与query的距离,从而避免O(N)的搜索规模。但对散列database,没有明显簇的数据,强行KMeans将导致样本划分很糟糕(簇内数据方差很大),从而在query时丢失实际很近的数据点,如上图。这里可能会想到用Multiple Assignment减少误差,但该方法也有自身的缺点(超出论文)。然后文章提出可以分别对各维度做KMeans,图中交错的网格是分对横向、纵向进行低维KMeans划分。query时,各维度计算centroids,检索multiple inverted,能获得准确的邻近点。

Inverted Multi-Index

The Inverted Multi-Index_第2张图片

上图展示了文章算法的整个过程:query时,将数据的维度均分成两个子空间,分别进行量化,形成向量 [p1p2] ,计算各子空间中到centroids的距离, r(k)=d1(q1,uα(k))
s(k)=d2(q2,vβ(k)) k 为子空间中centroids的数量,这里各子空间中centroids数量相等。将 r(k)+s(k) ,形成上图中红色底的表(以按值排过序了),排序并非用普通的排序算法完成的,而是由文中介绍的multi-sequence algorithm

  1. 初始化 [uα,vβ] 二维表;
  2. 将(0, 0)点放入距离优先队列;
  3. 弹出优先队列中的元素,以下是循环:
    • 添加到rank表中,并记录当前二维表中的位置(i, j);
    • 如果(i+1, j-1)已被遍历过,则(i+1, j)添加到优先队列;
    • 如果(i-1, j+1)已被遍历边,则(i, j+1)添加到优先队列。

你可能感兴趣的:(paper)