HNSW算法中,图的构建方式有多种不同的实现方法,最常用的是使用欧几里得空间中的距离作为节点之间的边权。具体来说,给定一个数据集$X={x_1,x_2,\ldots,x_n}$,其中每个向量$x_i$属于一个$d$维的欧几里得空间,可以构建一个有向图$G=(V,E)$,其中每个向量$x_i$对应图中的一个节点$v_i$,并且每个节点$v_i$都连接到与其距离最近的$k$个节点$v_{i_1},v_{i_2},\ldots,v_{i_k}$。这个过程中,$k$是超参数,代表每个节点的出度,即连接到其他节点的边的数量。
HNSW算法的分层实现是基于图的构建方式,具体来说,多层索引结构是由不同的图组成的。第一层是原始图,每个节点的出度为$k$,在此基础上,HNSW算法逐层递增出度$k'$,构建出更高层的图,直到达到所需的层数。一般情况下,每个节点的出度$k'$比前一层的出度$k$要大,同时高层图的节点数量会随着层数的增加而逐渐减少。
形式化地,可以将HNSW算法表示为一个三元组$(X,L,f)$,其中$X$是一个数据集,$L$是层数,$f$是构建索引的具体方法。索引构建方法$f$以数据集$X$和层数$L$为输入,输出是一个多层索引结构$G=(V,E)$。节点集合$V$是数据集$X$的节点表示,即$V={v_1,v_2,\ldots,v_n}$,每个节点$v_i$对应着数据集中的一个向量$x_i$。边集合$E$表示节点之间的连接关系,$E=\bigcup_{l=0}^{L-1}E_l$,其中$E_l$是第$l$层图中的边集合。具体来说,对于第$l$层图中的节点$v_i$,$E_l(v_i)$表示与节点$v_i$相邻的节点集合,也就是与节点$v_i$距离最近的$k'$个节点,其中$k'$是第$l$层的出度