nsw hnsw

article/2025/9/13 11:45:53

参考了很多该博客 https://blog.csdn.net/u011233351/article/details/85116719,感谢博主。

参考论文《Approximate nearest neighbor algorithm based on navigable small world graphs》

《Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs》

----------------------------------先了解NSW------------------------------------

 

NSW论文中配了这样一张图,黑色是近邻点的连线,红色线就是“高速公路机制”了。我们从enter point点进入查找,查找绿色点临近节点的时候,就可以用过红色连线“高速公路机制”快速查找到结果。

为什么会形成“高速公路”呢?来看下面的例子

我们对7个二维点进行构图,用户设置m=3(每个点在插入时找3个紧邻友点)。首先初始点是A点(随机出来的),A点插入图中只有它自己,所以无法挑选“友点”。然后是B点,B点只有A点可选,所以连接BA,此为第1次构造。然后插入F点,F只有A和B可以选,所以连接FA,FB,此为第2此构造。然后插入了C点,同样地,C点只有A,B,F可选,连接CA,CB,CF,此为第3次构造。重点来了,然后插入了E点,E点在A,B,F,C中只能选择3个点(m=3)作为“友点”,根据我们前面讲规则,要选最近的三个,怎么确定最近呢?朴素查找!从A,B,C,F任意一点出发,计算出发点与E的距离和出发点的所有“友点”和E的距离,选出最近的一点作为新的出发点,如果选出的点就是出发点本身,那么看我们的m等于几,如果不够数,就继续找第二近的点或者第三近的点,本着不找重复点的原则,直到找到3个近点为止。由此,我们找到了E的三个近点,连接EA,EC,EF,此为第四次构造。第5次构造和第6次与E点的插入一模一样,都是在“现成”的图中查找到3个最近的节点作为“友点”,并做连接。

        图画完了,请关注E点和A点的连线,如果我再这个图的基础上再插入6个点,这6个点有3个和E很近,有3个和A很近,那么距离E最近的3个点中没有A,距离A最近的3个点中也没有E,但因为A和E是构图早期添加的点,A和E有了连线,我们管这种连线叫“高速公路”,在查找时可以提高查找效率(当进入点为E,待查找距离A很近时,我们可以通过AE连线从E直接到达A,而不是一小步一小步分多次跳转到A)。

-------------------------------------划重点:越早插入的点越容易产生高速公路-------------------------

对于查询来说,这里有三个点集合:candidates、visitedset、results 。其中candidates为当前要考察的点集合,visitedset为已经访问过的点集合,results为当前距离查询点最近的点集合;前两者为变长,最后为定长。

查询流程如下:

  1. 随机选择一个点作为查询起始点entry_point,把该点加入candidates中,同时加入visitedset
  2. 遍历candidates,从candidates中选择距离查询点最近的点c,和results中距离查询点最远的点d进行比较,如果c和查询点q的距离大于d和查询点q的距离,则结束查询,说明当前图中所有距离查询点最近的点已经都找到了,或者candidates为空
  3. 从candidates中删除点c
  4. 查询c的所有邻居e,如果e已经在visitedset中存在则跳过,不存在则加入visitedset
  5. 把比d和q距离更近的e加入candidates、results中,如果results未满,则把所有的e都加入candidates、results。如果results已满,则弹出和q距离最远的点
  6. 循环2-5     

论文中的伪码:

K-NNSearch(object q, integer: m, k)
TreeSet [object] tempRes, candidates, visitedSet, result 
// 进行m次循环,避免随机性
for (i←0; i < m; i++) do:put random entry point in candidatestempRes←nullrepeat:// 利用上述提到的贪婪搜索算法找到距离q最近的点cget element c closest from candidates to qremove c from candidates// 判断结束条件if c is further than k-th element from result thenbreak repeat// 更新后选择列表for every element e from friends of c do:if e is not in visitedSet thenadd e to visitedSet, candidates, tempResend repeat// 汇总结果add objects from tempRes to result 
end for 
return best k elements from result

