IndexPQ
- 一个indexPQ的简单示例:
import numpy as np
import faiss
# 生成一些随机数据作为示例
np.random.seed(42)
data = np.random.random((10000, 64)).astype('float32')
# 定义 PQ 索引的参数
m, nbits = 8, 8 # m: 子空间的数量, nbits: 每个子空间的比特数
# 创建 IndexPQ
index = faiss.IndexPQ(data.shape[1], m, nbits)
# 训练索引
index.train(data)
# 添加数据到索引
index.add(data)
# 查询示例
query_vector = np.random.random((1, 64)).astype('float32')
k = 5 # 获取前 k 个最近邻
# 进行查询
distances, indices = index.search(query_vector, k)
# 打印结果
print("Query Vector:")
print(query_vector)
print("\nIndices of Nearest Neighbors:")
print(indices)
print("\nDistances to Nearest Neighbors:")
print(distances)
-
IndexPQ中包含pq对象
-
ProductQuantizer pq对象中包含质心表。其尺寸布局为 M * ksub * dsub:(M、ksub、dsub)(8,256,8)
参数 | 解释 |
---|---|
M | number of subquantizers ,输入向量被分为的片段的个数 |
dsub | dimensionality of each subvector,每个子聚类表的长度 |
ksub = 2 n 2^n 2n | number of centroids for each subquantizer,每个子聚类表的宽度 |
可通过faiss.vector_to_array(index.pq.centroids)
查看质心表中的具体数值
- index.train()之前:
- index.train()之后:
实现“偷梁换柱”
import numpy as np
import faiss
# 生成一些随机数据作为示例
np.random.seed(42)
data = np.random.random((10000, 64)).astype('float32')
data2 = np.random.random((10000, 64)).astype('float32')
# 定义 PQ 索引的参数
m, nbits = 8, 8 # m: 子空间的数量, nbits: 每个子空间的比特数
# 创建 IndexPQ
index = faiss.IndexPQ(data.shape[1], m