summaryrefslogtreecommitdiff
path: root/notebooks/plot_gromov_barycenter.ipynb
diff options
context:
space:
mode:
authorRémi Flamary <remi.flamary@gmail.com>2020-04-22 11:39:23 +0200
committerRémi Flamary <remi.flamary@gmail.com>2020-04-22 11:39:23 +0200
commit135c011092cb442b0b874b565b6a2ca3f09234c4 (patch)
tree06a1a5209ee090824ae74af76bd2426295edc424 /notebooks/plot_gromov_barycenter.ipynb
parent5f679247f64fa1c8e277f34165850caea311a084 (diff)
remove notebooks and cleanup readme and doc
Diffstat (limited to 'notebooks/plot_gromov_barycenter.ipynb')
-rw-r--r--notebooks/plot_gromov_barycenter.ipynb369
1 files changed, 0 insertions, 369 deletions
diff --git a/notebooks/plot_gromov_barycenter.ipynb b/notebooks/plot_gromov_barycenter.ipynb
deleted file mode 100644
index eb51305..0000000
--- a/notebooks/plot_gromov_barycenter.ipynb
+++ /dev/null
@@ -1,369 +0,0 @@
-{
- "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>\n",
- "# Nicolas Courty <ncourty@irisa.fr>\n",
- "#\n",
- "# License: MIT License\n",
- "\n",
- "\n",
- "import numpy as np\n",
- "import scipy as sp\n",
- "\n",
- "import matplotlib.pylab as pl\n",
- "from sklearn import manifold\n",
- "from sklearn.decomposition import PCA\n",
- "\n",
- "import ot"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Smacof MDS\n",
- "----------\n",
- "\n",
- "This function allows to find an embedding of points given a dissimilarity matrix\n",
- "that will be given by the output of the algorithm\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "def smacof_mds(C, dim, max_iter=3000, eps=1e-9):\n",
- " \"\"\"\n",
- " Returns an interpolated point cloud following the dissimilarity matrix C\n",
- " using SMACOF multidimensional scaling (MDS) in specific dimensionned\n",
- " target space\n",
- "\n",
- " Parameters\n",
- " ----------\n",
- " C : ndarray, shape (ns, ns)\n",
- " dissimilarity matrix\n",
- " dim : int\n",
- " dimension of the targeted space\n",
- " max_iter : int\n",
- " Maximum number of iterations of the SMACOF algorithm for a single run\n",
- " eps : float\n",
- " relative tolerance w.r.t stress to declare converge\n",
- "\n",
- " Returns\n",
- " -------\n",
- " npos : ndarray, shape (R, dim)\n",
- " Embedded coordinates of the interpolated point cloud (defined with\n",
- " one isometry)\n",
- " \"\"\"\n",
- "\n",
- " rng = np.random.RandomState(seed=3)\n",
- "\n",
- " mds = manifold.MDS(\n",
- " dim,\n",
- " max_iter=max_iter,\n",
- " eps=1e-9,\n",
- " dissimilarity='precomputed',\n",
- " n_init=1)\n",
- " pos = mds.fit(C).embedding_\n",
- "\n",
- " nmds = manifold.MDS(\n",
- " 2,\n",
- " max_iter=max_iter,\n",
- " eps=1e-9,\n",
- " dissimilarity=\"precomputed\",\n",
- " random_state=rng,\n",
- " n_init=1)\n",
- " npos = nmds.fit_transform(C, init=pos)\n",
- "\n",
- " return npos"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Data preparation\n",
- "----------------\n",
- "\n",
- "The four distributions are constructed from 4 simple images\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "def im2mat(I):\n",
- " \"\"\"Converts and image to matrix (one pixel per line)\"\"\"\n",
- " return I.reshape((I.shape[0] * I.shape[1], I.shape[2]))\n",
- "\n",
- "\n",
- "square = pl.imread('../data/square.png').astype(np.float64)[:, :, 2] / 256\n",
- "cross = pl.imread('../data/cross.png').astype(np.float64)[:, :, 2] / 256\n",
- "triangle = pl.imread('../data/triangle.png').astype(np.float64)[:, :, 2] / 256\n",
- "star = pl.imread('../data/star.png').astype(np.float64)[:, :, 2] / 256\n",
- "\n",
- "shapes = [square, cross, triangle, star]\n",
- "\n",
- "S = 4\n",
- "xs = [[] for i in range(S)]\n",
- "\n",
- "\n",
- "for nb in range(4):\n",
- " for i in range(8):\n",
- " for j in range(8):\n",
- " if shapes[nb][i, j] < 0.95:\n",
- " xs[nb].append([j, 8 - i])\n",
- "\n",
- "xs = np.array([np.array(xs[0]), np.array(xs[1]),\n",
- " np.array(xs[2]), np.array(xs[3])])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Barycenter computation\n",
- "----------------------\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "ns = [len(xs[s]) for s in range(S)]\n",
- "n_samples = 30\n",
- "\n",
- "\"\"\"Compute all distances matrices for the four shapes\"\"\"\n",
- "Cs = [sp.spatial.distance.cdist(xs[s], xs[s]) for s in range(S)]\n",
- "Cs = [cs / cs.max() for cs in Cs]\n",
- "\n",
- "ps = [ot.unif(ns[s]) for s in range(S)]\n",
- "p = ot.unif(n_samples)\n",
- "\n",
- "\n",
- "lambdast = [[float(i) / 3, float(3 - i) / 3] for i in [1, 2]]\n",
- "\n",
- "Ct01 = [0 for i in range(2)]\n",
- "for i in range(2):\n",
- " Ct01[i] = ot.gromov.gromov_barycenters(n_samples, [Cs[0], Cs[1]],\n",
- " [ps[0], ps[1]\n",
- " ], p, lambdast[i], 'square_loss', # 5e-4,\n",
- " max_iter=100, tol=1e-3)\n",
- "\n",
- "Ct02 = [0 for i in range(2)]\n",
- "for i in range(2):\n",
- " Ct02[i] = ot.gromov.gromov_barycenters(n_samples, [Cs[0], Cs[2]],\n",
- " [ps[0], ps[2]\n",
- " ], p, lambdast[i], 'square_loss', # 5e-4,\n",
- " max_iter=100, tol=1e-3)\n",
- "\n",
- "Ct13 = [0 for i in range(2)]\n",
- "for i in range(2):\n",
- " Ct13[i] = ot.gromov.gromov_barycenters(n_samples, [Cs[1], Cs[3]],\n",
- " [ps[1], ps[3]\n",
- " ], p, lambdast[i], 'square_loss', # 5e-4,\n",
- " max_iter=100, tol=1e-3)\n",
- "\n",
- "Ct23 = [0 for i in range(2)]\n",
- "for i in range(2):\n",
- " Ct23[i] = ot.gromov.gromov_barycenters(n_samples, [Cs[2], Cs[3]],\n",
- " [ps[2], ps[3]\n",
- " ], p, lambdast[i], 'square_loss', # 5e-4,\n",
- " max_iter=100, tol=1e-3)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Visualization\n",
- "-------------\n",
- "\n",
- "The PCA helps in getting consistency between the rotations\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "<matplotlib.collections.PathCollection at 0x7f05a732dcc0>"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 720x720 with 12 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "clf = PCA(n_components=2)\n",
- "npos = [0, 0, 0, 0]\n",
- "npos = [smacof_mds(Cs[s], 2) for s in range(S)]\n",
- "\n",
- "npost01 = [0, 0]\n",
- "npost01 = [smacof_mds(Ct01[s], 2) for s in range(2)]\n",
- "npost01 = [clf.fit_transform(npost01[s]) for s in range(2)]\n",
- "\n",
- "npost02 = [0, 0]\n",
- "npost02 = [smacof_mds(Ct02[s], 2) for s in range(2)]\n",
- "npost02 = [clf.fit_transform(npost02[s]) for s in range(2)]\n",
- "\n",
- "npost13 = [0, 0]\n",
- "npost13 = [smacof_mds(Ct13[s], 2) for s in range(2)]\n",
- "npost13 = [clf.fit_transform(npost13[s]) for s in range(2)]\n",
- "\n",
- "npost23 = [0, 0]\n",
- "npost23 = [smacof_mds(Ct23[s], 2) for s in range(2)]\n",
- "npost23 = [clf.fit_transform(npost23[s]) for s in range(2)]\n",
- "\n",
- "\n",
- "fig = pl.figure(figsize=(10, 10))\n",
- "\n",
- "ax1 = pl.subplot2grid((4, 4), (0, 0))\n",
- "pl.xlim((-1, 1))\n",
- "pl.ylim((-1, 1))\n",
- "ax1.scatter(npos[0][:, 0], npos[0][:, 1], color='r')\n",
- "\n",
- "ax2 = pl.subplot2grid((4, 4), (0, 1))\n",
- "pl.xlim((-1, 1))\n",
- "pl.ylim((-1, 1))\n",
- "ax2.scatter(npost01[1][:, 0], npost01[1][:, 1], color='b')\n",
- "\n",
- "ax3 = pl.subplot2grid((4, 4), (0, 2))\n",
- "pl.xlim((-1, 1))\n",
- "pl.ylim((-1, 1))\n",
- "ax3.scatter(npost01[0][:, 0], npost01[0][:, 1], color='b')\n",
- "\n",
- "ax4 = pl.subplot2grid((4, 4), (0, 3))\n",
- "pl.xlim((-1, 1))\n",
- "pl.ylim((-1, 1))\n",
- "ax4.scatter(npos[1][:, 0], npos[1][:, 1], color='r')\n",
- "\n",
- "ax5 = pl.subplot2grid((4, 4), (1, 0))\n",
- "pl.xlim((-1, 1))\n",
- "pl.ylim((-1, 1))\n",
- "ax5.scatter(npost02[1][:, 0], npost02[1][:, 1], color='b')\n",
- "\n",
- "ax6 = pl.subplot2grid((4, 4), (1, 3))\n",
- "pl.xlim((-1, 1))\n",
- "pl.ylim((-1, 1))\n",
- "ax6.scatter(npost13[1][:, 0], npost13[1][:, 1], color='b')\n",
- "\n",
- "ax7 = pl.subplot2grid((4, 4), (2, 0))\n",
- "pl.xlim((-1, 1))\n",
- "pl.ylim((-1, 1))\n",
- "ax7.scatter(npost02[0][:, 0], npost02[0][:, 1], color='b')\n",
- "\n",
- "ax8 = pl.subplot2grid((4, 4), (2, 3))\n",
- "pl.xlim((-1, 1))\n",
- "pl.ylim((-1, 1))\n",
- "ax8.scatter(npost13[0][:, 0], npost13[0][:, 1], color='b')\n",
- "\n",
- "ax9 = pl.subplot2grid((4, 4), (3, 0))\n",
- "pl.xlim((-1, 1))\n",
- "pl.ylim((-1, 1))\n",
- "ax9.scatter(npos[2][:, 0], npos[2][:, 1], color='r')\n",
- "\n",
- "ax10 = pl.subplot2grid((4, 4), (3, 1))\n",
- "pl.xlim((-1, 1))\n",
- "pl.ylim((-1, 1))\n",
- "ax10.scatter(npost23[1][:, 0], npost23[1][:, 1], color='b')\n",
- "\n",
- "ax11 = pl.subplot2grid((4, 4), (3, 2))\n",
- "pl.xlim((-1, 1))\n",
- "pl.ylim((-1, 1))\n",
- "ax11.scatter(npost23[0][:, 0], npost23[0][:, 1], color='b')\n",
- "\n",
- "ax12 = pl.subplot2grid((4, 4), (3, 3))\n",
- "pl.xlim((-1, 1))\n",
- "pl.ylim((-1, 1))\n",
- "ax12.scatter(npos[3][:, 0], npos[3][:, 1], color='r')"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.6.9"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}