TriMap is a dimensionality reduction method that uses triplet constraints to form a low-dimensional embedding of a set of points. The triplet constraints are of the form "point i is closer to point j than point k". The triplets are sampled from the high-dimensional representation of the points and a weighting scheme is used to reflect the importance of each triplet.
TriMap provides a significantly better global view of the data than the other dimensionality reduction methods such t-SNE, LargeVis, and UMAP. The global structure includes relative distances of the clusters, multiple scales in the data, and the existence of possible outliers. We define a global score to quantify the quality of an embedding in reflecting the global structure of the data.
The following implementation is in Python. Further details and more experimental results are available in the paper.
TriMap has a transformer API similar to other sklearn libraries. To use TriMap with the default parameters, simply do:
import trimap
from sklearn.datasets import load_digits
digits = load_digits()
embedding = trimap.TRIMAP().fit_transform(digits.data)
To calculate the global score, do:
gs = trimap.TRIMAP(verbose=False).global_score(digits.data, embedding)
print("global score %2.2f" % gs)
The list of parameters is given blow:
n_inliers
: Number of nearest neighbors for forming the nearest neighbor triplets (default = 10).n_outliers
: Number of outliers for forming the nearest neighbor triplets (default = 5).n_random
: Number of random triplets per point (default = 5).distance
: Distance measure ('euclidean' (default), 'manhattan', 'angular', 'hamming')weight_adj
: The value of gamma for the log-transformation (default = 500.0).lr
: Learning rate (default = 1000.0).n_iters
: Number of iterations (default = 400).
The other parameters include:
knn_tuple
: Use the pre-computed nearest-neighbors information in form of a tuple (knn_nbrs, knn_distances) (default = None)apply_pca
: Reduce the number of dimensions of the data to 100 if necessary before applying the nearest-neighbor search (default = True).opt_method
: Optimization method {'sd' (steepest descent), 'momentum' (GD with momentum), 'dbd' (delta-bar-delta, default)}.verbose
: Print the progress report (default = True).return_seq
: Store the intermediate results and return the results in a tensor (default = False).
An example of adjusting these parameters:
import trimap
from sklearn.datasets import load_digits
digits = load_digits()
embedding = trimap.TRIMAP(n_inliers=20,
n_outliers=10,
n_random=10,
weight_adj=1000.0).fit_transform(digits.data)
The nearest-neighbor calculation is performed using ANNOY.
The following are some of the results on real-world datasets. The values of nearest-neighbor accuracy and global score are shown as a pair (NN, GS) on top of each figure. For more results, please refer to our paper.
USPS Handwritten Digits (n = 11,000, d = 256)
20 News Groups (n = 18,846, d = 100)
Tabula Muris (n = 53,760, d = 23,433)
MNIST Handwritten Digits (n = 70,000, d = 784)
Fashion MNIST (n = 70,000, d = 784)
TV News (n = 129,685, d = 100)
Runtime of t-SNE, LargeVis, UMAP, and TriMap in the hh:mm:ss format on a single machine with 2.6 GHz Intel Core i5 CPU and 16 GB of memory is given in the following table. We limit the runtime of each method to 12 hours. Also, UMAP runs out of memory on datasets larger than ~4M points.
Requirements:
- numpy
- scikit-learn
- numba
- annoy
Install Options
If you have all the requirements installed, you can use pip:
sudo pip install trimap
Please regularly check for updates and make sure you are using the most recent version. If you have TriMap installed and would like to upgrade to the newer version, you can use the command:
sudo pip install --upgrade --force-reinstall trimap
An alternative is to install the dependencies manually using anaconda and using pip to install TriMap:
conda install numpy
conda install scikit-learn
conda install numba
conda install annoy
pip install trimap
For a manual install get this package:
wget https://github.com/eamid/trimap/archive/master.zip
unzip master.zip
rm master.zip
cd trimap-master
Install the requirements
sudo pip install -r requirements.txt
or
conda install scikit-learn numba annoy
Install the package
python setup.py install
This implementation is still a work in progress. Any comments/suggestions/bug-reports are highly appreciated. Please feel free contact me at: eamid@ucsc.edu. If you would like to contribute to the code, please fork the project and send me a pull request.
If you use TriMap in your publications, please cite our current reference on arXiv:
@article{2019TRIMAP, author = {{Amid}, E. and {Warmuth}, M. K.}, title = "{TriMap: Large-scale Dimensionality Reduction Using Triplets}", journal = {ArXiv e-prints}, archivePrefix = "arXiv", eprint = {1910.00204}, year = 2019, }
Please see the LICENSE file.