Elasticsearch:理解近似最近邻 (ANN) 算法

news2024/10/6 12:30:35

作者:来自 Elastic Elastic Platform Team

如果你是在互联网出现之前长大的,你会记得找到新喜好并不总是那么容易。我们是在无意中听到收音机里的新乐队时发现他们的,是因为忘了换频道偶然看到一个新电视节目的,也是几乎完全依据游戏封面的图片来找到新喜欢的视频游戏的。

如今,情况大为不同。Spotify 会向我推荐符合我的口味的艺术家,Netflix 会突出显示它知道我们会喜欢的电影和电视节目,Xbox 知道我们接下来可能想玩什么。这些推荐系统让我们更容易找到我们实际在寻找的东西,它们由最近邻(nearest neighbor - NN)算法驱动。NN 算法查看它可用的广泛信息海洋,并识别与你喜欢的东西或你正在寻找的东西最接近的东西。

但 NN 算法有一个固有的缺陷。如果它们分析的数据量太大,遍历每一个选项将永无止境。这尤其是问题,因为这些数据源每年都在变得越来越大。这就是近似最近邻(ANN)接过NN的接力棒并改变游戏规则的地方。

在本文中,我们将讨论关于 ANN 的以下关键主题:

  • ANN 的定义 
  • ANN 的工作原理
  • 何时使用 ANN 搜索
  • ANN 在向量搜索中的重要性
  • 各种类型的 ANN 算法

近似最近邻解释

近似最近邻(approximate nearest neighbor - ANN)是一种算法,它在数据集中找到一个非常接近给定查询点的数据点,但不一定是绝对最接近的一个。一个最近邻(NN)算法通过对所有数据进行详尽搜索来找到完美匹配,而近似最近邻(ANN)算法则会接受一个足够接近的匹配。

这听起来可能不是最好的解决方案,但实际上它是实现快速相似性搜索的关键。ANN 利用智能的快捷方式和数据结构来高效地遍历搜索空间。因此,它可以在大大减少时间和资源的情况下,识别出足够接近的数据点,在大多数实际场景中都是有用的。

基本上,这是一种权衡。如果你绝对需要找到最佳匹配,你可以通过 NN 来实现,但这会牺牲速度和性能。但是,如果你可以容忍精度的微小下降,ANN 几乎总是一个更好的解决方案。

近似最近邻(ANN)算法的

工作原理的第一部分是降维,其目标是将高维数据集转化为低维数据集。其目的是使预测模型任务比分析所有数据更简单、更高效。

这些算法基于数学概念的度量空间,其中数据点存在并且它们之间的距离被定义。这些距离必须遵循特定的规则(非负性、恒等性、对称性、三角不等式),常见的函数如欧几里得距离或余弦相似度用于计算它们。

为了更好地理解这一点,想象一下你在度假,正在寻找你租的别墅。与其逐一检查每栋建筑(高维),你可以使用地图,将问题简化为二维(低维)。(这是一个故意简化的例子。降维并不是 ANN 算法改善效率的唯一方法。)

ANN 算法还利用称为索引的巧妙数据结构来提高效率。通过将数据预处理成这些索引,ANN 可以更快地遍历搜索空间。可以将这些想象成街道标志,帮助你在地图上找到你的位置,更快地到达度假别墅。

何时使用近似最近邻搜索

在数据科学的快速发展世界中,效率至上。虽然找到真正最近的邻居(精确最近邻搜索)具有价值,但它常常需要较大的计算成本,正如我们已经讨论过的。这就是近似最近邻(ANN)搜索发光发热的地方,它提供了一个有吸引力的折衷方案:闪电般的速度与高但非绝对的准确性。

但是,确切地说,你应该在什么情况下选择 ANN 而不是其他搜索方法呢?

精确最近邻搜索可能很慢,但当精确度是你的首要任务或你正在使用小数据集时,它是最佳选择。k-nearest neighbors(kNN)位于 NN 和 ANN 之间,它在保持高准确性的同时提供更快的结果。但是,在决定k的值时可能难以准确把握,它也难以处理高维数据。

ANN 的速度和效率结合其高(但非绝对的)准确性,使其在许多情况下非常完美:

  • 大数据集:当处理百万甚至十亿级的数据点时,精确 NN 的详尽性质变得缓慢。ANN 在浏览庞大的数据景观中表现出色,迅速提供结果。
  • 高维数据:随着维度的增加,精确 NN 的计算量激增。ANN 的降维技术有效地缩小了搜索空间并提高了复杂数据(如图像或文本)的效率。
  • 实时应用:需要即时结果吗?推荐系统、欺诈检测和异常检测依赖于实时洞察。ANN 的速度使其非常适合这些场景。
  • 可接受的近似:如果你的应用可以容忍结果中的轻微不准确,ANN 的速度变得非常宝贵。例如,在图像搜索中,找到视觉上相似的图像 —— 而不是绝对最接近的一个 —— 可能就足够了。

