Faiss向量数据库搭建进阶

Faiss向量数据库搭建基于一些基本算法:k-means 聚类、PCA、PQ 编码 / 解码

k-means聚类

k-means聚类是一种常用的无监督学习算法,用于将数据分为k个簇。

k-means聚类能够通过迭代优化最小化簇内的总平方误差,从而找到数据的自然分组。

Faiss 提供了一个高效的 k-means 实现。可以对给定的二维张量中的一组向量进行快速聚类。

对于给定的二维张量中的一组向量进行聚类的方法如下:

ncentroids = 1024 
niter = 20 
verbose = True 
d = x.shape [1] 
kmeans = faiss.Kmeans (d, ncentroids, niter=niter, verbose=verbose) 
kmeans.train (x)

将数据分为1024个簇,迭代20次,输出详细的统计信息。

结果中心点存储在.kmeans.centroids 中。

目标函数的值(在 k-means 情况下为总平方误差)随迭代次数的变化存储在变量中,并且更详细的统计信息存储在.kmeans.objkmeans.iteration_stats 中。

要在 GPU 上运行,在 Kmeans 构造函数中添加选项。这将使用机器上所有可用的GPU.gpu=True 

PCA主成分分析

PCA主成分分析能够有效地降低数据的维度,同时保留数据中尽可能多的原始信息。

高维数据通常包含大量的冗余和噪声,直接处理可能会导致计算复杂度过高以及过拟合问题。

通过PCA,我们可以将Embedding后得到的高维数据投影到一个较低维度的子空间中,这个子空间由数据方差最大的方向(即主成分)构成,从而简化数据结构并突出主要特征。

以下代码示例使用Faiss库中自带的PCAMatrix方法将 40D 向量降维到 10D。

# random training data 
mt = np.random.rand(1000, 40).astype('float32')
mat = faiss.PCAMatrix (40, 10)
mat.train(mt)
assert mat.is_trained
tr = mat.apply(mt)
# print this to show that the magnitude of tr's columns is decreasing
print (tr ** 2).sum(0)
量化器

量化器对象继承自,该对象提供三种常用方法(参见 impl/Quantizer.h):Quantizer

  • 训练:在向量矩阵上训练量化器
  • compute_codes 和:编码器和解码器。编码器通常是有损的,并返回每个输入向量的代码矩阵。decode uint8.
  • get_DistanceComputer 是返回对象的方法。DistanceComputer 量化器对象的状态是训练的结果。 字段指示量化器生成的每个代码的字节数。Quantizercode_size .
量化器类型

支持的量化器类型有:

ScalarQuantizer:分别在线性范围内量化每个向量分量。

ProductQuantizer:对子向量执行向量量化

AdditiveQuantizer:将向量编码为码书条目的总和,详细信息请参见 Addtive Quantizers。 可以以多种方式训练加法量化器,因此有子类ResidualQuantizer ,LocalSearchQuantizer, ProductAdditiveQuantizer.

(每个量化器都是前一个量化器的超集。)

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