facebook Faiss的基本使用示例(逐步深入)

针对上一篇文章,安装完毕之后,可以对faiss进行基本的案例学习,具体步骤如下:


step1:构造实验数据



step2为向量集构建IndexFlatL2索引,它是最简单的索引类型,只执行强力L2距离搜索



step3:进行简单的k-近邻搜索



结果如下:

 

NOTE

 

1.程序输出为查询向量的最近邻的4个向量的索引

 

2.在机器上执行上述搜索需要约3.3秒。



step4:加快搜索速度

 

方法:

通过使用IndexIVFFlat索引,将数据集分割成多个,我们在d维空间中定义Voronoi单元,每个数据库向量落在其中一个单元格中。在搜索时,只有查询x所在的单元格中包含的数据库向量y和几个相邻的数据库向量y与查询向量进行比较。

 

搜索方法有两个参数:nlist(单元格数),nprobe(执行搜索访问的单元格数(nlist以外))



对于nprobe = 1,结果如下:



结果和上面的强力搜索类似,但是不同(见上文)。这是因为一些结果不在完全相同的Voronoi细胞。因此,访问更多的单元格可能是有用的。

设置nprobe = 10,结果如下:


这是正确的结果。

注意:在这种情况下获得完美的结果只是数据分布的一个假象,因为它在x轴上有一个强大的组件,这使得它更容易处理。nprobe参数始终是调整速度和结果精度之间权衡的一种方式设置nprobe = nlist给出与强力搜索相同的结果(但较慢)。

  

step5:进一步缩小存储空间

 

我们看到的索引IndexFlatL2和IndexIVFFlat都存储完整的向量。 为了扩展到非常大的数据集,Faiss提供了基于产品量化器的有损压缩来压缩存储的向量的变体。压缩的方法基于乘积量化。



结果如下:


我们可以观察到最近的邻居被正确地找到(它是矢量ID本身),但是向量自身的估计距离不是0,尽管它远远低于与其他邻居的距离。这是由于有损压缩。

 

另外搜索真实查询时,虽然结果大多是错误的,但是它们在正确的空间区域,而对于真实数据,情况更好,因为:

1.统一数据很难进行索引,因为没有规律性可以被利用来聚集或降低维度

2. 对于自然数据,语义最近邻居往往比不相关的结果更接近。


  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值