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