summaryrefslogtreecommitdiff
path: root/notebooks/plot_stochastic.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_stochastic.ipynb
parent5f679247f64fa1c8e277f34165850caea311a084 (diff)
remove notebooks and cleanup readme and doc
Diffstat (limited to 'notebooks/plot_stochastic.ipynb')
-rw-r--r--notebooks/plot_stochastic.ipynb573
1 files changed, 0 insertions, 573 deletions
diff --git a/notebooks/plot_stochastic.ipynb b/notebooks/plot_stochastic.ipynb
deleted file mode 100644
index aa0f1b3..0000000
--- a/notebooks/plot_stochastic.ipynb
+++ /dev/null
@@ -1,573 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "%matplotlib inline"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "# Stochastic examples\n",
- "\n",
- "\n",
- "This example is designed to show how to use the stochatic optimization\n",
- "algorithms for descrete and semicontinous measures from the POT library.\n",
- "\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "# Author: Kilian Fatras <kilian.fatras@gmail.com>\n",
- "#\n",
- "# License: MIT License\n",
- "\n",
- "import matplotlib.pylab as pl\n",
- "import numpy as np\n",
- "import ot\n",
- "import ot.plot"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "COMPUTE TRANSPORTATION MATRIX FOR SEMI-DUAL PROBLEM\n",
- "############################################################################\n",
- "############################################################################\n",
- " DISCRETE CASE:\n",
- "\n",
- " Sample two discrete measures for the discrete case\n",
- " ---------------------------------------------\n",
- "\n",
- " Define 2 discrete measures a and b, the points where are defined the source\n",
- " and the target measures and finally the cost matrix c.\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "n_source = 7\n",
- "n_target = 4\n",
- "reg = 1\n",
- "numItermax = 1000\n",
- "\n",
- "a = ot.utils.unif(n_source)\n",
- "b = ot.utils.unif(n_target)\n",
- "\n",
- "rng = np.random.RandomState(0)\n",
- "X_source = rng.randn(n_source, 2)\n",
- "Y_target = rng.randn(n_target, 2)\n",
- "M = ot.dist(X_source, Y_target)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Call the \"SAG\" method to find the transportation matrix in the discrete case\n",
- "---------------------------------------------\n",
- "\n",
- "Define the method \"SAG\", call ot.solve_semi_dual_entropic and plot the\n",
- "results.\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[[2.55553509e-02 9.96395660e-02 1.76579142e-02 4.31178196e-06]\n",
- " [1.21640234e-01 1.25357448e-02 1.30225078e-03 7.37891338e-03]\n",
- " [3.56123975e-03 7.61451746e-02 6.31505947e-02 1.33831456e-07]\n",
- " [2.61515202e-02 3.34246014e-02 8.28734709e-02 4.07550428e-04]\n",
- " [9.85500870e-03 7.52288517e-04 1.08262628e-02 1.21423583e-01]\n",
- " [2.16904253e-02 9.03825797e-04 1.87178503e-03 1.18391107e-01]\n",
- " [4.15462212e-02 2.65987989e-02 7.23177216e-02 2.39440107e-03]]\n"
- ]
- }
- ],
- "source": [
- "method = \"SAG\"\n",
- "sag_pi = ot.stochastic.solve_semi_dual_entropic(a, b, M, reg, method,\n",
- " numItermax)\n",
- "print(sag_pi)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "SEMICONTINOUS CASE:\n",
- "\n",
- "Sample one general measure a, one discrete measures b for the semicontinous\n",
- "case\n",
- "---------------------------------------------\n",
- "\n",
- "Define one general measure a, one discrete measures b, the points where\n",
- "are defined the source and the target measures and finally the cost matrix c.\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "n_source = 7\n",
- "n_target = 4\n",
- "reg = 1\n",
- "numItermax = 1000\n",
- "log = True\n",
- "\n",
- "a = ot.utils.unif(n_source)\n",
- "b = ot.utils.unif(n_target)\n",
- "\n",
- "rng = np.random.RandomState(0)\n",
- "X_source = rng.randn(n_source, 2)\n",
- "Y_target = rng.randn(n_target, 2)\n",
- "M = ot.dist(X_source, Y_target)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Call the \"ASGD\" method to find the transportation matrix in the semicontinous\n",
- "case\n",
- "---------------------------------------------\n",
- "\n",
- "Define the method \"ASGD\", call ot.solve_semi_dual_entropic and plot the\n",
- "results.\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[3.7937628 7.65961287 3.80848103 2.58141742 1.61215093 3.44897695\n",
- " 2.71747327] [-2.52391608 -2.29387992 -0.82558991 5.64338591]\n",
- "[[2.21553327e-02 1.03145567e-01 1.75528576e-02 3.38501746e-06]\n",
- " [1.20021720e-01 1.47691349e-02 1.47329335e-03 6.59299438e-03]\n",
- " [3.04838905e-03 7.78276435e-02 6.19810066e-02 1.03737333e-07]\n",
- " [2.31393025e-02 3.53135903e-02 8.40777056e-02 3.26544498e-04]\n",
- " [1.05758118e-02 9.63969840e-04 1.33213201e-02 1.17996041e-01]\n",
- " [2.34525044e-02 1.16688539e-03 2.32054035e-03 1.15917213e-01]\n",
- " [3.74708983e-02 2.86448739e-02 7.47858286e-02 1.95554208e-03]]\n"
- ]
- }
- ],
- "source": [
- "method = \"ASGD\"\n",
- "asgd_pi, log_asgd = ot.stochastic.solve_semi_dual_entropic(a, b, M, reg, method,\n",
- " numItermax, log=log)\n",
- "print(log_asgd['alpha'], log_asgd['beta'])\n",
- "print(asgd_pi)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Compare the results with the Sinkhorn algorithm\n",
- "---------------------------------------------\n",
- "\n",
- "Call the Sinkhorn algorithm from POT\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[[2.55553508e-02 9.96395661e-02 1.76579142e-02 4.31178193e-06]\n",
- " [1.21640234e-01 1.25357448e-02 1.30225079e-03 7.37891333e-03]\n",
- " [3.56123974e-03 7.61451746e-02 6.31505947e-02 1.33831455e-07]\n",
- " [2.61515201e-02 3.34246014e-02 8.28734709e-02 4.07550425e-04]\n",
- " [9.85500876e-03 7.52288523e-04 1.08262629e-02 1.21423583e-01]\n",
- " [2.16904255e-02 9.03825804e-04 1.87178504e-03 1.18391107e-01]\n",
- " [4.15462212e-02 2.65987989e-02 7.23177217e-02 2.39440105e-03]]\n"
- ]
- }
- ],
- "source": [
- "sinkhorn_pi = ot.sinkhorn(a, b, M, reg)\n",
- "print(sinkhorn_pi)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "PLOT TRANSPORTATION MATRIX\n",
- "#############################################################################\n",
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Plot SAG results\n",
- "----------------\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 360x360 with 3 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "pl.figure(4, figsize=(5, 5))\n",
- "ot.plot.plot1D_mat(a, b, sag_pi, 'semi-dual : OT matrix SAG')\n",
- "pl.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Plot ASGD results\n",
- "-----------------\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 360x360 with 3 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "pl.figure(4, figsize=(5, 5))\n",
- "ot.plot.plot1D_mat(a, b, asgd_pi, 'semi-dual : OT matrix ASGD')\n",
- "pl.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Plot Sinkhorn results\n",
- "---------------------\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 360x360 with 3 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "pl.figure(4, figsize=(5, 5))\n",
- "ot.plot.plot1D_mat(a, b, sinkhorn_pi, 'OT matrix Sinkhorn')\n",
- "pl.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "COMPUTE TRANSPORTATION MATRIX FOR DUAL PROBLEM\n",
- "############################################################################\n",
- "############################################################################\n",
- " SEMICONTINOUS CASE:\n",
- "\n",
- " Sample one general measure a, one discrete measures b for the semicontinous\n",
- " case\n",
- " ---------------------------------------------\n",
- "\n",
- " Define one general measure a, one discrete measures b, the points where\n",
- " are defined the source and the target measures and finally the cost matrix c.\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "n_source = 7\n",
- "n_target = 4\n",
- "reg = 1\n",
- "numItermax = 100000\n",
- "lr = 0.1\n",
- "batch_size = 3\n",
- "log = True\n",
- "\n",
- "a = ot.utils.unif(n_source)\n",
- "b = ot.utils.unif(n_target)\n",
- "\n",
- "rng = np.random.RandomState(0)\n",
- "X_source = rng.randn(n_source, 2)\n",
- "Y_target = rng.randn(n_target, 2)\n",
- "M = ot.dist(X_source, Y_target)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Call the \"SGD\" dual method to find the transportation matrix in the\n",
- "semicontinous case\n",
- "---------------------------------------------\n",
- "\n",
- "Call ot.solve_dual_entropic and plot the results.\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[0.91323163 2.78641673 1.06629943 0.01804936 0.61062914 1.81958274\n",
- " 0.11217916] [0.34004858 0.48129361 1.57541501 4.92963099]\n",
- "[[2.17913197e-02 9.28312769e-02 1.08665637e-02 9.30212767e-08]\n",
- " [1.60939150e-02 1.81215529e-03 1.24345544e-04 2.47002125e-05]\n",
- " [3.44318299e-03 8.04381532e-02 4.40643612e-02 3.27371535e-09]\n",
- " [3.12534315e-02 4.36443287e-02 7.14771848e-02 1.23227019e-05]\n",
- " [6.81023930e-02 5.68002968e-03 5.39927027e-02 2.12291313e-02]\n",
- " [8.06039569e-02 3.66972769e-03 5.01990391e-03 1.11309234e-02]\n",
- " [4.85325711e-02 3.39488142e-02 6.09673962e-02 7.07656480e-05]]\n"
- ]
- }
- ],
- "source": [
- "sgd_dual_pi, log_sgd = ot.stochastic.solve_dual_entropic(a, b, M, reg,\n",
- " batch_size, numItermax,\n",
- " lr, log=log)\n",
- "print(log_sgd['alpha'], log_sgd['beta'])\n",
- "print(sgd_dual_pi)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Compare the results with the Sinkhorn algorithm\n",
- "---------------------------------------------\n",
- "\n",
- "Call the Sinkhorn algorithm from POT\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[[2.55553508e-02 9.96395661e-02 1.76579142e-02 4.31178193e-06]\n",
- " [1.21640234e-01 1.25357448e-02 1.30225079e-03 7.37891333e-03]\n",
- " [3.56123974e-03 7.61451746e-02 6.31505947e-02 1.33831455e-07]\n",
- " [2.61515201e-02 3.34246014e-02 8.28734709e-02 4.07550425e-04]\n",
- " [9.85500876e-03 7.52288523e-04 1.08262629e-02 1.21423583e-01]\n",
- " [2.16904255e-02 9.03825804e-04 1.87178504e-03 1.18391107e-01]\n",
- " [4.15462212e-02 2.65987989e-02 7.23177217e-02 2.39440105e-03]]\n"
- ]
- }
- ],
- "source": [
- "sinkhorn_pi = ot.sinkhorn(a, b, M, reg)\n",
- "print(sinkhorn_pi)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Plot SGD results\n",
- "-----------------\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 360x360 with 3 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "pl.figure(4, figsize=(5, 5))\n",
- "ot.plot.plot1D_mat(a, b, sgd_dual_pi, 'dual : OT matrix SGD')\n",
- "pl.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Plot Sinkhorn results\n",
- "---------------------\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWAAAAFgCAYAAACFYaNMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAARxElEQVR4nO3dfZBdBX3G8ecxhEEMgjQ7Fgi41pc4jJWAK1VRSmHEBK22HUelvhRrm7G1DrS0vnXaSmdqrTo2jjraACoKRSlqx0G0YAlDqRC7kWgJIZZSkPBiNqVIUAQSnv5xT+w2s8k92b13f8m538/MDnvvPfec303Id8+ePXuukwgAMP+eUD0AAIwqAgwARQgwABQhwABQhAADQBECDABFCDCwj7D9UtubhrDeN9i+quWyZ9m+fm8fw+wQYHRGE4h/t/0T2/fZ/qTtw5rHPmX7oebjUduPTbv99XmYLbafuadlkvxLkqWzXP9LbH/L9o9s32/7X22/oFnvJUlOn816MVwEGJ1g+1xJfyPpTyQdKumFkp4m6WrbByZ5W5JFSRZJer+kL+68nWRF3eQ9tg+Yw3OfLOkKSR+TdLikoySdJ+mRwUw3eHN5vV1CgLHfawJ0nqR3JPlGkseS3CHptZLGJb1xFus8xfZm2++0vcX2vbZ/zfYZtr/f7GW+d9ryJ9q+wfYDzbIft31g89h1zWLfbfa4Xzdt/e+yfZ+kz+y8r3nOM5ptnNDcPtL2lO1TZhj32ZKU5NIkO5I8nOSqJN9rnvv/Dh00e+Nvs/0fzbyfsO3d/Dl8yPb1tg+ddt+Hbf+P7f+yvWLa/Ufa/moz9222f3faY++zfbnti20/KOms5r7LbH/O9jbbG2xP7OVf1X6NAKMLXizpIElfnn5nkockXSnpZbNc78836z1K0p9LOl+9mD9f0ksl/ZntpzfL7pD0h5IWS3qRpNMk/X4zx8nNMsc1e9xfnLb+w9XbU1+5y+z/Keldki62fbCkz0i6KMm1M8z5fUk7bF9ke4Xtp7R4ba+U9AJJz1PvC9XLpz9o+wm2z28ePz3Jj5qHfknSpuZ1flDShdPi/QVJmyUdKek1kt5v+9Rpq321pMslHSbpkua+VzXPO0zSVyV9vMXsnUGA0QWLJW1Nsn2Gx+5tHp+NxyT9VZLH1IvEYkkfTbItyQZJt0g6TpKSrEtyY5Ltzd7330n65T7rf1zSXyR5JMnDuz6Y5HxJt0laK+kISX8600qSPCjpJZKi3heJqWZP9Kl72PYHkjyQ5AeS1khaNu2xhZIuVe+Lw68m+cm0x+5Mcn6SHZIuauZ6qu2jJZ0k6V1JfppkvaQLJL152nNvSPKPSR6f9nqvT3Jls77Pq/nzHBUEGF2wVdLi3RxXPKJ5fDb+uwmDJO0Mxg+nPf6wpEWSZPvZtq9ofvj3oHrHmfuFfyrJT/ssc76k50r6WJLdHtNNsjHJWUmWNMsfKWnVHtZ737TPf7LzdTSeqd7e6nlJHt3d86aFeVGzvfuTbJu27J3qffew010t5jholI4PE2B0wQ3q/cDpN6bfaXuRpBWS/nkeZvikpFslPSvJkyW9V9KMx1Wn2eOlCJv5V0m6UNL7bB/eZpAkt0r6rHohno2Nkt4i6eu2256VcY+kw20fMu2+YyTdPX20Wc7TWQQY+73m+OR5kj5me7nthbbHJV2m3jHJz8/DGIdIelDSQ7afI+n3dnn8h5J+YS/X+VFJk0l+R9LXJH1qpoVsP8f2ubaXNLePlnSmpBv3cns/k+RS9b6IfNP2M1osf5ekb0n6a9sH2X6epLdKuni2M4wCAoxOSPJB9YLxYfVCuFa9b3lP29O37gP0x5J+U9I29Q4bfHGXx98n6aLmrIPX9luZ7VdLWq7/C/kfSTrB9htmWHybej8cW2v7x+qF92ZJ587idfxMkosk/aWka5ovaP2cqd5ZJ/dI+op6x7e/OZcZus5ckB0AarAHDABFCDAAFCHAAFCEAANAkZE54RkzW7x4ccbHx6vHADpl3bp1W5OM9VuOAI+48fFxTU5OVo8BdIrtO9ssxyEIAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIocUD0Aim3aJJ1ySvUUGGXLlkmrVlVPUYI9YAAowh7wqFu6VLr22uopgJHEHjAAFCHAAFCEAANAEQIMAEUIMAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAEQIMAEUIMAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAEQIMAEUIMAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAEQIMAEUIMAAUIcAAUIQAA0ARAgwARQgwABRxkuoZUMj2NkmbqucYgsWStlYPMWBdfE1SN1/X0iSH9FvogPmYBPu0TUkmqocYNNuTXXtdXXxNUjdfl+3JNstxCAIAihBgAChCgLG6eoAh6eLr6uJrkrr5ulq9Jn4IBwBF2AMGgCIEGACKEOARZXu57U22b7P97up5BsH2p21vsX1z9SyDZPto22ts32J7g+2zq2eaK9sH2f627e82r+m86pkGyfYC2zfZvmJPyxHgEWR7gaRPSFoh6VhJZ9o+tnaqgfispOXVQwzBdknnJjlW0gslvb0Df1+PSDo1yXGSlklabvuFxTMN0tmSNvZbiACPphMl3Zbk9iSPSvqCpFcXzzRnSa6TdH/1HIOW5N4k32k+36beP+yjaqeam/Q81Nxc2Hx04owA20skvULSBf2WJcCj6ShJd027vVn7+T/oUWF7XNLxktbWTjJ3zbfp6yVtkXR1kv3+NTVWSXqnpMf7LUiAgf2E7UWSviTpnCQPVs8zV0l2JFkmaYmkE20/t3qmubL9SklbkqxrszwBHk13Szp62u0lzX3YR9leqF58L0ny5ep5BinJA5LWqBvH70+S9Crbd6h3aO9U2xfvbmECPJr+TdKzbD/d9oGSXi/pq8UzYTdsW9KFkjYm+Uj1PINge8z2Yc3nT5T0Mkm31k41d0nek2RJknH1/l1dk+SNu1ueAI+gJNsl/YGkf1LvBzqXJdlQO9Xc2b5U0g2SltrebPut1TMNyEmS3qTe3tT65uOM6qHm6AhJa2x/T70dgquT7PGUrS7iV5EBoAh7wABQhAADQJGhvCPG4sWLMz4+PoxVY8DWrVu3NclY9RyzdcrpH5j1MbSX/+11gxyltTVvPnHet5mbag7xX/34P7hkw/uJoQR4fHxck5Ot3pEDxWzfWT0DMKo4BAEARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAEQIMAEVaBbiL76ALANX6BrjD76ALAKXa7AF38h10AaBamwCP/DvonnNO7wMABmlgV0OzvVLSSkk65phjBrXafcL69dUTAOiiNnvArd5BN8nqJBNJJsbG9tvLywLAvGkTYN5BFwCGoO8hiCTbbe98B90Fkj7dhXfQBYBqrY4BJ7lS0pVDngUARgq/CQcARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAEQIMAEUGdjU0oMI1n7tw1s894+RfH+Ak7eX2W+d9mwu4QNY+iT1gAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAifQNs+9O2t9i+eT4GAoBR0WYP+LOSlg95DgAYOX0DnOQ6SffPwywAMFIGdgzY9krbk7Ynp6amBrVaAOisgQU4yeokE0kmxrj2KAD0xVkQAFCEAANAkTanoV0q6QZJS21vtv3W4Y8FAN3X9z3hkpw5H4MAwKjhEAQAFCHAAFCEAANAEQIMAEUIMAAUIcAAUIQAA0ARAgwARfr+IgawL1vxzBfP+rk/+PzBA5ykvYfvmZj3bT7rHWvnfZvojz1gAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAibd4V+Wjba2zfYnuD7bPnYzAA6Lo2F+PZLuncJN+xfYikdbavTnLLkGcDgE7ruwec5N4k32k+3yZpo6Sjhj0YAHTdXh0Dtj0u6XhJXNsOAOaodYBtL5L0JUnnJHlwhsdX2p60PTk1NTXIGQGgk1oF2PZC9eJ7SZIvz7RMktVJJpJMjI2NDXJGAOikNmdBWNKFkjYm+cjwRwKA0dBmD/gkSW+SdKrt9c3HGUOeCwA6r+9paEmul+R5mAUARgq/CQcARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAEQIMAEXaXJAd2Gf99KXHzvq5h15W87//z/32D0u2i30Pe8AAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAEQIMAEX6Btj2Qba/bfu7tjfYPm8+BgOArmtzNZJHJJ2a5CHbCyVdb/vrSW4c8mwA0Gl9A5wkkh5qbi5sPjLMoQBgFLQ6Bmx7ge31krZIujrJ2hmWWWl70vbk1NTUoOcEgM5pFeAkO5Isk7RE0om2nzvDMquTTCSZGBsbG/ScANA5e3UWRJIHJK2RtHw44wDA6GhzFsSY7cOaz58o6WWSbh32YADQdW3OgjhC0kW2F6gX7MuSXDHcsQCg+9qcBfE9ScfPwywAMFL4TTgAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAirT5TThgn3Xwhntn/dwD775ngJO0d8CNS+Z9m1+7Z/28bxP9sQcMAEUIMAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCkdYBtL7B9k23eERkABmBv9oDPlrRxWIMAwKhpFWDbSyS9QtIFwx0HAEZH2z3gVZLeKenxIc4CACOlb4Btv1LSliTr+iy30vak7cmpqamBDQgAXdVmD/gkSa+yfYekL0g61fbFuy6UZHWSiSQTY2NjAx4TALqnb4CTvCfJkiTjkl4v6Zokbxz6ZADQcZwHDABF9uo94ZJcK+naoUwCACOGPWAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAihBgACiyV78JB+xrHnva7C/85LvvGeAk7e24+9553+aPHn943rcpSU8p2er+gz1gAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAira4FYfsOSdsk7ZC0PcnEMIcCgFGwNxfj+ZUkW4c2CQCMGA5BAECRtgGOpKtsr7O9cqYFbK+0PWl7cmpqanATAkBHtQ3wS5KcIGmFpLfbPnnXBZKsTjKRZGJsbPbXaAWAUdEqwEnubv67RdJXJJ04zKEAYBT0DbDtJ9k+ZOfnkk6XdPOwBwOArmtzFsRTJX3F9s7l/z7JN4Y6FQCMgL4BTnK7pOPmYRYAGCmchgYARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAkb25HjCwz9n6i0+c9XMPXfT8AU7S3l2/tX3et/m6ZyyY921K0lUPl2x2v8EeMAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAkVYBtn2Y7ctt32p7o+0XDXswAOi6thfj+aikbyR5je0DJR08xJkAYCT0DbDtQyWdLOksSUryqKRHhzsWAHRfm0MQT5c0Jekztm+yfYHtJw15LgDovDYBPkDSCZI+meR4ST+W9O5dF7K90vak7cmpqakBj1lr2bLeBwAMUptjwJslbU6ytrl9uWYIcJLVklZL0sTERAY24T5g1arqCQB0Ud894CT3SbrL9tLmrtMk3TLUqQBgBLQ9C+Idki5pzoC4XdJbhjcSAIyGVgFOsl7SxJBnAYCRwm/CAUARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAESeDv26O7SlJdw58xRiGpyUZqx4CGEVDCTAAoD8OQQBAEQIMAEUIMAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQJH/BRaxOz6vkQRTAAAAAElFTkSuQmCC\n",
- "text/plain": [
- "<Figure size 360x360 with 3 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "pl.figure(4, figsize=(5, 5))\n",
- "ot.plot.plot1D_mat(a, b, sinkhorn_pi, 'OT matrix Sinkhorn')\n",
- "pl.show()"
- ]
- }
- ],
- "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
-}