范涛
发表于2017-04-19
上面一章说了下高维稀疏数据如何通过learning to hash的方法来进行相似查找,这种主要想说下另外一种情况,稠密向量如何进行快速相似查找呢?还是以文本为例吧。之前提到过文本的paragraph2vector的向量表示,以及词word2vector向量表示形式。一旦文档变成这种稠密向量形式,那如何从海量文本中快速查找出相似的Top N 文本呢?
所以这里重点想说下Annoy(
Approximate Nearest Neighbors
Oh Yeah
)这个快速算法,这个在实际应用中发现无论计算速度和准确性都非常不错。
一 算法原理
以2D数据为例来介绍Annoy算法,下面一个2D数据分布图:
1 建立索引过程
Annoy的目标是建立一个数据结构,使得查询一个点的最近邻点的时间复杂度是次线性。Annoy 通过建立一个二叉树来使得每个点查找时间复杂度是O(log n)。 看下面这个图,
随机选择两个点,以这两个节点为初始中心节点,执行聚类数为2的kmeans过程,最终产生收敛后两个聚类中心点。这两个聚类中心点之间连一条线段(灰色短线),建立一条垂直于这条灰线,并且通过灰线中心点的线(黑色粗线)。这条黑色粗线把数据空间分成两部分。在多维空间的话,这条黑色粗线可以看成等距垂直超平面。
在划分的子空间内进行不停的递归迭代继续划分,知道每个子空间最多只剩下K个数据节点。