-----------------------------------------装个逼,写一句自己的理解,欢迎大佬修正--------------------------------

         其实搜索过程还是图搜索里面open-closed表那一套吧,所以NSW最重要的是构图机制(伪德劳内,其实跟德劳内没有版毛钱关系)产生了高速公路,而且算法复杂度要比德劳内算法更小

----------------------------------------------NSW部分完,接下来是HNSW------------------------------------------------

HNSW

-----------------------------------------------先来了解跳表---------------------------------------------

正常查找需要遍历八个节点,现在只需要遍历七个节点,这个数据量比较小,优势不太明显。数据量越大有优势越明显

这样就保证了表层是“高速通道”,底层是精细查找,这个思想被应用到了NSW算法中,变成了其升级版-----HNSW

 

---------------------------------------------------先看查找最近邻算法,如下图----------------------------------

输入:q是待插入点,ep是enter point(s),ef是返回最近邻的数量,lc是根据公式计算的q在哪些层

输出:q的ef个最近邻

c是候选点里面的某一点

f是上一步找到的最近邻点里面的最远点

7,8:如果c和q的距离大于f和q的距离,重新提取c

9,如果小于,就访问c的neighbours,更新已访问点v的数组和最远点f的值

13-17:如果e和q的距离小于f和q的距离,把e更新到候选点C的数组和返回最近邻点W的数组,如果W数组的长度大于ef的个数,就把最远点删除,从这可以看出W是一个动态链表,它的长度随着ef的个数而变化。

 

-----------------------------------------------------接下来是hnsw算法构建graph过程--------------------------------------------------------------

 

HNSW里面的多层结构不同于传统意义上的跳表,它的每一层不是顺序表,而是近邻图

这个算法总的来说干了个啥:遍历需要搜索的所有点,把每个点依次插入之后,确定该点所在的层数,建立该点与graph中其他点的连接关系(就是确定该点的邻居都有谁),举个例子:如果该点的层数l是3,那么算法会依次遍历3,2,1,0层的节点,分别在每一层用上面提到的SEARCH-LAYER算法找到自己的邻居,与这些邻居建立连接关系,每一层的每个节点的邻居数量是有限的(Mmax),如果大于这个数,就会丢弃最远的邻居,直到把所有点都insert到graph里面。

输入:graph ,q是待插入点,Mmax是每个点在某一层最多的连接数

输出:插入q,更新hnsw

第一步,L是top layer, l是根据公式(详见论文)算出来的layer,ef=1,就是简单的greedy search ,搜索到一个最接近的节点;

第二步,把第一步中获取的近邻值ep作为enter point,并用上面提到的SEARCH-LAYER依次在每一层查找最近邻,搜索到的最近邻会通过SELECT-NEIGHBOURS选取前几个到neighbours中,中间这几部比较简单,就不多说了,最后把搜索到的最近邻作为下一次的enter points。这里并不是从顶层开始遍历每一层,而是从min(L,l)到第0层

第二步开始以后,返回的近邻数量就从1变为efconstruction个了,这是为了保证检索的召回率;找到的最近邻值也作为插入值的候选,the found closest neighbors on each layer are also used as candidates for the connections of the inserted element。

第11行,找到这些邻居之后,将待插入点q和这些邻居之间建立联系,

Mmax是第0层以外的每一层的每个节点的最大边数,Mmax0是第0层的每个节点的最大边数(connections)

 

插入点q的层数l是个随机数,从l层到0层都会建立连接关系,第8-11行说明了该问题

 

----------------------------接下来就是利用KNN-SEARCH在建好的HNSW graph进行检索q的过程---------------------------

这个就比较好懂了,

先遍历top layer L到第1层,找到一个最近邻值作为下一步搜索的enter point

然后在第0层搜索,得到K个最近邻值。

 


http://chatgpt.dhexx.cn/article/9eReGAce.shtml

相关文章

思科光交MDS9710绑定WWN并激活新的wwn

第一步、查看所有的wwn号 #命令 #show flogi database 内容示例&#xff1a; 第二步、查看是否有发现新的wwn号 图中为新发现的wwn号 第三步、将该wwn号加入到对应的zone下 #先筋肉config模式 #再进入对应的zone zone name Zone_P11_****——** vsan 1 #新增新存在的wwn号…

