Inverted Multi-Index

来源:互联网 发布:在线c语言编译器 编辑:程序博客网 时间:2024/05/29 03:50

Inverted Multi-Index

简介

Inverted Multi-index是Artem Babenko 和 Victor Lempitsky发表的一篇论文,论文起初发表在CVPR2012上,后来又增加了内容,又发表在2014的PAMI上,被引用的次数很高。
论文地址如下所示:
CVPR2012
PAMI 2014

引言

分析整篇文章,总结下来想法还是很直观。首先分析传统的倒排索引,在传统的倒排索引中,我们这样做:

  1. 首先N个M维的数据,首先进行K-means聚类,会生成K个聚类
  2. 将原始的每个M维的数据分别和K个聚类中心进行比较,然后找出距离最小的聚类。
  3. 会生成如下所示的索引结构,方框代表聚类中心,圆代表聚类中同一类的数据。
    索引结构
    但是原始的倒排索引是在全维度上进行聚类,qurey时候先计算与聚类中心centroids的距离,然后计算centroids内的database与query的距离,避免了O(n)的搜索规模。然而,如果数据比较分散,没有出现明显的数据簇,直接进行聚类,数据将会非常稀疏。导致在查询的过程中,会只关注centroids内的点,然而忽视了实际很近的数据点。如下图所示:
    这里写图片描述
    所以,在论文中作者提出了一种新型的索引结构,将原始的数据进行维度划分,然后在各个维度中进行K-means聚类,将database中的数据映射到各个空间的centroids上,query时通过计算数据与database的centroids距离进行排序,返回K个紧邻。进行这种划分,一个最大的优势就是,采用了更精细的子空间划分,提高了检索的召回率。

Iverted Multi-Index

受到product quantization的思想启发,作者将原始的数据N×M维数据D={p1,p2,p3,.......pn},分别划分为两个N×M/2维的数据。假设pi=[p1i,p1j],其中piRM。我们现在讲数据集进行划分为两部分,p1iRM2p1jRM2 。所有的数据进行划分以后,原始的N M维的数据集 变为D1={p11,p12,p13,.......p1n}D2={p21,p22,p23,.......p2n}。分别对D1D2进行K-means生成k个centroids的聚类,分别记为 U={u1,u2,u3,.....uk}V={v1,v2,v3,.....vk}。聚类中心形成以后,我们将前半部分和后半部分的聚类中心进行拼接以后才能完全代表database中的数据,所以总共存在k2个列表。将原始的数据集pi的前半部分p1iD1的聚类中心进行比较,得到距离最近的聚类,后半部分同理。把K2的每一个(如图1的方框)lists写成 Wij。所以每一个points[p1i,p2i]会分到最近的点[ui,vj]
距离
上述的d(a,b)=d1(a1,b1)+d2(a2,b2) 距离采用欧式距离。
索引表建立以后,来了查询q以后,我们要得到距离q最近的k个邻居,由于k2个列表中有可能存在某个Wij后面没有数据,我们首先要找到T(T>k)个最近的聚类中心。我们首先分别从U中和V中找到T个最近的聚类中心,然后按照距离进行排序。然后,作者提出了multi-sequence 算法,具体步骤如下所示:
算法步骤
例子
加入误差
经过试验发现Multi-D-ADC比Multi-ADC有更高的召回率,Multi-ADC比Multi-D-ADC的计算速度更快。

总结

和Inverted index相比,由于D的数量不变,所有两者的索引结构所占用的内存相同,但是由于Inverted Multi-Index的列表长度为K2,而倒排索引为K。并且Inverted Multi-Index列表存在数据为空的情况,并且较长,限制了正交分割的数目,作者实验发现分为两部分正好。

参考文献

  • The Inverted Multi-Index Artem Babenko 1,2 and Victor Lempitsky Pami 2014
  • 参考博客1

  • 参考博客2

0 0