hnswlib 代码分析 hnswlib 源码分析
train过程说明
-
- 主要是生成hnsw模型
- Hnsw中,storage中存储的原始的中心点向量
- 生成hnsw
- 为每层分配空间
- 每层的中心点在当前层及下面的每一层都有中心点,例如第n层在n、n-1、…1层都有临近点,第3层只在3、2、1层有临近点。
- 同一个临近点在各层的数据是连续存储在一起的。
- 新加入的数据在下面的各层查找对应的临近点的候选集,选出最后的临近点,然后建立link
- 调整其他临近点的link,因为临近是相互的
76 void HNSW::set_default_probas(int M, float levelMult)
77 {
78 int nn = 0;
79 cum_nneighbor_per_level.push_back (0);
80 for (int level = 0; ;level++) {
81 float proba = exp(-level / levelMult) * (1 - exp(-1 / levelMult)); ///点落在每一层的概率,层越高概率越低,第0层概率为0.5
82 if (proba < 1e-9) break;
83 assign_probas.push_back(proba); ///向量落入每一层的概率
84 nn += level == 0 ? M * 2 : M;
85 cum_nneighbor_per_level.push_back (nn); ///