Clone or download
wdevazelhes and bellet [MRG] Add memory efficient implementation of NCA (#99)
* FIX Fixes #45 Add memory efficient implementation of NCA
- Make gradient computation more memory efficient
- Remove the hard-coded test but adds others

* ENH Add scipy optimizer lbfgs-b
- Add deprecation for learning rate (not needed anymore)
- TST: test deprecation
- TST: force the algorithm to converge to pass test_iris using tol

* FIX fix tests:
- use checked labels instead of raw y
- update string representation with new arguments

* FIX: remove init parameter in NCA

* FIX: remove random_state as well as unused imports

* DOC: add docstring for NCA

* TST: add more tests for edge cases and toy examples

* STY: replace np.sum(array) by array.sum()
Latest commit faa240f Jul 9, 2018


Travis-CI Build Status License PyPI version


Metric Learning algorithms in Python.


  • Large Margin Nearest Neighbor (LMNN)
  • Information Theoretic Metric Learning (ITML)
  • Sparse Determinant Metric Learning (SDML)
  • Least Squares Metric Learning (LSML)
  • Neighborhood Components Analysis (NCA)
  • Local Fisher Discriminant Analysis (LFDA)
  • Relative Components Analysis (RCA)
  • Metric Learning for Kernel Regression (MLKR)
  • Mahalanobis Metric for Clustering (MMC)


  • Python 2.7+, 3.4+
  • numpy, scipy, scikit-learn
  • (for running the examples only: matplotlib)


Run pip install metric-learn to download and install from PyPI.

Run python install for default installation.

Run pytest test to run all tests (you will need to have the pytest package installed).


For full usage examples, see the sphinx documentation.

Each metric is a subclass of BaseMetricLearner, which provides default implementations for the methods metric, transformer, and transform. Subclasses must provide an implementation for either metric or transformer.

For an instance of a metric learner named foo learning from a set of d-dimensional points, foo.metric() returns a d x d matrix M such that the distance between vectors x and y is expressed sqrt((x-y).dot(M).dot(x-y)). Using scipy's pdist function, this would look like pdist(X, metric='mahalanobis', VI=foo.metric()).

In the same scenario, foo.transformer() returns a d x d matrix L such that a vector x can be represented in the learned space as the vector

For convenience, the function foo.transform(X) is provided for converting a matrix of points (X) into the learned space, in which standard Euclidean distance can be used.


If a recent version of the Shogun Python modular (modshogun) library is available, the LMNN implementation will use the fast C++ version from there. The two implementations differ slightly, and the C++ version is more complete.