1,支持两种相似性计算方法:L2距离(即欧式距离)和点乘(归一化的向量点乘即cosine相似度);

2,按照是否编码压缩数据可以分为两类算法,使用压缩的算法可以在单台机器上处理十亿级别的向量规模;

3,并非线程安全的——不支持并行添加向量或搜索与添加的并行;仅在CPU模式下支持并行搜索;

4,只有继承了IndexIVF 的算法才支持向量的 remove() 操作,但由于是连续存储,remove的时间复杂度是 O(n),建议另外维护一个列表记录被删除的或尚存的向量;

5,faiss 针对批量搜索做了优化;

6,IndexPQ, IndexIVFFlat, IndexIVFPQ, IndexIVFPQR 需要训练;

7,不支持重新训练,建议新建一个索引;

8,只接受 32-bit 浮点类型的输入数据;

9,使用 index = faiss.index_factory(dim, "PCA32,IVF100,PQ8") 这种形式创建索引更灵活,此处类型参数可解释为:使用PCA降维将原始向量降至32维,使用 IVF 建立索引,子list(即bucket 分桶)个数为 100,使用 Product Quantizer (乘积量化) 将每个向量压缩编码成 8 字节;等价于

num_list = 64
dim = 64
bytes_per_vector = 8
bits_per_sub_vector = 8quantizer = faiss.IndexFlatL2(dim)
index = faiss.IndexIVFPQ(quantizer, dim, num_list, bytes_per_vector, bits_per_sub_vector)

10,索引类型的选择

  • 如果需要精确的搜索结果,不要降维、不要量化,使用 Flat,同时,使用Flat 意味着数据不会被压缩,将占用同等大小的内存;
  • 如果内存很紧张,可以使用 PCA 降维、PQ 量化编码,来减少内存占用,最终占用的内存大小约等于 <降维后的向量维度> * <量化后的每个向量的字节数> * <向量个数>; 如果量化编码后的字节数大于64,推荐使用SQx 替换PQx,准确度相同但速度会更快;为了便于量化编码,可以使用 OPQx_y 先对向量做线性变换,y 必须是编码后字节数x的倍数,但最好小于维度dim和4*x;
  • 如果总向量个数 N 小于 1百万,推荐使用  IVFx ,x 的选值介于 4*sqrt(N) 和 16*sqrt(N) 之间,训练数据的大小至少要是x的30倍;如果总向量个数 N 大于 1百万、小于 1千万,推荐使用 IMI2x10,实际内部聚类个数是 2 ^ (2 * 10),将需要64 * 2 ^ 10 个向量参与训练;如果总向量个数 N 大于 1千万、小于 1亿,推荐使用 IMI2x12;如果总向量个数 N 大于 1亿、小于 10亿,推荐使用 IMI2x14;IMI方法不支持GPU;
  • IndexIVF 天生支持 add_with_ids 方法,对于不支持 add_with_ids方法的类型,可以使用IndexIDMap 辅助
  • index = faiss.IndexFlatL2(xb.shape[1])
    ids = np.arange(xb.shape[0])
    index.add_with_ids(xb, ids)  # this will crash, because IndexFlatL2 does not support add_with_ids
    index2 = faiss.IndexIDMap(index)
    index2.add_with_ids(xb, ids) # works, the vectors are stored in the underlying index

4,常见问题:

暴力搜索比较慢,解决方法:

export OMP_WAIT_POLICY=PASSIVE

参考:

https://github.com/facebookresearch/faiss

https://github.com/facebookresearch/faiss/wiki/Troubleshooting

https://github.com/facebookresearch/faiss/wiki/FAQ

