HNSW近邻搜索算法

文章目录

  • HNSW近邻搜索算法记录
    • 1 NSW算法
    • 2 跳表原理
    • 3 HNSW算法

HNSW近邻搜索算法记录

1 NSW算法

如果要知道HNSW算法,那首先必须得了解NSW原理,毕竟HNSW是根据HNSW升级转换而来

理想状态下,一个好的近邻搜索算法应该要包括三点的内容:1、构图算法的时间复杂度低;2、查找目标的效率高;3、具备"高速公路"机制(高速公路:相隔较远的点的连接,方便快速查找到当前节点)

HNSW近邻搜索算法_第1张图片

人为规定友节点数量是4(友节点:和自己最近的点的数量),上图解释:

1、我们要做的是搜索近邻,那肯定是要选择距离自己近的,当图中只有a节点的时候,没有友节点,所以a->0

2、当b插入图中的时候,发现只有a,那a就是b唯一的友节点,此时要更新a的友节点,所以a->b,b->a

3、当c插入图中的时候友节点都没超过4,同理b,所以a-73->b-90->c、b-73->a-88->c、c-88->b-90->a

4、当d插入图中的时候同理c,所以a-73->b-90->c-120->d、b-73->a-85->d-88->c、c-39->d-88->b-90->a、d-39->c-85->b-120->a

5、e插入的图中的时候同理d,所以a-48->e-73->b-90->c-120->d、b-73->a-85->d-88->c-99->e、c-39->d-59->e-88->b-90->a、d-39->c-85->b-101->e-120->a、e-48->a-59->c-99->b-101->d

6、当f插入的时候,发现图中已经有了5个节点,但规定是每个节点4个友节点,所以此时会选取离f点最近的4个点作为它的友节点,同样的,其他5个点当f选完后他们也会跟着变化自己的友节点,所以a-48->e-73->b-90->c-120->d、b-52->f-73->a-85->d-88->c-99->e、c-39->d-59->e-87->f-88->b-90->a、d-39->c-56->f-85->b-101->e-120->a、e-48->a-59->c-99->b-101->d、f-52->b-56->d-87->c-121->a

最后,我们可以发现原来存在的高速公路在这样逐步加入新的节点的时候已经被取代,这样肯定不是我们所想的,我们所想的肯定是不仅要查的快还要查的准,那这种高速公路肯定是要有所保留的,于是就有了HNSW算法

2 跳表原理

上文的讲述其实已经引出了HNSW的必要性就是高速公路的存在,那怎么才能让高速公路保留一定的数量呢,那就是将NSW和跳表结合,下面看下跳表的原理

HNSW近邻搜索算法_第2张图片

上图的原始链表是有序的链表,原始链表中的每个节点都有50%的概率添加到一级索引层,而一级索引层的节点同样也有50%的概率添加到二级索引层。当我现在要查找图中绿色节点32时,我可以分两种方法查找。

方法一:在原始链表中查找,那么需要跳转11次才能到达绿色节点。

方法二:先在二级索引中查找,经过两次跳转到达30节点,然后从下一级的30节点开始查找,最后再到原始链表查找,那么算上层之间的跳转,只需要跳转6次便可到达绿色节点。

3 HNSW算法

上文已经介绍了NSW算法以及跳表的原理,下图就是将NSW算法结合跳表实现的HNSW算法图

HNSW近邻搜索算法_第3张图片

附上原文链接:https://www.jianshu.com/p/c8f731e7510d

你可能感兴趣的:(大数据——机器学习,链表,算法,HNSW)