PQ (Product Quantizer), 相对与普通的Quantizer而言
普通Quantizer 将整个向量通过单次聚类达到量化。
Product Quantizer 则通过对向量分段(这里的分段是针对向量本身的,例如128维的向量分为2个64维的向量),每段分别聚类得到多个量化结果(每段一个量化结果),这样的好处是同较小的码本来表达非常大量的码
把256个128维的向量分为4段,每段有256个32维的向量,每段独立训练中心点,这样在查询时从每个段中选一个最近的中心点(可以采用排列组合的思想理解),所以可能的情况有256*256*256*256, 这样可以用较少的向量,训练出更多的中心点,而且还省空间。
而普通Quantizer就只有256个中心点。
void ProductQuantizer::train (int n, const float * x)
{
if (train_type != Train_shared) { ///共享词典
train_type_t final_train_type;
final_train_type = train_type;
if (train_type == Train_hypercube ||
train_type == Train_hypercube_pca) { ///使用超立方体初始化中心点
if (dsub < nbits) { ///猜测是形成不了nbits个空间
final_train_type = Train_default;
printf ("cannot train hypercube: nbits=%ld > log2(d=%ld)\n",
nbits, dsub);
}
}
///为每个子空间分配内存(向量个数 * 子向量维度)
Product Quantizer:提升向量量化效率

Product Quantizer是一种高效的向量量化方法,相对于普通Quantizer,它将向量分段并分别进行聚类,从而能用更少的码本表达大量中心点。在训练时,每个子空间独立聚类,查询时通过组合每个段的最近中心点,实现更多可能的组合,节省存储空间。此方法在大规模数据处理和检索中具有优势。
最低0.47元/天 解锁文章
795

被折叠的 条评论
为什么被折叠?