faiss 相似特征向量搜索相关推荐

  1. faiss之特征检索与聚类算法

    特征检索与聚类算法 核心逻辑: 如何得到数字特征 如何对目标进行召回和排序 相关算法 Tree-based FLANN Annoy Quantization-based Faiss Graph-bas ...

  2. 向量检索(一)Faiss 在工业界的应用和常见问题解决

    一.向量检索的场景 传统的搜索,使用关键做精确的查找,利用倒排索引在索引库中搜索.日常在用的百度,Google都属于关键词搜索. 在 AI 时代,我们需要查找一张相似的图片,一个问题的答案,或者根据一 ...

  3. faiss的python接口使用

    faiss的python接口使用 1. 简介 2. 安装 3. 示例 1. 简介 faiss是一种ann(Approximate Nearest Neighbor)库,可以用于特征的入库,检索. 不仅 ...

  4. 取消高速省界收费站驶入“快车道”,我们距智能交通还有多远?

    取消高速公路省界收费站不仅是我国高速公路收费模式的重大变革,更是高速公路迈向智能化的关键一环. 每逢周末或者节假日,高速公路的拥堵都让人惴惴不安.长跑高速的老司机们都知道,抛开事故等突发状况,进出收费 ...

  5. 高速公路发展趋势,智慧高速公路解决方案

    一.高速公路发展趋势 高速公路监控.通信.收费三大系统,为高速公路智能化奠定了坚实基础.高速公路不停车收费系统全国联网,更是将高速公路智能化推向了新的阶段,随着移动互联网.大数据.云计算等新一代信息技 ...

  6. 迷人的神经网络——机器学习笔记1

    目录 迷人的神经网络--机器学习笔记1 第1章 神经元模型及网络结构 1.1 神经元模型 1.1.1 单输入神经元 1.1.2 激活函数 1.1.3 多输入神经元 1.2 网络结构 1.2.1 单层神 ...

  7. 实现 AI 换脸的第一步:人脸搜索

    前段时间,AI 换脸这条新闻你关注了吗? 说的是一位博主将 1994 年版<射雕英雄传>里朱茵的脸换成了杨幂的脸.因为该视频涉及到版权问题已被下架,但大家可以看看图片对比来感受一下&quo ...

  8. faiss通用向量搜索服务玩转腾讯880万词向量

    通用向量搜索服务 faiss是个高效的向量搜索解决方案,经过测试对比,可以感受到它的飞速,关于faiss性能测试的见这里:faiss包装与性能对比 这次开源的是使用faiss搭建的通用向量搜索服务. ...

  9. 完全解析:使用Faiss进行海量特征的相似度匹配

    点击上方"计算机视觉工坊",选择"星标" 干货第一时间送达 作者丨Gemfield@知乎 来源丨https://zhuanlan.zhihu.com/p/210 ...

最新文章

  1. 关于Java“回调”的详细理解及使用
  2. Spring Boot入门——全局异常处理
  3. python集合例题_python基础练习题、集合的讲解、一些公关方法
  4. fast-json.jar的用法
  5. 顶点计划家庭感情冲突问题讨论
  6. 分布式本质论:高吞吐、高可用、可扩展 (1)
  7. 优盘中发现计算机病毒怎么办,u盘插电脑中了病毒怎么办
  8. python normalize函数_Python normalize包_程序模块 - PyPI - Python中文网
  9. 如何用命令行和carbite c++生成sis文件
  10. 如何选择最佳技术来加速文件传输—镭速
  11. Xdebug中文文档-基础特性
  12. hex文件格式剖析,以及hex与bin文件互相转换
  13. AD20和立创EDA设计(2)提取立创EDA的原理图库和PCB库
  14. win11旗舰版安装WSL子系统和环境-12配置SSH(Win远程连接)
  15. ThreadPoolExecutor详解及线程池优化
  16. Debian 安装与设置
  17. 人工智能之眼:运用科技消除可预防失明
  18. 取消检验批过账(决策)
  19. 第四篇:由浅入深,虚拟机常量池底层解析
  20. 超简单的数据分析模板

热门文章

  1. 现代服务器底层奠基(SEDA+Reactor/Proactor+epoll/kqueue )
  2. 实现微信支付(Native支付),使用WebSocket进行推送——3.创建支付订单,接收付款结果
  3. 马尔可夫决策过程(Markov Decision Process, MDP)
  4. Word操作之Mathtype自动进行公式编号
  5. windows10图片打开找不到内置图片查看器
  6. 【算法】【树】已知先序中序序列求后序序列(详细解释)
  7. [转] linux操作系统下c语言编程入门
  8. Java常见面试题(JVM)
  9. classnames库的简单使用
  10. [微传感器]PID控制结合电路的通俗理解