summaryrefslogtreecommitdiff
path: root/notebooks/plot_gromov_barycenter.ipynb
diff options
context:
space:
mode:
authorRémi Flamary <remi.flamary@gmail.com>2017-09-15 13:57:01 +0200
committerRémi Flamary <remi.flamary@gmail.com>2017-09-15 13:57:01 +0200
commitdd3546baf9c59733b2109a971293eba48d2eaed3 (patch)
treedbc9c5dd126eecf537acbe7d205b91250f2bdc9b /notebooks/plot_gromov_barycenter.ipynb
parentbad3d95523d005a4fbf64dd009c716b9dd560fe3 (diff)
add all files for doc
Diffstat (limited to 'notebooks/plot_gromov_barycenter.ipynb')
-rw-r--r--notebooks/plot_gromov_barycenter.ipynb368
1 files changed, 368 insertions, 0 deletions
diff --git a/notebooks/plot_gromov_barycenter.ipynb b/notebooks/plot_gromov_barycenter.ipynb
new file mode 100644
index 0000000..8102bcf
--- /dev/null
+++ b/notebooks/plot_gromov_barycenter.ipynb
@@ -0,0 +1,368 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "# Gromov-Wasserstein Barycenter example\n",
+ "\n",
+ "\n",
+ "This example is designed to show how to use the Gromov-Wasserstein distance\n",
+ "computation in POT.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Author: Erwan Vautier <erwan.vautier@gmail.com>\r\n",
+ "# Nicolas Courty <ncourty@irisa.fr>\r\n",
+ "#\r\n",
+ "# License: MIT License\r\n",
+ "\r\n",
+ "\r\n",
+ "import numpy as np\r\n",
+ "import scipy as sp\r\n",
+ "\r\n",
+ "import scipy.ndimage as spi\r\n",
+ "import matplotlib.pylab as pl\r\n",
+ "from sklearn import manifold\r\n",
+ "from sklearn.decomposition import PCA\r\n",
+ "\r\n",
+ "import ot"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Smacof MDS\r\n",
+ " ----------\r\n",
+ "\r\n",
+ " This function allows to find an embedding of points given a dissimilarity matrix\r\n",
+ " that will be given by the output of the algorithm\r\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "def smacof_mds(C, dim, max_iter=3000, eps=1e-9):\r\n",
+ " \"\"\"\r\n",
+ " Returns an interpolated point cloud following the dissimilarity matrix C\r\n",
+ " using SMACOF multidimensional scaling (MDS) in specific dimensionned\r\n",
+ " target space\r\n",
+ "\r\n",
+ " Parameters\r\n",
+ " ----------\r\n",
+ " C : ndarray, shape (ns, ns)\r\n",
+ " dissimilarity matrix\r\n",
+ " dim : int\r\n",
+ " dimension of the targeted space\r\n",
+ " max_iter : int\r\n",
+ " Maximum number of iterations of the SMACOF algorithm for a single run\r\n",
+ " eps : float\r\n",
+ " relative tolerance w.r.t stress to declare converge\r\n",
+ "\r\n",
+ " Returns\r\n",
+ " -------\r\n",
+ " npos : ndarray, shape (R, dim)\r\n",
+ " Embedded coordinates of the interpolated point cloud (defined with\r\n",
+ " one isometry)\r\n",
+ " \"\"\"\r\n",
+ "\r\n",
+ " rng = np.random.RandomState(seed=3)\r\n",
+ "\r\n",
+ " mds = manifold.MDS(\r\n",
+ " dim,\r\n",
+ " max_iter=max_iter,\r\n",
+ " eps=1e-9,\r\n",
+ " dissimilarity='precomputed',\r\n",
+ " n_init=1)\r\n",
+ " pos = mds.fit(C).embedding_\r\n",
+ "\r\n",
+ " nmds = manifold.MDS(\r\n",
+ " 2,\r\n",
+ " max_iter=max_iter,\r\n",
+ " eps=1e-9,\r\n",
+ " dissimilarity=\"precomputed\",\r\n",
+ " random_state=rng,\r\n",
+ " n_init=1)\r\n",
+ " npos = nmds.fit_transform(C, init=pos)\r\n",
+ "\r\n",
+ " return npos"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Data preparation\r\n",
+ " ----------------\r\n",
+ "\r\n",
+ " The four distributions are constructed from 4 simple images\r\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "def im2mat(I):\r\n",
+ " \"\"\"Converts and image to matrix (one pixel per line)\"\"\"\r\n",
+ " return I.reshape((I.shape[0] * I.shape[1], I.shape[2]))\r\n",
+ "\r\n",
+ "\r\n",
+ "square = spi.imread('../data/square.png').astype(np.float64)[:, :, 2] / 256\r\n",
+ "cross = spi.imread('../data/cross.png').astype(np.float64)[:, :, 2] / 256\r\n",
+ "triangle = spi.imread('../data/triangle.png').astype(np.float64)[:, :, 2] / 256\r\n",
+ "star = spi.imread('../data/star.png').astype(np.float64)[:, :, 2] / 256\r\n",
+ "\r\n",
+ "shapes = [square, cross, triangle, star]\r\n",
+ "\r\n",
+ "S = 4\r\n",
+ "xs = [[] for i in range(S)]\r\n",
+ "\r\n",
+ "\r\n",
+ "for nb in range(4):\r\n",
+ " for i in range(8):\r\n",
+ " for j in range(8):\r\n",
+ " if shapes[nb][i, j] < 0.95:\r\n",
+ " xs[nb].append([j, 8 - i])\r\n",
+ "\r\n",
+ "xs = np.array([np.array(xs[0]), np.array(xs[1]),\r\n",
+ " np.array(xs[2]), np.array(xs[3])])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Barycenter computation\r\n",
+ "----------------------\r\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "ns = [len(xs[s]) for s in range(S)]\r\n",
+ "n_samples = 30\r\n",
+ "\r\n",
+ "\"\"\"Compute all distances matrices for the four shapes\"\"\"\r\n",
+ "Cs = [sp.spatial.distance.cdist(xs[s], xs[s]) for s in range(S)]\r\n",
+ "Cs = [cs / cs.max() for cs in Cs]\r\n",
+ "\r\n",
+ "ps = [ot.unif(ns[s]) for s in range(S)]\r\n",
+ "p = ot.unif(n_samples)\r\n",
+ "\r\n",
+ "\r\n",
+ "lambdast = [[float(i) / 3, float(3 - i) / 3] for i in [1, 2]]\r\n",
+ "\r\n",
+ "Ct01 = [0 for i in range(2)]\r\n",
+ "for i in range(2):\r\n",
+ " Ct01[i] = ot.gromov.gromov_barycenters(n_samples, [Cs[0], Cs[1]],\r\n",
+ " [ps[0], ps[1]\r\n",
+ " ], p, lambdast[i], 'square_loss', 5e-4,\r\n",
+ " max_iter=100, tol=1e-3)\r\n",
+ "\r\n",
+ "Ct02 = [0 for i in range(2)]\r\n",
+ "for i in range(2):\r\n",
+ " Ct02[i] = ot.gromov.gromov_barycenters(n_samples, [Cs[0], Cs[2]],\r\n",
+ " [ps[0], ps[2]\r\n",
+ " ], p, lambdast[i], 'square_loss', 5e-4,\r\n",
+ " max_iter=100, tol=1e-3)\r\n",
+ "\r\n",
+ "Ct13 = [0 for i in range(2)]\r\n",
+ "for i in range(2):\r\n",
+ " Ct13[i] = ot.gromov.gromov_barycenters(n_samples, [Cs[1], Cs[3]],\r\n",
+ " [ps[1], ps[3]\r\n",
+ " ], p, lambdast[i], 'square_loss', 5e-4,\r\n",
+ " max_iter=100, tol=1e-3)\r\n",
+ "\r\n",
+ "Ct23 = [0 for i in range(2)]\r\n",
+ "for i in range(2):\r\n",
+ " Ct23[i] = ot.gromov.gromov_barycenters(n_samples, [Cs[2], Cs[3]],\r\n",
+ " [ps[2], ps[3]\r\n",
+ " ], p, lambdast[i], 'square_loss', 5e-4,\r\n",
+ " max_iter=100, tol=1e-3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Visualization\r\n",
+ " -------------\r\n",
+ "\r\n",
+ " The PCA helps in getting consistency between the rotations\r\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "<matplotlib.collections.PathCollection at 0x7fd293df1e50>"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\nLzLFtqgTIcnUwIOTZKwvdXu2mJemGPl1x6bYADaZVgq99ECTugYUNttMPRlzj7vyYQoJ/CJTbIta\n6TKZGnhwkozFtCzQUl0kasTXHZtiAxhzZCzWdaIGFjbbkIw1UxUzA7icUyem2BY11nUyNfDgJBmL\npYs5n6pEKnZwZf7NYacpNoAx14zFOr9jYGGzzRSSsbrfx+psN/DBh85MsS1qrOtkauDBSTIWS9+X\npahT56J99pncdWyqDWCssyljneA0sLDZZuzJWN1mJ9Z2sWJqaNPeU22LGuk6mWLNWH4lSeD2fVmK\nrf3FPLUu828OO9EAhovR6Q0sbLYZezJW97Np8hl2uca67ja5oS2qoY9kirMp8ypZjow1VXe4oW5w\nxU7uMjDFBjDmlFPMY4oRNinaybEnY3Wbkb5GN+s0Q0NM7qfYFjU28mQqFMlYLLHPXMw9ucvA1BrA\n2FNOTeoNnVaq836K7wFjT8ZijYzFahbqNENDnPaeWlvUWmggjThZIxmLKeaZi7kndxmYWgOYasop\nNEnKeYZ87MlYjAS+yT5CTwCou82yvzdFXzy1tqi1Lue4BzazsxPJWCp1pw1TJneZm1oDGHvKqa8k\nqc4+Uo2GjD0Zcw+f2o65wqHLNWMpm7jRtEUxhri7SqZCF/hnjmQslRSXpRjwEO4io2kAa4o9MhYj\nSaoTUnVCnZGx7rX97x/78wuZ9s518H8UbVFostR1MjXw64hVSZ6MSbpR0rOSjkk6uOD9CyTdV7z/\niKT9VfvMpfGL3nIs29/AA7GN+eAddRwVYq8ZC+1k69YTc2Qltq5jyDOJo5B/31xGNqv+hpRN4Cja\notBkqetkipGx0tLql7btQNol6XlJV0s6X9Ljkq7bsc2nJN1ZPL5V0n1V+82h8Ys+bRj6raNsnwMe\nKdsK3lHH0Q6hU07zQpOkuiEXc81RbF3HkGcSR6HrsGJNZ4fMcuXcF4+iLQpNlriOWJDUydi7JT0w\n9/xzkj63Y5sHJL27eLxb0i8k2bL95tD4RZ82DA3UnQYeuO7bGsDxxlGHQpOkJiMRueb9XceQZxJH\noaNGMU70CO1L60yZp14zNui2qOuRsRjJVOiatoylTsY+LOmuuecflfTFHds8KenKuefPS7p02X5z\naPyij5mnuKhs5uYawPHGUYlYbU7IfmKHUOKRsU5iyDOJo9hruhap+r0++vq9e3/3+t69/fXFo2iL\n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\n",
+ "text/plain": [
+ "<matplotlib.figure.Figure at 0x7fd294476ed0>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "clf = PCA(n_components=2)\r\n",
+ "npos = [0, 0, 0, 0]\r\n",
+ "npos = [smacof_mds(Cs[s], 2) for s in range(S)]\r\n",
+ "\r\n",
+ "npost01 = [0, 0]\r\n",
+ "npost01 = [smacof_mds(Ct01[s], 2) for s in range(2)]\r\n",
+ "npost01 = [clf.fit_transform(npost01[s]) for s in range(2)]\r\n",
+ "\r\n",
+ "npost02 = [0, 0]\r\n",
+ "npost02 = [smacof_mds(Ct02[s], 2) for s in range(2)]\r\n",
+ "npost02 = [clf.fit_transform(npost02[s]) for s in range(2)]\r\n",
+ "\r\n",
+ "npost13 = [0, 0]\r\n",
+ "npost13 = [smacof_mds(Ct13[s], 2) for s in range(2)]\r\n",
+ "npost13 = [clf.fit_transform(npost13[s]) for s in range(2)]\r\n",
+ "\r\n",
+ "npost23 = [0, 0]\r\n",
+ "npost23 = [smacof_mds(Ct23[s], 2) for s in range(2)]\r\n",
+ "npost23 = [clf.fit_transform(npost23[s]) for s in range(2)]\r\n",
+ "\r\n",
+ "\r\n",
+ "fig = pl.figure(figsize=(10, 10))\r\n",
+ "\r\n",
+ "ax1 = pl.subplot2grid((4, 4), (0, 0))\r\n",
+ "pl.xlim((-1, 1))\r\n",
+ "pl.ylim((-1, 1))\r\n",
+ "ax1.scatter(npos[0][:, 0], npos[0][:, 1], color='r')\r\n",
+ "\r\n",
+ "ax2 = pl.subplot2grid((4, 4), (0, 1))\r\n",
+ "pl.xlim((-1, 1))\r\n",
+ "pl.ylim((-1, 1))\r\n",
+ "ax2.scatter(npost01[1][:, 0], npost01[1][:, 1], color='b')\r\n",
+ "\r\n",
+ "ax3 = pl.subplot2grid((4, 4), (0, 2))\r\n",
+ "pl.xlim((-1, 1))\r\n",
+ "pl.ylim((-1, 1))\r\n",
+ "ax3.scatter(npost01[0][:, 0], npost01[0][:, 1], color='b')\r\n",
+ "\r\n",
+ "ax4 = pl.subplot2grid((4, 4), (0, 3))\r\n",
+ "pl.xlim((-1, 1))\r\n",
+ "pl.ylim((-1, 1))\r\n",
+ "ax4.scatter(npos[1][:, 0], npos[1][:, 1], color='r')\r\n",
+ "\r\n",
+ "ax5 = pl.subplot2grid((4, 4), (1, 0))\r\n",
+ "pl.xlim((-1, 1))\r\n",
+ "pl.ylim((-1, 1))\r\n",
+ "ax5.scatter(npost02[1][:, 0], npost02[1][:, 1], color='b')\r\n",
+ "\r\n",
+ "ax6 = pl.subplot2grid((4, 4), (1, 3))\r\n",
+ "pl.xlim((-1, 1))\r\n",
+ "pl.ylim((-1, 1))\r\n",
+ "ax6.scatter(npost13[1][:, 0], npost13[1][:, 1], color='b')\r\n",
+ "\r\n",
+ "ax7 = pl.subplot2grid((4, 4), (2, 0))\r\n",
+ "pl.xlim((-1, 1))\r\n",
+ "pl.ylim((-1, 1))\r\n",
+ "ax7.scatter(npost02[0][:, 0], npost02[0][:, 1], color='b')\r\n",
+ "\r\n",
+ "ax8 = pl.subplot2grid((4, 4), (2, 3))\r\n",
+ "pl.xlim((-1, 1))\r\n",
+ "pl.ylim((-1, 1))\r\n",
+ "ax8.scatter(npost13[0][:, 0], npost13[0][:, 1], color='b')\r\n",
+ "\r\n",
+ "ax9 = pl.subplot2grid((4, 4), (3, 0))\r\n",
+ "pl.xlim((-1, 1))\r\n",
+ "pl.ylim((-1, 1))\r\n",
+ "ax9.scatter(npos[2][:, 0], npos[2][:, 1], color='r')\r\n",
+ "\r\n",
+ "ax10 = pl.subplot2grid((4, 4), (3, 1))\r\n",
+ "pl.xlim((-1, 1))\r\n",
+ "pl.ylim((-1, 1))\r\n",
+ "ax10.scatter(npost23[1][:, 0], npost23[1][:, 1], color='b')\r\n",
+ "\r\n",
+ "ax11 = pl.subplot2grid((4, 4), (3, 2))\r\n",
+ "pl.xlim((-1, 1))\r\n",
+ "pl.ylim((-1, 1))\r\n",
+ "ax11.scatter(npost23[0][:, 0], npost23[0][:, 1], color='b')\r\n",
+ "\r\n",
+ "ax12 = pl.subplot2grid((4, 4), (3, 3))\r\n",
+ "pl.xlim((-1, 1))\r\n",
+ "pl.ylim((-1, 1))\r\n",
+ "ax12.scatter(npos[3][:, 0], npos[3][:, 1], color='r')"
+ ]
+ }
+ ],
+ "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": 0
+}