0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

介绍当前比较常见的几种近邻搜索算法

工程师邓生 来源:得物技术 作者:张林 2022-09-29 17:11 次阅读

简介

随着深度学习的发展和普及,很多非结构数据被表示为高维向量,并通过近邻搜索来查找,实现了多种场景的检索需求,如人脸识别、图片搜索、商品推荐搜索等。另一方面随着互联网技术的发展及5G技术的普及,产生的数据呈爆发式增长,如何在海量数据中精准高效的完成搜索成为一个研究热点,各路前辈专家提出了不同的算法,今天我们就简单聊下当前比较常见的近邻搜索算法。

主要算法

aa1d36f2-3edc-11ed-9e49-dac502259ad0.png

Kd-Tree

K-dimension tree,二叉树结构,对数据点在k维空间(如二维 (x,y),三维(x,y,z),k维(x,y,z..))中划分。

构建过程

确定split域的值(轮询 or 最大方差)

确定Node-data的域值(中位数 or 平均值)

确定左子空间和右子空间

递归构造左右子空间

查询过程

进行二叉搜索,找到叶子结点

回溯搜索路径,进入其他候选节点的子空间查询距离更近的点

重复步骤2,直到搜索路径为空

性能

理想情况下的复杂度是O(K log(N)) 最坏的情况下(当查询点的邻域与分割超平面两侧的空间都产生交集时,回溯的次数大大增加)的复杂度为维度比较大时,直接利用K-d树快速检索(维数超过20)的性能急剧下降,几乎接近线性扫描。

改进算法

Best-Bin-First:通过设置优先级队列(将“查询路径”上的结点进行排序,如按各自分割超平面与查询点的距离排序)和运行超时限定(限定搜索过的叶子节点树)来获取近似的最近邻,有效地减少回溯的次数。采用了BBF查询机制后Kd树便可以有效的扩展到高维数据集上。

Randomized Kd tree:通过构建多个不同方向上的Kd tree,在各个Kd tree上并行搜索部分数量的节点来提升搜索性能(主要解决BBF算法随着Max-search nodes增长,收益减小的问题)

Hierarchical k-means trees

类似k-means tree,通过聚类的方法来建立一个二叉树来使得每个点查找时间复杂度是O(log n) 。

构建过程:

随机选择两个点,执行k为2的聚类,用垂直于这两个聚类中心的超平面将数据集划分

在划分的子空间内进行递归迭代继续划分,直到每个子空间最多只剩下K个数据节点

最终形成一个二叉树结构。叶子节点记录原始数据节点,中间节点记录分割超平面的信息

aa7cf6fa-3edc-11ed-9e49-dac502259ad0.png

ab487b36-3edc-11ed-9e49-dac502259ad0.png

搜索过程

从根节点开始比较,找到叶子节点,同时将路径上的节点记录到优先级队列中

执行回溯,从优先级队列中选取节点重新执行查找

每次查找都将路径中未遍历的节点记录到优先级队列中

当遍历节点的数目达到指定阈值时终止搜索

性能

搜索性能不是特别稳定,在某些数据集上表现很好,在有些数据集上则有些差

构建树的时间比较长,可以通过设置kmeans的迭代次数来优化

LSH

Locality-Sensitive Hashing 高维空间的两点若距离很近,他们哈希值有很大概率是一样的;若两点之间的距离较远,他们哈希值相同的概率会很小 。

一般会根据具体的需求来选择满足条件的hash函数,(d1,d2,p1,p2)-sensitive 满足下面两个条件(D为空间距离度量,Pr表示概率):

若空间中两点p和q之间的距离D(p,q)p1

若空间中两点p和q之间的距离D(p,q)>d2,则Pr(h(p)=h(q))

abc4ef68-3edc-11ed-9e49-dac502259ad0.png



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • adc
    adc
    +关注

    关注

    95

    文章

    5646

    浏览量

    539404
  • SDC
    SDC
    +关注

    关注

    0

    文章

    46

    浏览量

    15300
  • BBF
    BBF
    +关注

    关注

    0

    文章

    5

    浏览量

    7169

原文标题:近邻搜索算法浅析

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问有什么更好的搜索算法去SD卡中FATFS文件系统中搜索某个关键字?

    如题,谢谢各位!!请问有没有好的搜索算法呢?
    发表于 04-04 04:46

    五种运动搜索算法简介

    (九)帧间编码2:运动搜索算法简介
    发表于 07-17 15:09

    Viterbi搜索算法

    自然语言处理——65 Viterbi搜索算法
    发表于 04-14 11:44

    改进的双向启发式搜索算法主要流程是怎样的?

    如何对双向启发式搜索算法进行改进和实现?改进的双向启发式搜索算法主要流程是怎样的?
    发表于 05-17 06:51

    改进的二进制搜索算法原理是什么?有什么优势?

    改进的二进制搜索算法原理是什么?改进的二进制搜索算法有什么优势?
    发表于 05-20 07:12

    一种无回溯的最长前缀匹配搜索算法

    研究网络处理器中的搜索算法,提出一种基于Patricia树的无回溯搜索算法,并进行仿真和评估分析。该算法被用于中科院计算所的网络处理器的搜索引擎的设计中,该
    发表于 04-22 09:41 18次下载

    方向性多层抽样继承排除全搜索算法

    运动估计是视频压缩中的关键技术,是视频编码中的主要开销。全搜索算法是最简单可靠的块匹配算法。本文在传统全搜索算法的基础上,提出一种方向性多层抽样继承排除全搜
    发表于 05-30 13:44 17次下载

    WebCAD中的剖面区域搜索算法

    基于Web的CAD系统是协同设计研究的一个分支。论文讨论了矢量化标记语言用于在Web上表示矢量图形的优点,比较常见几种剖面区域搜索算法,提出了一种不依赖操作系统的剖面
    发表于 07-30 16:24 8次下载

    四轴飞行器中的自动搜索算法

    四轴飞行器中的自动搜索算法,简单易懂,带你飞起来
    发表于 06-08 14:10 2次下载

    一种改进的邻近粒子搜索算法

    一种改进的邻近粒子搜索算法
    发表于 01-07 20:32 0次下载

    一种改进的自由搜索算法_任诚

    一种改进的自由搜索算法_任诚
    发表于 03-14 17:47 3次下载

    DS18B20-ROM编码的搜索算法

    DS18B20-ROM编码的搜索算法
    发表于 05-04 08:51 9次下载

    激光散乱点云K最近邻搜索算法

    针对激光散乱点云的数据量大,且具有面型的特点,为降低存储器使用量,提高散乱点云的处理效率,提出了一种散乱点云K最近邻(KNN)搜索算法。首先,利用多级分块、动态链表的存储方式,只存储非空的子空间编号
    发表于 12-11 14:09 1次下载

    二分搜索算法运用的框架套路

    我们前文 我作了首诗,保你闭着眼睛也能写对二分查找 详细介绍了二分搜索的细节问题,探讨了「搜索一个元素」,「搜索左侧边界」,「搜索右侧边界」
    的头像 发表于 08-25 16:06 1608次阅读

    图染色局部搜索算法python

    一个简单的局部搜索算法解决图染色问题,python版本太少了,写了一个
    发表于 01-03 14:31 1次下载