Faiss 索引深度解析:从基础到实战
在处理高维数据的相似性搜索时,Faiss(Facebook AI Similarity Search)无疑是一款强大且高效的工具。它为我们提供了多种索引类型,适用于不同规模和需求的数据场景。本文将结合代码实例,深入剖析 Faiss 中常见索引的原理、特点及应用。
一、初识 Faiss 与数据准备
Faiss 是一个专门用于高效相似性搜索和密集向量聚类的库,能够处理包含数十亿个向量的数据集,在图像检索、自然语言处理等领域有着广泛应用。在使用 Faiss 之前,我们先准备一些数据。通过以下代码生成具有 20000 个样本、128 维的浮点型数据集,以及一个用于查询的样本:
import time
import numpy as np
import faiss
np.random.seed(2025)
data = np.random.normal(size=(20000, 128)).astype('float32')
query = np.random.normal(size=(1, 128)).astype('float32')
二、Faiss 索引类型详解
1. 暴力搜索(Flat)索引
Flat 索引是 Faiss 中最基础的索引类型,它采用暴力搜索的方式,直接计算查询向量与数据集中所有向量的距离。创建 Flat 索引非常简单,使用faiss.index_factory函数传入维度和索引类型参数即可:
index = faiss.index_factory(128, 'Flat')
index.add(data)
now = time.time()
D, I = index.search(query, 1)
aa = time.time()
print(aa - now)
这种索引的优点是能够保证较高的准确性,因为它遍历了所有数据。然而,其缺点也很明显,当数据量较大时,计算开销巨大,搜索速度慢,适用于数据量较小的场景。
2. 倒排索引(IVF)
倒排索引(Inverted File,IVF)通过将向量空间划分为多个区域(cell),在查询时只在部分相关区域内进行搜索,从而提高搜索效率。以IVF50,Flat为例,IVF50表示将向量空间划分为 50 个区域,每个区域内部再使用 Flat 索引进行搜索:
index = faiss.index_factory(128, 'IVF50,Flat')
index.train(data)
index.add(data)
D, I = index.search(query, 1)
print(D)
print(I)
使用倒排索引前需要对数据进行训练,这一步骤有助于优化索引结构。倒排索引在提高搜索速度的同时,可能会降低一定的准确性,适合处理中型数据集。
3. 乘积量化(PQ)索引
乘积量化(Product Quantization,PQ)是一种用于向量压缩的技术,它通过将高维向量分解为多个低维子向量,并对每个子向量进行量化,从而实现向量的降维存储和快速搜索。PQ8表示将每个向量压缩为 8 位:
index = faiss.index_factory(128, 'PQ8')
index.train(data)
index.add(data)
D, I = index.search(query, 1)
print(D)
print(I)
PQ 索引在减少内存占用的同时,能够显著提高搜索速度,但会牺牲一定的精确性,常用于对内存和速度有较高要求的场景。
4. 复合索引(PCA + IVF + PQ)
复合索引结合了多种索引技术的优势,例如PCA16,IVF50,PQ8索引,先通过 PCA(主成分分析)将数据从 128 维降至 16 维,降低数据维度后再使用倒排索引和乘积量化:
index = faiss.index_factory(128, 'PCA16,IVF50,PQ8')
index.train(data)
index.add(data)
D, I = index.search(query, 1)
print(D)
print(I)
这种复合索引方式在处理大规模高维数据时,能在速度和精确性之间取得较好的平衡,是实际应用中常用的选择。
5. 局部敏感哈希(LSH)索引
局部敏感哈希(Locality Sensitive Hashing,LSH)是一种哈希算法,它将相似的向量映射到相同或相近的哈希值,从而实现快速的近似搜索。在 Faiss 中创建 LSH 索引如下:
index = faiss.index_factory(128, 'LSH')
index.train(data)
index.add(data)
D, I = index.search(query, 1)
print(D)
print(I)
LSH 索引对数据的微小变化非常敏感,一个参数的改变可能会导致哈希值的大幅变化,适合对搜索速度要求极高,但可以接受一定误差的场景。
三、总结与建议
通过以上代码示例,我们对 Faiss 的多种索引类型有了更深入的了解。在实际应用中,我们需要根据数据规模、查询效率和准确性要求等因素,选择合适的索引类型。对于小规模数据,Flat 索引可以保证准确性;对于中型数据,倒排索引是不错的选择;而处理大规模高维数据时,复合索引往往能带来更好的性能表现。
此外,在使用 Faiss 时,还可以进一步调整索引参数、进行性能测试和添加更多评估指标,以优化搜索效果。如果你在实际项目中也在使用 Faiss,欢迎在评论区分享你的经验和遇到的问题,让我们共同学习进步!
以上博客涵盖了 Faiss 索引的核心内容。若你觉得某些部分需要补充,或是有特定的案例想加入,欢迎随时告诉我。
相关文章:
Faiss 索引深度解析:从基础到实战
在处理高维数据的相似性搜索时,Faiss(Facebook AI Similarity Search)无疑是一款强大且高效的工具。它为我们提供了多种索引类型,适用于不同规模和需求的数据场景。本文将结合代码实例,深入剖析 Faiss 中常见索引的原理…...
Error parsing column 10 (YingShou=-99.5 - Double) dapper sqlite
在使用sqlite 调取 dapper的时候出现这个问题提示: 原因是 在 sqlite表中设定的字段类型是 decimel而在C#的字段属性也是decimel,结果解析F负数 小数的时候出现这个错误提示: 解决办法:使用默认的sqlite的字段类型来填入 REAL描述…...
星云智控:物联网时代的设备守护者——卓伊凡详解物联网监控革命-优雅草卓伊凡
星云智控:物联网时代的设备守护者——卓伊凡详解物联网监控革命-优雅草卓伊凡 一、物联网的本质解析 1.1 什么是物联网? 当卓伊凡被问及”星云智控物联网是干嘛的”这个问题时,他首先给出了一个技术定义:物联网(Int…...
LeRobot 项目部署运行逻辑(五)——intelrealsense.py/configs.py
在运行 control_robot.py 的时候会启用相机拍摄,lerobot 中封装好了两种相机类型:realsense 和 opencv realsense 直接使用他们的脚本就可以,但需要在 lerobot/robot_devices/robots/configs.py 中修改相机 serial_number 由于我们设备采用的…...
从0开始学linux韦东山教程第一三章问题小结(1)
本人从0开始学习linux,使用的是韦东山的教程,在跟着课程学习的情况下的所遇到的问题的总结,理论虽枯燥但是是基础。 摘要关键词:VMware、Ubuntu、网络网口 视频链接:【【韦东山】韦东山手把手教你嵌入式Linux快速入门到精通 | Lin…...
解决 MySQL 数据库无法远程连接的问题
在使用 MySQL 数据库时,遇到这样的问题: 本地可以连接 MySQL,但远程机器连接时,总是报错 Host ... is not allowed to connect to this MySQL server。 这通常是因为 MySQL 的用户权限或配置限制了远程访问。 1. 登录 MySQL 数据…...
分享一款开源的图片去重软件 ImageContrastTools,基于Electron和hash算法
最近发现个挺实在的图片查重软件,叫ImageContrastTools。电脑手机都能用,特别适合整理乱七八糟的相册。直接去这里下载就能用: https://github.com/html365/ImageContrastTools 功能说明: 1️⃣ 选个文件夹就能自动扫重复图&…...
软件测试——用例篇(2)
目录 一、基于需求的设计方法 1.1设计账号注册、账号登录的测试用例 1.1.1功能测试 1.1.2界面测试 1.1.3性能测试 1.1.4兼容性测试 1.1.5易用性测试 1.1.6安全测试 一、基于需求的设计方法 根据参考需求文档/产品规格说明书来设计测试用例 测试人员接到需求之后、对需求…...
图像匹配导航定位技术 第 11 章
第 11 章 基 于 改 进 SIFT 的 SAR 与 可 见光 图 像 匹 配 控 制 点 定 位 算 法 HOG 描述子也只是对整幅图像的特征向量进行匹配,但是仍然存在局部匹配误差。而局部不变特征(如 SIFT,Harris 等)是对特征点局部邻域的特征进行描述来构造局部…...
安装jdk步骤
将Linux安装jdk的步骤放入shell脚本中 #!/bin/bash # 阿里云服务器专用 - 全自动安装 OpenJDK 1.8(无交互) # 仅支持 yum 系系统(CentOS/RHEL/Alibaba Cloud Linux)# 检查 root 权限 if [ "$(id -u)" -ne 0 ]; thenech…...
理解 `.sln` 和 `.csproj`:从项目结构到构建发布的一次梳理
理解 .sln 和 .csproj:从项目结构到构建发布的一次梳理 在初学 .NET 项目开发时,很多人都会对 .sln(解决方案)和 .csproj(项目)文件感到疑惑。随着开发经验的积累,我逐渐理解了这些层级的设计意…...
高频算法面试题总结
高频算法面试题总结 排序算法 1. 基础排序算法 快速排序: public void quickSort(int[] arr, int low, int high) {if (low < high) {int pivot = partition(arr, low, high);quickSort(arr, low, pivot - 1);quickSort(arr, pivot + 1, high);} }平均时间复杂度:O(n lo…...
SQL进阶:如何把字段中的键值对转为JSON格式?
JSON 一、问题描述二、ORACLE<一>、键值对拆分(REGEXP_SUBSTR)<二>、转为JSON<三>、不足 三、MYSQL<一>、键值对拆分(RECURSIVE)<二>、转为JSON 一、问题描述 假如某张表的某列是键值对数据,如何把这个键值对转为json格式,数据如下所示 dynast…...
vue3:十二、图形看板- echart图表-柱状图、饼图
一、效果 如图展示增加了饼图和柱状图,并且优化了浏览器窗口大小更改,图表随着改变 二、 饼图 1、新建组件文件 新增组件EchartsExaminePie.vue,用于存储审核饼图的图表 2、写入组件信息 (1)视图层 写入一个div,写入变量chart和图表宽高 <template><div ref…...
nacos-server-2.2.2.tar及使用方式
下载链接 nacos-server-2.2.2.tar包及使用资源-CSDN文库 下载与安装 下载地址:可从 Nacos 官网版本下载页面 或 Nacos GitHub Releases 获取 nacos-server-2.2.2.tar.gz 安装包。 环境准备:Nacos 依赖 Java 环境运行,需确保安装了 64 位 J…...
el-form的label星号位置如何修改
默认情况 修改后 实现代码 .el-form {.el-form-item {.el-form-item__label {padding: 0;&::before {float: none;position: relative;}}} }...
小刚说C语言刷题—1004阶乘问题
1.题目描述 编程求 123⋯n 。 输入 输入一行,只有一个整数 n(1≤n≤10); 输出 输出只有一行(这意味着末尾有一个回车符号),包括 1 个整数。 样例 输入 5 输出 120 2.参考代码(C语言版) #include <stdio…...
Java 集合体系深度解析面试篇
一、Java 集合体系核心架构与高频考点 1. 集合体系架构图(大厂必问) Java集合框架 ├─ Collection(单列集合) │ ├─ List(有序、可重复) │ │ ├─ ArrayList(动态数组,随机…...
websocketd 10秒教程
websocketd 参考地址:joewalnes/websocketd 官网地址:websocketd websocketd简述 websocketd是一个简单的websocket服务Server,运行在命令行方式下,可以通过websocketd和已经有程序进行交互。 现在,可以非常容易地构…...
PCA降维
主成分分析(Principal Component Analysis,PCA)降维是一种广泛使用的无监督机器学习技术,主要用于数据预处理阶段,其目的是在尽量保留数据重要信息的前提下,减少数据的维度。 PCA 的原理 PCA 的核心思想…...
【计算机视觉】OpenCV实战项目: opencv-text-deskew:实时文本图像校正
opencv-text-deskew:基于OpenCV的实时文本图像校正 一、项目概述与技术背景1.1 核心功能与创新点1.2 技术指标对比1.3 技术演进路线 二、环境配置与算法原理2.1 硬件要求2.2 软件部署2.3 核心算法流程 三、核心算法解析3.1 文本区域定位3.2 角度检测优化3.3 仿射变换…...
具身智能时代的机器人导航和操作仿真器综述
系列文章目录 前言 导航和操作是具身智能的核心能力,然而在现实世界中训练具有这些能力的智能体却面临着高成本和时间复杂性。因此,从模拟到现实的转移已成为一种关键方法,但模拟到现实的差距依然存在。本调查通过分析以往调查中忽略的物理模…...
Go语言Stdio传输MCP Server示例【Cline、Roo Code】
Go语言 Stdio 传输 MCP Server 示例 AI 应用开发正处于加速发展阶段,新技术和新方法不断涌现。Model Context Protocol (MCP) 作为一个开放标准,正在改变 AI 应用与数据源和工具集成的方式。 Go-MCP 是一个 MCP 协议的 GO 实现&…...
Xcode16.3配置越狱开发环境
首先先在https://developer.apple.com/xcode/resources/ 这里面登陆Apple账号,然后访问url下载 https://download.developer.apple.com/Developer_Tools/Xcode_16.3/Xcode_16.3.xip 1、安装theos https://theos.dev/docs/installation-macos 会安装到默认位置~/th…...
AWS IoT Core与MSK跨账号集成:突破边界的IoT数据处理方案
随着企业规模的扩大和业务的复杂化,跨账号资源访问成为云架构中的一个常见需求。本文将深入探讨如何实现AWS IoT Core与Amazon MSK(Managed Streaming for Apache Kafka)的跨账号集成,为您的IoT数据处理方案开辟新的可能性。无论您是正在构建多账号架构,还是需要整合不同部门的…...
【Python 列表(List)】
Python 中的列表(List)是最常用、最灵活的有序数据集合,支持动态增删改查操作。以下是列表的核心知识点: 一、基础特性 有序性:元素按插入顺序存储可变性:支持增删改操作允许重复:可存储重复元…...
在另一个省发布抖音作品,IP属地会随之变化吗?
你是否曾有过这样的疑惑:出差旅游时在外地发布了一条抖音视频,评论区突然冒出“IP怎么显示xx省了?”的提问?随着各大社交平台上线“IP属地”功能,用户的地理位置标识成为公开信息,而属地显示的“灵敏性”也…...
在线工具源码_字典查询_汉语词典_成语查询_择吉黄历等255个工具数百万数据 养站神器,安装教程
在线工具源码_字典查询_汉语词典_成语查询_择吉黄历等255个工具数百万数据 养站神器,安装教程 资源宝分享:https://www.httple.net/154301.html 一次性打包涵盖200个常用工具!无论是日常的图片处理、文件格式转换,还是实用的时间…...
D720201 PCIE 转USB HUB
1. 启动时出现了下面错误 [ 4.682595] pcieport 0004:00:00.0: Signaling PME through PCIe PME interrupt [ 4.684939] pci 0004:01:00.0: Signaling PME through PCIe PME interrupt [ 4.691287] pci 0004:01:00.0: enabling device (0000 -> 0002) [ 5.2962…...
QT事件介绍及实现字体放大缩小(滚轮)
使用update是为了回调paintEvent这个事件函数 pic.load是加载一张图片 setfixedsize(pic.siez())是为了把按键的矩形区域变成和pic一样大 painter.drawPixmap(rec(),pic)就是在按键的矩形区域画一个pic emit clicked();是用来发送clicked信号的,当然你也可以在事…...
p2p虚拟服务器
ZeroTier Central ✅ 推荐工具:ZeroTier(免费、稳定、跨平台) ZeroTier 可以帮你把多台设备(无论是否跨网)加入一个虚拟局域网,彼此间可以像在同一个 LAN 中通信,UDP 视频、文件传输、SSH 等都…...
高尔夫基本知识及规则·棒球1号位
高尔夫与棒球的结合看似跨界,但两者在规则、策略和运动哲学上存在有趣的关联性。以下从五个角度进行对比分析,揭示它们的异同与潜在联系: 一、核心目标的对比性结合 高尔夫:以最少击球次数完成18洞(标准杆72杆左右&am…...
数据结构(1)复杂度
一、数据结构概要 1.数据结构 数据结构是计算机存储、组织数据的方式,是数据相互之间存在一种或者多种特定关系的集合。没有一种单一的数据结构可以解决所有问题,因此要学习多种多样的数据结构。如:线性表、图、树等。 2.算法 算法其实就…...
多分类问题softmax传递函数+交叉熵损失
在多分类问题中,Softmax 函数通常与交叉熵损失函数结合使用。 Softmax 函数 Softmax 函数是一种常用的激活函数,主要用于多分类问题中。它将一个实数向量转换为概率分布,使得每个元素的值在 0 到 1 之间,且所有元素的和为 1。 …...
Java如何获取电脑分辨率?
以下是一个 Java 程序示例,用于获取电脑的主屏幕分辨率: import java.awt.*; public class ScreenResolutionExample { public static void main(String[] args) { // 获取默认的屏幕设备 GraphicsDevice device GraphicsEnvironm…...
【NextPilot日志移植】logged_topics.cpp解析
📘 PX4 Logger 模块注册 uORB 主题、实际订阅与数据采集流程 🧭 目的与背景 在 PX4 飞控中,日志记录模块 logger 需要记录多个 uORB 主题的数据(如 IMU、GPS、姿态等)。为了系统统一管理这些记录需求,log…...
CSS vertical-align
这里的小空白就是为了和基线对齐 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&quo…...
“工作区”升级为“磁盘”、数据集统计概览优化|ModelWhale 版本更新
本次更新围绕用户在实际项目中对平台的理解和管理体验进行了多项优化。 “工作区”升级为“磁盘”、及其管理优化 平台“工作区”概念正式更名为“磁盘”,突出其存储功能。原有以目录代称的存储区域划分同步更名,其中“work目录”更改为“个人磁盘”&am…...
mac 电脑如何打开剪切板
mac 不像 Windows 拥有官方的剪贴板应用。所以我们需要使用官方商店中的第三方应用实现剪切板管理的功能。 打开苹果电脑上的 App Store,下载 PasteMe 或 Paste 等复制历史记录的管理工具。(PasteMe 为买断制18元,Paste为订阅制,…...
信息系统项目管理师-软考高级(软考高项)2025最新(十二)
个人笔记整理---仅供参考 第十二章项目质量管理 可能考论文??? 12.1管理基础 12.2项目质量管理过程 12.3规划质量管理 12.4管理质量 12.5控制质量...
Java、javax 和 Jakarta有什么区别?
在 Java 开发中,我们经常会看到 java、javax 和 jakarta 这些包名前缀。本文将详细介绍这三个命名空间的含义、发展历程以及它们之间的关系,帮助你更好地理解 Java 生态系统。 一、Java:核心 API 的基础 ✅ 含义: java 是 Java 标准库的核心包名。所有以 java. 开头的类构…...
LeetCode百题刷002摩尔投票法
遇到的问题都有解决的方案,希望我的博客可以为你提供一些帮助 图片源自leetcode 题目:169. 多数元素 - 力扣(LeetCode) 一、排序法 题目要求需要找到多数值(元素个数>n/2)并返回这个值。一般会想到先…...
【推荐笔记工具】思源笔记 - 隐私优先的个人知识管理系统,支持 Markdown 排版、块级引用和双向链接
Typora 使用Typora好多年了,一直非常的喜欢这个简洁的Markdown编辑工具,低版本的免费且好用。 Typora官网地址: https://typora.io/ https://typoraio.cn/ Typora的文档树如下,细看后,总觉得差点意思! 思源笔记 今…...
ACTF2025 - Web writeup
ACTF2025 - Web writeup ACTF upload 进去后是一个登录界面,输入用户名后登录,然后到一个文件上传的界面。 在 /upload?file_path 处,可以实现任意文件读取,文件内容保存在 img 标签中的 base64 值中。 示例请求:…...
使用Java实现HTTP协议服务:从自定义服务器到内置工具
在Web开发领域,HTTP协议是服务器与客户端(如Web浏览器)通信的核心。Java作为一种多功能且强大的编程语言,提供了多种方法来实现HTTP协议服务,满足从学习实验到生产部署的各种需求。本文将深入探讨在Java中实现HTTP服务的三种主要方法:使用ServerSocket构建自定义HTTP服务…...
【星海随笔】信息安全相关标准
重要的国际信息安全标准> 国际标准化组织(ISO) 该组织成立于1947年2月23日,总部位于瑞士日内瓦 国际电工委员会(IEC) 成立于1906年,最初总部设在英国伦敦,但后来于1948年迁至瑞士日内瓦…...
检查当前 Docker 使用的 默认运行时(default runtime)方法
目录 ✅ 方法一:查看 Docker 配置文件(最准确) ✅ 方法二:使用 Docker info 命令 ✅ 方法三:检查特定容器的运行时 说明:常见的 Docker Runtime ✅ 方法一:查看 Docker 配置文件(…...
【论文阅读】基于客户端数据子空间主角度的聚类联邦学习分布相似性高效识别
Efficient distribution similarity identification in clustered federated learning via principal angles between client data subspaces -- 基于客户端数据子空间主角度的聚类联邦学习分布相似性高效识别 论文来源TLDR背景与问题两个子空间之间的主角(Principa…...
MySQL 性能调优:从执行计划到硬件瓶颈
MySQL 性能调优:从执行计划到硬件瓶颈 一、性能调优的宏观视角与核心挑战 在数字化浪潮下,企业数据量呈指数级增长,MySQL 作为主流关系型数据库,面临着巨大的性能压力。某电商平台日均订单量突破千万,高峰期数据库响…...
a-range-picker 格式化 M2 为正确日期格式
直接打印 range-picker value 是一个满足 dayjs 规则的数组: Reactive<1. Array(2)1. 0:Reactive<1. M2>2. 1: M2 {$L: en, $u: undefined, $d: Fri May 02 2025 14:50:00 GMT0800 (中国标准时间), $y: 2025, $M: 4, …}3. length: 24. [[Prototype]]: Ar…...