faiss快速入门

本文是Faiss的快速入门教程,介绍了数据准备、精确索引、倒排表快速索引和乘积量化索引。在精确索引中,使用IndexFlatL2类型进行L2距离计算。倒排表索引通过调整nprobe参数平衡查询精度和时间开销。乘积量化索引用于处理大数据量,以节省内存并进行近似查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Tutorial 快速入门

数据准备

faiss可以处理固定维度d的向量集合,这样的集合这里用二维数组表示。 一般来说,我们需要两个数组:
1.data。包含被索引的所有向量元素;
2.query。索引向量,我们需要根据索引向量的值返回xb中的最近邻元素。
为了对比不同索引方式的差别,在下面的例子中我们统一使用完全相同的数据,即维数d为512,data包含2000个向量,每个向量符合正态分布。
需要注意的是,faiss需要数组中的元素都是32位浮点数格式。 datatype = 'float32'。

In [2]:

import numpy as np 
d = 512          #维数
n_data = 2000   
np.random.seed(0) 
data = []
mu = 3
sigma = 0.1
for i in range(n_data):
    data.append(np.random.normal(mu, sigma, d))
data = np.array(data).astype('float32')

# print(data[0])

# 查看第六个向量是不是符合正态分布
import matplotlib.pyplot as plt 
plt.hist(data[5])
plt.show()

query = []
n_query = 10
mu = 3
sigma = 0.1
np.random.seed(12) 
query = []
for i in range(n_query):
    query.append(np.random.normal(mu, sigma, d))
query = np.array(query).astype('float32')

精确索引

在使用faiss时,我们是围绕index对象进行的。index中包含被索引的数据库向量,在索引时可以选择不同方式的预处理来提高索引的效率,表现维不同的索引类型。在精确搜索时选择最简单的IndexFlatL2索引类型。
IndexFlatL2类型遍历计算查询向量与被查询向量的L2精确距离,不需要训练操作(大部分index类型都需要train操作)。
在构建index时要提供相关参数,这里是向量维数d,构建完成index之后可以通过add()和search()进行查询。

In [91]:

import sys
sys.path.append('/home/maliqi/faiss/python/')
import faiss
index = faiss.IndexFlatL2(d)  # 构建index
print(index.is_trained)  # False时需要train
index.add(data)  #添加数据
print(index.ntotal)  #index中向量的个数
True
2000

In [92]:

k = 10  # 返回结果个数
query_self = data[:5]  # 查询本身
dis, ind = index.search(query_self, k)
print(dis)  # 升序返回每个查询向量的距离
print(ind)  # 升序返回每个查询向量的k个相似结果
[[0.       8.007045 8.313328 8.53525  8.560175 8.5616
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值