结构体 faiss::Clustering

struct Clustering : public faiss::ClusteringParameters

基于分配的 K-means 聚类 - 质心更新迭代

聚类基于一个 Index 对象,该对象将训练点分配给质心。 因此,在每次迭代中,质心都会被添加到索引中。

在输出时,质心表被设置为最新的质心版本,并且它们也被添加到索引中。 如果质心表在输入时不是空的,它也会被用于初始化。

faiss::Clustering1D 继承

公共函数

Clustering(int d, int k)
Clustering(int d, int k, const ClusteringParameters &cp)
virtual void train(idx_t n, const float *x, faiss::Index &index, const float *x_weights = nullptr)

运行 k-means 训练

参数:
  • x – 训练向量,大小为 n * d

  • index – 用于分配的索引

  • x_weights – 与每个向量关联的权重:NULL 或大小为 n

void train_encoded(idx_t nx, const uint8_t *x_in, const Index *codec, Index &index, const float *weights = nullptr)

使用编码向量运行

除了 train() 的参数之外,还接受一个 codec 作为参数来解码输入向量。

参数:

codec – 用于解码向量的 codec (nullptr = 向量实际上是浮点数)

void post_process_centroids()

在每次质心更新后对质心进行后处理。 包括可选的 L2 归一化和最近整数舍入

inline virtual ~Clustering()

公共成员

size_t d

向量的维度

size_t k

质心的数量

std::vector<float> centroids

质心 (k * d) 如果在训练的输入中设置了质心,它们将被用作初始化

std::vector<ClusteringIterationStats> iteration_stats

聚类每次迭代的统计信息

int niter = 25

聚类迭代次数

int nredo = 1

重新进行聚类这么多次数,并保留具有最佳目标的聚类

bool verbose = false
bool spherical = false

是否在每次迭代后标准化质心(对内积聚类很有用)

bool int_centroids = false

每次迭代后将质心坐标四舍五入为整数?

bool update_index = false

每次迭代后重新训练索引?

bool frozen_centroids = false

使用作为输入提供的质心子集,并且在迭代期间不更改它们

int min_points_per_centroid = 39

如果每个质心提供的训练向量少于此数量,则会发出警告。 请注意,每个质心少于 1 个点会引发异常。

int max_points_per_centroid = 256

限制数据集大小,否则训练集将被二次采样

int seed = 1234

随机数生成器的种子。负值会导致使用 std::high_resolution_clock 播种内部 rng。

size_t decode_block_size = 32768

当训练集被编码时,编解码器解码器的批量大小

bool check_input_data_for_NaNs = true

是否检查输入数据中是否存在 NaN

bool use_faster_subsampling = false

是否使用基于 splitmix64 的随机数生成器进行二次采样,它速度更快,但可能会选择重复的点。