A performant 3rd party implementation of the Denmune Clustering algorithm
Project description
DenMune-Sklearn: A Robust Implementation of the DenMune Clustering Algorithm
An efficient, scikit-learn compatible implementation of the "DENMUNE: Density peak based clustering using mutual nearest neighbors" algorithm.
Disclaimer: This project is a clean-room rewrite of the DenMune algorithm. It is not derived from the original authors' code and makes significant implementation choices to improve performance and scikit-learn compatibility. It is not a strictly faithful reproduction of the paper's original pseudocode but adheres to its core principles.
Why DenMune-Sklearn?
The original DenMune paper presents a powerful algorithm for finding clusters of arbitrary shapes and densities. However, existing third-party implementations suffer from critical issues, including a lack of scikit-learn compatibility, data leakage bugs, and severe performance bottlenecks.
This project was created to provide a version of DenMune that is:
- Scikit-Learn Native: Fully compatible with the scikit-learn ecosystem (
Pipeline,GridSearchCV, etc.). - Correct & Robust: Fixes fundamental algorithmic flaws like data leakage and provides robust error handling.
- Performant: Replaces slow Python loops with optimized, vectorized NumPy operations and a sparse graph representation.
Key Features
- Finds Complex Clusters: Excels at identifying non-convex clusters of varying densities.
- Automatic Noise Detection: Automatically identifies and labels noise points.
- Single Parameter Tuning: Requires only one primary parameter,
k_nearest, for straightforward tuning. - Efficient Implementation: Uses a sparse
csr_matrixfor k-NN graph representation and a Union-Find data structure for fast cluster merging. - Flexible Dimensionality Reduction: Integrates with scikit-learn's
TSNEandPCA, and allows for any user-provided reducer (e.g., UMAP).
Installation
pip install denmune-skl
Quick Usage
from sklearn.datasets import make_moons
from sklearn.preprocessing import StandardScaler
from denmune_skl import DenMune
import matplotlib.pyplot as plt
import numpy as np
# 1. Generate and prepare data
X, y = make_moons(n_samples=250, noise=0.07, random_state=42)
X = StandardScaler().fit_transform(X)
# 2. Fit the model
model = DenMune(k_nearest=20, random_state=42)
model.fit(X)
# 3. Visualize the results
labels = model.labels_
n_clusters = model.n_clusters_
print(f"Estimated number of clusters: {n_clusters}")
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
plt.title(f"DenMune Clustering (k={model.k_nearest})\nEstimated clusters: {n_clusters}")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
Reference
This algorithm is based on the following paper:
@article{Abbas2021DenMune,
title = {{DENMUNE}: {Density} peak based clustering using mutual nearest neighbors},
author = {Abbas, Mohamed and El-Zoghabi, Adel and Shoukry, Amin},
journal = {Pattern Recognition},
volume = {112},
pages = {107718},
year = {2021},
doi = {10.1016/j.patcog.2020.107718}
}
License
This project is licensed under the BSD 3-Clause License.
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 denmune_skl-0.1.2.tar.gz.
File metadata
- Download URL: denmune_skl-0.1.2.tar.gz
- Upload date:
- Size: 110.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b14b9f1f61661ed1dcdf325f5243ab87e77e6a3f6298ffdd61e6aea803083ecc
|
|
| MD5 |
cd554c66b4f91341459fb35ee69967b5
|
|
| BLAKE2b-256 |
64a617f36ab96097f5308432ac8b065e2b6b2c8f56719cebbc2eac2b661c9660
|
File details
Details for the file denmune_skl-0.1.2-py3-none-any.whl.
File metadata
- Download URL: denmune_skl-0.1.2-py3-none-any.whl
- Upload date:
- Size: 17.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cfd2fffbcc1ff9a34e834b703d01c5bd82a7c4bb6467907dac047ce3fed98116
|
|
| MD5 |
58dd902453eca7fa9ad4582285858f92
|
|
| BLAKE2b-256 |
2f4052e260081b78ff4f3b0309b954a504a1de131fd4ab3b9f24b6a9d8be9ed7
|