{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# 2D Optimal transport for different metrics\n", "\n", "\n", "2D OT on empirical distributio with different gound metric.\n", "\n", "Stole the figure idea from Fig. 1 and 2 in\n", "https://arxiv.org/pdf/1706.07650.pdf\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Author: Remi Flamary \n", "#\n", "# License: MIT License\n", "\n", "import numpy as np\n", "import matplotlib.pylab as pl\n", "import ot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dataset 1 : uniform sampling\n", "----------------------------\n", "\n" ] }, { "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" }, { "data": { "image/png": "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\nfeLcgsUAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n = 20 # nb samples\n", "xs = np.zeros((n, 2))\n", "xs[:, 0] = np.arange(n) + 1\n", "xs[:, 1] = (np.arange(n) + 1) * -0.001 # to make it strictly convex...\n", "\n", "xt = np.zeros((n, 2))\n", "xt[:, 1] = np.arange(n) + 1\n", "\n", "a, b = ot.unif(n), ot.unif(n) # uniform distribution on samples\n", "\n", "# loss matrix\n", "M1 = ot.dist(xs, xt, metric='euclidean')\n", "M1 /= M1.max()\n", "\n", "# loss matrix\n", "M2 = ot.dist(xs, xt, metric='sqeuclidean')\n", "M2 /= M2.max()\n", "\n", "# loss matrix\n", "Mp = np.sqrt(ot.dist(xs, xt, metric='euclidean'))\n", "Mp /= Mp.max()\n", "\n", "# Data\n", "pl.figure(1, figsize=(7, 3))\n", "pl.clf()\n", "pl.plot(xs[:, 0], xs[:, 1], '+b', label='Source samples')\n", "pl.plot(xt[:, 0], xt[:, 1], 'xr', label='Target samples')\n", "pl.axis('equal')\n", "pl.title('Source and traget distributions')\n", "\n", "\n", "# Cost matrices\n", "pl.figure(2, figsize=(7, 3))\n", "\n", "pl.subplot(1, 3, 1)\n", "pl.imshow(M1, interpolation='nearest')\n", "pl.title('Euclidean cost')\n", "\n", "pl.subplot(1, 3, 2)\n", "pl.imshow(M2, interpolation='nearest')\n", "pl.title('Squared Euclidean cost')\n", "\n", "pl.subplot(1, 3, 3)\n", "pl.imshow(Mp, interpolation='nearest')\n", "pl.title('Sqrt Euclidean cost')\n", "pl.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dataset 1 : Plot OT Matrices\n", "----------------------------\n", "\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%% EMD\n", "G1 = ot.emd(a, b, M1)\n", "G2 = ot.emd(a, b, M2)\n", "Gp = ot.emd(a, b, Mp)\n", "\n", "# OT matrices\n", "pl.figure(3, figsize=(7, 3))\n", "\n", "pl.subplot(1, 3, 1)\n", "ot.plot.plot2D_samples_mat(xs, xt, G1, c=[.5, .5, 1])\n", "pl.plot(xs[:, 0], xs[:, 1], '+b', label='Source samples')\n", "pl.plot(xt[:, 0], xt[:, 1], 'xr', label='Target samples')\n", "pl.axis('equal')\n", "# pl.legend(loc=0)\n", "pl.title('OT Euclidean')\n", "\n", "pl.subplot(1, 3, 2)\n", "ot.plot.plot2D_samples_mat(xs, xt, G2, c=[.5, .5, 1])\n", "pl.plot(xs[:, 0], xs[:, 1], '+b', label='Source samples')\n", "pl.plot(xt[:, 0], xt[:, 1], 'xr', label='Target samples')\n", "pl.axis('equal')\n", "# pl.legend(loc=0)\n", "pl.title('OT squared Euclidean')\n", "\n", "pl.subplot(1, 3, 3)\n", "ot.plot.plot2D_samples_mat(xs, xt, Gp, c=[.5, .5, 1])\n", "pl.plot(xs[:, 0], xs[:, 1], '+b', label='Source samples')\n", "pl.plot(xt[:, 0], xt[:, 1], 'xr', label='Target samples')\n", "pl.axis('equal')\n", "# pl.legend(loc=0)\n", "pl.title('OT sqrt Euclidean')\n", "pl.tight_layout()\n", "\n", "pl.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dataset 2 : Partial circle\n", "--------------------------\n", "\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfAAAACrCAYAAACZks5mAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnXuUZFdd7z/fqu7pnunpmZ4Z4pjMBIImCAkqIE8BjREu\nEMCwFJWHGBSNuPQCC5DXXVyjIoJXCXhRNBJMeEhAUYlBr0Iel4vySCIRJUEeISEJk4TJTCedeXZX\n/e4fe5+qXTXV1VXd9dpVv89avfrUPufss88537P32b/zPfvIzHAcx3EcJy9Kwy6A4ziO4zjd4w24\n4ziO42SIN+CO4ziOkyHegDuO4zhOhngD7jiO4zgZ4g244ziO42SIN+AJks6WdEfy+8uSzu5kWcfp\nJ5JM0ukD3N5pcZtT8fc/Sjq/k2UdpxskXSjpg3H6wZIekFRea1kn4wZc0q2SjsSTXfy9u5fbMLOz\nzOzaXuY5akh6qaTPDLscg0DSUyT9q6T7JB2Q9C+SHjfscm0USddKOtp0Lfx9L7dhZs8ys8t6meeo\nkdtNea/1HHX0S23mFzdqDzT9/ex6t9mMmX3LzLaaWaVXeY4iki6V9JaN5pP7HfNzzexTwy6EM/pI\n2gZcCfwq8FFgE/BU4NgQylLuQwX162b23h7n6YwovdSzJAHqYpUFM1vpdjtO78m2B96O5jBLi3Dg\nTkl/Ienbkg5K+rtV8rlV0tPi9OZ413RQ0k3A45qWPUXSxyR9R9I3Jb0imfd4SZ+VtChpn6R3S9qU\nzDdJL5f0tbjMH8eLqlWZypLeJOkbkpYk3SDp1DjvhyVdF+/Ir5P0w8l6L5V0S1znm5JeLOkRwJ8C\nT4p30ovrONy58DAAM/uwmVXM7IiZ/bOZfQlqx/UPJO2Px+nXmjRT00L83ayxv5J0Vzz2n5Z0VjLv\nUknvkfQPkg4BPyZpJm7vW5LulvSnkjYn6/xG1Mq3Jf3iene6VYRFSTg+6voPJd0Wy/6ZtBzJOrXe\nWfOxAp7dtOx2SZfE8t8p6S2KIVFJ3yvpakn3xvU/JGkhWfdWSa+V9KVYno9Imm2zf78s6eao65sk\nPSamPyKWeVHhUdhPJOucG5ddiuV7raQ54B+BU1TvWZ6yjkM+KDaq52sl/a6kfwEOAx8g3AC8W+uM\nZqqpB9+sPUlnSfqkQrTgbklvapFHc139UEn/N56rTwIPalr+iQpRiEVJ/67kkaekX0i0cYukX0nm\nnS3pDkmvkXRP1OovtNm3VduMqMGvx/26otCNAhfF/O+X9B+SHinpAuDFwOu00WiZmWX5B9wKPG2V\neRcCH0x+nwYYMBV/fwL4CLADmAZ+NKafDdzRahvA24D/B+wETgX+s1iWcCN0A/A/CXfC3wPcAjwj\nzv8h4ImEiMdpwM3Aq5LtGOFuegF4MPAd4Jmr7NtvAP8BfB/hrvkHgV2xXAeBl8TtvDD+3gXMAfcD\n3xfzOBk4K06/FPjMsM/nAPSyDbgXuAx4FrCjaf7Lga/Ec7sTuKZJMw16a6GxXwTmgRngncCNybxL\ngfuAJ0etzAIXAVfEbc0Dfw/8Xlz+mcDdwCPjufvLWJbTV9m3a4FfWmXeCec3zQv447j+HqAM/HDc\nh9Oa9r+2jQ6O1d8CfxbL/l3AF4BfifNOB54et3ES8GngnU3X3BeAU2LeNwMvX2Xffhq4k3AzrZj3\nQwjX9NeBNxGux3OApUT/+4CnxukdwGNaXf+j/MfG9Xwt8C3gLEJ9Md1OR3GdBk2spcNUewSN7wNe\nQ9D/PPCE5muphe4+C7wj6uVH4nkslt0Tj8G5hOvq6fH3SXH+s4Hvjdr4UcKNSnquV4Dfjvt+bpy/\nY5V9W63NOAfYDzwmlvF/A5+O855BaBcWYhkeAZyc1Alv2bAOhi3EDQj4VuABYDH5++VmQTSLgtB4\nVVudKNo34LeQNKrABdQb8CcA32rK643AX6xS9lcBf5v8NuApye+PAm9YZd3/As5rkf4S4AtNaZ8l\nXERz8fj8FLC5aZmXMgENeNzXR8QL54548V4B7I7zriZpKID/RhcNeNN2FuK62+PvS4H3J/MFHAK+\nN0l7EvDNOP0+4G3JvIexdgN+uOla+J3Vzm+RF6HSOwL8YIs8a9dMso2iAV/1WAG7CWHczcn8FwLX\nrFL25wFfTH7fCvxc8vv3gT9dZd1/Al7ZIv2pwF1AKUn7MHBhnP4W8CvAtqb1ziaTBrwHer4W+O0W\nOuqkAV9s+ntEq/VpbMBfmJ7npnwvpEUDTujMrABzybJ/mSz7euADLTRx/irb+btCL/FcHyG5GQHu\nAZ7YYr12bcYlwO8nv7cCy3E/zgG+Sui8lZrWu5QeNOC5h9CfZ2YLyd+fd7DOqcABMzvY5bZOAW5P\nft+WTD+EEHpbLP4Id/+7ASQ9TNKVCiHW+4G30hQKIlQ4BYcJQlit/N9YpXy3NaXdBuwxs0PAzxLu\nyvdJ+oSkh6+2o+OKmd1sZi81s72E3u0phN4ytD+/bYnhyrcpPNa4n9AIQeM5TvM+CdgC3JDo5f/E\n9PWW5RVN18KbO1jnQYTeUCs9tWOta2GaoLNi3/6M0BNH0m5Jl8fQ9f3AB+nPtXC7mVWbyrgnTv8U\nocd1WwzPPmmV/EeaHuj59hZpnfCgJq3d3ME6q52rdpwCHIz1V0Gz1n66qd59CqHBRdKzJH0uhrYX\nCec81dq91vgsfzWttWszGupdM3uAEAXYY2ZXA+8mRLnukXSxgnehZ+TegK/GIUIFWfDdyfTtwE4l\nz906ZB/hRBY8uCnPbzaJet7Mzo3z30MIZ51hZtsIjXs3ppGU2wlhoWa+TRB0yoMJIUbM7J/M7OkE\ncX8FKG52bJ3lyBoz+wrhLviRMand+YX2mnoRcB7wNGA74e4bGs9xepz3E+7+z0r0st3MispjrbJ0\nQ0O5JaXl3g8cpbWe2rHWtXCMxkp+m5kVnoC3Eo7F98dr4efoz7VwqqS0fkuvhevM7DzCTcXfESJe\nkPG1sA49w4n7u9H9X6ve/Z4u89sH7Ij+hIJmrX2gqd6dM7O3SZoBPgb8ASEqsQD8A+vTWrs2o6He\njWXdRV1rf2RmPwScSYik/UZctCdaG9cG/EbgRxTeKdxOCGcDYGb7CGaVP5G0Q9K0pB/pIM+PAm+M\n6+wF/nsy7wvAkqTXK5iCytGsUBjd5gnPoB+IPd9f3cC+vRf4HUlnRJPED0jaRRDnwyS9SNKUwqsd\nZwJXxl7PeVFcxwiPHoreyd3AXiWmunFE0sOjYWVv/H0qIaz3ubjIR4FXSNoraQfwhqYsbgReEPXy\nWOD5ybx5wnG9l1CBvbVdWWLP8M+BiyQVPdM9kp6RlOWlks6UtAX4zfXtNQD/Dpwl6VEKZrALm8rx\nPuAdCibMsqQnxcqvHaseq3h9/TPwh5K2SSopGNd+NC4yT9DffZL2UK/Q1sN7gddK+qF4LZwu6SHA\n5wm9qdfF83U28FzgckmbFAyc281smXBdptfCrlhnjDQ90HMr7qb7RjblRuAnJW1RMEm+LJl3JXCy\npFcpGDjnJT2hXWZmdhtwPfBb8bw9hXAeCz4IPFfSM6J2ZxXMaXsJ3ocZgp9oRdKzCI8RumaNNuPD\nwC/E62uGcO1/3sxulfQ4SU+QNE24uTlKo9Y2cqyB/Bvwv1fj+4h/C2BmnyQYDr5EMBFc2bTeSwjP\nKb5CeO7xqg629VuEUMk3CRXUB4oZFl4Jeg7wqDh/P6FyKSqC1xJ6aUuEivsjXe9pnXcQLs5/JlQ+\nlxCeN94by/AaQkPyOuA5ZrafcJ5fTbhbPEAwdBQ3EVcDXwbukrR/A+UadZYIXoXPKzjBP0cwIr4m\nzv9zwvOzfwf+DfibpvXfTOjtHSRo4S+Tee8naONO4CbqlWg7Xk8wWn0uhpI/RTAmYmb/SAiFXh2X\nubqD/N7ddC3cEPP6KsGo8ynga0DzO/+vJZgiryNo4+2sXS+sdax+nlCB3kQ4Xn9NDGsSjt1jCKa+\nT7RYt2PM7K+A3yWciyVCb3qnmR0nVPTPIlyLfwL8fOylQrj+b43H/eUER3DRi/0wcEsMyY6yC32j\nem7Fu4DnK7is/6jNcotNWnt1TL8IOE5onC4DPlSsYGZLBJPZcwmPSL4G/FgHZXpR3M8DhBvZ9yd5\n3k6IfL2J0FDfTrghLMXtvYJQVx6M+VzRwfZWo2WbYeE15jcTevv7CHXEC+I62wjn4SChfrgX+F9x\n3iXAmVFnLd+C6gTFB+qO4yRIOo1wMzZt/s6rkzmu5/Ek9x644ziO40wk3oA7juM4ToZsqAGX9ExJ\n/6UwCk0nJgnHGRgb0aeZ3Wpm8nCj0w8GXXe6nseTdT8DVxga8asEY8IdBBPMC83spt4Vz3HWh+vT\nGVVcm06v2EgP/PHA183sluj6vJzgCHScUcD16Ywqrk2nJ2zka2R7aBzJ5w6C3X9VNpVmbXN5Hsr1\nT73aVJi2cv39+mK6mnwR1krFvCTDUuM8AMohoqBSPbJQKoVX78pJ2pRC2lSpcmKakjROTCvH5crJ\nu/ilOF1OvkGi2n81/E7TWmFJvtYirXiRsJpETyoxv0pyT1aJB2YlOUArlGNa/UCuVFssF9Mq1Xpa\ntRrLXE3KHqeVjHlVHKqjd92x38xOYjh0pc9NmrFZ5hpOUu0clRKBlVqlhekGDcflGnUd/ieHtJbW\nSsO1/0ApaneqXD/Q01G704k2N9XS6pHSaULaVHKSyk16LZHqdnVtVht0GKZTHa7EdVN9Lcfp5STt\nuIWqZzm5yJdbaa4SpytJ+eJuJLvdOq1SzLMkLUwvHfp2NtoEmN40Z7NbdlCZTvQUa29rUU+m2inq\nwqIeBCgrnv8krdBHOdVJqzSKNDshrZQsV9SJqbSLNCX1ZDFfnFh30mJepxR1ZqsYc7VVHWuptmMb\n1LBOrGOTi7Wob6st0tL6tFgnXbeYX0nq00L7R7+xryN99v1zogpfXrkAYLa0lSct/CTsrA9oU9kR\nBtk5vqM+dsTxbUGRx7bVd3Z5PuzkcjImz8p8OOArc/XDbHOxAttyvJa2dUv4wt72zUdrabtmw+h8\nu2bqo/SdtOkBAB40vVRL21kOabumHqilLZQOx//1L/dtibXFfKl+MmbjN+mn4/8p6ldaWasHPyrJ\nCJArsfI9mjy6OhbnH0oqpqV4NS9W6x9uWqyEQZEOVOqjA35nZR6A/cvztbT9x8L8e4/VD+6Bo2Hd\nxSP1/A4fDueocmi6llY6FPftUH2/px4I019566s7Ho50GDRoky08QT+OpuqXRDGt2bo2tTl8qMvm\n6h/ssrlwjCpb68stz4djdHy+fp6L6ePz9WO1vLVYPmkEt4VzXppfrqXNzQft7po7XEvbvSXodM9s\n/SNye2bC9CnT9VEfv3vqPgBOKte1vr1U6DWcvy3JOD6FXltxzOplOlwN00uJXg9Uwn7fk2jurpUw\nHMK+5R21tDuPhTrg20fqY6bcdSiMMnnwUP3YHlmK+luqn5eppXAcp5fqx3FTvGSnl+rHcWYplGv6\ngeSGfCmU+ap/ffNIaxMa9TmzeYFHP/UVPHBK/Tgc3RX2//i2RDvzYZ+LehBg01yoC+c21+urbbNh\nemHmSC1tx0zQ1vbpJG0qpk3VdbdQDtPzpXp9Ol8K62xL0raUwrGeTe6qtsRGf1PSgM/EunA6qR8L\nDRY3lu3qy9Uo6tGiDg1pYfvHkvp0OTbhR5MG/KiF7R6u1o/3IQvaXqrW9Xl/rG+XKvW0+4p6d6Ve\nny4ux/p0ub7c4vEwvXi0nrZ0NNQh/3ne73Skz4004HfSOFTf3pjWgJldDFwMsE07rXLvAdLqoZhu\nHAas1UBQ9fu0OmqaF0a+B1hOcqw3vT2i1VErGvNq0gVIevdAy4E1WwmzIS0uN9twAxr3Mrl7plqk\nHaXfHE6miz1cYfVKf0isqc9mbQLYSguPT4tD2qo/0PoITLdIS8+5mv7Xc0pLkg4G3RuKHOMZLNVv\neLfEa6dVQz6jZH+K3ajWG3XKxXRvr7oj1G8kV2oX4FrHcWRfsllX3Tnzievg2elXjIvjcOI+p9o5\nzpAHWWw4DUWNkfaLi/BJkhRn1zRoaVSgs/NaWy7dVLyZmEkr8aIxb7io40ql5EgWRRghWW2kKNcB\nZyh8r3UTYfSZjYx04zi9xPXpjCquTacnrLsHbmYrkn6dMFxfGXifmX25ZyVznA3g+nRGFdem0ys2\n9AzczP6B8BGNjtBUmfLCTir3HqillZv+QxpObxdKh3ZhszSEVITTBxpKh3o4vTmUDvUiJ+GdtuH0\nZLl6OD3ZyyKcXk3TBhdOT/dwVMLp3erzhPUHGk5v9WgoMRrG/30PpUMtnL6F9s/Fa+H0VLZFOL2c\nhNX7FE5fabgAO3vENip0q03bvoVjT30cM5+4rp5YC6enx2H1x4pDD6VDUqy0xigqt9QJ2zirQX9W\nmOi6DKWnm0qey9fC6ekr8mpegXo4PXW2DVlao6dsx3Ecx3HWpO8u9AbKZdi50NA7KXrjE2Fsa9cT\nh7EztmWFguu8Va97MoxtaW5ubBs1KtMKDvTExFbrjU+CsS2Z5ca2Onmq2XEcx3EmHG/AHcdxHCdD\nBhpCt6kylR1zLcPlE2Fsa/eOOIydsS0nhBoGcYHWoXM3to2LsS0vbKoYuCXZvxg6nwhjW7t3xGFi\njW3eA3ccx3GcDBlsD7wsju+Yabjna9XbHltjW7evmEHWxrasKJXCkKktDsvwe+JpTm5sa0fnxra8\nsHIxZGpa/rh/E2FsW/0VM5hcY5v3wB3HcRwnQ7wBdxzHcZwMGXwIfVuZNPRdBG3c2MZYG9tGnpJq\nXxqrMZLhdDe2dUp7Y1teWKn40lirem0SjG1dfvwEJsLYlqeaHcdxHGfCGWgPvFpu/MZ3IPSeJ8LY\n1oux08GNbf2gVMLmNre2OI1kTzzNyY1t7WhtbMuMsmFzFRoV1qpeG1djW3djp8NkGNu8B+44juM4\nGeINuOM4juNkyGBNbCVYnhet7xvc2ObGtiFSKmFzsw1J+YTT3djWKWk4PSdUMjbNHW8IadcVNgHG\ntm4/fpLMHmdjm/fAHcdxHCdD1uyBS3of8BzgHjN7ZEzbCXwEOA24FfgZMzu4Vl5WhuU5WPvzfm5s\nq+HGtrb0Sp9WFpWtMy17v/n0xNOc3Ng2CvRKn6VSlbnNxxrSil6xG9tgUo1tnax6KfDMprQ3AFeZ\n2RnAVfG34wyDS3F9OqPLpbg+nT6xZgNuZp8GDjQlnwdcFqcvA57X43I5Tke4Pp1RxvXp9JP1mth2\nm9m+OH0XsLujtUqwMt88IP+JYes6bmxzY9u66FqfVhLL843h6bzD6W5sG2G61mdZxrbZYy3nubEN\nJtXYtmETm5lZY6kakXSBpOslXV851PvqwnHa0U6fqTaXj7s2ncHTsT7vOzzgkjk5sN4e+N2STjaz\nfZJOBu5ZbUEzuxi4GGDmwafaytxq4/m6sa2GG9s2Skf6TLW5deepdny+RKtebd498TSn1Y1t/euJ\ngxvbTqBrfS48/LtsYebImhm7sW1MjG0dst4e+BXA+XH6fODj68zHcfqB69MZZVyfTk9YswGX9GHg\ns8D3SbpD0suAtwFPl/Q14Gnxt+MMHNenM8q4Pp1+smYI3cxeuMqsH+96ax0PyO/GthpubGtLr/Rp\nZQgh9JRxC6evbmzr3zviaY6TZ2zrlT6nVGXHTOfPwd3YBlkb2zrER2JzHMdxnAwZ6FjoKhnTW443\nmL/a3x26sa2GG9v6SrUEx1cdp3/ceuJpTsN4xQzc2NYdZVXZPr22ia0VbmzL0NjWId4DdxzHcZwM\n8QbccRzHcTJkoCH0UqnK1i3HGoJcyx2Hd9zYVsONbT3HyrC8FdZ+bDNu4fRhfPwkzXHyjG3roawq\nO6Y2NpiLG9sgH2NbZ3gP3HEcx3EyZKA98HLJ2L65sStR3CNPgrFtoD1xGL6xLSOsBMtdjdM/rj3x\ndNqNbaNCWVW2b7AHnuLGthE3tnWI98Adx3EcJ0O8AXccx3GcDBloCH1KVXbNtg7CTYKxrW/viMNo\nGttyomysbKvQePY7fWwzDuH07j5+Am5sGyRlqiyUe/9FMje2wUga2zrEe+CO4ziOkyGD7YGXKuya\nWfu+fVyNbUN/xQwGa2zLibJRml9uKnlx9t3YNn7Gtrwoy5jv8+uZbmwbHWNbp3gP3HEcx3EyxBtw\nx3Ecx8mQgZvYTtrUedB4/IxtA/z4CYyAsS0fSiVjbv5oQ/C2rrVJMLZ1+/GTei5ZGtsyo0yV+dL6\nPmbSLW5sg6Eb2zrEe+CO4ziOkyFr9sAlnQq8H9hNuD+42MzeJWkn8BHgNOBW4GfM7GDbjanCg6aX\n1lXQ8TC2jeDY6dA3Y9sg6JU+p8pVds01vqZT9P3c2AZjZ2wbAL2sO0uqsm0I3xhwY9uQjG0d0snS\nK8BrzOxM4InAr0k6E3gDcJWZnQFcFX87zqBxfTqjimvT6StrNuBmts/M/i1OLwE3A3uA84DL4mKX\nAc/rVyEdZzVcn86o4tp0+k1XJjZJpwGPBj4P7DazfXHWXYQw0Robq7KzvLEAcd7Gtu4+fgKZG9sG\nzEb0OV2qsHtL68c7k2Bs6z6UnuaSobFtwGy07ixhbCkNz4DnxjYYpLFtXcVrh6StwMeAV5nZ/ek8\nMzNWefIp6QJJ10u6fulgng5QZ/RZjz5TbR47mN83zJ086EXduXggw+GJnb7TUQ9c0jRBgB8ys7+J\nyXdLOtnM9kk6Gbin1bpmdjFwMcAZ37/Zdk31rk+Zn7Gtu7HTIW9j26BYrz5Tbe4+c6ftmV1cc1tu\nbEvJ19g2KHpVdz7yBzbZrCoj8d7QMIxtQ++Jw9CMbR0VaTUkCbgEuNnM3pHMugI4P06fD3x8w6Vx\nnC5xfTqjimvT6Ted9MCfDLwE+A9JN8a0NwFvAz4q6WXAbcDP9KeIjtMW16czqrg2nb6yZgNuZp9h\nlWge8OPdbKysKgulwz0f/82NbRtkAMa2ftErfW4qVdgzs3YIvWDcjG29CaWnOeVjbOsXvaw7Sxhb\nZDTu37qL1hMGaWwbzXfEYdjGthF4ouI4juM4TrcMdCz0MsZCapTqQwlG29jW7djp9fk5GttyYlor\nnDLddjCsVXFjW0oexrbckMQmicaLq9i/YZSokf4b20bwFTMYurFtBE694ziO4zjd4g244ziO42TI\nQEPowYhRaQzL9qkko2hs6/7jJ63LlI2xLSOmqfDdU/dtKI+sjW19C6WnOY2OsS03SsCMSjSEZWvx\n2EkwtuXy8RPohbFtXZt1HMdxHCcPBmtik5gvqakHN7je+LCNbd2/Yta+TCNvbMuIKVU5qdy7PqAb\n21JG0NiWGUJMU246EUVvbRKMbZmMnQ69MbZ1uynHcRzHcfJhoD1wAbMqN/bWaj248X8u3v3Y6Z2X\naeSfi484ZYztpQq97v/l8lx8sD3xNKdhPRfPCxF7Z9aUCEzEc/Eux05v3u5Q2MBz8XVtwnEcx3Gc\nPPAG3HEcx3EyZMAhdJ34kL4It06Asa03Y6e3L9NIGdsyIhgsyzQaT/oTTndjGwzf2JYfpeb6swi3\nToCxrdux09NtDD2UDt0b27rN1nEcx3GcfBi4iW3qhFchIhNgbOt+7PTG/Lot09CNbRlRQmzRpqaB\nPgpNjr+xbfg98TSnQRvbRh+hME52MtBHfSzthgUjY2Zs63rs9Hp+WRrb1pOd4ziO4zh54A244ziO\n42TImgFpSbPApwmx3Cngr83sNyU9FLgc2AXcALzEzNoONFwPAzUknsiYGtu6HTs9XTdLY9sA6JU+\nC4Nlw+cma+F0N7a5sa17ell3FjR8bjKG0yfD2Nbt2Onpujka27rMog3HgHPM7AeBRwHPlPRE4O3A\nRWZ2OnAQeFlXW3ac3uD6dEYV16bTV9bsN5mZUe+wTcc/A84BXhTTLwMuBN7TyUYb7yLj/wkwtnU7\ndno6nb2xrU/0Wp9pb6bWG58EY9tI9sTTnPIztvWj7kyp1aMTYWzrduz0ZLksjW3rWHU1JJUl3Qjc\nA3wS+AawaGbFcbgD2LPKuhdIul7S9d+5N7/3g53RZ736dG06/cbrTqefdNSAm1nFzB4F7AUeDzy8\n0w2Y2cVm9lgze+xJu7r70orjdMJ69enadPqN151OP+kq2Glmi5KuAZ4ELEiaineSe4E711OAehgo\nSRxbY1t3Hz9J07I0tg2YXuuzCEe6sW0Uwul5G9v6UXcWTIaxrcuPnyRpeRrberS4pJMkLcTpzcDT\ngZuBa4Dnx8XOBz7e3aYdZ+O4Pp1RxbXp9JtO+qsnA5dJKhMa/I+a2ZWSbgIul/QW4IvAJWtlZBgV\nqzbeMUbc2Dbmxrb+0RN9VjGO2TIzOrEXOAnGtnx64mlOI29s61nd2Snjamzrdux0yNzY1iGduNC/\nBDy6RfothGc6jjM0XJ/OqOLadPrNCDztcBzHcRynWwY6fpYBK1QaQjltw+ljZ2zr7uMn6bQb2/pL\nFeNwdbnhULULp7uxbRTC6Xkb27qh3ePHVoybsa3rj5/A+Bjb2uA9cMdxHMfJkAH3wI2jtsKsGhKB\nNXriyXJ5G9u6Gzsd3Ng2KKpmLFkVqsv1xHg4JsHYlndPPM1p5I1t66LT6GUr3Ng2vsY274E7juM4\nToZ4A+44juM4GTLQEHoVOGZV0sBELZw+Eca27t4RBze2DYoVxIHKNJSTEHoRTndjW0bh9M6MbTlS\nMQMlemrz+LEVbmxj7Ixt3gN3HMdxnAwZbA/cjENVg1Jqkgj3NZNhbOt27HRwY9tgWLEy91S20rBH\nRW98Ioxt49YTT3M60diWG2GkwBVm0gqr6I27sW1ijW3eA3ccx3GcDPEG3HEcx3EyZKAh9Apiyaag\nmgQhauH08Te29eLjJ+DGtn6wbGXuWtnelBr3yo1tmYfTW+13XhiwjIHVj1stnO7GthqTZmzzHrjj\nOI7jZMiAe+AlFquzUEputYve+AQY27ofO715foEb23rNspXZt7xjlbmTYGybhJ74ajmNPmbGUbPG\n4sfeuBvbWjMJxjbvgTuO4zhOhngD7jiO4zgZ0nGwWFIZuB6408yeI+mhwOXALuAG4CVmdrxdHhUr\nsVjZ0pjqDcKnAAAHP0lEQVRYhNMnwNjW/cdP0un8jG2DohfaPG5T3HlsoYOtjauxrbuPn6Q5pOQV\nTh8MvdBnFXHUREPFVqsT3djWjnE2tnVzaF8J3Jz8fjtwkZmdDhwEXtbLgjlOF7g2nVHG9en0hY76\nl5L2As8Gfhd4tSQB5wAviotcBlwIvKddPitW4kBla+uZbmwbO2PbIOiVNperZb59pPk1snaMm7Ft\n0l4xGwy90mcVOFydglJ6bGLF5sa2jhk3Y1unh/OdwOuon51dwKJZLXZzB7Cn1YqSLpB0vaTrHzi4\n3GoRx9kIPdHmscUj/S+pM4n0RJ8HD1RbLeJMOGs24JKeA9xjZjesZwNmdrGZPdbMHrt1x/DuhJ3x\no5fanFnY3OPSOZNOL/W5Y6f7jZ0T6SQw/GTgJySdC8wC24B3AQuSpuKd5F7gzrUyWqHMd1bm196i\nG9vSQsX/+RnbBkDPtLlcLXHXoW3rLMY4GNu6/fgJeDh9TXqmzyrikE03Rqhr4XQ3tnXLuBjb1jyM\nZvZGM9trZqcBLwCuNrMXA9cAz4+LnQ98vKclc5w1cG06o4zr0+k3G+lLvh64XNJbgC8Cl6y1woqV\n2b/cQQ+8wI1tmRvbhkbX2qxUSxw8tNEwer7GtskbO32odK9PK7FU3dx4+Iuq0I1tGyJnY1tXTZCZ\nXQtcG6dvAR6/4RI4Tg9wbTqjjOvT6QfujHAcx3GcDBnox0xWqiX2H1vlPfC1cGNbWqj4f9SNbflQ\nrZQ4sjTbwxzzMrZ1//ET8HD64KhQ4v5qkz6Lw+/Gtp6Qo7HNe+CO4ziOkyGD7YFbiXuPzW0sEze2\nZWRsy4iKYGmKI/SyFw5ubDsxh5Rh9cRzo2olliqrmCzd2NZzcjG2ZVjTOo7jOI7jDbjjOI7jZMjA\nTWwHjm5Ze8FOcWNbWqj4f5SMbfmgKkwtlVhJTlrfwulubPNwepdUKHFf86eYW+HGtp4yLGNbp3gP\n3HEcx3EyZKA98Eq1xOKRXvdqcGMbORjbRhtVYHpJNN4NhxPnxrbxM7blxoqVOLDShQF43IxtI9DV\nHKSxrVNG4LA4juM4jtMt3oA7juM4ToYMNIRerYrDh/scXh1lY1ufQukwqsa2fFAVNi1B6/c03djW\nKqdxMbblQMVKLC6v0wA8Fsa20XtHHPppbOsM74E7juM4ToYMtAdOVVQOTXN4ENtyY9vQjW05EUxs\nxlrRCje21cna2JYZoQe+wc/dZm1sG71XzKCfxrbOGIFD4DiO4zhOt3gD7jiO4zgZMvAQeulQucFe\nM9Bw+rCNbQMMpcPwjW05oQrMLFXp9HGDG9ta55SlsS0DVqzE4vENhtBTsjO25fHxE+iVsa0zvAfu\nOI7jOBkiM1t7qV5tTPoO4YZ9/8A22j8eRP770e99eIiZndTH/HtG1OZt+HkdJfq5H9loE7zuHFGG\nrs+BNuAAkq43s8cOdKN9YBz2Yxz2odeMwzEZh32A8dmPXjEux8P3o3d4CN1xHMdxMsQbcMdxHMfJ\nkGE04BcPYZv9YBz2Yxz2odeMwzEZh32A8dmPXjEux8P3o0cM/Bm44ziO4zgbx0PojuM4jpMhA23A\nJT1T0n9J+rqkNwxy2+tF0qmSrpF0k6QvS3plTN8p6ZOSvhb/7xh2WddCUlnSFyVdGX8/VNLn4/n4\niKQcPyTWE3LUJrg+J4Uc9TlO2oTR1OfAGnBJZeCPgWcBZwIvlHTmoLa/AVaA15jZmcATgV+L5X4D\ncJWZnQFcFX+POq8Ebk5+vx24yMxOBw4CLxtKqYZMxtoE1+fYk7E+x0mbMIL6HGQP/PHA183sFjM7\nDlwOnDfA7a8LM9tnZv8Wp5cIJ3APoeyXxcUuA543nBJ2hqS9wLOB98bfAs4B/jouMvL70Eey1Ca4\nPieELPU5LtqE0dXnIBvwPcDtye87Ylo2SDoNeDTweWC3me2Ls+4Cdg+pWJ3yTuB11AcV3gUsmtUG\nOc7ufPSQ7LUJrs8xJnt9Zq5NGFF9uomtQyRtBT4GvMrM7k/nWbDyj6ydX9JzgHvM7IZhl8XpD65P\nZ1TJWZsw2voc5NfI7gROTX7vjWkjj6RpggA/ZGZ/E5PvlnSyme2TdDJwz/BKuCZPBn5C0rnALLAN\neBewIGkq3kVmcz76QLbaBNfnBJCtPsdAmzDC+hxkD/w64Izo3NsEvAC4YoDbXxfxWcclwM1m9o5k\n1hXA+XH6fODjgy5bp5jZG81sr5mdRjjuV5vZi4FrgOfHxUZ6H/pMltoE1+eEkKU+x0GbMOL6NLOB\n/QHnAl8FvgH8j0FuewNlfgohxPMl4Mb4dy7hGchVwNeATwE7h13WDvfnbODKOP09wBeArwN/BcwM\nu3xDPC7ZaTOW2/U5AX856nPctBn3aaT06SOxOY7jOE6GuInNcRzHcTLEG3DHcRzHyRBvwB3HcRwn\nQ7wBdxzHcZwM8QbccRzHcTLEG3DHcRzHyRBvwB3HcRwnQ7wBdxzHcZwM+f+FjXrd9xdqlgAAAABJ\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n = 50 # nb samples\n", "xtot = np.zeros((n + 1, 2))\n", "xtot[:, 0] = np.cos(\n", " (np.arange(n + 1) + 1.0) * 0.9 / (n + 2) * 2 * np.pi)\n", "xtot[:, 1] = np.sin(\n", " (np.arange(n + 1) + 1.0) * 0.9 / (n + 2) * 2 * np.pi)\n", "\n", "xs = xtot[:n, :]\n", "xt = xtot[1:, :]\n", "\n", "a, b = ot.unif(n), ot.unif(n) # uniform distribution on samples\n", "\n", "# loss matrix\n", "M1 = ot.dist(xs, xt, metric='euclidean')\n", "M1 /= M1.max()\n", "\n", "# loss matrix\n", "M2 = ot.dist(xs, xt, metric='sqeuclidean')\n", "M2 /= M2.max()\n", "\n", "# loss matrix\n", "Mp = np.sqrt(ot.dist(xs, xt, metric='euclidean'))\n", "Mp /= Mp.max()\n", "\n", "\n", "# Data\n", "pl.figure(4, figsize=(7, 3))\n", "pl.clf()\n", "pl.plot(xs[:, 0], xs[:, 1], '+b', label='Source samples')\n", "pl.plot(xt[:, 0], xt[:, 1], 'xr', label='Target samples')\n", "pl.axis('equal')\n", "pl.title('Source and traget distributions')\n", "\n", "\n", "# Cost matrices\n", "pl.figure(5, figsize=(7, 3))\n", "\n", "pl.subplot(1, 3, 1)\n", "pl.imshow(M1, interpolation='nearest')\n", "pl.title('Euclidean cost')\n", "\n", "pl.subplot(1, 3, 2)\n", "pl.imshow(M2, interpolation='nearest')\n", "pl.title('Squared Euclidean cost')\n", "\n", "pl.subplot(1, 3, 3)\n", "pl.imshow(Mp, interpolation='nearest')\n", "pl.title('Sqrt Euclidean cost')\n", "pl.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dataset 2 : Plot OT Matrices\n", "-----------------------------\n", "\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nIBW4iNwkIm+IyLM53hcR+f8islpE/iEiHw3iewnJB70kNkIvSVAEdQbeDOCEPO+fCOAwt9QDuD6g\n77WThQuBlhYAQEODO+38803xTmtpAU46afd5801fuDDcdS8vmkEv+6GXttAMetkPvRw8qhpIATAB\nwLM53vslgLM8r1cB2LfQMo866ihNJI6jmkqpOo4C7uvRo1VragZOS6VUm5p2nzfX9OpqM11V5871\nfFdjYyybWQwA2jQg14op9NJDHi+33GemvfM7R3eNS+mWeU26a1xKX7nZTO9ZTi+DLPTSA+Plbvj1\nMioh7wdwjOf1owAmFVqm9UI2NhohNIsgrljzMKdPrKzT0p/xMz2XvOn5LcbSQFlRXvZc1ahrmx3d\nNso4tW1USn9/kaO/Pc/RziozrbMqpc0zHG1oUG2eMXD6HfWOXned6rLZjnZVm+k9Y1Pacw29LLbQ\nS3ca42VWEluBw6SM2gC0jR8/PsRdVCTZ5GtqUq2q2k2QRdPN63mYowroPMxRQLNOmzKluOmLpmeR\nN98PwxKSHiiT6OWbdxsP/361o10jU/pfH/bv5aRJ2adPnJh9+uyjHd1eY7zcNY5eFiqV7CXjZWFs\nq8CTnxLKlubxtPJ8tRJLbFHmEj0tqc0tTUsDZdl52b3U0R1jUtp6dtOAs+el33X0kUdU1zabFHlQ\nXu7cO6VXfSa7l00nO9pLL+kl42XR2FaBfw7AQwAEwNEAnvSzTKuEVC1NkCCu6RT7A7AISwNlWXjZ\nvbT/7LezKqUXfSgeL3td/7pHp/Sur5s0/M0zHd3qptt76WVFecl4OXgircAB3AHgVQA7AawHcC6A\nCwBc4L4vAH4B4EUAz/i5nqNxCZkjvbLsuMbSUjT19aZkLFdPPDF7Oifb9CJSULPQaNYtc7kxpYni\nCJTl7uXOZY7eNTm7lzedE6+XvamU/uKM7F7edA69LBsvVbN6tWi6o7PQyHg5SCI/Aw+jxCJkrtRP\ntpRO1J0kiukEYlkHjrjOdMIoNnj59E/MmW3zDEcfuMSkzW31Mn1m3jUypUs/26Rbq1P6lx/Sy6BL\nbBW433S5ZV6WQ7yMXbp8JW4hs12PGXCAbblNwe8PqL4+t9Ahw0BZOrseGZgqXzbb0Vdvz3Kd2VIv\nex91tGdsSts81+d3jEnprq/RyyBKrCl0PxWipV4mOV7GLl2+EomQGa20uXNVp8LR5Zim3tTPsuMs\n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\n/wfPnU7C6ZZu4AAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%% EMD\n", "G1 = ot.emd(a, b, M1)\n", "G2 = ot.emd(a, b, M2)\n", "Gp = ot.emd(a, b, Mp)\n", "\n", "# OT matrices\n", "pl.figure(6, figsize=(7, 3))\n", "\n", "pl.subplot(1, 3, 1)\n", "ot.plot.plot2D_samples_mat(xs, xt, G1, c=[.5, .5, 1])\n", "pl.plot(xs[:, 0], xs[:, 1], '+b', label='Source samples')\n", "pl.plot(xt[:, 0], xt[:, 1], 'xr', label='Target samples')\n", "pl.axis('equal')\n", "# pl.legend(loc=0)\n", "pl.title('OT Euclidean')\n", "\n", "pl.subplot(1, 3, 2)\n", "ot.plot.plot2D_samples_mat(xs, xt, G2, c=[.5, .5, 1])\n", "pl.plot(xs[:, 0], xs[:, 1], '+b', label='Source samples')\n", "pl.plot(xt[:, 0], xt[:, 1], 'xr', label='Target samples')\n", "pl.axis('equal')\n", "# pl.legend(loc=0)\n", "pl.title('OT squared Euclidean')\n", "\n", "pl.subplot(1, 3, 3)\n", "ot.plot.plot2D_samples_mat(xs, xt, Gp, c=[.5, .5, 1])\n", "pl.plot(xs[:, 0], xs[:, 1], '+b', label='Source samples')\n", "pl.plot(xt[:, 0], xt[:, 1], 'xr', label='Target samples')\n", "pl.axis('equal')\n", "# pl.legend(loc=0)\n", "pl.title('OT sqrt Euclidean')\n", "pl.tight_layout()\n", "\n", "pl.show()" ] } ], "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 }