faiss 学习笔记(二) | 您所在的位置:网站首页 › opq是什么意思 › faiss 学习笔记(二) |
前言
faiss 的索引种类很多, 并且可以嵌套使用. 不同的索引有不同的实现方式及试用条件,根据数据集的特性和运行机器的性能来选择合适的索引是进行开发的第一步 faiss 核心组件在了解深入了解索引之前, 我们需要直到 faiss是基于三个高效实现基本算法 聚类 Faiss提供了一个高效的k-means实现 PCA降维算法 PQ(ProductQuantizer)编码/解码 基础索引有关于基础索引所使用的参数及其含义, 请参考 官方wiki - Faiss indexes 索引工厂模式另外,faiss实现了一个索引工厂模式,可以通过字符串来灵活的创建索引,例如 index = faiss.index_factory(d,"PCA32,IVF100,PQ8 ")该字符串的含义如下 使用PCA算法将向量降维到32维, 划分成100个nprobe (搜索空间), 通过PQ算法将每个向量压缩成8bit 为向量添加唯一ID 对于支持 add_with_ids() 方法的index ids = list[] ... ids = numpy.array(ids).astype('int') # 转换成int型一维数组 index.add_with_ids(data,ids) 对于不支持 add_with_ids() 的 index 借助 IndexIDMap ids = list[] ... ids = numpy.array(ids).astype('int') # 同上 index = ... index2 = faiss.IndexIDMap(index) index2.add_with_ids(data, ids) D, I = index2.search(data[:50], k) # 注意这里对索引的add 和 search # 都需要调用index2 来进行操作 # 来获取向量正确的id 如何选择合适的索引 1. 你需要确切的结果吗?唯一可以保证精确结果的索引是IndexFlatL2。它为其他指标的结果提供了基准。它不会压缩矢量,但不会增加它们之上的开销。它不支持使用ids(add_with_ids方法)添加向量及向量的名称,所以如果需要的话add_with_ids,使用"IDMap,Flat"。该索引不需要训练,也没有额外的参数. 在GPU上支持:是的 2. 内存是问题吗?请记住,所有的Faiss索引都将向量存储在RAM中。以下内容认为,如果不需要准确的结果,RAM是限制因素,并且在内存约束条件下,我们将把精确度和速度进行折衷。 如果不: "HNSWx"如果你有很多RAM或数据集很小,HNSW是最好的选择,它是一个非常快速和准确的指标。4 |
CopyRight 2018-2019 实验室设备网 版权所有 |