3个不稳定版本
0.10.0 | 2024年6月21日 |
---|---|
0.2.1 | 2024年1月3日 |
0.2.0 | 2020年10月8日 |
0.1.0 |
|
在 算法 中排名 370
每月下载量 50
在 2 个crate中使用
105KB
1.5K SLoC
kmeans
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