当前位置:   article > 正文

faiss学习(二)另外两种基础索引,保存索引_indexivfflat

indexivfflat

在上一篇文章里面的官方demo建立索引方式使用的是最基本的索引,这里在介绍两种基础索引

更多索引类别1--更快的检索IndexIVFFlat

官方介绍:
为了加快搜索速度,可以将数据集分割成几部分。我们在d维空间中定义Voronoi单元格,并且每个数据库矢量都落入其中一个单元格中。在搜索时,只有查询x所在单元中包含的数据库向量y与少数几个相邻查询向量进行比较。(划分搜索空间)
这是通过IndexIVFFlat索引完成的。这种类型的索引需要一个训练的过程,可以在与数据库向量具有相同分布的任何向量集合上执行。在这种情况下,我们只测试数据进行搜索。
IndexIVFFlat还需要另一个索引,即量化器(quantizer),它将矢量分配给Voronoi单元。每个单元由一个质心定义,找到一个矢量所在的Voronoi单元包括在质心集中找到该矢量的最近邻居。这是另一个索引的任务,通常是索引IndexFlatL2。
搜索方法有两个参数:
---nlist 划分单元的数量
---nprobe 执行搜索访问的单元格数(不包括nlist)
官方demo:

  1. import numpy as np
  2. d = 64 # 向量维度
  3. nb = 100000 # 向量集大小
  4. nq = 10000 # 查询次数
  5. np.random.seed(1234)
  6. xb = np.random.random((nb, d)).astype('float32')
  7. xb[:, 0] += np.arange(nb) / 1000.
  8. xq = np.random.random((nq, d)).astype('float32')
  9. xq[:, 0] += np.arange(nq) / 1000.
  10. import faiss
  11. nlist = 100
  12. k = 4
  13. quantizer = faiss.IndexFlatL2(d) # the other index
  14. index = faiss.IndexIVFFlat(quantizer, d, nlist, faiss.METRIC_L2)
  15. assert not index.is_trained
  16. index.train(xb)
  17. assert index.is_trained
  18. index.add(xb) # 添加索引可能会有一点慢
  19. D, I = index.search(xq, k) # 搜索
  20. print(I[-5:]) # 最初五次查询的结果
  21. index.nprobe = 10 # 默认 nprobe 是1 ,这里设置为10
  22. D, I = index.search(xq, k)
  23. print(I[-5:]) # 最后五次查询的结果

一般来说,搜索精度会随着nprobe的提高而提高,但是与之同时速度也会变慢

更多索引类别—更少的内存IndexIVFPQ

使用有损存储:
我们看到的索引IndexFlatL2和IndexIVFFlat都存储完整的向量。 为了扩展到非常大的数据集,Faiss提供了基于产品量化器的有损压缩来压缩存储的向量的变体。压缩的方法基于乘积量化(Product Quantizer)。
在这种情况下,由于矢量没有精确存储,搜索方法返回的距离也是近似值。
官方示例:

  1. import numpy as np
  2. d = 64 # 向量维度
  3. nb = 100000 # 向量集大小
  4. nq = 10000 # 查询次数
  5. np.random.seed(1234) # 随机种子,使结果可复现
  6. xb = np.random.random((nb, d)).astype('float32')
  7. xb[:, 0] += np.arange(nb) / 1000.
  8. xq = np.random.random((nq, d)).astype('float32')
  9. xq[:, 0] += np.arange(nq) / 1000.
  10. import faiss
  11. nlist = 100
  12. m = 8
  13. k = 4
  14. quantizer = faiss.IndexFlatL2(d) # 内部的索引方式依然不变
  15. index = faiss.IndexIVFPQ(quantizer, d, nlist, m, 8)
  16. # 每个向量都被编码为8个字节大小
  17. index.train(xb)
  18. index.add(xb)
  19. D, I = index.search(xb[:5], k) # 测试
  20. print(I)
  21. print(D)
  22. index.nprobe = 10 # 与以前的方法相比
  23. D, I = index.search(xq, k) # 检索
  24. print(I[-5:])

保存索引

可以使用如下方法将索引保存为文件:
faiss.write_index(index, "large.index")
然后需要使用时,使用以下方法读取文件建立索引:
index = faiss.read_index("large.index")

参考文章:(对基础索引介绍的更详细一些,不过多为谷歌翻译直译)

https://www.jianshu.com/p/43db601b8af1

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/875028
推荐阅读
相关标签
  

闽ICP备14008679号