结构体 faiss::ProductQuantizer
-
struct ProductQuantizer : public faiss::Quantizer
Product Quantizer. PQ 使用 k-means 进行训练,以最小化到质心的 L2 距离。 PQ 支持 L2 和内积搜索,但量化误差偏向于 L2 距离。
公共类型
-
enum train_type_t
初始化
值
-
enumerator Train_default
-
enumerator Train_hot_start
质心已经初始化
在 PQ 段之间共享字典
-
enumerator Train_hypercube
使用 nbits-D 超立方体初始化质心
-
enumerator Train_hypercube_pca
使用 nbits-D 超立方体初始化质心
-
enumerator Train_default
公共函数
-
inline float *get_centroids(size_t m, size_t i)
返回与子向量 m 关联的质心
-
inline const float *get_centroids(size_t m, size_t i) const
-
virtual void train(size_t n, const float *x) override
训练量化器
- 参数:
x – 训练向量,大小为 n * d
-
ProductQuantizer(size_t d, size_t M, size_t nbits)
-
ProductQuantizer()
-
void set_derived_values()
当 d、M 和 nbits 设置完毕后,计算导出的值
-
void set_params(const float *centroids, int m)
为子量化器 m 定义质心。
-
void compute_code(const float *x, uint8_t *code) const
使用乘积量化器量化一个向量。
-
virtual void compute_codes(const float *x, uint8_t *codes, size_t n) const override
与多个向量的 compute_code 相同
-
void compute_codes_with_assign_index(const float *x, uint8_t *codes, size_t n)
使用 assign_index 加速代码分配(非 const,因为索引已更改)
-
void decode(const uint8_t *code, float *x) const
从给定代码解码一个向量(如果第三个参数,则解码 n 个向量)
-
virtual void decode(const uint8_t *code, float *x, size_t n) const override
解码一组向量
- 参数:
codes – 输入代码,大小为 n * code_size
x – 输出向量,大小为 n * d
-
void compute_code_from_distance_table(const float *tab, uint8_t *code) const
如果我们碰巧预先计算了距离表,那么计算代码会更有效。
-
void compute_distance_table(const float *x, float *dis_table) const
为单个向量计算距离表。
向量 x = [x_0 x_1 .. x_(M-1)] 的距离表是一个 M * ksub 矩阵,其中包含
dis_table (m, j) = || x_m - c_(m, j)||^2, 其中 m = 0..M-1,j = 0 .. ksub - 1
其中 c_(m, j) 是子量化器 m 的质心 j。
- 参数:
x – 输入向量,大小为 d
dis_table – 输出表,大小为 M * ksub
-
void compute_inner_prod_table(const float *x, float *dis_table) const
-
void compute_distance_tables(size_t nx, const float *x, float *dis_tables) const
为多个向量计算距离表。
- 参数:
nx – 输入向量的个数
x – 输入向量,大小为 nx * d
dis_table – 输出表,大小为 nx * M * ksub
-
void compute_inner_prod_tables(size_t nx, const float *x, float *dis_tables) const
-
void search(const float *x, size_t nx, const uint8_t *codes, const size_t ncodes, float_maxheap_array_t *res, bool init_finalize_heap = true) const
执行搜索(L2 距离)。
- 参数:
x – 查询向量,大小为 nx * d
nx – 查询的数量
codes – 数据库编码,大小为 ncodes * code_size
ncodes – 向量的数量
res – 用于存储结果的堆数组 (nh == nx)
init_finalize_heap – 初始化堆(输入)并排序(输出)吗?
-
void search_ip(const float *x, size_t nx, const uint8_t *codes, const size_t ncodes, float_minheap_array_t *res, bool init_finalize_heap = true) const
与 search 相同,但使用内积相似度。
-
void compute_sdc_table()
-
void search_sdc(const uint8_t *qcodes, size_t nq, const uint8_t *bcodes, const size_t ncodes, float_maxheap_array_t *res, bool init_finalize_heap = true) const
-
void sync_transposed_centroids()
将转置的质心与常规质心同步。 如果质心被直接编辑,则需要调用此方法。
-
void clear_transposed_centroids()
清除转置的质心表,使其不再被使用。
公共成员
-
size_t M
子量化器的数量
-
size_t nbits
每个量化索引的位数
-
size_t dsub
每个子向量的维度
-
size_t ksub
每个子量化器的质心数量
-
bool verbose
训练期间是否显示详细信息?
-
train_type_t train_type
-
ClusteringParameters cp
聚类期间使用的参数
-
Index *assign_index
如果非 NULL,则使用此索引进行分配(大小应为 d / M)
-
std::vector<float> centroids
质心表,大小为 M * ksub * dsub。布局:(M, ksub, dsub)
-
std::vector<float> transposed_centroids
转置质心表,大小为 M * ksub * dsub。布局:(dsub, M, ksub)
-
std::vector<float> centroids_sq_lengths
质心的平方长度,大小为 M * ksub。布局:(M, ksub)
-
std::vector<float> sdc_table
对称距离表。
-
size_t d
输入向量的大小
-
size_t code_size
每个索引向量的字节数
-
enum train_type_t