www.wwwwwwwwww

复习题 一、问答题 1.Anaconda的优点有哪些&#xff1f; &#xff08;1&#xff09;开源。 &#xff08;2&#xff09;安装过程简单。 &#xff08;3&#xff09;⾼性能使⽤Python和R语⾔。 &#xff08;4&#xff09;免费的社区⽀持。 &#xff08;5&#xff09; Conda包…

NWD(2022)

A Normalized Gaussian Wasserstein Distance for Tiny Object Detection Abstract 检测微小物体是一个非常具有挑战性的问题&#xff0c;因为微小物体仅包含几个像素大小。我们证明&#xff0c;由于缺乏外观信息&#xff0c;最先进的检测器无法在微小物体上产生令人满意的结…

SAN环境中WWN,WWNN,WWPN的区别

存储区域网络&#xff08;Storage Area Network&#xff0c;简称SAN&#xff09;采用网状通道&#xff08;Fibre Channel &#xff0c;简称FC&#xff0c;区别与Fiber Channel光纤通道&#xff09;技术&#xff0c;通过FC交换机连接存储阵列和服务器主机&#xff0c;建立专用于…

WWN,WWNN,WWPN介绍

WWN是HBA卡用的编号吧&#xff0c;每一个光纤通道设备都有一个唯一的标识&#xff0c;称为WWN&#xff08;world wide name&#xff09;&#xff0c;由IEEE负责分配。在有多台主机使用磁盘阵列时&#xff0c;通过WWN号来确定哪台主机正在使用指定的LUN&#xff08;或者说是逻辑…

WWN,WWNN,WWPN区别

WWN: world wide number 是硬件的全球唯一标示 WWPN: world wide port number 是指端口号 WWNN: world wide node number 是指节点号 如果是光纤交换机的话wwn和wwnn是一样的,而wwpn是指每个光纤端口. 如果是HBA卡的话,若是只有一个端口则三者可能一样,若是有多个端口则和交换…

如何查看WWN号

如何查看WWN号 WWN即World Wide Name,用来标识网络上的一个连接或连接集合,主要用于FC和SAS。就像网卡的MAC地址一样,WWN是用在光纤网络的。 如何查看WWN号AIX: 1,获得AIX主机连接的光纤设备: # lsdev -Cc adapter -S a | grep fcs fcs0 Ava…

linux查看WWN号及常见问题解决

linux查看WWN号及常见问题解决 查看WWN号查看WWID号查询常见问题 查看WWN号 要查看CentOS 6.7版本的WWN号&#xff0c;可以执行以下步骤&#xff1a; 1.确保已经连接了存储设备。 lspci | grep -i fibre2.在终端中输入命令&#xff1a;lsscsi&#xff0c;然后按 Enter 键。该命…

WWN,WWNN,WWPN三者的区别

WWN: world wide number 是硬件的全球唯一标示 WWPN: world wide port number 是指端口号 WWNN: world wide node number 是指节点号 如果是光纤交换机的话wwn和wwnn是一样的,而wwpn是指每个光纤端口. 如果是HBA卡的话,若是只有一个端口则三者可能一样,若是有多个端口则和交换…

excel制作可模糊匹配的下拉框

1.整体效果&#xff1a; 2.设置数据有效性 在来源中输入公式&#xff1a;OFFSET(国籍地区!$A$1,MATCH(船舶基本资料!$F2&"*",国籍地区!$A$2:$A$246,0),,COUNTIF(国籍地区!$A$2:$A$246,船舶基本资料!$F2&"*"),) 其中“国籍地区”为一个sheet,ru如下…

关于Excel表操作-通过gensim实现模糊匹配

gensim是一个Python的自然语言处理库&#xff0c;能够将文档根据TF-IDF&#xff0c;LDA&#xff0c;LSI等模型转换成向量模式&#xff0c;此外&#xff0c;gensim还实现了word2vec&#xff0c;能够将单词转换为词向量。 gensim的一些常见概念&#xff1a; 语料Corpus: 一组原始…

