2013IS-(NSW索引算法)Approximate nearest neighbor algorithm based on navigable small world graphs

标题:基于可导航的小世界图的近似NN算法

编者的总结

  1. 设计了一个简易的KNN算法同时用于索引构建和查询。恰好如此构建的索引是一个近似的泰森图(Delaunay三角剖分),满足导向性小世界图特性,因此可以用于KNN搜索。

编者的思考

  1. 参数太难调了,m,w,要换个参数,得从构建图开始重新来一次,不够灵活;
  2. 构建图的时候算了太多次距离了,距离公式复杂的时候,这个proximity graph index的构建应该会很慢;每一个点的插入是对数的,可是n个点的插入就是nlogn了;
  3. 这是一个完全基于内存的算法,所有数据都在内存里才能达到效果,实验中采用的机器是192GB的;除此之外,边也是O(n)级别的,所以size其实蛮大的,数据量较大的时候,空间上也蛮成问题;
  4. 高维退化问题实验没有研究透;
  5. KNN中repeat break的条件我有些疑问,为什么candidate list中最小的元素大于KNN BSF算法就要终止? 它是距离最小的,但它的邻居有可能比它的距离还小,那这部分不就是搜不到了?
  6. 当然,搜索效率上值得肯定,复杂度,而且看参数合适情况下,召回率非常高,这点比树形索引的要好很多。

abstract

度量空间KNN算法。把每一个数据对象当做图中一个点,用边来连接。通过维护一个在构建初期生成的近似Delaunay图。
算法可以做成分布式、并行的。搜索和插入是同类型操作,复杂度是。

1. Introduction

基于哈希表的分布式系统(BitTorrent, Skype)只能执行精确匹配,元素值的微小改变可能导致哈希值的大变,这使得KNN和Range query都不太可能。


image.png

2. Related work

  • 在99年就有人用狄洛尼图和贪心算法做精确近似搜索了。当时作者证明了在一个度量空间中找一个精确的狄洛尼图是不可能的(?)。但当时的构建和查询复杂度都很高。
  • 在00年介绍小世界现象的文章中,作者指出要想获得小世界的导航特性,边的长度必须服从一个指数分布,即,长度越长的边的数量是指数下降的。本文也是符合这个规律的。
  • 07年有一份工作,也是近似狄洛尼图,方法是给每个点选择个邻居(是维数),最小化对应的维诺格子。然而精度并不好。

4. Search algorithm

图的构建要通过顺序插入所有的点。然后在图中找到最近邻的邻居,互相连接。注意看上图,所有黑线+顶点其实就构成了一个Delaunay三角剖分。红线可视作远程随机插入的。

4.1. Basic greedy search algorithm

这种贪婪算法比较简单,首先找到一个entry point,然后计算这个entry point所有邻居和query的距离,如果最小距离小于dist(query, entry point),那么就重新设置current point为这个最小距离点,直到最后找到一个point,其所有邻居和query的距离都大于这个point。


image.png

通过这种贪婪算法找到的是一个局部最小值,未必是全局最优的。也就是说,这种算法结构,不对结果质量作出绝对保证,只能做出概率保证,保证找到的结果以多大的概率是真实的NN。

4.2. k-NN search modification

对于上述贪婪算法,可以通过重复做几次搜索,选不同的entry point,最终取最佳答案,来提升结果质量。这也是作者之前的做法,然而本文作者对此进行了改进。改进体现在两方面:

  1. 终止条件改变:如果一个entry point和当前Query的距离比BSF KNN还要大,那么这一轮迭代立即终止。
  2. 访问对象改变:维护已访问列表,已经访问过的节点,不再重复进入算法。

具体算法如下,算法重复m轮,最终取最优解。
TreeSet是有序列表,实现中可以用堆。


image.png

image.png

5. Data insertion algorithm

如果每一个元素都将其Voronoi邻居维护在自己的friend列表上(图中的邻居列表),那么得到的结果必定是精确的。但是维护这个条件等同于构建一个Delaunay图。

我们构建图的目标就是尽可能的最小化假精确解的概率,同时让图的边尽量的少。做法就是一个一个插入数据点,然后在已插入的节点中找f个最近的节点作为邻居。核心思想就是:这f个点和Voronoi邻居集合的交集是很大的。
还有一个好处就是,这样生成的图,不需要其他操作,自然就带有小世界属性。这是因为早起制造出来的边在后来逐渐会变成long links,产生的越早,越大概率是long links,这样边的长度会大致符合一个几何分布。
具体怎么找这f个点呢,就用4.2节提到的KNN算法就可以了。

5.1. Choice of parameters

这个方法的参数调试是非常麻烦的,其中最麻烦的当属w。w就是构建时用到的KNN算法中的参数m。首先要让m足够大,保证KNN搜索质量很高,然后再慢慢放大w,直到达到一个较好的KNN搜索质量。

6. Test results and discussion

6.2. Small world navigation properties

  1. 可以看到对数性质还是很明显的,尤其在低维;
  2. 在高维就不那么明显了,原因不是在于f的选取,更多的在于搜索过程中,每次只选择一个方向去搜,使得搜索过程更像是单维的。


    image.png

6.4. k-Nearest neighbor search complexity scaling

  1. 固定召回率,搜索量基本和数据集大小成比例。当然这个固定召回率,实际上要付出很多代价调m,w两个参数才能得到固定。


    image.png
  2. 横轴指数,纵轴线性,可以看到二次曲线还是很明显的,印证了理论上的复杂度。


    image.png
  3. 维数较高时,搜索量也随之增长;从上两张图也能看出来,随着维度增加,质量和速度退化也都比较明显。


    image.png

你可能感兴趣的:(2013IS-(NSW索引算法)Approximate nearest neighbor algorithm based on navigable small world graphs)