Fast k-means++ seeding algorithms with C++ implementation and Python bindings
Project description
kmeans-seeding: Fast k-means++ Initialization Algorithms
Fast, state-of-the-art k-means initialization algorithms implemented in C++ with Python bindings.
Features
🚀 Fast: C++ implementation with OpenMP parallelization 🎯 Accurate: State-of-the-art algorithms with theoretical guarantees 🔌 Compatible: Drop-in replacement for sklearn's k-means++ initialization 📦 Easy to use: Simple Python API, works with NumPy arrays 🛠️ Flexible: Multiple algorithms to choose from
Algorithms Included
-
RS-k-means++ (Rejection Sampling) - Our contribution
- Fast approximate D² sampling using rejection sampling
- Supports FAISS for approximate nearest neighbors
- Best for large datasets (n > 10,000)
-
AFK-MC² (Adaptive Fast k-MC²)
- MCMC-based sampling without computing all distances
- Good balance of speed and quality
-
Fast-LSH k-means++ (Google 2020)
- Tree embedding with LSH for fast sampling
- Excellent for high-dimensional data
-
Standard k-means++
- Classic D² sampling algorithm
- Baseline for comparison
Installation
From PyPI (recommended)
pip install kmeans-seeding
With FAISS support (recommended for large datasets)
# CPU version
conda install -c pytorch faiss-cpu
pip install kmeans-seeding
# GPU version
conda install -c pytorch faiss-gpu
pip install kmeans-seeding
From source
git clone https://github.com/pcshah2004/kmeans-seeding.git
cd kmeans-seeding
pip install -e .
Quick Start
from kmeans_seeding import rejection_sampling
from sklearn.cluster import KMeans
import numpy as np
# Generate sample data
X = np.random.randn(10000, 50)
# Get initial centers using RS-k-means++
centers = rejection_sampling(X, n_clusters=100, index_type='LSH')
# Use with sklearn
kmeans = KMeans(n_clusters=100, init=centers, n_init=1)
kmeans.fit(X)
Usage Examples
RS-k-means++ (Rejection Sampling)
from kmeans_seeding import rejection_sampling
centers = rejection_sampling(
X,
n_clusters=100,
max_iter=50, # Max rejection sampling iterations
index_type='LSH', # FAISS index type: 'Flat', 'LSH', 'IVFFlat', 'HNSW'
random_state=42
)
AFK-MC² (MCMC Sampling)
from kmeans_seeding import afkmc2
centers = afkmc2(
X,
n_clusters=100,
chain_length=200, # Markov chain length
random_state=42
)
Fast-LSH k-means++
from kmeans_seeding import fast_lsh
centers = fast_lsh(
X,
n_clusters=100,
n_trees=4, # Number of trees for embedding
random_state=42
)
Standard k-means++
from kmeans_seeding import kmeanspp
centers = kmeanspp(X, n_clusters=100, random_state=42)
Benchmarks
Performance comparison on various datasets:
| Dataset | n | d | Algorithm | Time (s) | Cost Ratio* |
|---|---|---|---|---|---|
| MNIST | 60K | 784 | k-means++ | 45.2 | 1.00 |
| RS-k-means++ (LSH) | 2.1 | 1.02 | |||
| AFK-MC² | 8.3 | 1.05 | |||
| CIFAR-10 | 50K | 512 | k-means++ | 38.7 | 1.00 |
| RS-k-means++ (LSH) | 1.8 | 1.01 | |||
| AFK-MC² | 6.9 | 1.04 |
*Cost ratio: Final k-means cost compared to standard k-means++
Documentation
Full documentation available at: https://kmeans-seeding.readthedocs.io
Requirements
- Python 3.9+
- NumPy >= 1.20.0
- (Optional) FAISS >= 1.7.0 for fast approximate nearest neighbors
- (Optional) scikit-learn for full k-means clustering
Citation
If you use this library in your research, please cite:
@article{shah2025rejection,
title={A New Rejection Sampling Approach to k-means++ With Improved Trade-Offs},
author={Shah, Poojan and Agrawal, Shashwat and Jaiswal, Ragesh},
journal={arXiv preprint arXiv:2502.02085},
year={2025}
}
For AFK-MC²:
@inproceedings{bachem2016approximate,
title={Approximate k-means++ in sublinear time},
author={Bachem, Olivier and Lucic, Mario and Hassani, Hamed and Krause, Andreas},
booktitle={AAAI Conference on Artificial Intelligence},
year={2016}
}
For Fast-LSH k-means++:
@inproceedings{cohen2020fast,
title={Fast and accurate k-means++ via rejection sampling},
author={Cohen-Addad, Vincent and Lattanzi, Silvio and Mitrovi{\'c}, Slobodan and Norouzi-Fard, Ashkan and Parotsidis, Nikos and Tarnawski, Jakub},
booktitle={Advances in Neural Information Processing Systems},
year={2020}
}
Contributing
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Acknowledgments
- FAISS library by Facebook AI Research
- scikit-learn for the k-means clustering API design
- Research supported by the Department of Computer Science, IIT Delhi
Contact
- Poojan Shah: cs1221594@cse.iitd.ac.in
- Issues: https://github.com/pcshah2004/kmeans-seeding/issues
- Discussions: https://github.com/pcshah2004/kmeans-seeding/discussions
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kmeans_seeding-0.2.3.tar.gz.
File metadata
- Download URL: kmeans_seeding-0.2.3.tar.gz
- Upload date:
- Size: 45.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0bfb840bb6460fc06d1b81a22d2418ab1b409b0f7328b7a080b02baf14625be5
|
|
| MD5 |
4e7f33bc4beb76331d19d9ce43549685
|
|
| BLAKE2b-256 |
e7906fedacf031f3a141d14aae60f6cca0da08ac513e30e34e57ab613b72fe78
|
File details
Details for the file kmeans_seeding-0.2.3-cp313-cp313-macosx_14_0_arm64.whl.
File metadata
- Download URL: kmeans_seeding-0.2.3-cp313-cp313-macosx_14_0_arm64.whl
- Upload date:
- Size: 140.2 kB
- Tags: CPython 3.13, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91a2a5763a3b32a83029ee0ef017fcf411f654ee6b51d6967ebdff1393356bf9
|
|
| MD5 |
510a67f69e23edfa379d5e13ae01512e
|
|
| BLAKE2b-256 |
dfa5f7516f92ae1a98a7cd086a82c323d17bb7b580e29d8c6c4726b6144ce7e5
|