A fast hierarchical dimensionality reduction algorithm.
h-NNE is a general purpose dimensionality reduction algorithm such as t-SNE and UMAP. It stands out for its speed, simplicity and the fact that it provides a hierarchy of clusterings as part of its projection process. The algorithm is inspired by the FINCH clustering algorithm. For more information on the structure of the algorithm, please look at our corresponding paper in CVPR 2022:
M. Saquib Sarfraz*, Marios Koulakis*, Constantin Seibold, Rainer Stiefelhagen. Hierarchical Nearest Neighbor Graph Embedding for Efficient Dimensionality Reduction. CVPR 2022.
More details are available in the project documentation.
The project is available in PyPI. To install run:
pip install hnne
The HNNE class implements the common methods of the sklearn interface.
Below a dataset of dimensionality 256 is projected to 2 dimensions.
import numpy as np
from hnne import HNNE
data = np.random.random(size=(1000, 256))
hnne = HNNE(n_components=2)
projection = hnne.fit_transform(data)
Once a dataset has been projected, one can apply the transform and project new points to the same dimension.
hnne = HNNE()
projection = hnne.fit_transform(data)
new_data_projection = hnne.transform(new_data)
The following demo notebooks are available:
If you make use of this project in your work, it would be appreciated if you cite the hnne paper:
@article{hnne,
title={Hierarchical Nearest Neighbor Graph Embedding for Efficient Dimensionality Reduction},
author={M. Saquib Sarfraz, Marios Koulakis, Constantin Seibold, Rainer Stiefelhagen},
booktitle = {Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
year = {2022}
}
If you make use of the clustering properties of the algorithm please also cite:
@inproceedings{finch,
author = {M. Saquib Sarfraz and Vivek Sharma and Rainer Stiefelhagen},
title = {Efficient Parameter-free Clustering Using First Neighbor Relations},
booktitle = {Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
pages = {8934--8943},
year = {2019}
}
Contributions are very welcome :-) Please check the contributions guide for more details.