Genie: Fast and Robust Hierarchical Clustering with Noise Points Detection

genieclust Package for R and Python

Genie: Fast and Robust Hierarchical Clustering with Noise Point Detection

Genie finds meaningful clusters quickly – even on large data sets.

A comprehensive tutorial, benchmarks, and a reference manual is available at https://genieclust.gagolewski.com/.

When using genieclust in research publications, please cite (Gagolewski, 2021) and (Gagolewski, Bartoszuk, Cena, 2016) as specified below. Thank you.

A faster and more powerful version of Genie – a robust and outlier resistant clustering algorithm (see Gagolewski, Bartoszuk, Cena, 2016), originally included in the R package genie.

The idea behind Genie is beautifully simple. First, make each individual point the only member of its own cluster. Then, keep merging pairs of the closest clusters, one after another. However, to prevent the formation of clusters of highly imbalanced sizes a point group of the smallest size will sometimes be matched with its nearest neighbour.

Genie's appealing simplicity goes hand in hand with its usability; it often outperforms other clustering approaches such as K-means, BIRCH, or average, Ward, and complete linkage on benchmark data. Of course, there is no, nor will there ever be, a single best universal clustering approach for every kind of problem, but Genie is definitely worth a try!

Thanks to its being based on minimal spanning trees of the pairwise distance graphs, Genie is also very fast – determining the whole cluster hierarchy for datasets of millions of points can be completed within minutes. Therefore, it is nicely suited for solving of extreme clustering tasks (large datasets with any number of clusters to detect) for data (also sparse) that fit into memory. Thanks to the use of nmslib (if available), sparse or string inputs are also supported.

It also allows clustering with respect to mutual reachability distances so that it can act as a noise point detector or a robustified version of HDBSCAN* (see Campello et al., 2013) that is able to detect a predefined number of clusters and hence it doesn't dependent on the DBSCAN's somewhat difficult-to-set eps parameter.

Author and Contributors

Author and Maintainer: Marek Gagolewski

Contributors: Maciej Bartoszuk, Anna Cena (R packages genie and CVI), Peter M. Larsen (rectangular_lsap).

Examples, Tutorials, and Documentation

R's interface is compatible with stats::hclust(), but there is more.

X <- ... # some data
h <- gclust(X)
plot(h) # plot cluster dendrogram
cutree(h, k=2)
# or genie(X, k=2)


The Python language version of genieclust has a familiar scikit-learn-like look-and-feel:

import genieclust
X = ... # some data
g = genieclust.Genie(n_clusters=2)
labels = g.fit_predict(X)


Tutorials and the package documentation are available here.

To learn more about Python, check out Marek's recent open-access (free!) textbook Minimalist Data Wrangling in Python.

How to Install

Python Version

To install via pip (see PyPI):

pip3 install genieclust


The package requires Python 3.7+ together with cython as well as numpy, scipy, matplotlib, and scikit-learn. Optional dependencies: nmslib and mlpack.

R Version

To install the most recent release, call:

install.packages("genieclust")


See the package entry on CRAN.

Other

The core functionality is implemented in the form of a header-only C++ library. It can thus be easily adapted for use in other environments.

Any contributions are welcome (e.g., Julia, Matlab, ...).

Copyright (C) 2018–2022 Marek Gagolewski https://www.gagolewski.com

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License Version 3, 19 November 2007, published by the Free Software Foundation.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License Version 3 for more details. You should have received a copy of the License along with this program. If not, see (https://www.gnu.org/licenses/).

The file src/c_scipy_rectangular_lsap.h is adapted from the scipy project (https://scipy.org/scipylib/), source: /scipy/optimize/rectangular_lsap/rectangular_lsap.cpp. Author: Peter M. Larsen. Distributed under the BSD-3-Clause license.

The implementation of internal cluster validity measures were adapted from our previous project (Gagolewski, Bartoszuk, Cena, 2021); see optim_cvi. Originally distributed under the GNU Affero General Public License Version 3.

References

Gagolewski M., genieclust: Fast and robust hierarchical clustering, SoftwareX 15, 2021, 100722. DOI: 10.1016/j.softx.2021.100722.

Gagolewski M., Bartoszuk M., Cena A., Genie: A new, fast, and outlier-resistant hierarchical clustering algorithm, Information Sciences 363, 2016, 8–23. DOI: 10.1016/j.ins.2016.05.003.

Gagolewski M., Bartoszuk M., Cena A., Are cluster validity measures (in)valid?, Information Sciences 581, 2021, 620–636. DOI: 10.1016/j.ins.2021.10.004.

Gagolewski M., Adjusted asymmetric accuracy: A well-behaving external cluster validity measure, under review (preprint), DOI: 10.48550/arXiv.2209.02935.

Gagolewski M., A Framework for Benchmarking Clustering Algorithms, 2022, https://clustering-benchmarks.gagolewski.com.

Campello R.J.G.B., Moulavi D., Sander J., Density-based clustering based on hierarchical density estimates, Lecture Notes in Computer Science 7819, 2013, 160–172. DOI: 10.1007/978-3-642-37456-2_14.

Mueller A., Nowozin S., Lampert C.H., Information Theoretic Clustering using Minimum Spanning Trees, DAGM-OAGM, 2012.

Rezaei M., Fränti P., Set matching measures for external cluster validity, IEEE Transactions on Knowledge and Data Engineering 28(8), 2016, 2173–2186 DOI: 10.1109/TKDE.2016.2551240.

See the package's homepage for more references.

Project details

Source Distribution

genieclust-1.1.2.tar.gz (89.8 kB view hashes)

Uploaded source

Built Distributions

genieclust-1.1.2-cp310-cp310-win_amd64.whl (623.9 kB view hashes)

Uploaded cp310

genieclust-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl (829.8 kB view hashes)

Uploaded cp310

genieclust-1.1.2-cp39-cp39-win_amd64.whl (628.0 kB view hashes)

Uploaded cp39

genieclust-1.1.2-cp39-cp39-win32.whl (530.4 kB view hashes)

Uploaded cp39

genieclust-1.1.2-cp39-cp39-macosx_10_9_x86_64.whl (825.1 kB view hashes)

Uploaded cp39

genieclust-1.1.2-cp38-cp38-win_amd64.whl (627.9 kB view hashes)

Uploaded cp38

genieclust-1.1.2-cp38-cp38-win32.whl (530.2 kB view hashes)

Uploaded cp38

genieclust-1.1.2-cp38-cp38-macosx_10_9_x86_64.whl (806.1 kB view hashes)

Uploaded cp38

genieclust-1.1.2-cp37-cp37m-win_amd64.whl (614.5 kB view hashes)

Uploaded cp37

genieclust-1.1.2-cp37-cp37m-win32.whl (522.5 kB view hashes)

Uploaded cp37

genieclust-1.1.2-cp37-cp37m-macosx_10_9_x86_64.whl (800.9 kB view hashes)

Uploaded cp37