diff --git a/doc/introduction.rst b/doc/introduction.rst index dad530b3..ef221971 100644 --- a/doc/introduction.rst +++ b/doc/introduction.rst @@ -1,3 +1,5 @@ +.. _intro_metric_learning: + ======================== What is Metric Learning? ======================== @@ -77,6 +79,8 @@ necessarily the identity of indiscernibles. parameterizations are equivalent. In practice, an algorithm may thus solve the metric learning problem with respect to either :math:`M` or :math:`L`. +.. _use_cases: + Use-cases ========= diff --git a/doc/metric_learn.constraints.rst b/doc/metric_learn.constraints.rst new file mode 100644 index 00000000..97d79002 --- /dev/null +++ b/doc/metric_learn.constraints.rst @@ -0,0 +1,7 @@ +metric_learn.constraints module +=============================== + +.. automodule:: metric_learn.constraints + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/metric_learn.rst b/doc/metric_learn.rst index c2472408..eb606542 100644 --- a/doc/metric_learn.rst +++ b/doc/metric_learn.rst @@ -6,6 +6,7 @@ Module Contents .. toctree:: + metric_learn.constraints metric_learn.base_metric metric_learn.itml metric_learn.lfda diff --git a/doc/weakly_supervised.rst b/doc/weakly_supervised.rst index 93720ffc..351c4e3b 100644 --- a/doc/weakly_supervised.rst +++ b/doc/weakly_supervised.rst @@ -118,6 +118,7 @@ through the argument `preprocessor`. paths in the filesystem, name of records in a database etc...) See section :ref:`preprocessor_section` for more details on how to use the preprocessor. +.. _sklearn_compat_ws: Scikit-learn compatibility ========================== diff --git a/examples/metric_plotting.ipynb b/examples/metric_plotting.ipynb deleted file mode 100644 index f8661181..00000000 --- a/examples/metric_plotting.ipynb +++ /dev/null @@ -1,708 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": false - }, - "source": [ - "### Metric Learning and Plotting\n", - "\n", - "This is a small walkthrough which illustrates all the Metric Learning algorithms implemented in metric_learn, and also does a quick visualisation which can help understand which algorithm might be best suited for you.\n", - "\n", - "Of course, depending on the data set and the constraints your results will look very different; you can just follow this and change your data and constraints accordingly. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Imports " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "\n", - "import metric_learn\n", - "import numpy as np\n", - "from sklearn.datasets import load_iris\n", - "\n", - "# visualisation imports\n", - "import matplotlib.pyplot as plt\n", - "from mpl_toolkits.mplot3d import Axes3D" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Loading our data-set and setting up plotting\n", - "\n", - "We will be using the IRIS data-set to illustrate the plotting. You can read more about the IRIS data-set here: [link](https://en.wikipedia.org/wiki/Iris_flower_data_set). \n", - "\n", - "We would like to point out that only two features - Sepal Width and Sepal Length are being plotted. This is because it is tough to visualise more features than this. The purpose of the plotting is to understand how each of the new learned metrics transform the input space. " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# loading our dataset\n", - "\n", - "iris_data = load_iris()\n", - "# this is our data\n", - "X = iris_data['data']\n", - "# these are our constraints\n", - "Y = iris_data['target']\n", - "\n", - "# function to plot the results\n", - "def plot(X, Y):\n", - " x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5\n", - " y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5\n", - " plt.figure(2, figsize=(8, 6))\n", - "\n", - " # clean the figure\n", - " plt.clf()\n", - "\n", - " plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)\n", - " plt.xlabel('Sepal length')\n", - " plt.ylabel('Sepal width')\n", - "\n", - " plt.xlim(x_min, x_max)\n", - " plt.ylim(y_min, y_max)\n", - " plt.xticks(())\n", - " plt.yticks(())\n", - "\n", - " plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# plotting the dataset as is.\n", - "plot(X, Y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Metric Learning\n", - "\n", - "Why is Metric Learning useful? We can, with prior knowledge of which points are supposed to be closer, figure out a better way to understand distances between points. Especially in higher dimensions when Euclidean distances are a poor way to measure distance, this becomes very useful.\n", - "\n", - "Basically, we learn this distance: $D(x,y)=\\sqrt{(x-y)\\,M^{-1}(x-y)}$.\n", - "And we learn this distance by learning a Matrix $M$, based on certain constraints.\n", - "\n", - "Some good reading material for the same can be found [here](https://arxiv.org/pdf/1306.6709.pdf). It serves as a good literature review of Metric Learning. \n", - "\n", - "We will briefly explain the metric-learning algorithms implemented by metric-learn, before providing some examples for it's usage, and also discuss how to go about doing manual constraints.\n", - "\n", - "Metric-learn can be easily integrated with your other machine learning pipelines, and follows (for the most part) scikit-learn conventions." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Large Margin Nearest Neighbour\n", - "\n", - "LMNN is a metric learning algorithm primarily designed for k-nearest neighbor classification. The algorithm is based on semidefinite programming, a sub-class of convex programming (as most Metric Learning algorithms are).\n", - "\n", - "The main intuition behind LMNN is to learn a pseudometric under which all data instances in the training set are surrounded by at least k instances that share the same class label. If this is achieved, the leave-one-out error (a special case of cross validation) is minimized. \n", - "\n", - "You can find the paper [here](http://jmlr.csail.mit.edu/papers/volume10/weinberger09a/weinberger09a.pdf)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Fit and then transform!" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# setting up LMNN\n", - "lmnn = metric_learn.LMNN(k=5, learn_rate=1e-6)\n", - "\n", - "# fit the data!\n", - "lmnn.fit(X, Y)\n", - "\n", - "# transform our input space\n", - "X_lmnn = lmnn.transform()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So what have we learned? The matrix $M$ we talked about before.\n", - "Let's see what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 2.49193844, 0.35638993, -0.39984418, -0.77608969],\n", - " [ 0.35638993, 1.68815388, -0.90376817, -0.07406329],\n", - " [-0.39984418, -0.90376817, 2.37468946, 2.18784107],\n", - " [-0.77608969, -0.07406329, 2.18784107, 2.94523937]])" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "lmnn.metric()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let us plot the transformed space - this tells us what the original space looks like after being transformed with the new learned metric." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\nAAAAAElFTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot(X_lmnn, Y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Pretty neat, huh?\n", - "\n", - "The rest of this notebook will briefly explain the other Metric Learning algorithms before plottting them.\n", - "Also, while we have first run `fit` and then `transform` to see our data transformed, we can also use `fit_transform` if you are using the bleeding edge version of the code. The rest of the examples and illustrations will use `fit_transform`." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Information Theoretic Metric Learning \n", - "\n", - "ITML uses a regularizer that automatically enforces a Semi-Definite Positive Matrix condition - the LogDet divergence. It uses soft must-link or cannot like constraints, and a simple algorithm based on Bregman projections. \n", - "\n", - "Link to paper: [ITML](http://www.cs.utexas.edu/users/pjain/pubs/metriclearning_icml.pdf). " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "itml = metric_learn.ITML_Supervised(num_constraints=200)\n", - "X_itml = itml.fit_transform(X, Y)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot(X_itml, Y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sparse Determinant Metric Learning\n", - "\n", - "Implements an efficient sparse metric learning algorithm in high dimensional space via an $l_1$-penalised log-determinant regularization. Compare to the most existing distance metric learning algorithms, the algorithm exploits the sparsity nature underlying the intrinsic high dimensional feature space.\n", - "\n", - "Link to paper here: [SDML](http://lms.comp.nus.edu.sg/sites/default/files/publication-attachments/icml09-guojun.pdf). \n", - "\n", - "One feature which we'd like to show off here is the use of random seeds.\n", - "Some of the algorithms feature randomised algorithms for selecting constraints - to fix these, and get constant results for each run, we pass a numpy random seed as shown in the example below." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/bhargavvader/Open_Source/metric-learn/venv/lib/python2.7/site-packages/sklearn/covariance/graph_lasso_.py:252: ConvergenceWarning: graph_lasso: did not converge after 100 iteration: dual gap: 2.377e-04\n", - " ConvergenceWarning)\n" - ] - } - ], - "source": [ - "sdml = metric_learn.SDML_Supervised(num_constraints=200)\n", - "X_sdml = sdml.fit_transform(X, Y, random_state = np.random.RandomState(1234))" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot(X_sdml, Y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Least Squares Metric Learning\n", - "\n", - "LSML is a simple, yet effective, algorithm that learns a Mahalanobis metric from a given set of relative comparisons. This is done by formulating and minimizing a convex loss function that corresponds to the sum of squared hinge loss of violated constraints. \n", - "\n", - "Link to paper: [LSML](http://web.cs.ucla.edu/~weiwang/paper/ICDM12.pdf)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "lsml = metric_learn.LSML_Supervised(num_constraints=200)\n", - "X_lsml = lsml.fit_transform(X, Y)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\nUqUKZcqU0XtuQj9epRv5V2CEqqpHnzZUj/Ti+1bOpvhmiI+PZ+/evaSkpODj4/NKYzJ37tyhUePG\ntBs4lkoepVn3yzwiHj3i+3+tAx4yZAi2BZ2YumwzRhoNzbv1ZXyHRiQkyFaMIvcM6NWTzuUd6FzO\nkciEVN7fdZshQ4boLGtbs/IPfqtfgvKO6cXxUkQs69et1Sm2KSnJOFr+MyO2kJUJfhGxOtet5O2N\n7wY/ahRJH2P0vZ9EpRbPnd+ZYwYPHsKAAQOJj4/PdPbu3xRFoX79+rmSkzCMlym2aX8XWgBVVY8p\nipJ7R3vkI1FRUdSt3wCNuRXmVtaMGTuOo0cOU7JkyWy1t3XrVrwbNKdZt34AuHqUYmLXpjrFNiws\njMLuHhg9PevTybUoKiqhoaF4eHi80j2JvGXTpk1cvHiRFi1aZDp+aUgJKam0Kp0+TupgYUxdd1uO\nHDmiE2duZkZkwj/H2j1KSsPlX7NeAWrUqc+SE4f4oI4riala/vCPYMjo93TiPvlsKm1PnWLY7vMo\nioJnmXJM/+rrHLyz59NoNM8ttOLN8DLF9rCiKD8Dq0jfM7AbcEhRFG8AVVX/0mN++crMWbNwKV2e\nAVNmoSgK239byPvjP2TLpo3Zas/Y2JjkpMRnr5MTE9AY6x6ePWTIEPr068f5YwcoXbEKm3+Zj7mF\nlRTa18STJ0+YN3cO94ODadysOV26dMl0SYhPg3qcOXWCYgXMmTnjC0aOGce3s/POzqqmxkZcDI2n\ndlEbUtK0+IXFUbGe7trciZ9PY/DIYYyq6MKD+BS2B8dwatBgnbgt27bTrLEPE/efxMhIoX3nbsyc\nNUsnztLSkr0HD3Pz5k1UVaVUqVIYGb0RWwWIPORlxmwz3wQznaqqauMsPidjtv/ybu/eWJeoRKP2\n3QG4fuEM2376inNnTmervfDwcCpX8aZ6s7a4eJRi1x+LGNinF1MmT9aJHTFiBEt/W05qSjIWltZs\n3byRRo0avcrtiFc0Y8YMvvnyC1JSUylZoiSHfE/oHHweFxdHDe/KuKhReNgYse9eEgNGvccnn36W\nIW7t2rUM7N2TBW08sDUzJjAykY/23iHicRS2tra5eVtZmjhxIt99M5MS9uY8jEtBa2RCWGQUpqam\nOrH79u1j8/p1WNnYMnL06EzHOYXIi7K9zvYVLijF9l9+WrCA7xcuYfz85ZiamfPzp+Pw9irB/O/n\n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\nTGUrIiJis/8Ddjbvid3BBjsAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot(X_lsml, Y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Neighborhood Components Analysis\n", - "\n", - "NCA is an extrememly popular metric-learning algorithm, and one of the first few (published back in 2005).\n", - "\n", - "Neighbourhood components analysis aims at \"learning\" a distance metric by finding a linear transformation of input data such that the average leave-one-out (LOO) classification performance is maximized in the transformed space. The key insight to the algorithm is that a matrix $A$ corresponding to the transformation can be found by defining a differentiable objective function for $A$, followed by use of an iterative solver such as conjugate gradient descent. One of the benefits of this algorithm is that the number of classes $k$ can be determined as a function of $A$, up to a scalar constant. This use of the algorithm therefore addresses the issue of model selection.\n", - "\n", - "You can read more about it in the paper here: [NCA](https://papers.nips.cc/paper/2566-neighbourhood-components-analysis.pdf). " - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "nca = metric_learn.NCA(max_iter=1000, learning_rate=0.01)\n", - "X_nca = nca.fit_transform(X, Y)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\nDZq35vJb7mXfji289eCtLJg/T4/qExEpBo1s5RdxcXHM+fEH9q5cSHZmOuGR0QBYa0k5sJe/3vt/\nVIyNo1mHrrS5sB9TpkxxObGISOmmsi2nmjZtyqzvv2XU9aN47/E72bZ2JYtmTMYbEMjhfbuBwvLd\nvW0z//fkk/zjjjvRTIWIyJnRNHI5V1BQwCOPPsY306dToUIFLujciX+/+x4d+13C7i0byMpI4x8v\nvMvzt1zNi8/8kyFDhrgdWUSkxNLZyFJsCxcu5KLevRk66nb6jPgrQSGhTHztGVrWiuXhhx92O56I\nSImlNVspti5dutA0sRkRFSoSFBJKXk42m5Yv0tOCRETOkEa28rvWrVtH7z59ialajaOHD9Hzwh6M\n//ADPB79fiYicjKaRpbTlpaWxpo1a6hQoQLNmjXDmP/5/4+IiPyKylbOmuTkZFJSUqhTpw6hoaFu\nxxERKTG0ZitnxVNPP03d+vXpP2gIdevVZ/Xq1W5HEhEp8TSylWL76aefGHrZcB5+fwoVY+NYOGMy\n33/4Gtu3bnE7mohIiaCRrfxp69atI7F9FyrGxgHQqe9gdiXtID8/3+VkIiIlm8pWiq1BgwZsXvEz\nmempAKxe+CPVzqtOYGCgy8lEREq2ALcDSOnRvXt3Rgwfxr3DelK1ek0O79vN15Mnux1LRKTE05qt\nnLatW7dy6NAhEhMTiYmJcTuOiEiJoVt/REREHKYNUiIiIi5R2YqIiDhMZSsiIuIwla2IiIjDVLYi\nIiIOU9mKiIg4TGUrIiLiMJWtiIiIw1S2IiIiDlPZioiIOExlKyIi4jCVrYiIiMNUtiIiIg5T2YqI\niDhMZSsiIuIwla2IiIjDVLYiIiIOU9mKiIg4TGUrIiLiMJWtiIiIw1S2IiIiDlPZioiIOExlKyIi\n4jCVrYiIiMNUtiIiIg5T2YqIiDhMZSsiIuIwla2IiIjDVLYiIiIOU9mKiIg4TGUrIiLiMJWtiIiI\nw1S2IiIiDlPZioiIOExlKyIi4jCVrYiIiMNUtiIiIg5T2YqIiDhMZSsiIuIwla2IiIjDVLYiIiIO\nU9mKiIg4TGUrIiLiMJWtiIiIw1S2IiIiDlPZioiIOExlKyIi4jCVrYiIiMNUtiIiIg5T2YqIiDhM\nZSsiIuIwla2IiIjDVLYiIiIOU9mKiIg4TGUrIiLisIBTfYExJhi4FEj49ddbax93LpaIiEjZccqy\n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\nQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot(X_nca, Y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Local Fischer Discriminant Analysis\n", - "\n", - "LFDA is a linear supervised dimensionality reduction method. It is particularly useful when dealing with multimodality, where one ore more classes consist of separate clusters in input space. The core optimization problem of LFDA is solved as a generalized eigenvalue problem.\n", - "\n", - "Link to paper: [LFDA](http://www.machinelearning.org/proceedings/icml2006/114_Local_Fisher_Discrim.pdf)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "lfda = metric_learn.LFDA(k=2, dim=2)\n", - "X_lfda = lfda.fit_transform(X, Y)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot(X_lfda, Y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Relative Components Analysis\n", - "\n", - "RCA is another one of the older algorithms.\n", - "It learns a full rank Mahalanobis distance metric based on a weighted sum of in-class covariance matrices. It applies a global linear transformation to assign large weights to relevant dimensions and low weights to irrelevant dimensions. Those relevant dimensions are estimated using “chunklets”, subsets of points that are known to belong to the same class.\n", - "\n", - "Link to paper: [RCA](https://www.aaai.org/Papers/ICML/2003/ICML03-005.pdf)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "rca = metric_learn.RCA_Supervised(num_chunks=30, chunk_size=2)\n", - "X_rca = rca.fit_transform(X, Y)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot(X_rca, Y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Manual Constraints\n", - "\n", - "Some of the algorithms we've mentioned have alternate ways to pass constraints.\n", - "So far we've been passing them as just class labels - and letting the internals of metric-learn deal with creating our constrints.\n", - "\n", - "We'll be looking at one other way to do this - which is to pass a Matrix X such that - (a,b,c,d) indices into X, such that $d(X[a],X[b]) < d(X[c],X[d])$. \n", - "\n", - "This kind of input is possible for ITML and LSML.\n", - "\n", - "We're going to create these constraints through the labels we have, i.e $Y$.\n", - "\n", - "This is done internally through metric learn anyway (do check out the `constraints` class!) - but we'll try our own version of this. I'm going to go ahead and assume that two points labelled the same will be closer than two points in different labels.\n", - "\n", - "Do keep in mind that we are doing this method because we know the labels - we can actually create the constraints any way we want to depending on the data!" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def create_constraints(labels):\n", - " import itertools\n", - " import random\n", - " \n", - " # aggregate indices of same class\n", - " zeros = np.where(Y==0)[0]\n", - " ones = np.where(Y==1)[0]\n", - " twos = np.where(Y==2)[0]\n", - " # make permutations of all those points in the same class\n", - " zeros_ = list(itertools.combinations(zeros, 2))\n", - " ones_ = list(itertools.combinations(ones, 2))\n", - " twos_ = list(itertools.combinations(twos, 2))\n", - " # put them together!\n", - " sim = np.array(zeros_ + ones_ + twos_)\n", - " \n", - " # similarily, put together indices in different classes\n", - " dis = []\n", - " for zero in zeros:\n", - " for one in ones:\n", - " dis.append((zero, one))\n", - " for two in twos:\n", - " dis.append((zero, two))\n", - " for one in ones:\n", - " for two in twos:\n", - " dis.append((one, two))\n", - " \n", - " # pick up just enough dissimilar examples as we have similar examples\n", - " dis = np.array(random.sample(dis, len(sim)))\n", - " \n", - " # return a four-tuple of arrays with d(X[a],X[b])" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot(X_itml, Y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And that's the result of ITML after being trained on our manual constraints! A bit different from our old result but not too different. We can also notice that it might be better to rely on the randomised algorithms under the hood to make our constraints if we are not very sure how we want our transformed space to be.\n", - "\n", - "RCA and SDML also have their own specific ways of taking in inputs - it's worth one's while to poke around in the constraints.py file to see how exactly this is going on.\n", - "\n", - "This brings us to the end of this tutorial!\n", - "Have fun Metric Learning :)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/examples/plot_metric_learning_examples.py b/examples/plot_metric_learning_examples.py new file mode 100644 index 00000000..fd6cff20 --- /dev/null +++ b/examples/plot_metric_learning_examples.py @@ -0,0 +1,485 @@ +""" +Algorithms walkthrough +~~~~~~~~~~~~~~~~~~~~~~ + +This is a small walkthrough which illustrates most of the Metric Learning +algorithms implemented in metric-learn by using them on synthetic data, +with some visualizations to provide intuitions into what they are designed +to achieve. +""" + +# License: BSD 3 clause +# Authors: Bhargav Srinivasa Desikan +# William de Vazelhes + +###################################################################### +# Imports +# ^^^^^^^ +# + +from sklearn.manifold import TSNE + +import metric_learn +import numpy as np +from sklearn.datasets import make_classification, make_regression + +# visualisation imports +import matplotlib.pyplot as plt +np.random.seed(42) + + +###################################################################### +# Loading our dataset and setting up plotting +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# We will be using a synthetic dataset to illustrate the plotting, +# using the function `sklearn.datasets.make_classification` from +# scikit-learn. The dataset will contain: +# - 100 points in 3 classes with 2 clusters per class +# - 5 features, among which 3 are informative (correlated with the class +# labels) and two are random noise with large magnitude + +X, y = make_classification(n_samples=100, n_classes=3, n_clusters_per_class=2, + n_informative=3, class_sep=4., n_features=5, + n_redundant=0, shuffle=True, + scale=[1, 1, 20, 20, 20]) + +########################################################################### +# Note that the dimensionality of the data is 5, so to plot the +# transformed data in 2D, we will use the t-sne algorithm. (See +# `sklearn.manifold.TSNE`). + + +def plot_tsne(X, y, colormap=plt.cm.Paired): + plt.figure(figsize=(8, 6)) + + # clean the figure + plt.clf() + + tsne = TSNE() + X_embedded = tsne.fit_transform(X) + plt.scatter(X_embedded[:, 0], X_embedded[:, 1], c=y, cmap=colormap) + + plt.xticks(()) + plt.yticks(()) + + plt.show() + +################################### +# Let's now plot the dataset as is. + + +plot_tsne(X, y) + +######################################################################### +# We can see that the classes appear mixed up: this is because t-sne +# is based on preserving the original neighborhood of points in the embedding +# space, but this original neighborhood is based on the euclidean +# distance in the input space, in which the contribution of the noisy +# features is high. So even if points from the same class are close to each +# other in some subspace of the input space, this is not the case when +# considering all dimensions of the input space. +# +# Metric Learning +# ^^^^^^^^^^^^^^^ +# +# Why is Metric Learning useful? We can, with prior knowledge of which +# points are supposed to be closer, figure out a better way to compute +# distances between points for the task at hand. Especially in higher +# dimensions when Euclidean distances are a poor way to measure distance, this +# becomes very useful. +# +# Basically, we learn this distance: +# :math:`D(x, x') = \sqrt{(x-x')^\top M(x-x')}`. And we learn the parameters +# :math:`M` of this distance to satisfy certain constraints on the distance +# between points, for example requiring that points of the same class are +# close together and points of different class are far away. +# +# For more information, check the :ref:`intro_metric_learning` section +# from the documentation. Some good reading material can also be found +# `here `__. It serves as a +# good literature review of Metric Learning. +# +# We will briefly explain the metric learning algorithms implemented by +# metric-learn, before providing some examples for its usage, and also +# discuss how to perform metric learning with weaker supervision than class +# labels. +# +# Metric-learn can be easily integrated with your other machine learning +# pipelines, and follows scikit-learn conventions. +# + + +###################################################################### +# Large Margin Nearest Neighbour +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# LMNN is a metric learning algorithm primarily designed for k-nearest +# neighbor classification. The algorithm is based on semidefinite +# programming, a sub-class of convex programming (as most Metric Learning +# algorithms are). +# +# The main intuition behind LMNN is to learn a pseudometric under which +# all data instances in the training set are surrounded by at least k +# instances that share the same class label. If this is achieved, the +# leave-one-out error (a special case of cross validation) is minimized. +# You'll notice that the points from the same labels are closer together, +# but they are not necessary in a same cluster. This is particular to LMNN +# and we'll see that some other algorithms implicitly enforce points from +# the same class to cluster together. +# +# - See more in the :ref:`User Guide ` +# - See more in the documentation of the class :py:class:`LMNN +# ` + + +###################################################################### +# Fit and then transform! +# ----------------------- +# + +# setting up LMNN +lmnn = metric_learn.LMNN(k=5, learn_rate=1e-6) + +# fit the data! +lmnn.fit(X, y) + +# transform our input space +X_lmnn = lmnn.transform(X) + + +###################################################################### +# So what have we learned? The matrix :math:`M` we talked about before. + + +###################################################################### +# Now let us plot the transformed space - this tells us what the original +# space looks like after being transformed with the new learned metric. +# + +plot_tsne(X_lmnn, y) + + +###################################################################### +# Pretty neat, huh? +# +# The rest of this notebook will briefly explain the other Metric Learning +# algorithms before plotting them. Also, while we have first run ``fit`` +# and then ``transform`` to see our data transformed, we can also use +# ``fit_transform``. The rest of the examples and illustrations will use +# ``fit_transform``. + +###################################################################### +# Information Theoretic Metric Learning +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# ITML uses a regularizer that automatically enforces a Semi-Definite +# Positive Matrix condition - the LogDet divergence. It uses soft +# must-link or cannot like constraints, and a simple algorithm based on +# Bregman projections. Unlike LMNN, ITML will implicitly enforce points from +# the same class to belong to the same cluster, as you can see below. +# +# - See more in the :ref:`User Guide ` +# - See more in the documentation of the class :py:class:`ITML +# ` + +itml = metric_learn.ITML_Supervised() +X_itml = itml.fit_transform(X, y) + +plot_tsne(X_itml, y) + + +###################################################################### +# Mahalanobis Metric for Clustering +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# MMC is an algorithm that will try to minimize the distance between similar +# points, while ensuring that the sum of distances between dissimilar points is +# higher than a threshold. This is done by optimizing a cost function +# subject to an inequality constraint. +# +# - See more in the :ref:`User Guide ` +# - See more in the documentation of the class :py:class:`MMC +# ` + +itml = metric_learn.ITML_Supervised() +X_itml = itml.fit_transform(X, y) + +plot_tsne(X_itml, y) + +###################################################################### +# Sparse Determinant Metric Learning +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# Implements an efficient sparse metric learning algorithm in high +# dimensional space via an :math:`l_1`-penalized log-determinant +# regularization. Compared to the most existing distance metric learning +# algorithms, the algorithm exploits the sparsity nature underlying the +# intrinsic high dimensional feature space. +# +# - See more in the :ref:`User Guide ` +# - See more in the documentation of the class :py:class:`SDML +# ` + +sdml = metric_learn.SDML_Supervised(sparsity_param=0.1, balance_param=0.0015) +X_sdml = sdml.fit_transform(X, y) + +plot_tsne(X_sdml, y) + + +###################################################################### +# Least Squares Metric Learning +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# LSML is a simple, yet effective, algorithm that learns a Mahalanobis +# metric from a given set of relative comparisons. This is done by +# formulating and minimizing a convex loss function that corresponds to +# the sum of squared hinge loss of violated constraints. +# +# - See more in the :ref:`User Guide ` +# - See more in the documentation of the class :py:class:`LSML +# ` + +lsml = metric_learn.LSML_Supervised(tol=0.0001, max_iter=10000) +X_lsml = lsml.fit_transform(X, y) + +plot_tsne(X_lsml, y) + + +###################################################################### +# Neighborhood Components Analysis +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# NCA is an extremly popular metric learning algorithm. +# +# Neighborhood components analysis aims at "learning" a distance metric +# by finding a linear transformation of input data such that the average +# leave-one-out (LOO) classification performance of a soft-nearest +# neighbors rule is maximized in the transformed space. The key insight to +# the algorithm is that a matrix :math:`A` corresponding to the +# transformation can be found by defining a differentiable objective function +# for :math:`A`, followed by use of an iterative solver such as +# `scipy.optimize.fmin_l_bfgs_b`. Like LMNN, this algorithm does not try to +# cluster points from the same class in a unique cluster, because it +# enforces conditions at a local neighborhood scale. +# +# - See more in the :ref:`User Guide ` +# - See more in the documentation of the class :py:class:`NCA +# ` + +nca = metric_learn.NCA(max_iter=1000) +X_nca = nca.fit_transform(X, y) + +plot_tsne(X_nca, y) + +###################################################################### +# Local Fisher Discriminant Analysis +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# LFDA is a linear supervised dimensionality reduction method. It is +# particularly useful when dealing with multimodality, where one ore more +# classes consist of separate clusters in input space. The core +# optimization problem of LFDA is solved as a generalized eigenvalue +# problem. Like LMNN, and NCA, this algorithm does not try to cluster points +# from the same class in a unique cluster. +# +# - See more in the :ref:`User Guide ` +# - See more in the documentation of the class :py:class:`LFDA +# ` + +lfda = metric_learn.LFDA(k=2, num_dims=2) +X_lfda = lfda.fit_transform(X, y) + +plot_tsne(X_lfda, y) + + +###################################################################### +# Relative Components Analysis +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# RCA is another one of the older algorithms. It learns a full rank +# Mahalanobis distance metric based on a weighted sum of in-class +# covariance matrices. It applies a global linear transformation to assign +# large weights to relevant dimensions and low weights to irrelevant +# dimensions. Those relevant dimensions are estimated using "chunklets", +# subsets of points that are known to belong to the same class. +# +# - See more in the :ref:`User Guide ` +# - See more in the documentation of the class :py:class:`RCA +# ` + +rca = metric_learn.RCA_Supervised(num_chunks=30, chunk_size=2) +X_rca = rca.fit_transform(X, y) + +plot_tsne(X_rca, y) + +###################################################################### +# Regression example: Metric Learning for Kernel Regression +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# The previous algorithms took as input a dataset with class labels. Metric +# learning can also be useful for regression, when the labels are real numbers. +# An algorithm very similar to NCA but for regression is Metric +# Learning for Kernel Regression (MLKR). It will optimize for the average +# leave-one-out *regression* performance from a soft-nearest neighbors +# regression. +# +# - See more in the :ref:`User Guide ` +# - See more in the documentation of the class :py:class:`MLKR +# ` +# +# To illustrate MLKR, let's use the dataset +# `sklearn.datasets.make_regression` the same way as we did with the +# classification before. The dataset will contain: 100 points of 5 features +# each, among which 3 are informative (i.e., used to generate the +# regression target from a linear model), and two are random noise with the +# same magnitude. + +X_reg, y_reg = make_regression(n_samples=100, n_informative=3, n_features=5, + shuffle=True) + +###################################################################### +# Let's plot the dataset as is + +plot_tsne(X_reg, y_reg, plt.cm.Oranges) + +###################################################################### +# And let's plot the dataset after transformation by MLKR: +mlkr = metric_learn.MLKR() +X_mlkr = mlkr.fit_transform(X_reg, y_reg) +plot_tsne(X_mlkr, y_reg, plt.cm.Oranges) + +###################################################################### +# Points that have the same value to regress are now closer to each +# other ! This would improve the performance of +# `sklearn.neighbors.KNeighborsRegressor` for instance. + + +###################################################################### +# Metric Learning from Weaker Supervision +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# To learn the metric, so far we have always given the labels of the +# data to supervise the algorithms. However, in many applications, +# it is easier to obtain information about whether two samples are +# similar or dissimilar. For instance, when annotating a dataset of face +# images, it is easier for an annotator to tell if two faces belong to the same +# person or not, rather than finding the ID of the face among a huge database +# of every person's faces. +# Note that for some problems (e.g., in information +# retrieval where the goal is to rank documents by similarity to a query +# document), there is no notion of individual label but one can gather +# information on which pairs of points are similar or dissimilar. +# Fortunately, one of the strength of metric learning is the ability to +# learn from such weaker supervision. Indeed, some of the algorithms we've +# used above have alternate ways to pass some supervision about the metric +# we want to learn. The way to go is to pass a 2D array `pairs` of pairs, +# as well as an array of labels `pairs_labels` such that for each `i` between +# `0` and `n_pairs` we want `X[pairs[i, 0], :]` and `X[pairs[i, 1], :]` to be +# similar if `pairs_labels[i] == 1`, and we want them to be dissimilar if +# `pairs_labels[i] == -1`. In other words, we +# want to enforce a metric that projects similar points closer together and +# dissimilar points further away from each other. This kind of input is +# possible for ITML, SDML, and MMC. See :ref:`weakly_supervised_section` for +# details on other kinds of weak supervision that some algorithms can work +# with. +# +# For the purpose of this example, we're going to explicitly create these +# pairwise constraints through the labels we have, i.e. `y`. +# Do keep in mind that we are doing this method because we know the labels +# - we can actually create the constraints any way we want to depending on +# the data! +# +# Note that this is what metric-learn did under the hood in the previous +# examples (do check out the +# `constraints` module!) - but we'll try our own version of this. We're +# going to go ahead and assume that two points labeled the same will be +# closer than two points in different labels. + + +def create_constraints(labels): + import itertools + import random + + # aggregate indices of same class + zeros = np.where(y == 0)[0] + ones = np.where(y == 1)[0] + twos = np.where(y == 2)[0] + # make permutations of all those points in the same class + zeros_ = list(itertools.combinations(zeros, 2)) + ones_ = list(itertools.combinations(ones, 2)) + twos_ = list(itertools.combinations(twos, 2)) + # put them together! + sim = np.array(zeros_ + ones_ + twos_) + + # similarily, put together indices in different classes + dis = [] + for zero in zeros: + for one in ones: + dis.append((zero, one)) + for two in twos: + dis.append((zero, two)) + for one in ones: + for two in twos: + dis.append((one, two)) + + # pick up just enough dissimilar examples as we have similar examples + dis = np.array(random.sample(dis, len(sim))) + + # return an array of pairs of indices of shape=(2*len(sim), 2), and the corresponding labels, array of shape=(2*len(sim)) + # Each pair of similar points have a label of +1 and each pair of dissimilar points have a label of -1 + return (np.vstack([np.column_stack([sim[:, 0], sim[:, 1]]), np.column_stack([dis[:, 0], dis[:, 1]])]), + np.concatenate([np.ones(len(sim)), -np.ones(len(sim))])) + +pairs, pairs_labels = create_constraints(y) + + +###################################################################### +# Now that we've created our constraints, let's see what it looks like! +# + +print(pairs) +print(pairs_labels) + + +###################################################################### +# Using our constraints, let's now train ITML again. Note that we are no +# longer calling the supervised class :py:class:`ITML_Supervised +# ` but the more generic +# (weakly-supervised) :py:class:`ITML `, which +# takes the dataset `X` through the `preprocessor` argument (see +# :ref:`this section ` of the documentation to learn +# about more advanced uses of `preprocessor`) and the pair information `pairs` +# and `pairs_labels` in the fit method. + +itml = metric_learn.ITML(preprocessor=X) +itml.fit(pairs, pairs_labels) + +X_itml = itml.transform(X) + +plot_tsne(X_itml, y) + + +###################################################################### +# And that's the result of ITML after being trained on our manually +# constructed constraints! A bit different from our old result, but not too +# different. +# +# RCA and LSML also have their own specific ways of taking in inputs - +# it's worth one's while to poke around in the constraints.py file to see +# how exactly this is going on. +# +# Finally, one of the main advantages of metric-learn is its out-of-the box +# compatibility with scikit-learn, for doing `model selection +# `__, +# cross-validation, and scoring for instance. Indeed, supervised algorithms are +# regular `sklearn.base.TransformerMixin` that can be plugged into any +# pipeline or cross-validation procedure. And weakly-supervised estimators are +# also compatible with scikit-learn, since their input dataset format described +# above allows to be sliced along the first dimension when doing +# cross-validations (see also this :ref:`section `). You +# can also look at some :ref:`use cases ` where you could combine +# metric-learn with scikit-learn estimators. + +######################################################################## +# This brings us to the end of this tutorial! Have fun Metric Learning :)