ANN 在向量搜索中的重要性

向量搜索涉及将数据编码为密集向量,捕捉复杂的关系和嵌入式含义。这使得它非常适合搜索图像、文本和用户偏好等内容,而传统的基于关键词的搜索往往表现不佳。但是,维度诅咒也同样适用于这里。因为随着代表这些向量的维度数量增加,传统的搜索方法也会遇到困难,变得缓慢且低效。

ANN 通过将重点从寻找精确匹配转变为 “足够接近” 的匹配来解决了这个问题。这使得快速检索成为可能,你的向量搜索可以在庞大的数据集中快速找到相似的向量。它还提供了内置的可扩展性,因此你可以随意扩展数据集,而无需牺牲速度。

这些实时响应与提高的相关性和效率结合在一起,通常意味着 ANN 在释放向量搜索的真正潜力方面可能发挥着至关重要的作用。

近似最近邻算法的类型

虽然 ANN 的概念在搜索中提供了令人信服的速度优势,但实际上,这个术语涵盖了多种算法的多样化工具箱。它们都有各自的优势和权衡,了解这些细微差别在选择适合特定数据和搜索需求的正确工具时至关重要。

KD - trees

KD-trees 将数据点组织成分层树结构,根据特定维度对空间进行分区。这使得在低维空间和基于欧几里德距离的查询中能够进行快速高效的搜索。

但是,虽然 KD-trees 在低维空间中寻找最近邻时表现出色,但它们受到 “维度诅咒” 的影响。这是指随着维度数量的增加,点之间的距离会变得非常大。在这些高维空间中,KD-trees 基于单个轴进行分割的策略变得不再有效。这使得搜索需要检查大部分数据,失去了效率优势,并接近于简单线性扫描所有点的缓慢过程。

局部敏感哈希(locality-sensitive hashing - LSH)

LSH 是一种强大的 ANN 技术,通过将数据点 “哈希” 到较低维度的空间中,以一种巧妙地保留它们相似关系的方式进行工作。这种聚类使它们更容易被找到,并且使 LSH 能够在搜索大规模、高维度的数据集(如图像或文本)时表现出色,既具有速度又具有可扩展性。而且,在返回 “足够接近” 的匹配结果时,它仍能保持良好的准确性。但请记住,LSH 有时也可能产生误报(将非相似点视为相似),其有效性可能会根据距离度量和数据类型而有所不同。有各种各样的LSH家族专门设计用于处理不同的度量标准(例如欧几里德距离、Jaccard 相似性),这意味着 LSH 具有很强的通用性。

Annoy

Annoy(Approximate Nearest Neighbors Oh Yeah)并不是单一的算法,而是一个开源的 C++ 库,使用自己的算法来构建和查询树,而不是直接实现 LSH 或 KD-trees。它旨在实现在高维空间中的内存高效和快速搜索,适用于实时查询。实质上,它是一个提供了灵活性,适用于不同数据类型和搜索场景的用户友好接口。Annoy 的优势在于在一个平台上利用多种 ANN 方法,使你可以选择最适合你需求的方法。虽然它简化了流程,但请记住,在 Annoy 中选择正确的内部算法对于获得最佳性能至关重要,而其有效性仍取决于你的数据和准确性要求等因素。

线性扫描算法 - Liear scan algorithm

虽然通常不被分类为 ANN 技术,但值得一提的是线性扫描,因为它是一种蛮力方法,可以为你提供与其他 ANN 算法类似的结果。它按顺序迭代每个数据点,计算记录之间的距离并跟踪最佳匹配项。由于算法的简单性,它易于实现,适用于小数据集。基本方法的缺点是对于大数据集而言效率低下,在处理高维数据时速度慢,并且在实时应用中不实用。

选择合适的 ANN

在选择 ANN 之前,你应该考虑以下几点:

  • 数据集大小和维度:对于大型和高维数据,考虑使用局部敏感哈希;对于较小和低维数据,可以考虑使用 KD-trees。
  • 期望的准确度水平:如果绝对精确度至关重要,则线性扫描可能是最佳选择;否则,可以考虑 LSH 或 Annoy,以实现速度与准确度的平衡。
  • 计算资源:Annoy 提供了灵活性,但在选择其中的算法之前,请考虑内存和处理能力的限制。

