文本向量化(二)基于Faiss向量数据库语义向量检索
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.
(每个量化器都是前一个量化器的超集。)
更多推荐
所有评论(0)