#clustering #cluster #means #simd-vector

nightly kmeans

用于k-means聚类的轻量级且快速库

3个不稳定版本

0.10.0 2024年6月21日
0.2.1 2024年1月3日
0.2.0 2020年10月8日
0.1.0 2019年7月27日

算法 中排名 370

每月下载量 50
2 个crate中使用

Apache-2.0

105KB
1.5K SLoC

kmeans

Current Crates.io Version docs

kmeans 是一个用于k-means聚类的轻量级且快速库。它 需要带有 portable_simd 特性的nightly编译器 才能运行。

以下是一个小示例,使用kmean++作为初始化方法,lloyd作为k-means变体

use kmeans::*;

fn main() {
    let (sample_cnt, sample_dims, k, max_iter) = (20000, 200, 4, 100);

    // Generate some random data
    let mut samples = vec![0.0f64;sample_cnt * sample_dims];
    samples.iter_mut().for_each(|v| *v = rand::random());

    // Calculate kmeans, using kmean++ as initialization-method
    // KMeans<_, 8> specifies to use f64 SIMD vectors with 8 lanes (e.g. AVX512)
    let kmean: KMeans<_, 8> = KMeans::new(samples, sample_cnt, sample_dims);
    let result = kmean.kmeans_lloyd(k, max_iter, KMeans::init_kmeanplusplus, &KMeansConfig::default());

    println!("Centroids: {:?}", result.centroids);
    println!("Cluster-Assignments: {:?}", result.assignments);
    println!("Error: {}", result.distsum);
}

数据结构

出于性能考虑,所有计算都在裸向量上完成,使用来自 packed_simd crate的手写SIMD内联函数。所有向量都按行主序存储,因此每个样本都存储在连续的内存块中。

支持的变体/算法

  • lloyd (标准kmeans)
  • minibatch

支持的质心初始化方法

  • KMean++
  • 随机分区
  • 随机样本

依赖项

~2MB
~40K SLoC