{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "V-WUgdSPyUAr"
},
"source": [
"# Part 1: Optimal Transport and Wasserstein Distances"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DFkIPDGpyUAu"
},
"source": [
"The goal of this first practical session is to introduce computational optimal transport (OT) in Python. You will familiarize yourself with OT by:\n",
"1. using the Python library POT (Python Optimal Transport),\n",
"2. coding Sinkhorn's algorithm.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "JJOuSWT0yUAv"
},
"source": [
"You first need to install the package POT:\n",
"* Install with pip: ```bash pip install pot```"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "VIKeeTPGyUAv",
"outputId": "0dc74f6c-5979-4433-c78d-5d98f27d8cfa"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
"Collecting pot\n",
" Downloading POT-0.8.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (664 kB)\n",
"\u001b[K |████████████████████████████████| 664 kB 7.4 MB/s \n",
"\u001b[?25hRequirement already satisfied: numpy>=1.16 in /usr/local/lib/python3.7/dist-packages (from pot) (1.21.6)\n",
"Requirement already satisfied: scipy>=1.0 in /usr/local/lib/python3.7/dist-packages (from pot) (1.4.1)\n",
"Installing collected packages: pot\n",
"Successfully installed pot-0.8.2\n"
]
}
],
"source": [
"# Check your installation by importing POT\n",
"!pip install pot"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "8WBXwefByUAw"
},
"outputs": [],
"source": [
"import ot\n",
"from ot.datasets import make_1D_gauss as gauss\n",
"import ot.plot\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MCcVE894yUAx"
},
"source": [
"## 1. Solving Exact OT: Linear Programming"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IN6yrlKYyUAx"
},
"source": [
"### Reminders on Optimal Transport"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "v92BOTWqyUAy"
},
"source": [
"Optimal Transport is a theory that allows us to compare two (weighted) points clouds $(X, a)$ and $(Y, b)$, where $X \\in \\mathbb{R}^{n \\times d}$ and $Y \\in \\mathbb{R}^{m \\times d}$ are the locations of the $n$ (resp. $m$) points in dimension $d$, and $a \\in \\mathbb{R}^n$, $b \\in \\mathbb{R}^m$ are the weights. We ask that the total weights sum to one, i.e. $\\sum_{i=1}^n a_i = \\sum_{j=1}^m b_j = 1$."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "64804TyqyUAy"
},
"source": [
"The basic idea of Optimal Transport is to \"transport\" the mass located at points $X$ to the mass located at points $Y$.\n",
"\n",
"Let us denote by $\\mathcal{U}(a,b) = \\left\\{ P \\in \\mathbb{R}^{n \\times m} \\,|\\, P \\geq 0, \\sum_{j=1}^m P_{ij} = a_i, \\sum_{i=1}^n P_{ij} = b_j\\right\\}$ the set of admissible transport plans.\n",
"\n",
"If $P \\in \\mathcal{U}(a,b)$, the quantity $P_{ij} \\geq 0$ should be regarded as the mass transported from point $X_i$ to point $Y_j$. For this reason, it is called a *transport plan*.\n",
"\n",
"We will also consider a *cost matrix* $C \\in \\mathbb{R}^{n \\times m}$. The quantity $C_{ij}$ should be regarded as the cost paid for transporting one unit of mass from $X_i$ to $Y_j$. This cost is usually computed using the positions $X_i$ and $Y_j$, for example $C_{ij} = \\|X_i - Y_j\\|$ or $C_{ij} = \\|X_i - Y_j\\|^2$.\n",
"\n",
"Then transporting mass according to $P \\in \\mathcal{U}(a,b)$ has a total cost of $\\sum_{ij} P_{ij} C_{ij}$."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "LzQp44cAyUAz"
},
"source": [
"In \"Optimal Transport\", there is the word _Optimal_. Indeed, we want to find a transport plan $P \\in \\mathcal{U}(a,b)$ that will minimize its total cost. In other words, we want to solve\n",
"$$\n",
" \\min_{P \\in \\mathcal{U}(a,b)} \\sum_{ij} C_{ij }P_{ij}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IIew7e7ByUAz"
},
"source": [
"This problem is a Linear Program: the objective function is linear in the variable $P$, and the constraints are linear in $P$. We can thus solve this problem using classical Linear Programming algorithms, such as the simplex algorithm."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4L9H7QLMyUA0"
},
"source": [
"If $P^*$ is a solution to the Optimal Transport problem, we will say that $P^*$ is an optimal transport plan between $(X, a)$ and $(Y, b)$, and that $\\sum_{ij} P^*_{ij} C_{ij}$ is the optimal transport distance between $(X, a)$ and $(Y, b)$: it is the minimal amount of \"energy\" that is necessary to transport the initial mass located at points $X$ to the target mass lcoated at points $Y$."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Top1Ht-0yUA0"
},
"source": [
"### Data\n",
"\n",
"---\n",
"\n"
]
},
{
"cell_type": "markdown",
"source": [
"One dimensional data (two histograms)"
],
"metadata": {
"id": "yOqyRbMF7YId"
}
},
{
"cell_type": "code",
"source": [
"n = 100 # nb bins\n",
"\n",
"# bin positions\n",
"x = np.arange(n, dtype=np.float64)\n",
"y = np.arange(n, dtype=np.float64)\n",
"\n",
"# Gaussian distributions\n",
"a = gauss(n, m=20, s=10) # m= mean, s= std\n",
"b = gauss(n, m=70, s=20)\n",
"b = 0.5*a + 0.5*b\n",
"\n",
"C = np.zeros((n,n))\n",
"\n",
"### Distance square cost function\n",
"for i in range(n):\n",
" for j in range(n):\n",
" C[i,j] = (x[i] - y[j])**2\n",
"\n",
"plt.figure(1, figsize=(6.4, 3))\n",
"plt.plot(x, a, 'b', label='Source distribution')\n",
"plt.plot(x, b, 'r', label='Target distribution')\n",
"plt.legend()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 228
},
"id": "2ubGJJK17ceQ",
"outputId": "4c9a6ea4-4b64-4c7f-d7eb-b3f4e7bb21ff"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
""
]
},
"metadata": {},
"execution_count": 3
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAADCCAYAAABnjpSEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3dd3iUZdbA4d9DKKGjgIUioLSFEEIXFQRRpLi4IlUEoiiiYsGKnw2x4bqiKAqLgBRpilIUFVcEEQsIAoIBkWDUAKKGXgIkOd8fZwIhJCFlJu9kcu7rmotk5p13TmaGOfO08zgRwRhjjMmpIl4HYIwxpmCyBGKMMSZXLIEYY4zJFUsgxhhjcsUSiDHGmFyxBGKMMSZXinodQHqVKlWSmjVreh2GMcYYYM2aNX+LSOWMbgu6BFKzZk1Wr17tdRjGGGMA59yvmd1mXVjGGGNyxRKIMcaYXLEEYowxJleCbgzEGJP/jh8/Tnx8PImJiV6HYjwSHh5OtWrVKFasWLbvk60E4pzrBIwBwoCJIjIq3e0lgGlAMyAB6C0icWluvwCIAUaIyH+yHZ3Jkf37YdUq+Ppr/blVK2jdGqpV8zoyE+zi4+MpW7YsNWvWxDnndTgmn4kICQkJxMfHU6tWrWzf74wJxDkXBrwOXAXEA9855xaKSEyawwYBe0SktnOuD/AC0DvN7aOBj7MdlcmRn36C22+HZctABJyD4sXhpZf09osu0p+vvdbTME0QS0xMtORRiDnnqFixIn/99VeO7pedMZCWwFYR2SYix4DZQPqPomuBqb6f5wIdnO+d6Jz7F/AL8GOOIjNnlJysiSEqCtatg8cfh8WLYc+ek62RV16BMmXgX/+CG2+E3bu9jtoEK0sehVtuXv/sJJCqwO9pfo/3XZfhMSKSBOwDKjrnygAPA0/lODKTpb//hssvhwcegKuvhpgYeOop6NgRypfXFkiLFnDPPZpInnwS5syBhg3hq6+8jt6Y0z377LM0bNiQyMhIoqKiWLlypdchnWLZsmVcc801ACxcuJBRo0Zleuy6dev46KOPMr199erV3H333QCMGDGC//wnZz37r7zyCocPHz7xe5cuXdi7d2+OzuEPgZ6FNQJ4WUQOZnWQc26wc261c251TptQhdHBg9C1K6xZA9Onw7x5cN55mR9fvDiMGAHffQdly+p9f/gh38I15oy++eYbPvzwQ77//nt++OEHPvvsM6pXr57n8yYlJfkhutN169aN4cOHZ3p7VgkkKSmJ5s2b8+qrr+b68dMnkI8++ogKFSrk+ny5lZ0Esh1I+0pW812X4THOuaJAeXQwvRXwb+dcHHAv8H/OuaHpH0BEJohIcxFpXrlyhivmjc+xY3D99bB6tbYobrxRxzyyIyoKPvtMu7Suvhp++SWwsRqTXTt37qRSpUqUKFECgEqVKlGlShUAlixZQpMmTWjUqBE333wzR48eBbRqxd9//w3oN/p27doB+o2+f//+XHrppfTv359du3Zx3XXX0bhxYxo3bszXX38NwNtvv03Lli2JioritttuIzk5+bS4PvnkE+rXr0/Tpk15//33T1w/ZcoUhg7Vj7J3332XiIgIGjduTNu2bTl27BhPPPEEc+bMISoqijlz5pwWU9rWDMD69etp3bo1derU4c033wQ47ZihQ4cyZcoUXn31VXbs2EH79u1p3779ac/F6NGjiYiIICIigldeeQWAuLg4/vGPf3DrrbfSsGFDOnbsyJEjR/LykgHZm4X1HVDHOVcLTRR9gBvSHbMQGAh8A/QAPhfdK7dN6gHOuRHAQREZm+eoC6mUFBg4ED79FCZNgm7dcn6OCy7QcZI2bbS7a8UKOPdc/8dqCq5779UxNX+KitLxuMx07NiRkSNHUrduXa688kp69+7N5ZdfTmJiItHR0SxZsoS6desyYMAAxo0bx7333pvl48XExLBixQpKlix54lzz5s0jOTmZgwcPsmnTJubMmcNXX31FsWLFuOOOO5gxYwYDBgw4cY7ExERuvfVWPv/8c2rXrk3v3r0zfKyRI0eyePFiqlatyt69eylevDgjR45k9erVjB2rH3cjRow4JaZly5adco4ffviBb7/9lkOHDtGkSRO6du2a6d929913M3r0aJYuXUqlSpVOuW3NmjW89dZbrFy5EhGhVatWXH755Zx11ln8/PPPzJo1izfffJNevXrx3nvvceONN2b5PJ7JGVsgvjGNocBiYBPwjoj86Jwb6ZxL/QibhI55bAXuAzJv25lce+YZmD0bRo2Cm2/O/XkaNoRFi2D7dujeXQfjjfFSmTJlWLNmDRMmTKBy5cr07t2bKVOm8NNPP1GrVi3q1q0LwMCBA1m+fPkZz9etWzdKliwJwOeff87tt98OQFhYGOXLl2fJkiWsWbOGFi1aEBUVxZIlS9i2bdsp59i8eTO1atWiTp06OOcy/bC99NJLiY6O5s0338ywFZNRTOlde+21lCxZkkqVKtG+fXtWrVp1xr8xIytWrOC6666jdOnSlClThu7du/Pll18CUKtWLaKiogBo1qwZcXFxuXqMtLK1DkREPgI+SnfdE2l+TgR6nuEcI3IRn/FZuxaefhpuuAEeeijv52vdGiZMgP794eWXdTDeGMi6pRBIYWFhtGvXjnbt2tGoUSOmTp1KkyZNMj2+aNGipKSkAJy2ALJ06dJZPpaIMHDgQJ5//vk8xz1+/HhWrlzJokWLaNasGWvWrMnwuKxiSj8Dyjl3yt8Hp/+NOZXaPQj6XPujC8tKmRQAx45p11WlSvDaa9kf8ziTfv10eu9jj8GmTf45pzG58dNPP/Hzzz+f+H3dunXUqFGDevXqERcXx9atWwGYPn06l19+OaD9/qkf1u+9916m5+7QoQPjxo0DIDk5mX379tGhQwfmzp3Ln3/+CcDu3bv59ddTi87Wr1+fuLg4YmNjAZg1a1aG54+NjaVVq1aMHDmSypUr8/vvv1O2bFkOHDiQ7b9/wYIFJCYmkpCQwLJly2jRogU1atQgJiaGo0ePsnfvXpYsWXLi+MzO36ZNG+bPn8/hw4c5dOgQ8+bNo02bNqcd5y+WQAqAp5+GDRu0xXD22f47r3MwfrwOqkdHQ4AmrBhzRgcPHmTgwIE0aNCAyMhIYmJiGDFiBOHh4bz11lv07NmTRo0aUaRIEYYMGQLAk08+yT333EPz5s0JCwvL9Nxjxoxh6dKlNGrUiGbNmhETE0ODBg145pln6NixI5GRkVx11VXs3LnzlPuFh4czYcIEunbtStOmTTnnnHMyPP+DDz5Io0aNiIiI4JJLLqFx48a0b9+emJiYE4PoZxIZGUn79u25+OKLefzxx6lSpQrVq1enV69eRERE0KtXr1NaY4MHD6ZTp04nBtFTNW3alOjoaFq2bEmrVq245ZZbsmzF5ZXTse7g0bx5c7H9QE5avRouvlhnW02ZEpjHmDMH+vSB55+HLGYmmhC2adMm/vGPf3gdhvFYRu8D59waEWme0fHWAgliKSkweLCu8Qhkv3Tv3tCzpy42tKm9xpjssgQSxGbO1MHzf/8bAr1GaPRoCAvT8RBjjMkOSyBBKjFRP8ybNtXupUCrVk3n/8+cCd9/H/jHM8YUfJZAgtTrr8Ovv2rro0g+vUoPPwwVK+o04SAbGjPGBCFLIEFozx549lktN9KhQ/49bvnyWtF3yRJd7W6MMVmxBBKERo2CvXvhhRfy/7GHDIFatbQ1YivUjTFZsQQSZP74A159VaftNm6c/49fogQ89xysXw/vvpv/j28Kp4SEBKKiooiKiuK8886jatWqJ34/duyYXx9r7969vPHGG9k6Nm2p9SeeeILPPvss02Pnz59PTExMprePHz+eadOmAdCuXTtyslwhfcw7duygR48e2b5/oFgCCTJjxujK8yeeOPOxgdKrF9Svry0hGwsx+aFixYqsW7eOdevWMWTIEIYNG3bi9+LFi2d6v9yUa89JAklr5MiRXHnllZnenlUCSUpKYsiQIacUa8yJ9DFXqVKFuXPn5upc/mQJJIjs2wdvvAE9ekDt2t7FUaSIdmGtX6+Ve43xwptvvkmLFi1o3Lgx119//Yn9L6KjoxkyZAitWrXioYceIjY2losvvphGjRrx2GOPUaZMmRPnePHFF2nRogWRkZE8+eSTAAwfPpzY2FiioqJ48MEHT3vcZ599lrp163LZZZfx008/nbg+Ojr6xIf28OHDT6yaf+CBB/j6669ZuHAhDz74IFFRUcTGxtKuXTvuvfdemjdvzpgxY07bOGr69OlERUURERFxonhi+mMiIiKIi4s7Lea4uDgiIiIArZF100030ahRI5o0acLSpUsBLTnfvXt3OnXqRJ06dXjIH0X00slWMUWTP8aP161oH37Y60i0aOPjj2srpFMnr6Mx+cqLeu4Z6N69O7feeisAjz32GJMmTeKuu+4CID4+nq+//pqwsDCuueYa7rnnHvr27cv48eNP3P/TTz/l559/ZtWqVYgI3bp1Y/ny5YwaNYqNGzeyLoO/cc2aNcyePZt169aRlJRE06ZNadas2SnHJCQkMG/ePDZv3oxzjr1791KhQgW6devGNddcc0rX0rFjx050VY0YMeKU8xw+fJh169axfPlybr75ZjZu3Jjpc5E+5rSVdF9//XWcc2zYsIHNmzfTsWNHtmzZAmhNsbVr11KiRAnq1avHXXfd5ZeNulJZCyRIJCZqVdyrrtK1H14rXhzuuw+++AK++cbraExhtHHjRtq0aUOjRo2YMWMGP/7444nbevbs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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Z6JNPV7tyUA0"
},
"source": [
"We will solve the Bakery/Cafés problem of transporting croissants from a number of Bakeries to Cafés in Palaiseau.\n",
"\n",
"We use fictional positions, production and sale numbers (that both sum to the same value).\n",
"\n",
"We have acess to the position of Bakeries $X \\in \\mathbb{R}^{8 \\times 2}$ and their respective production $a \\in \\mathbb{R}^8$ which describe the source point cloud. The Cafés where the croissants are sold are defined by their position $Y \\in \\mathbb{R}^{5 \\times 2}$ and $b \\in \\mathbb{R}^{5}$."
]
},
{
"cell_type": "code",
"source": [
"## Computing the (exact) optimal transport plan and the optimal transport distance for the L1 and L2 costs via Linear Programming\n",
"P0 = ot.emd(a,b,C)\n",
"\n",
"plt.figure(3, figsize=(5, 5))\n",
"ot.plot.plot1D_mat(a, b, P0, 'OT matrix solved via EMD')\n",
"\n",
"## Computing the Optimal Transport cost\n",
"OT_cost_C = np.sum(P0*C)\n",
"print(OT_cost_C)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 386
},
"id": "-pjzxR7T7mXC",
"outputId": "2efbcf37-7c89-469d-b2b6-5efec55138af"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"872.4977923209124\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8TVgtB5WyUA3"
},
"source": [
"## 2. Sinkhorn Algorithm for Entropy Regularized Optimal Transport"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "STB-yYoHyUA4"
},
"source": [
"### Reminders on Sinkhorn Algorithm"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "q-Vtb1QUyUA4"
},
"source": [
"In real applications, and especially in Machine Learning, we often have to deal with huge numbers of points. In this case, the linear programming algorithms which have cubic complexity will take too much time to run.\n",
"\n",
"That's why in practise, among other reasons, people minimize another criterion given by\n",
"$$\n",
" \\min_{P \\in \\mathcal{U}(a,b)} \\langle C, P \\rangle + \\epsilon \\sum_{ij} P_{ij} [ \\log(P_{ij}) - 1].\n",
"$$\n",
"When $\\epsilon$ is sufficiently small, we can consider that a solution to the above problem (often refered to as \"Entropy-regularized Optimal Transport\") is a good approximation of a real optimal transport plan."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Q59fpYL9yUA4"
},
"source": [
"In order to solve this problem, one can remark that the optimality conditions imply that a solution $P_\\epsilon^*$ necessarily is of the form $P_\\epsilon^* = \\text{diag}(u) \\, K \\, \\text{diag}(v)$, where $K = \\exp(-C/\\epsilon)$ and $u,v$ are two non-negative vectors."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "nezS0OKXyUA4"
},
"source": [
"$P_\\epsilon^*$ should verify the constraints, i.e. $P_\\epsilon^* \\in \\mathcal{U}(a,b)$, so that\n",
"$$\n",
" P_\\epsilon^* 1_m = a \\text{ and } (P_\\epsilon^*)^T 1_n = b\n",
"$$\n",
"which can be rewritten as\n",
"$$\n",
" u \\odot (Kv) = a \\text{ and } v \\odot (K^T u) = b\n",
"$$\n",
"\n",
"Then Sinkhorn's algorithm alternate between the resolution of these two equations, and reads\n",
"$$\n",
" u \\leftarrow \\frac{a}{Kv} \\text{ and } v \\leftarrow \\frac{b}{K^T u}\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "sm_zahMSyUA4"
},
"outputs": [],
"source": [
"def sinkhorn(a, b, C, epsilon=0.1, max_iters=100):\n",
" \"\"\"Run Sinnkhorn's algorithm\"\"\"\n",
" \n",
" # Compute the kernel matrix K\n",
" K = np.exp(-C/epsilon)\n",
" \n",
" # Alternate projections\n",
" v = np.ones(b.shape[0])\n",
" for _ in range(max_iters):\n",
" u = a / K.dot(v)\n",
" v = b / K.T.dot(u)\n",
" \n",
" return np.diag(u).dot(K).dot(np.diag(v))"
]
},
{
"cell_type": "markdown",
"source": [
"We are going to solve our previous one-dimensional example using the Sinkhorn algorithm."
],
"metadata": {
"id": "0rVXD383exlW"
}
},
{
"cell_type": "code",
"source": [
"P10 = sinkhorn(a, b, C, epsilon=10)"
],
"metadata": {
"id": "OR5-IhOdewk0"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"plt.figure(3, figsize=(5, 5))\n",
"ot.plot.plot1D_mat(a, b, P10, 'Sinkhorn algorithm with ep=10')"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 369
},
"id": "ngubFN-CfDuw",
"outputId": "0de3b557-83e0-4816-975f-ff82d8f05938"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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Dz4Izz4LK1b445ts4mO7x4zxRLr22j7dvLTU37faWli2zHecnjEDPv4YPvjAF75P99XXXx8OPth/ue20U85XyBZCSDoGyQKjR48Ob7zxRsdenErByJHwta/BP/6R0bgSsXKlfz1f/zo8+WTS0XSPVMq/1ltv9WnktbUwYoQny3328T39Kis7duwQPBk//bSPEX/ySa+s11vPdyb50Y98IkwPZGYTQwijO3yAEII+9ME222wTOuz550OAEMaP7/gxss0ll/jX9PrrSUfStaqqQrjmmhA22si/3kGDQjjttBBeey2EVKprzrl0qX+v7L13CGYh5OeHcOihIbzyStecrwsBb4RO/Nwl/oOvj+z46FQCPv74EMrLQ1i+vOPHyDZLloRQWRnCIYckHUnXWLIkhAsu8IQLIeywgyfFmprujeOzz0I466wQ+vf3OHbfPYRnn+3eGDqhswk4txsw0nlVVXDffb7pZllZ0tFkTr9+cNppPhqio62ZbLRyJVx+uV9oPO882G47v8D2yis+fruoqHvjGTkSLrnEL+z98Y/eqthjD9h77971vrdCCVg656GHfPLCccclHUnm/fznvpnoeeclHUnnpVJ+oXTUKPjFL3xkwmuvec8+GxZNKi/3IYCffuqJ+J13YNtt4ZhjfIJPL6UELJ0zbpxXMbvsknQkmdevH5x7rl84euGFpKPpuIkTYeed4eijfdTCM8/417TttklH9r9KSjwRT54Mv/yl/3W1ySbwhz/4hbteRglYOm7aNP9hPvbY3juc6JRTfELBuef61fyeZPFij3/bbb2yvPVW/7N+jz2SjmzN+vWDCy/01en23deT8RZb9OxfhC3opT810i3uvNOT0rHHJh1J1ykthd//3nukd9+ddDRtEwLce69XjjfeCKee6r3VE07oeb8oR4708cj//KcPjdt9dx+2tnhx0pFlRA/735CskUp5RZWe3dSbHX88jB7tvdNly5KOZvWmTfOxuz/4AayzDrz+uq9tUVGRdGSds99+8P77/n9w++2w+ebw2GNJR9VpSsDSMc8/D1OmeDXS2+XlwXXXwaxZcMEFSUfTshB8X7vNNvO20BVXwH/+4wsM9RZ9+sCll/rXVVkJ3/oW/PjH2f9LcTWUgKVj/vxn6N8fvvvdpCPpHttv73/C//GPflErm3z2mW8seuKJ3u99/30fwVHQS1ca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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"### Diference between Sinkhorn and EMD\n",
"coupling_diff = []\n",
"dist_diff = []\n",
"for epsilon in np.linspace(10, 100, 1000, 10000):\n",
" OT_plan_sinkhorn = sinkhorn(a, b, C/C.max(), epsilon, 1000)\n",
" OT_cost_sinkhorn = np.sum(OT_plan_sinkhorn*C)\n",
" coupling_diff.append(np.linalg.norm(OT_plan_sinkhorn-P0)/b.sum())\n",
"\n",
"\n",
"print(coupling_diff)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "YxjzgMgFfwni",
"outputId": "2314c132-b3c1-4e74-aa0b-65147004dc6a"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[0.09712403934609154, 0.09712414514923841, 0.09712424908037308, 0.09712435118874267, 0.09712445152188187, 0.0971245501256868, 0.09712464704448505, 0.09712474232110202, 0.09712483599692412, 0.09712492811195864, 0.09712501870489075, 0.0971251078131376, 0.09712519547290001, 0.0971252817192113, 0.09712536658598411, 0.09712545010605482, 0.0971255323112259, 0.0971256132323063, 0.09712569289914993, 0.09712577134069242, 0.09712584858498605, 0.09712592465923336, 0.09712599958981896, 0.09712607340234011, 0.09712614612163585, 0.0971262177718148, 0.09712628837628198, 0.09712635795776411, 0.0971264265383341, 0.0971264941394344, 0.09712656078189934, 0.09712662648597643, 0.09712669127134711, 0.09712675515714612, 0.09712681816198059, 0.09712688030394792, 0.09712694160065326, 0.09712700206922598, 0.09712706172633581, 0.09712712058820801, 0.09712717867063812, 0.09712723598900623, 0.09712729255829024, 0.0971273483930793, 0.09712740350758604, 0.09712745791565879, 0.09712751163079313, 0.09712756466614308, 0.0971276170345318, 0.09712766874846193, 0.09712771982012564, 0.097127770261414, 0.09712782008392644, 0.09712786929897951, 0.09712791791761548, 0.09712796595061061, 0.09712801340848311, 0.09712806030150078, 0.09712810663968843, 0.09712815243283517, 0.09712819769050103, 0.09712824242202382, 0.09712828663652548, 0.09712833034291833, 0.097128373549911, 0.09712841626601425, 0.0971284584995465, 0.09712850025863931, 0.09712854155124262, 0.09712858238512966, 0.09712862276790188, 0.09712866270699387, 0.09712870220967758, 0.09712874128306694, 0.09712877993412217, 0.0971288181696538, 0.09712885599632663, 0.09712889342066376, 0.09712893044905031, 0.0971289670877369, 0.09712900334284331, 0.09712903922036192, 0.09712907472616077, 0.0971291098659871, 0.09712914464547023, 0.0971291790701246, 0.09712921314535268, 0.09712924687644783, 0.09712928026859712, 0.09712931332688372, 0.09712934605628987, 0.09712937846169897, 0.09712941054789842, 0.09712944231958157, 0.09712947378135028, 0.09712950493771715, 0.09712953579310747, 0.09712956635186153, 0.09712959661823652, 0.09712962659640859, 0.0971296562904747, 0.09712968570445456, 0.09712971484229233, 0.0971297437078586, 0.09712977230495182, 0.09712980063730017, 0.09712982870856311, 0.09712985652233304, 0.09712988408213655, 0.09712991139143637, 0.09712993845363242, 0.09712996527206338, 0.0971299918500081, 0.09713001819068687, 0.09713004429726275, 0.09713007017284275, 0.09713009582047928, 0.09713012124317107, 0.09713014644386454, 0.09713017142545491, 0.09713019619078721, 0.09713022074265742, 0.09713024508381361, 0.09713026921695687, 0.09713029314474214, 0.09713031686977963, 0.09713034039463536, 0.09713036372183224, 0.097130386853851, 0.09713040979313099, 0.09713043254207106, 0.09713045510303048, 0.09713047747832967, 0.097130499670251, 0.09713052168103958, 0.09713054351290404, 0.09713056516801724, 0.09713058664851695, 0.09713060795650666, 0.09713062909405627, 0.09713065006320257, 0.09713067086595006, 0.09713069150427162, 0.097130711980109, 0.09713073229537349, 0.09713075245194654, 0.09713077245168038, 0.09713079229639841, 0.09713081198789598, 0.09713083152794076, 0.09713085091827336, 0.09713087016060781, 0.09713088925663203, 0.09713090820800849, 0.09713092701637446, 0.09713094568334259, 0.09713096421050146, 0.09713098259941588, 0.09713100085162742, 0.09713101896865478, 0.09713103695199422, 0.09713105480312018, 0.09713107252348523, 0.09713109011452101, 0.09713110757763806, 0.09713112491422674, 0.09713114212565717, 0.09713115921327976, 0.09713117617842573, 0.09713119302240708, 0.09713120974651722, 0.09713122635203122, 0.09713124284020618, 0.09713125921228134, 0.09713127546947878, 0.09713129161300328, 0.09713130764404293, 0.0971313235637693, 0.09713133937333777, 0.09713135507388776, 0.09713137066654302, 0.09713138615241192, 0.09713140153258774, 0.09713141680814881, 0.09713143198015892, 0.09713144704966745, 0.09713146201770961, 0.09713147688530675, 0.09713149165346663, 0.09713150632318346, 0.09713152089543822, 0.09713153537119915, 0.09713154975142131, 0.09713156403704754, 0.09713157822900811, 0.0971315923282213, 0.09713160633559328, 0.09713162025201845, 0.09713163407837977, 0.09713164781554871, 0.09713166146438554, 0.09713167502573947, 0.09713168850044895, 0.09713170188934173, 0.09713171519323496, 0.09713172841293555, 0.09713174154924015, 0.09713175460293545, 0.09713176757479829, 0.09713178046559567, 0.09713179327608526, 0.09713180600701504, 0.097131818659124, 0.09713183123314181, 0.09713184372978927, 0.09713185614977828, 0.09713186849381207, 0.0971318807625853, 0.0971318929567841, 0.09713190507708637, 0.09713191712416186, 0.0971319290986721, 0.0971319410012708, 0.09713195283260385, 0.09713196459330929, 0.09713197628401773, 0.0971319879053522, 0.09713199945792837, 0.0971320109423547, 0.09713202235923239, 0.09713203370915573, 0.09713204499271189, 0.09713205621048134, 0.09713206736303769, 0.09713207845094803, 0.09713208947477275, 0.0971321004350659, 0.09713211133237505, 0.09713212216724162, 0.09713213294020073, 0.09713214365178148, 0.09713215430250695, 0.09713216489289421, 0.0971321754234546, 0.09713218589469363, 0.09713219630711116, 0.09713220666120143, 0.0971322169574532, 0.09713222719634972, 0.09713223737836886, 0.09713224750398335, 0.09713225757366052, 0.09713226758786261, 0.0971322775470468, 0.09713228745166527, 0.09713229730216522, 0.09713230709898896, 0.09713231684257409, 0.09713232653335338, 0.09713233617175492, 0.09713234575820222, 0.09713235529311427, 0.0971323647769055, 0.09713237420998591, 0.09713238359276112, 0.09713239292563257, 0.09713240220899723, 0.09713241144324804, 0.09713242062877371, 0.09713242976595887, 0.09713243885518409, 0.09713244789682605, 0.0971324568912574, 0.09713246583884691, 0.09713247473995959, 0.09713248359495663, 0.09713249240419544, 0.09713250116802981, 0.09713250988680991, 0.0971325185608822, 0.09713252719058976, 0.09713253577627204, 0.09713254431826511, 0.09713255281690156, 0.09713256127251067, 0.09713256968541842, 0.09713257805594734, 0.09713258638441695, 0.09713259467114348, 0.09713260291643987, 0.09713261112061612, 0.09713261928397905, 0.09713262740683247, 0.09713263548947713, 0.09713264353221089, 0.09713265153532862, 0.09713265949912224, 0.09713266742388098, 0.09713267530989107, 0.09713268315743606, 0.09713269096679666, 0.09713269873825085, 0.09713270647207403, 0.09713271416853883, 0.09713272182791527, 0.09713272945047086, 0.09713273703647037, 0.09713274458617624, 0.09713275209984824, 0.09713275957774381, 0.09713276702011779, 0.09713277442722269, 0.09713278179930873, 0.09713278913662352, 0.09713279643941257, 0.09713280370791896, 0.09713281094238356, 0.09713281814304495, 0.0971328253101395, 0.09713283244390136, 0.09713283954456256, 0.09713284661235294, 0.09713285364750021, 0.09713286065022997, 0.09713286762076584, 0.09713287455932926, 0.09713288146613973, 0.0971328883414147, 0.09713289518536969, 0.0971329019982182, 0.0971329087801718, 0.09713291553144027, 0.09713292225223125, 0.09713292894275076, 0.09713293560320281, 0.09713294223378967, 0.09713294883471175, 0.09713295540616766, 0.09713296194835427, 0.09713296846146671, 0.09713297494569834, 0.09713298140124087, 0.09713298782828424, 0.09713299422701678, 0.09713300059762514, 0.09713300694029431, 0.09713301325520772, 0.09713301954254712, 0.09713302580249274, 0.09713303203522326, 0.09713303824091568, 0.09713304441974567, 0.0971330505718872, 0.0971330566975128, 0.09713306279679358, 0.0971330688698991, 0.09713307491699752, 0.09713308093825551, 0.09713308693383839, 0.09713309290390996, 0.09713309884863275, 0.09713310476816787, 0.09713311066267502, 0.09713311653231266, 0.09713312237723777, 0.09713312819760618, 0.09713313399357225, 0.09713313976528912, 0.09713314551290872, 0.09713315123658157, 0.0971331569364571, 0.09713316261268332, 0.09713316826540716, 0.0971331738947743, 0.09713317950092919, 0.09713318508401507, 0.09713319064417408, 0.09713319618154717, 0.09713320169627405, 0.09713320718849346, 0.09713321265834284, 0.09713321810595858, 0.09713322353147602, 0.09713322893502928, 0.09713323431675151, 0.09713323967677474, 0.09713324501522995, 0.09713325033224705, 0.09713325562795493, 0.09713326090248138, 0.09713326615595329, 0.09713327138849644, 0.09713327660023563, 0.09713328179129477, 0.09713328696179664, 0.0971332921118631, 0.09713329724161507, 0.09713330235117254, 0.09713330744065449, 0.09713331251017905, 0.0971333175598633, 0.09713332258982357, 0.09713332760017516, 0.09713333259103248, 0.09713333756250914, 0.09713334251471777, 0.09713334744777015, 0.09713335236177727, 0.09713335725684921, 0.09713336213309515, 0.09713336699062355, 0.0971333718295419, 0.09713337664995704, 0.0971333814519748, 0.09713338623570036, 0.09713339100123804, 0.09713339574869136, 0.09713340047816302, 0.09713340518975506, 0.09713340988356865, 0.0971334145597042, 0.09713341921826141, 0.09713342385933928, 0.09713342848303588, 0.09713343308944876, 0.09713343767867462, 0.09713344225080946, 0.09713344680594861, 0.09713345134418662, 0.09713345586561742, 0.09713346037033417, 0.09713346485842943, 0.09713346932999493, 0.0971334737851219, 0.09713347822390082, 0.09713348264642147, 0.09713348705277304, 0.097133491443044, 0.09713349581732228, 0.09713350017569508, 0.09713350451824895, 0.09713350884506995, 0.09713351315624333, 0.0971335174518539, 0.09713352173198571, 0.09713352599672234, 0.09713353024614661, 0.09713353448034094, 0.09713353869938698, 0.09713354290336595, 0.09713354709235837, 0.09713355126644424, 0.097133555425703, 0.09713355957021351, 0.09713356370005405, 0.09713356781530237, 0.09713357191603571, 0.09713357600233073, 0.09713358007426351, 0.09713358413190967, 0.09713358817534425, 0.09713359220464178, 0.09713359621987629, 0.09713360022112127, 0.09713360420844967, 0.09713360818193405, 0.09713361214164627, 0.09713361608765789, 0.09713362002003986, 0.0971336239388627, 0.09713362784419641, 0.09713363173611049, 0.09713363561467404, 0.09713363947995558, 0.09713364333202328, 0.09713364717094473, 0.09713365099678714, 0.09713365480961723, 0.0971336586095013, 0.09713366239650512, 0.09713366617069409, 0.09713366993213318, 0.09713367368088684, 0.09713367741701914, 0.09713368114059377, 0.09713368485167387, 0.09713368855032226, 0.09713369223660129, 0.09713369591057289, 0.09713369957229862, 0.09713370322183959, 0.09713370685925653, 0.09713371048460974, 0.09713371409795915, 0.09713371769936427, 0.09713372128888424, 0.09713372486657777, 0.09713372843250322, 0.09713373198671858, 0.09713373552928144, 0.09713373906024897, 0.09713374257967801, 0.09713374608762507, 0.09713374958414625, 0.09713375306929721, 0.0971337565431334, 0.09713376000570977, 0.09713376345708101, 0.09713376689730145, 0.09713377032642499, 0.09713377374450527, 0.09713377715159552, 0.09713378054774868, 0.09713378393301733, 0.09713378730745373, 0.09713379067110973, 0.09713379402403696, 0.09713379736628663, 0.09713380069790971, 0.0971338040189568, 0.09713380732947813, 0.09713381062952368, 0.09713381391914312, 0.09713381719838578, 0.09713382046730064, 0.09713382372593644, 0.09713382697434159, 0.09713383021256423, 0.09713383344065205, 0.09713383665865272, 0.09713383986661331, 0.09713384306458078, 0.09713384625260177, 0.09713384943072259, 0.09713385259898927, 0.09713385575744758, 0.09713385890614304, 0.0971338620451208, 0.09713386517442578, 0.09713386829410267, 0.09713387140419577, 0.09713387450474918, 0.09713387759580679, 0.09713388067741205, 0.09713388374960837, 0.0971338868124387, 0.09713388986594582, 0.09713389291017228, 0.09713389594516025, 0.09713389897095177, 0.09713390198758856, 0.09713390499511212, 0.0971339079935637, 0.09713391098298421, 0.09713391396341446, 0.09713391693489491, 0.09713391989746585, 0.09713392285116726, 0.09713392579603891, 0.09713392873212034, 0.09713393165945086, 0.09713393457806951, 0.09713393748801517, 0.09713394038932638, 0.09713394328204156, 0.09713394616619883, 0.09713394904183612, 0.09713395190899114, 0.09713395476770136, 0.097133957618004, 0.09713396045993614, 0.09713396329353458, 0.09713396611883593, 0.09713396893587656, 0.09713397174469267, 0.0971339745453202, 0.09713397733779493, 0.09713398012215241, 0.09713398289842796, 0.09713398566665674, 0.0971339884268737, 0.09713399117911349, 0.0971339939234107, 0.09713399665979966, 0.09713399938831455, 0.09713400210898922, 0.09713400482185748, 0.09713400752695282, 0.09713401022430865, 0.09713401291395812, 0.09713401559593424, 0.09713401827026974, 0.09713402093699722, 0.09713402359614919, 0.09713402624775781, 0.09713402889185517, 0.09713403152847311, 0.09713403415764331, 0.09713403677939732, 0.09713403939376648, 0.0971340420007819, 0.09713404460047459, 0.09713404719287537, 0.09713404977801489, 0.09713405235592355, 0.0971340549266317, 0.09713405749016946, 0.09713406004656679, 0.09713406259585348, 0.09713406513805911, 0.09713406767321321, 0.09713407020134507, 0.09713407272248378, 0.09713407523665835, 0.09713407774389761, 0.09713408024423019, 0.09713408273768455, 0.09713408522428914, 0.09713408770407206, 0.09713409017706136, 0.09713409264328494, 0.0971340951027705, 0.09713409755554567, 0.0971341000016378, 0.09713410244107422, 0.09713410487388205, 0.0971341073000882, 0.09713410971971964, 0.09713411213280296, 0.09713411453936473, 0.09713411693943136, 0.09713411933302908, 0.09713412172018404, 0.09713412410092222, 0.09713412647526945, 0.09713412884325141, 0.09713413120489368, 0.09713413356022169, 0.0971341359092607, 0.09713413825203594, 0.09713414058857232, 0.09713414291889484, 0.09713414524302816, 0.09713414756099699, 0.09713414987282575, 0.09713415217853881, 0.09713415447816047, 0.09713415677171479, 0.09713415905922577, 0.09713416134071721, 0.09713416361621292, 0.09713416588573645, 0.09713416814931129, 0.09713417040696082, 0.09713417265870825, 0.0971341749045767, 0.09713417714458915, 0.09713417937876852, 0.09713418160713753, 0.0971341838297188, 0.09713418604653491, 0.09713418825760818, 0.097134190462961, 0.09713419266261544, 0.09713419485659358, 0.09713419704491742, 0.09713419922760876, 0.09713420140468929, 0.09713420357618065, 0.09713420574210431, 0.09713420790248167, 0.09713421005733401, 0.0971342122066825, 0.0971342143505482, 0.09713421648895205, 0.09713421862191493, 0.09713422074945753, 0.09713422287160049, 0.09713422498836438, 0.09713422709976959, 0.09713422920583645, 0.09713423130658519, 0.09713423340203592, 0.09713423549220868, 0.09713423757712335, 0.09713423965679978, 0.09713424173125765, 0.09713424380051663, 0.09713424586459618, 0.09713424792351576, 0.09713424997729468, 0.09713425202595216, 0.09713425406950736, 0.09713425610797928, 0.09713425814138689, 0.09713426016974906, 0.09713426219308452, 0.09713426421141191, 0.09713426622474984, 0.0971342682331168, 0.0971342702365311, 0.0971342722350111, 0.097134274228575, 0.09713427621724091, 0.09713427820102685, 0.0971342801799508, 0.09713428215403055, 0.09713428412328391, 0.09713428608772855, 0.09713428804738208, 0.09713429000226192, 0.09713429195238564, 0.09713429389777042, 0.09713429583843361, 0.09713429777439238, 0.09713429970566377, 0.09713430163226483, 0.09713430355421242, 0.09713430547152342, 0.09713430738421461, 0.0971343092923026, 0.09713431119580404, 0.09713431309473541, 0.09713431498911321, 0.09713431687895374, 0.09713431876427331, 0.0971343206450881, 0.09713432252141427, 0.09713432439326787, 0.09713432626066482, 0.09713432812362106, 0.09713432998215243, 0.09713433183627461, 0.09713433368600335, 0.09713433553135416, 0.09713433737234266, 0.09713433920898423, 0.0971343410412943, 0.0971343428692881, 0.09713434469298089, 0.09713434651238792, 0.0971343483275242, 0.09713435013840471, 0.09713435194504448, 0.0971343537474584, 0.09713435554566116, 0.09713435733966762, 0.0971343591294924, 0.09713436091515013, 0.09713436269665532, 0.09713436447402245, 0.09713436624726592, 0.09713436801640007, 0.09713436978143915, 0.09713437154239736, 0.09713437329928888, 0.09713437505212776, 0.09713437680092797, 0.09713437854570348, 0.09713438028646819, 0.09713438202323586, 0.09713438375602029, 0.09713438548483515, 0.09713438720969407, 0.0971343889306106, 0.09713439064759824, 0.09713439236067045, 0.09713439406984059, 0.09713439577512196, 0.09713439747652788, 0.09713439917407149, 0.09713440086776595, 0.0971344025576243, 0.0971344042436596, 0.09713440592588483, 0.09713440760431281, 0.09713440927895643, 0.09713441094982851, 0.09713441261694172, 0.09713441428030875, 0.09713441593994221, 0.09713441759585467, 0.09713441924805859, 0.09713442089656649, 0.09713442254139068, 0.09713442418254352, 0.09713442582003731, 0.09713442745388425, 0.09713442908409652, 0.09713443071068625, 0.09713443233366544, 0.09713443395304619, 0.09713443556884035, 0.09713443718105993, 0.09713443878971671, 0.09713444039482251, 0.09713444199638904, 0.09713444359442804, 0.09713444518895113, 0.09713444677996991, 0.09713444836749592, 0.09713444995154061, 0.09713445153211549, 0.09713445310923188, 0.09713445468290115, 0.09713445625313459, 0.09713445781994344, 0.0971344593833389, 0.09713446094333208, 0.09713446249993414, 0.09713446405315601, 0.09713446560300881, 0.09713446714950341, 0.09713446869265079, 0.09713447023246168, 0.097134471768947, 0.0971344733021175, 0.09713447483198387, 0.09713447635855676, 0.0971344778818468, 0.09713447940186462, 0.09713448091862072, 0.0971344824321256, 0.09713448394238962, 0.09713448544942328, 0.0971344869532369, 0.0971344884538408, 0.09713448995124523, 0.09713449144546041, 0.09713449293649654, 0.09713449442436367, 0.09713449590907203, 0.09713449739063158, 0.09713449886905234, 0.09713450034434427, 0.09713450181651731, 0.09713450328558135, 0.09713450475154616, 0.09713450621442164, 0.09713450767421747, 0.09713450913094338, 0.09713451058460904, 0.09713451203522411, 0.09713451348279817, 0.09713451492734074, 0.09713451636886136, 0.09713451780736955, 0.09713451924287468, 0.09713452067538615, 0.09713452210491334, 0.09713452353146548, 0.09713452495505201, 0.09713452637568204, 0.09713452779336482, 0.0971345292081095, 0.09713453061992518, 0.09713453202882101, 0.09713453343480595, 0.09713453483788909, 0.09713453623807937, 0.09713453763538572, 0.09713453902981709, 0.09713454042138228, 0.09713454181009014, 0.0971345431959495, 0.09713454457896904, 0.09713454595915755, 0.0971345473365237, 0.09713454871107609, 0.09713455008282337, 0.09713455145177415, 0.09713455281793691, 0.09713455418132019, 0.09713455554193244, 0.09713455689978216, 0.0971345582548777, 0.09713455960722742, 0.09713456095683974, 0.09713456230372287, 0.09713456364788513, 0.09713456498933472, 0.09713456632807987, 0.09713456766412878, 0.0971345689974895, 0.09713457032817023, 0.09713457165617899, 0.09713457298152381, 0.09713457430421275, 0.09713457562425375, 0.09713457694165475, 0.09713457825642365, 0.09713457956856837, 0.09713458087809673, 0.09713458218501655, 0.09713458348933562, 0.09713458479106174, 0.09713458609020256, 0.09713458738676577, 0.09713458868075914, 0.09713458997219018, 0.09713459126106654, 0.09713459254739584, 0.09713459383118556, 0.09713459511244323, 0.09713459639117633, 0.09713459766739237, 0.09713459894109863, 0.09713460021230268, 0.0971346014810118, 0.09713460274723336, 0.09713460401097461, 0.09713460527224287, 0.09713460653104539, 0.0971346077873894, 0.09713460904128209, 0.0971346102927306, 0.0971346115417421, 0.09713461278832372, 0.0971346140324825, 0.09713461527422551, 0.0971346165135598, 0.09713461775049237, 0.09713461898503016, 0.09713462021718015, 0.09713462144694925, 0.09713462267434436, 0.09713462389937236, 0.09713462512204003, 0.09713462634235424, 0.0971346275603218, 0.09713462877594942, 0.09713462998924387, 0.09713463120021182, 0.09713463240886, 0.09713463361519505, 0.09713463481922362, 0.09713463602095229, 0.09713463722038765, 0.09713463841753625, 0.09713463961240468, 0.0971346408049994, 0.09713464199532688, 0.09713464318339363, 0.09713464436920605, 0.09713464555277057, 0.09713464673409354, 0.09713464791318134, 0.0971346490900403, 0.09713465026467676, 0.09713465143709701, 0.09713465260730729, 0.09713465377531383, 0.09713465494112292, 0.09713465610474066, 0.09713465726617332, 0.097134658425427, 0.09713465958250778, 0.09713466073742184, 0.09713466189017524, 0.097134663040774, 0.09713466418922417, 0.09713466533553185, 0.09713466647970284, 0.09713466762174333, 0.09713466876165913, 0.0971346698994562, 0.0971346710351404, 0.09713467216871768, 0.09713467330019385, 0.09713467442957474, 0.09713467555686621, 0.09713467668207403, 0.09713467780520395, 0.09713467892626174, 0.09713468004525314, 0.09713468116218384, 0.09713468227705956, 0.0971346833898859, 0.09713468450066855, 0.09713468560941313, 0.09713468671612527, 0.09713468782081049, 0.09713468892347442, 0.09713469002412255, 0.09713469112276044, 0.0971346922193936, 0.09713469331402748, 0.09713469440666751, 0.0971346954973192, 0.09713469658598795, 0.09713469767267917, 0.09713469875739823, 0.09713469984015047, 0.09713470092094127, 0.09713470199977597, 0.09713470307665985, 0.09713470415159821, 0.09713470522459626, 0.09713470629565933, 0.09713470736479263]\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"plt.figure(figsize=(16,5))\n",
"plt.loglog(np.linspace(10, 100, 1000, 10000), coupling_diff, lw=4)\n",
"plt.xlabel('Regularization Strength $\\epsilon$', fontsize=25)\n",
"plt.ylabel('$||P^* - P_\\epsilon^*||_F$', fontsize=25)\n",
"plt.xticks(fontsize=20)\n",
"plt.yticks(fontsize=20)\n",
"plt.grid(ls='--')\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 364
},
"id": "H4CBieqjiegB",
"outputId": "6db5b4ba-0bde-4f8c-956a-33e62665995d"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA/0AAAFbCAYAAACH5e66AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeXwdd33v/9dHsvbNsjbb8iLvju3ES5TFiWM7IQlJICmlZW8pUFJoCZel98elfVDovRfKUtofcKGlQLhASVlCIJCQjUASk+B4jR3v+yZ5kWXtsnZ97h8zcmRZkiVZ0jkjvZ+Px3mcOTPfmfnIYEfv813G3B0RERERERERGXsSYl2AiIiIiIiIiIwMhX4RERERERGRMUqhX0RERERERGSMUugXERERERERGaMU+kVERERERETGKIV+ERERERERkTFqQqwLkNGRn5/vJSUlsS6jT62trSQnJ8e6DBERERERkUvEe17ZsmVLpbsX9HZMoX+cKCkpYfPmzbEuo09NTU2kpaXFugwREREREZFLxHteMbNjfR3T8H6JC2VlZbEuQUREREREpFdRzisK/RIXysvLY12CiIiIiIhIr6KcVxT6RURERERERMYohX6JCwsWLIh1CSIiIiIiIr2Kcl5R6Je4kJiYGOsSREREREREehXlvKLQL3Fh9+7dsS5BRERERESkV1HOKwr9IiIiIiIiImOUQr/EhcmTJ8e6BBERERERkV5FOa9MiHUBIgCzZs2KdQkiIiIiIjJOuTvnWzuoamwNXudbqQ63q8+3UlnXTN7RvXziroWxLnXQFPolLqxfv561a9fGugwRERERERkD3J36lnaqGlo51xXkG1uC7XDfuXBf1+eW9s5+rzk7P0OhX0RERERERGS4uTt1Te2cC4P7uYYeQT58vba/ldaO/kP8YFWdbx3W640WhX6JC2lpabEuQURERERERlFLeweVDa1U1rdQ2dD1auVsfVewbwmCfGMw1L6902Nab21TG+0dnUxIjNbSeAr9EhduuOGGWJcgIiIiIiJXqKm1g8qGFs42tIRhvrVboG+hsr71wvH65vZYl3uR5MQE8jKTyU1PvvA+KaPrPYncjGRi+7XD0Cj0S1zYsGGDgr+IiIiISBxqaGm/qDf+bC+985VhyG9s7Yh1uRekJiWQl5HCpIwgvOdl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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"Let is now do a two dimensional problem of transporting \"croissants\" to \"Bakeries\" or \"Maple Syrop\" to \"Pancakes\"."
],
"metadata": {
"id": "hT7BGwP-ekZ7"
}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "TNsjLklTyUA4"
},
"outputs": [],
"source": [
"n = 10\n",
"m = 10\n",
"d = 2\n",
"\n",
"X = np.random.randn(n,d)\n",
"Y = np.random.randn(m,d)\n",
"\n",
"a = np.ones(n)\n",
"b = np.ones(m)\n",
"\n",
"\n",
"\n",
"C_1 = (((X[:, None] - Y)**2)**0.5).sum(axis=2)\n",
"#optimal_plan_sinkhorn_1 = sinkhorn(a, b, C_1/C_1.max(), epsilon=0.01)\n",
"\n",
"C_2 = ((X[:, None] - Y)**2).sum(axis=2)\n",
"\n",
"#optimal_plan_sinkhorn_2 = sinkhorn(a, b, C_2/C_2.max(), epsilon=0.01)\n"
]
},
{
"cell_type": "code",
"source": [
"## Safe check solving OT via Linear programming\n",
"\n",
"optimal_plan_1 = ot.emd(a, b, C_1)\n",
"print(optimal_plan_1)\n",
"optimal_cost_1 = np.sum(optimal_plan_1*C_1)\n",
"print('1-Wasserstein distance =', optimal_cost_1)\n",
"print('')\n",
"\n",
"optimal_plan_2 = ot.emd(a, b, C_2)\n",
"print(optimal_plan_2)\n",
"optimal_cost_2 = np.sum(optimal_plan_2*C_2)\n",
"print('2-Wasserstein distance =', np.sqrt(optimal_cost_2))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "OjiwCGfs2-W-",
"outputId": "609503b8-92f8-417c-a4c5-d5517c14d878"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
" [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
" [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
" [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
" [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
" [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
" [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
" [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]]\n",
"1-Wasserstein distance = 9.570485673930486\n",
"\n",
"[[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
" [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
" [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
" [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
" [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
" [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
" [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
" [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]]\n",
"2-Wasserstein distance = 2.69668980003373\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"fig = plt.figure(figsize=(17,8))\n",
"\n",
"ax = fig.add_subplot(1, 2, 1)\n",
"ax.scatter(X[:,0], X[:,1], s=80*a, c='r', edgecolors='k', label='Bakeries')\n",
"ax.scatter(Y[:,0], Y[:,1], s=80*b, c='b', edgecolors='k', label='Cafés')\n",
"for i in range(8):\n",
" for j in range(5):\n",
" ax.plot([X[i,0], Y[j,0]], [X[i,1], Y[j,1]], c='k', lw=1*optimal_plan_1[i,j], alpha=1)\n",
"ax.axis('off')\n",
"ax.set_title('$\\ell_1$ cost', fontsize=30)\n",
"\n",
"ax = fig.add_subplot(1, 2, 2)\n",
"ax.scatter(X[:,0], X[:,1], s=80*a, c='r', edgecolors='k', label='Bakeries')\n",
"ax.scatter(Y[:,0], Y[:,1], s=80*b, c='b', edgecolors='k', label='Cafés')\n",
"for i in range(8):\n",
" for j in range(5):\n",
" ax.plot([X[i,0], Y[j,0]], [X[i,1], Y[j,1]], c='k', lw=0.1*optimal_plan_2[i,j], alpha=1)\n",
"ax.axis('off')\n",
"ax.set_title('$\\ell_2$ cost', fontsize=30)\n",
"\n",
"plt.legend(fontsize=20)\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 497
},
"id": "MGGmML3P0mKs",
"outputId": "29ec61ca-b78c-4b56-cab0-4ad15d8831d1"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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3nfffRUbco4LL7xwSEFBwfhx48aNmT9/fuHq5Q888EDFIYcc8uGBAwfuXFxcPG7o0KEfO+644z70xhtvFLc/xm677bZ9RIyvq6uLs88+e9jIkSN3KikpGXfUUUeNhHX3EZ45c2bxF77wha232mqrj5aUlIyrqqra5YADDtj24YcfLm+/7ZIlSwrOOeecYaNHj96xb9++YysqKsaOGDFip0MPPfTDf/3rX9fYXt1XSmlhCVz7OVi5EngHGNS6rh44BlYVwR9SSrOzq1LyjbCkTpBSWhQRE74K9w2Fyq2gz/XAn2Dl3UAdnJBS+lvWdUrqXZYsWVJw4403Vs+bN69o6NChTccff/yS6urqlqzrWh/33ntvP4CxY8e+r/vkP/7xj7JLL710+K677rriwAMPXFpVVdU0a9askvvvv7/qkEMO6ffb3/72n5/73OeWrevYzc3NfPnLXx5x3XXXDT7ooINq/vCHP7xWXl6eAKZMmTLg7LPPHllcXNzyiU98omb48OGNM2fOLL355psH3nffff0feeSRl0aPHt3Q/piTJk0a9cwzz1Tsv//+SwcNGtQ4ePDgpjXP/J5p06aVf/rTnx69dOnSon322WfZpEmTlixatKjonnvuqfrkJz855te//vXMY445ZilAS0sLBx544HYzZsyo2GWXXWqPPfbYd4qKipgzZ07x448/XvnXv/61Yt99923fzVTd2DI47e9QvRV8+ngo2R2KXoXmq6G+Ae5fBidlXaNkEJbUKVJKz0bEiNfgzlLY4ix4cyk81ALXpZRqsq5PUu/R0tLCxRdcMPSqyZOH7VNQwHYNDfGXkpJ04dlnb33qmWfOvfiSS+YVFHSfRm9nnXXWlqs/L1u2rGDGjBkVM2bM6Dtx4sSlF1100by22+6yyy51b7311jPDhg17X9CcOXNm8Z577vmRc889d8TnPve55zs618qVK+OII4748D333FP1hS98YcGvfvWrWYWFuZfBzzzzTOk555zzoS233LL+4YcffnmbbbZ5t1/vn/70p8ojjzxyu1NOOWXEvffeO7P9cWfPnl3y7LPPPt++rrVpbGzkuOOO+/DKlSsLb7vttpcPPfTQFavXvfHGG8W77bbbR771rW996PDDD3+2T58+6amnnuozY8aMik984hM17c/d3NzM4sWLC9c8i7qzlFIjcGxE7PRLOP0mGFIPb9XCNSmlGVnXJ4FBWFInSik1RMSIejimLqV/ZF2PpN7p4gsuGHrrlCnDZtTXF4xcvXDVqngDOHTKlGEA3/vP/5zXwe5dbvLkycPaLxs1alTd0Ucfvbj9G+yO+tuOGjWqcdKkSUuuu+66wa+++mrJ2t7azp8/v3DSpEnbzpgxo+8FF1ww+wc/+MH8tuuvuOKKwU1NTfHDH/5wVtsQDPCZz3xm+QEHHFDz4IMPVi1ZsqSgfV0XXXTR2+sTggFuvvnmqlmzZpV+7Wtfm982BAOMHDmy8dRTT5130UUXjfjzn//cb/VbYYCysrI13uYXFhYyaNAg+yD3XC/Vwb+tSmn+B28qdS2DsKROExHDyHUFejbrWiT1TkuWLCm4avLk94fgViOBO+rqCsZOmTLs2+edt6B///7dopl0Smn66s/Lli0rmD59etn555+/1Te+8Y1tnn/++T5XXXXVnLbb33PPPRVTpkwZ8ve//73v4sWLixobG6Pt+jfffLO4fRBeuHBh0Z577jlm9uzZpVdfffXrJ5988uL2dTz11FMVAA899FDlE088sUZ/40WLFhU3Nzfz3HPPlbVvirzvvvvWru/f99FHH60AmDVrVknbt+Gr/fOf/ywFeOGFF8qApePGjVs1ZsyYVbfffvsW48aNK500adKSCRMmrNh3331XlpWVpfU9r7qlIcAag8VJ3YFBWFJn2g+YllLy6b2kzeLGG2+s3qeggJEdrB8J7FNQwA033FD1zW9+c40wmLV+/fq1TJw4ceXtt98+c+utt/7Yf//3fw85/fTTF2y77baNANdff33Vl770pVElJSUte++997JtttmmvqKioqWgoIBp06ZVPvnkk33r6urWaPe9cOHC4tra2sIhQ4Y0HHjggSvWPDPU1NQUAfz85z8fsq4aly1btsbxR4wYsd7TIy1evLgI4K677qq+6667OtxuxYoVBQBFRUVMnTr15fPOO2/LO+64o/qSSy7Z6pJLLqGioqLlqKOOWnjllVfO6S4PNbThUko+zFC3ZBCW1JkmkJs9SZI2i3nz5hVt19AQ69pmu4aGmDt37hojIHcnAwcObN5mm23qXnjhhfLHH3+8Ytttt60B+P73vz+8uLg4PfLIIy+OGzeuru0+xx133IeefPLJvms73pgxY1Z98YtffOe0007bZv/999/+3nvvfXmHHXZ431vjysrKZoBFixbN2GKLLTYoWG5In+t+/fo1A9xwww3/PP7445d+0PYAgwYNar7mmmtmAbOee+650nvvvbfyV7/61aDrr79+8NKlS4v++Mc/vr4h9UrSB+k+I0lI6g0mAA9lXYSk3mvo0KFNr5SUrPMN0yslJWnYsGHr/QYzK0uXLi2C3OBfq7311lulo0aNWtU+BDc3N/PEE0+sNQSvdsoppyz+xS9+8dqCBQuKJ06cOOaZZ54pbbt+3LhxtQD33HNPZaf9JdZizz33rAWYOnXqRp1np512qj/zzDMXPvbYYy+Vl5e33HfffVWdW6G6QkQUArYQU7dlEJbUKSJiMDAccJAsSZvN8ccfv2RaSwtvdLD+DWBaSwsnnHBCtx6t/te//nXVnDlzSoqKitLEiRPfbcq85ZZb1r/55ptlbef0bWlp4dvf/vaWM2fOLPug437pS19acu21186sqakpOvDAA7d/6qmn3t3nzDPPXFBUVJTOO++8Ee1DMkBdXV3cfffd6wzb6+O4446rGTFiRP31118/6Oabb+6/tm3uu+++iuXLlxcAvPTSSyUvvPBCSfttFi5cWNTQ0BClpaU2i+6ZhgIOkqVuy6bRkjrLfsAj9g+WtDlVV1e3nHrmmXMPnTJl2B11de8bMOsN4NCyspZTzzhjbnfqU9p2wKja2tqCl19+uWzq1Kn9Ac4///w5I0aMeHc05lNOOWX+ueee+6Hx48fv8KlPfWpJcXFxevLJJ/vOnDmzbOLEiUsffPDBtQbLto4//vilZWVl/zzhhBNGffKTn9z+zjvvfGXPPfdcNXbs2LorrrjijdNPP33kuHHjdtxvv/2WjRo1qq6xsTFmz55d8tRTT1VWV1c3vv766x1Oz7Q+SktL0y233DLzsMMOG33sscdue9lll9XuuOOOK8vLy1vmzJlT8vTTT5fPnj279M0333y6srKy5cknnyw/8cQTR+200061o0ePrhs2bFjjwoULi+65556qpqamOPXUU7vNCODaMPYPVndmEJbUWewfLKlLXHzJJfMAxk6ePGyfwkK2a2iIV0pK0rTmZk4944y5q9d3F22nTyosLKS6urpx4sSJNd/61rfeOeKII5a13facc85ZWFpamq6++uoht95664CysrKWj3/84yt+9atfvfHb3/62en2CMMBRRx21rLS09J/HHHPMtocccsj2f/7zn1+Z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1dW976XFnDlzitfnONOmTatobm4mIjjrrLO2bL++sbExAF555ZWy1cs++9nPLrruuusGb7fddjsefvjhSyZOnLh84sSJtQMGDGje1L+XerXilNIGPfCRugODsKQNNQF4KOsiJOWnG2+8sbqgYB/WDMGrjaSgYB9uuOGGqm9+85uLu7C09xk8eHDja6+9VjZr1qyS9d3nhRdeKNl7770/smzZsqLx48evmDBhwrL+/fs3FxYW8uabb5b8/ve/H1BfX79erfneeeedIoDnnnuu/LnnnivvaLva2tp3j/fLX/5y1oc//OH6G2+8ceDVV0TkSGQAACAASURBVF899Oqrrx5aWFiYJkyYsPSKK66YvdNOO63xtlqSeiqbRkvaUA6UJSkz8+bNK2po2G6dc5Y2NGwXc+fOXa83p5vLHnvssQLggQceqFzffS699NKhNTU1RZMnT37jiSeeePnaa6+ddcUVV7x9+eWXv33QQQct25DzV1VVNQN8+ctfnp9Smt7Rn7/97W+vrN6nqKiIiy66aMHLL7/8wuzZs5++9tprZx500EE1DzzwQNWkSZNGr1q1yrliJfUaBmFJ6y0iyoBdgUeyrkVSfho6dGhTSckr6xyYp6TklTRs2LBMp3I5+eSTFxYVFaW//OUv1dOnTy9b17arA+brr79eCvD5z39+jdGZH3744b4bcv799tuvtqCggMcff3y9g3hbw4cPbzrxxBNr7rzzztf22GOP5bNmzSp96qmn+mzMsdR7RcRA7B+sHsogLGlD7Aa8mFLaoDcTktRZjj/++CUtLdOANzrY4g1aWqZxwgkn1HRhWWvYfvvtG7797W+/3djYGIcffvjoqVOnrrV58u9+97t+EydOHA0wYsSIeoC77rrrfeH11ltv7fd///d/gzbk/MOHD286/PDDFz3//PPl55xzzrCmpjXHunr++edLX3rppRLIhfF77rmnov029fX1UVNTUwRQUVHR4/pca7MrTSnZZF49kn2EJW0Im0VLylR1dXXLmWeeOnfKlEOH1dXd0W7ArDcoKzu05YwzTp3bHQbKuvTSS+c1NTXF5MmTt5wwYcJHxo4dW7vzzjvX9u3bt2XBggVFf/vb3yrffPPN0h133HElwOmnn/7O7373u4Ff+tKXRt18881Lhg0b1vjiiy+W/fWvf+0/adKkJXfccUf1hpz/mmuueev1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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "k-qf5XOYyUA5",
"outputId": "0d112238-98a5-49d6-d6bf-ba5ed1096672"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
" [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
" [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
" [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],\n",
" [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
" [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],\n",
" [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
" [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],\n",
" [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],\n",
" [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.]])"
]
},
"metadata": {},
"execution_count": 13
}
],
"source": [
"optimal_plan_2"
]
},
{
"cell_type": "code",
"source": [
"# Solve with Sinkhorn \n",
"optimal_plan_sinkhorn_1 = sinkhorn(a, b, C_1/C_1.max(), epsilon=0.1)\n",
"optimal_plan_sinkhorn_2 = sinkhorn(a, b, C_2/C_2.max(), epsilon=0.1)"
],
"metadata": {
"id": "FxAs4WFD3k7u"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "oh-CirdayUA5"
},
"source": [
"We first show that this algorithm is consistent with classical optimal transport, using the \"croissant\" transport example."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "4AR8AztxyUA5"
},
"outputs": [],
"source": [
"plan_diff = []\n",
"distance_diff = []\n",
"for epsilon in np.linspace(0.01, 1, 100):\n",
" optimal_plan_sinkhorn = sinkhorn(a, b, C_2/C_2.max(), epsilon, 1000)\n",
" optimal_cost_sinkhorn = np.sum(optimal_plan_sinkhorn*C_2)\n",
" plan_diff.append(np.linalg.norm(optimal_plan_sinkhorn-optimal_plan_2)/b.sum())\n",
" distance_diff.append(100*np.abs(optimal_cost_sinkhorn-optimal_cost_2)/optimal_cost_2)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 364
},
"id": "fjSXa_IHyUA5",
"outputId": "e7a116e3-c9d5-4775-c22f-39a852a3e61b"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
],
"source": [
"plt.figure(figsize=(16,5))\n",
"plt.loglog(np.linspace(0.01, 1, 100), plan_diff, lw=4)\n",
"plt.xlabel('Regularization Strength $\\epsilon$', fontsize=25)\n",
"plt.ylabel('$||P^* - P_\\epsilon^*||_F$', fontsize=25)\n",
"plt.xticks(fontsize=20)\n",
"plt.yticks(fontsize=20)\n",
"plt.grid(ls='--')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 364
},
"id": "XI15BhamyUA5",
"outputId": "1c13200a-7c23-4c61-ac7c-235f10d2f23e"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
],
"source": [
"plt.figure(figsize=(16,5))\n",
"plt.loglog(np.linspace(0.01, 1, 100), distance_diff, lw=4)\n",
"plt.xlabel('Regularization Strength $\\epsilon$', fontsize=25)\n",
"plt.ylabel('Error in %', fontsize=25)\n",
"plt.xticks(fontsize=20)\n",
"plt.yticks(fontsize=20)\n",
"plt.grid(ls='--')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"source": [],
"metadata": {
"id": "H5ghlKeQBe_7"
},
"execution_count": null,
"outputs": []
}
],
"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.7.4"
},
"colab": {
"provenance": []
}
},
"nbformat": 4,
"nbformat_minor": 0
}