结构体 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

质心已经初始化

enumerator Train_shared

在 PQ 段之间共享字典

enumerator Train_hypercube

使用 nbits-D 超立方体初始化质心

enumerator Train_hypercube_pca

使用 nbits-D 超立方体初始化质心

公共函数

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

每个索引向量的字节数