annoy 算法的目标是建立一个数据结构能够在较短的时间内找到任何查询点的最近点,在精度允许的条件下通过牺牲准确率来换取比暴力搜索要快的多的搜索速度。

首先随机选择两个点,然后根据这两个点之间的连线确定一个可以垂直等分线段的超平面,灰色是两点的连线,黑色是超平面。

接下里在超平面分割后的字空间内按照同样的方法继续确定超平面分割字空间,通过这样的方法我们可以将子空间的从属关系用二叉树来表示:

然后再继续分割:

继续重复上述步骤,直到子节点包含的数据点数不超过 K 个,这里我们取 K = 10。

对应的二叉树结构如下所示:

通过上述步骤,我们建立了二叉树的结构用于表示上述点分布空间,每个节点都表示一个子空间,在点分布空间中接近的子空间在二叉树结构中表现为位置靠近的节点。这里有一个假设,如果两个点在空间中彼此靠近,任何超平面都不可能将他们分开。
如果要搜索空间中的任意一个点,我们都可以从根结点遍历二叉树。
假设我们要找下图中红色 X 表示的点的临近点:

从二叉树的根结点遍历的路径如下所示:

可以看到在最后的子节点中有7个点,其中有6个是我们要找的临近点。不过这样找到的点太少了,我们可以采用其他办法。

使用优先队列

不仅是在二叉树中找红色点存在的路径,还要找与红色点相近的子空间存在的路径(最大路径为子空间与红色点的最远距离)。

对应的二叉树结构如下所示:

建立多个二叉树

第二个技巧就是构建多个二叉树结构构成森林,每棵树都是通过随机选择点分割平面构建的,我们需要同时在所有树结构中寻找相邻点:

每棵树都包含平面中所有点,所以当我们搜索多棵树的时候,将这些节点组合起来,我们可以得到对于目标点的近邻点分布的大概估计:

接下来再对这个分布范围内所有点进行距离计算并排序:

排序后我们再选择最前面的 K 个点,这就是 Annoy 算法的工作原理。当然会有一部分本应该是相邻的点没有包含进来,不过损失了一定精度的情况下可以换来比穷举搜索快很多的搜索时间。

Annoy搜索算法(Approximate Nearest Neighbors Oh Yeah)相关推荐

  1. (FLANN论文)fast approximate nearest neighbors with automatic algorithm configuration——中英对照翻译

    Fast Approximate Nearest Neighbors With Automatic Algorithm Configuration Abstract 在许多计算机视觉问题中,最耗时的部 ...

  2. 机器学习算法系列(二十二)-近似k近邻算法-Annoy(Approximate Nearest Neighbor / ANN)

    阅读本文需要的背景知识点:k近邻算法.一丢丢编程知识 一.引言   前面一节我们学习了机器学习算法系列(二十一)-k近邻算法(k-Nearest Neighbor / kNN Algorithm),其 ...

  3. Approximate Nearest Neighbors.接近最近邻搜索

    (一):次优最近邻:http://en.wikipedia.org/wiki/Nearest_neighbor_search 有少量修改:如有疑问,请看链接原文..... 1.Survey: Near ...

  4. 近邻模块︱apple.Turicreate中相似判定Nearest Neighbors(四)

    apple.Turicreate已经是第四篇了.本模块主要阐述该平台相似模块的一些功能. 也是目前求相似解决方案很赞的一个. 官方地址:https://apple.github.io/turicrea ...

  5. ANN(Approximate Nearest Neighbor)简介

    简介(Introduction): ANN(Approximate Nearest Neighbor)是一种用于在大规模数据集中寻找最近邻居的算法.它的目标是在尽可能短的时间内找到与给定查询点最近的数 ...

  6. KNN(K Nearest Neighbors)分类是什么学习方法?如何或者最佳的K值?RadiusneighborsClassifer分类器又是什么?KNN进行分类详解及实践

    KNN(K Nearest Neighbors)分类是什么学习方法?如何或者最佳的K值?RadiusneighborsClassifer分类器又是什么?KNN进行分类详解及实践 如何使用GridSea ...

  7. [更新ing]sklearn(十六):Nearest Neighbors *

    Finding the Nearest Neighbors 1.NearestNeighbors #Unsupervised learner for implementing neighbor sea ...

  8. 检索 : Approximate Nearest Neighbor NSW + HNSW

    在一个给定向量数据集中,按照某种度量方式,检索出与查询向量相近的K个向量(K-Nearest Neighbor,KNN),但由于KNN计算量过大,我们通常只关注近似近邻(Approximate Nea ...

  9. Detecting Adversarial Samples Using Influence Functions and Nearest Neighbors

    2021.12.24 第10篇(CVPR2020) 粗读 论文链接:Detecting Adversarial Samples Using Influence Functions and Neares ...

最新文章

  1. CIO需“野蛮生长” 2017中国CIO高峰论坛7月开幕
  2. 【CV】图像分析用 OpenCV 与 Skimage,哪一个更好?
  3. 语音识别系统_智能语音识别系统_第三方语音识别系统 - 云+社区 - 腾讯云
  4. AV-TEST最新Windows 10平台最佳杀毒软件测试结果
  5. Linux下安装常用软件
  6. Linux忘记密码的找回方法
  7. 3分钟教会你用excel做多层饼图
  8. java微信支付超时_Java语言:微信支付之关闭订单
  9. 九连环解法java版
  10. 基础通用版IPv6转换服务使用说明及设置示例
  11. 嵌入式开发学习(5)S5PV210开发板刷系统那点破事儿之一
  12. 如何用Python找出英语和汉语中特定词性的单词
  13. 数据源为Excel的解决方法
  14. 活捉那只抢算力的谷歌员工!挤占计算资源?博弈论或可破解数据中心“囚徒困境”...
  15. 白细胞膜囊泡包裹在金纳米粒表面|DNA纳米结构的细胞膜囊泡|靶向细胞膜的多肽药物外泌体纳米载药
  16. 解决Incorrect result size: expected 1, actual 0!
  17. 学会NI-DAQmx10个函数,解决80%的数据采集应用问题
  18. 定时任务Schedule的使用
  19. Revit中模型文字的放置和族库工具介绍
  20. GBase 8c 数据导入-错误处理

热门文章

  1. 此问题可能是由配置更改或安装另一个扩展导致的
  2. 在IE中测试调用Web Service
  3. 关于NB-IoT的十大问题和答案【转】
  4. 《深入浅出Mysql》學習筆記--日志
  5. jQuery温度计,支持摄氏度华氏度同时展示
  6. Java并发编程开发笔记——2线程安全性
  7. Js高设笔记1-2章 defer and async
  8. 修改科技论文的6项注意
  9. 动态加载jar 并进行调用
  10. VC++结束程序进程