近邻算法比较:hnsw、KDTree、Annoy

基于树结构的近邻算法

KDTree

kd树是二叉树,核心思想是对 k 维特征空间不断切分

  1. 从根结点出发,递归地向下访问kd树
  2. 递归地向上回退,查找该结点的兄弟结点中是否存在更近的点
  3. 回退到根结点时,搜索结束

类似的有Balltree(在嵌套的超球面上分割数据,而不是超矩形划分区域)

Annoy

  1. annoy的每一次空间划分,可以看作聚类数为2的KMeans过程
  2. 在划分的子空间内不停的递归迭代继续划分
  3. 直到每个子空间最多只剩下K个数据节点,划分结束
    近邻算法比较:hnsw、KDTree、Annoy_第1张图片

基于图存储结构的近邻算法

图查找的朴素思想:

  1. 从任意一个黑色点出发,如C,计算它和粉色点的距离,存下来备用
  2. 计算C点的所有友点(A,I,B)与粉色点的距离
  3. 找到与粉色点的距离最近的点B
  4. 若B点距离粉色点的距离比C点距离粉色点的距离更近,则用B点继续查找

近邻算法比较:hnsw、KDTree、Annoy_第2张图片

NSW

  1. 图中每个点都有“友点”
  2. 相近的点都互为“友点”
  3. 图中所有连线的数量最少
  4. 配有高速公路机制的构图法

向图中逐个插入点,插图一个全新点时,通过朴素想法中的朴素查找法(通过计算“友点”和待插入点的距离来判断下一个进入点是哪个点)查找到与这个全新点最近的m个点(m由用户设置),连接全新点到m个点的连线

HNSW

跳表结构
最底层是所有数据点,每一个点都有50%概率进入上一层的有序链表。

优点:

  1. 表层是“高速通道”,底层是精细查找。
  2. 通过层状结构,将边按特征半径进行分层,使每个顶点在所有层中平均度数变为常数,从而将NSW的计算复杂度由多重对数复杂度降到了对数复杂度。

近邻算法比较:hnsw、KDTree、Annoy_第3张图片

性能比较

近邻算法比较:hnsw、KDTree、Annoy_第4张图片

Reference:
1.Annoy - Github
2.HNSW - Github
3.Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs
4.Five Balltree Construction Algorithms
5.李航 《统计学习方法》P53-P57: K近邻法的实现: kd树
6.快速计算距离Annoy算法原理及Python使用
7.HNSW算法理论的来龙去脉
8.高维空间最近邻逼近搜索算法评测

你可能感兴趣的:(算法,python)