Excel效率提升|解决不完全匹配数据整理

以各地级市&#xff08;1&#xff0d;5线城市&#xff09;人均GDP数据为例 从国家统计局或wind导出来的数据&#xff1a; 而我们整理后的目标sheet的匹配字段如图&#xff1a; 如何进行有效匹配&#xff1f; 观察可知&#xff1a;我们需要以城市名作为匹配的依据 如何将城市名批…

ExcelWPS通配符的使用方法,一招解决模糊查询!

大家好&#xff0c;本期和大家分享Excel通配符的使用方法&#xff01; Excel 通配符一共有3个。 它们的含义如下图所示&#xff1a; 符号含义举例&#xff1f;表示任意单个字符比如要查找所有姓王的名字为2个字的人&#xff0c;则可以使用 【 王? 】 代替&#xff1b;查找所…

[Excel]vlookup的内在逻辑以及模糊检索

作为一个excel的用户&#xff0c;vlookup可能是使用频度最高的一个函数 但是有关这个函数当中的数学意义不知道大家具体了解多少 今天就在这里讲讲我个人的vlookup的一些用法 比一般的使用方法稍微高阶一点&#xff08;求保命&#xff09; 大部分人刚开始使用vlookup的时候都…

python 模糊匹配字符串 excel,python pandas模糊匹配 读取Excel后 获取指定指标的操作...

1.首先读取Excel文件 数据代表了各个城市店铺的装修和配置费用,要统计出装修和配置项的总费用并进行加和计算; 2.pandas实现过程 import pandas as pd #1.读取数据 df = pd.read_excel(r./data/pfee.xlsx) print(df) cols = list(df.columns) print(cols) #2.获取含有装修 和…

模糊匹配省市区地址

用户输入地址不可能一定规范&#xff0c;如按习惯省略掉&#xff1a;“省”、“市”、“区”等关键字&#xff0c;此时安装正则匹配很容易查找不到正确的地址。 以下代码按照用户输入的先后顺序&#xff0c;相同的词组进行匹配&#xff0c;可靠性与适配性大大提高&#xff0c;记…

excel根据不同的条件模糊匹配,替换,做计算

IF(COUNTIF(E2,“Gbps”)>0,VALUE(SUBSTITUTE(E2," Gbps","")),IF(COUNTIF(E2,“Tbps”)>0,VALUE(SUBSTITUTE(E2," Tbps","")*1024),IF(COUNTIF(E2,“Mbps”)>0,VALUE(SUBSTITUTE(E2," Mbps","")/1024),…

【Python处理EXCEL】轻办公实用篇1:通过模糊匹配算法对两个excel表格的内容进行匹配归类

目录 一、问题描述 二、运用方法 三、代码编写 3.1 3.2 3.3 3.4 3.5 四、代码集合 一、问题描述 在实习的时候&#xff0c;需要将两个表格的内容进行匹配分类&#xff0c;比如两个不同的工程项目针对的对象都是A&#xff0c;那么就需要将这两个工程项目归类到A当中&am…

python 模糊匹配字符串 excel,python pandas模糊匹配Excel指定指标 python pandas模糊匹配 读取Excel后 获取指定指标的操作...

想了解python pandas模糊匹配 读取Excel后 获取指定指标的操作的相关内容吗,D_grey在本文为您仔细讲解python pandas模糊匹配Excel指定指标的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:python,pandas,模糊匹配,读取Excel,指定指标,下面大家一起来学习吧。 1.首…

wps中excel如何实现模糊搜索匹配的内容(可以匹配想要的各种格式)

1&#xff0c;在某一列进行搜索-筛选搜索-如包含“XXX信息XX公司XX”这种格式的。 输入 &#xff1a;信息*公司 &#xff08;1&#xff09;选择第一种搜索方式代表寻找符合条件&#xff1a; 包含信息和公司两个关键字&#xff0c; 且信息在前公司在后&#xff0c; 且两个词语之…