记住,没有一种解决方案适用于所有情况。尝试不同的 ANN 算法,并评估它们在你特定数据上的性能,以找到最适合你向量搜索需求的完美匹配。除了这些选项之外,ANN 算法的世界不断发展,因此值得保持关注,以免错过可能改进你搜索的新内容。

ANN 是更好搜索的秘密武器

庞大而复杂的数据世界需要高效的工具来穿越其迷宫。这就是 ANN 可以成为将你的相似性搜索从普通提升到出色的秘密武器的地方。它提供了速度和可伸缩性,尽管在轻微准确度上有所妥协。而且,每周都有研究和发展工作,这将为 ANN 领域的动态性做出贡献。例如,量子计算和机器学习方面的进步可能会导致新型的 ANN 算法,这些算法甚至更快更高效。

我们已经探讨了不同的 ANN 算法,每种算法都有其独特的优势和劣势。但最终,最佳选择取决于你的具体需求。考虑数据大小、维度、准确度要求和资源等因素。进行实验,探索,并选择适合你的 ANN 算法,以充分发挥其潜力。从图像搜索到欺诈检测,这些算法可以产生巨大的影响,快速揭示隐藏的联系,并赋予数据驱动的洞察力。

因此,下次你搜索下一首歌曲、电影或视频游戏时,请记住幕后的默默英雄 —— ANN 算法 —— 它们连接着各种信息,产生联系。

接下来你应该做什么

当你准备好时,我们有四种方式可以帮助你利用你企业数据的洞察力:

  1. 开始免费试用,了解 Elastic 如何帮助你的业务。
  2. 参观我们的解决方案,了解 Elasticsearch 平台的工作原理以及我们的解决方案如何满足你的需求。
  3. 探索如何将生成式人工智能应用于企业。
  4. 将本文与你认识的可能感兴趣的人分享。通过电子邮件、LinkedIn、Twitter 或 Facebook 与他们分享。

原文:Understanding the approximate nearest neighbor (ANN) algorithm | Elastic Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1638110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『项目整理』易CAR通项目说明文档-我的第一款APP

『项目整理』易CAR通项目说明文档-我的第一款APP 项目介绍功能介绍技术栈介绍实现效果如何运行备注 项目介绍 易CAR通项目是我的第一个Android项目。是一款结合了AR技术的模仿懂车帝的看车软件。因为是初学,所示实现的效果差强人意,很多的功能界面只实现…

算法训练营第十三天 | LeetCode 239 滑动窗口最大值、LeetCode 347 前K个高频元素

LeetCode 239 滑动窗口最大值 本体初始思路是这样的,首先看下给定数组长度和维持一个滑动窗口所需要花费的时间复杂度之间的关系。初步判断是还行的,当然后面被样例打脸了。需要更新成优先队列的解法。原本的解法能通过37/51和46/51的测试用例。但这还不…

Dynamic-Programming

目录 前言 引入 1) Fibonacci 2) 最短路径 - Bellman-Ford 3) 不同路径-Leetcode 62 4) 0-1 背包问题 降维 5) 完全背包问题 降维 6) 零钱兑换问题-Leetcode322 降维 零钱兑换 II-Leetcode 518 7) 钢条切割问题 降维 类似题目 Leetcode-343 整数拆分 8) 最长…

如何安全的使用密码登录账号(在不知道密码的情况下)

首先,需要用到的这个工具: 度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z 1、打开工具,进入账号密码模块,如图 2、看到鼠标移动到密码那一栏有提示,按住Ctrl或者Alt点击或者双击就能复制内容&…

Linux(ubuntu)—— 用户管理user 用户组group

一、用户 1.1、查看所有用户 cat /etc/passwd 1.2、新增用户 useradd 命令,我这里用的是2.4的命令。 然后,需要设置密码 passwd student 只有root用户才能用passwd命令设置其他用户的密码,普通用户只能够设置自己的密码 二、组 2.1查看…

人工智能与地理大数据实验--出租车GPS数据—时空大数据Python处理基础(二)

环境:Windows 10 专业版 Python 3.9.1 Anaconda 2020( 4.8.2) 系列文章: 人工智能与地理大数据实验--出租车GPS数据—时空大数据Python处理基础(一) 人工智能与地理大数据实验--出租车GPS数据—时空大数据…

接收区块链的CCF会议--APSEC 2024 截止7.13 附录用率

会议名称:APSEC(Asia-Pacific Software Engineering Conference) CCF等级:CCF C类学术会议 类别:软件工程/系统软件/程序设计语言 录用率:2023年,90 submissions were recommended for accep…

【MATLAB画图】如何绘制图像坐标系

