加速搜索
如果需要存储的向量太多,通过暴力搜索索引IndexFlatL2速度很慢,这里介绍一种加速搜索的方案,索引为IndexIVFFlat,即倒排文件,其实就是使用KMeans建立聚类中心,然后通过查询最近的聚类中心,比较聚类中的所有向量得到相似的向量
通过IndexIVFFlat索引,可以实现上面的思想,它需要一个训练阶段
创建IndexIVFFlat时需要指定一个其他的索引作为量化器,来判断向量属于哪个聚类中心
search方法也相应引入了nlist(聚类中心的数目)和nprobe(执行搜索的聚类数)
nlist = 100
k = 4
quantizer = faiss.IndexFlatL2(d)
index = faiss.IndexIVFFlat(quantizer, d, nlist, faiss.METRIC_L2)
print(index.is_trained) ---False
index.train(xb)
print(index.is_trained) ---True
index.add(xb)
D, I = index.search(xq, k)
print(I[-5:])
index.nprobe = 10
D, I - index.search(xq, k)
print(I[-5:])
经过 index.nprobe 的结果并不完全一致,因为落在聚类外的数据也可能离查询数据更近,适当增加 nprobe 可以得到和之前一 中比较相同的结果,nprobe 控制了速度和精度的平衡
网友评论