首先我们需要图像坐标轴的原点在左上角: set(gca,ydir,reverse,xaxislocation,top); 然后我们需要坐标轴上加上箭头 quiver(0, 0, 0, 520); % 在(x1, y1)处绘制一个箭头,其方向和长度由(dx, dy)确定 quiver(0, 0, 700, 0); % 在(x1, y1)处绘制一个箭头…

缓存分享(1)——Guava Cache原理及最佳实践

Guava Cache原理及最佳实践 1. Guava Cache是什么1.1 简介1.2 核心功能1.3 适用场景 2. Guava Cache的使用2.1 创建LoadingCache缓存2.2 创建CallableCache缓存 缓存的种类有很多,需要根据不同的应用场景来选择不同的cache,比如分布式缓存如redis、memca…

帕金森患者应该怎么注意生活方式?

在面对帕金森病的挑战时,科学合理地改善日常生活方式,不仅能帮助患者更好地管理病情,还能提升生活质量。今天,让我们一起探索如何通过简单的日常调整,为患有帕金森病的朋友们带来积极的变化。 饮食调整:营养…

MATLAB 函数

MATLAB 函数 函数是一起执行任务的一组语句。在MATLAB中,函数是在单独的文件中定义的。文件名和函数名应该相同。 函数在其自己的工作空间(也称为本地工作空间)中对变量进行操作,与在MATLAB命令提示符下访问的工作空间&#xff0…

优化|贝叶斯优化系列(一):基础算法原理

贝叶斯优化是一种处理黑盒函数优化问题的重要方法。它通过构建一个目标函数的代理模型,并且利用贝叶斯机器学习方法如高斯过程回归来评估代理模型的不确定性。基于代理模型,通过一个采样函数来决定在哪里进行采样。本推文简单描述了贝叶斯优化方法的框架…

【1小时掌握速通深度学习面试1】卷积神经网络-上

目录 1.简述卷积的基本操作,并分析其与全连接层的区别 2.在卷积神经网络中,如何计算各层的感受野大小?卷积层的输出尺寸、参数量和计算量。 3.简述分组卷积及其应用场景 4.简述空洞卷积的设计思路 5.简述转置卷积的主要思想以及应用场景 1.简述卷积…

8. Django 表单与模型

8. 表单与模型 表单是搜集用户数据信息的各种表单元素的集合, 其作用是实现网页上的数据交互, 比如用户在网站输入数据信息, 然后提交到网站服务器端进行处理(如数据录入和用户登录注册等).网页表单是Web开发的一项基本功能, Django的表单功能由Form类实现, 主要分为两种: dj…

vue3项目引入VueQuill富文本编辑器(成功)及 quill-image-uploader 图像模块(未成功)

tip:重点解释都写在代码注释里了,方便理解,所以看起来比较密集 富文本基本使用 项目文件夹路径安装依赖 npm install vueup/vue-quilllatest --save 全局注册:main.js // main.js// 自己项目的一些配置(只放了主要…

IoTDB 入门教程 问题篇①——内存不足导致datanode服务无法启动

文章目录 一、前文二、发现问题三、分析问题四、继续分析五、解决问题 一、前文 IoTDB入门教程——导读 二、发现问题 执行启动命令,但是datanode服务却无法启动,查询不到6667端口 bash sbin/start-standalone.sh 进而导致数据库连接也同样失败 [rooti…

开箱子咸鱼之王H5游戏源码_内购修复优化_附带APK完美运营无bug最终版__GM总运营后台_附带安卓版本

内容目录 一、详细介绍二、效果展示2.效果图展示 三、学习资料下载 一、详细介绍 1.包括原生打包APK,资源全部APK本地化,基本上不跑服务器宽带 2.优化后端,基本上不再一直跑内存,不炸服响应快! 3.优化前端&#xff0c…

Linux开发板 FTP 服务器移植与搭建

VSFTPD(Very Secure FTP Daemon)是一个安全、稳定且快速的FTP服务器软件,广泛用于Unix和Linux操作系统。它以其轻量级、高效和易于配置而受到赞誉。VSFTPD不仅支持标准的FTP命令和操作,还提供了额外的安全特性,如匿名F…

会声会影2024中文旗舰版最新网盘安装包下载

会声会影2024是一款功能强大的视频编辑软件,它凭借直观易用的界面、全面的编辑工具以及丰富的特效库,吸引了广泛的用户群体。无论是视频编辑初学者还是专业人士,都能在这款软件中找到满足自己创作需求的功能。 一、软件概述 会声会影2024继承…

【c++】模板编程解密:C++中的特化、实例化和分离编译

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章我们来学习模版的进阶部分 目录 1.非类型模版参数按需实例化 2.模版的特化函数模版特化函数模版的特化类模版全特化偏特化 3.分离编译模版分离编译 1.非类…