summaryrefslogtreecommitdiff
path: root/notebooks/plot_optim_OTreg.ipynb
diff options
context:
space:
mode:
Diffstat (limited to 'notebooks/plot_optim_OTreg.ipynb')
-rw-r--r--notebooks/plot_optim_OTreg.ipynb643
1 files changed, 0 insertions, 643 deletions
diff --git a/notebooks/plot_optim_OTreg.ipynb b/notebooks/plot_optim_OTreg.ipynb
deleted file mode 100644
index 34f42af..0000000
--- a/notebooks/plot_optim_OTreg.ipynb
+++ /dev/null
@@ -1,643 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "%matplotlib inline"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "# Regularized OT with generic solver\n",
- "\n",
- "\n",
- "Illustrates the use of the generic solver for regularized OT with\n",
- "user-designed regularization term. It uses Conditional gradient as in [6] and\n",
- "generalized Conditional Gradient as proposed in [5][7].\n",
- "\n",
- "\n",
- "[5] N. Courty; R. Flamary; D. Tuia; A. Rakotomamonjy, Optimal Transport for\n",
- "Domain Adaptation, in IEEE Transactions on Pattern Analysis and Machine\n",
- "Intelligence , vol.PP, no.99, pp.1-1.\n",
- "\n",
- "[6] Ferradans, S., Papadakis, N., Peyré, G., & Aujol, J. F. (2014).\n",
- "Regularized discrete optimal transport. SIAM Journal on Imaging Sciences,\n",
- "7(3), 1853-1882.\n",
- "\n",
- "[7] Rakotomamonjy, A., Flamary, R., & Courty, N. (2015). Generalized\n",
- "conditional gradient: analysis of convergence and applications.\n",
- "arXiv preprint arXiv:1510.06567.\n",
- "\n",
- "\n",
- "\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "import matplotlib.pylab as pl\n",
- "import ot\n",
- "import ot.plot"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Generate data\n",
- "-------------\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "n = 100 # nb bins\n",
- "\n",
- "# bin positions\n",
- "x = np.arange(n, dtype=np.float64)\n",
- "\n",
- "# Gaussian distributions\n",
- "a = ot.datasets.make_1D_gauss(n, m=20, s=5) # m= mean, s= std\n",
- "b = ot.datasets.make_1D_gauss(n, m=60, s=10)\n",
- "\n",
- "# loss matrix\n",
- "M = ot.dist(x.reshape((n, 1)), x.reshape((n, 1)))\n",
- "M /= M.max()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Solve EMD\n",
- "---------\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "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": [
- "G0 = ot.emd(a, b, M)\n",
- "\n",
- "pl.figure(3, figsize=(5, 5))\n",
- "ot.plot.plot1D_mat(a, b, G0, 'OT matrix G0')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Solve EMD with Frobenius norm regularization\n",
- "--------------------------------------------\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 0|1.760578e-01|0.000000e+00|0.000000e+00\n",
- " 1|1.669467e-01|5.457501e-02|9.111116e-03\n",
- " 2|1.665639e-01|2.298130e-03|3.827855e-04\n",
- " 3|1.664378e-01|7.572776e-04|1.260396e-04\n",
- " 4|1.664077e-01|1.811855e-04|3.015066e-05\n",
- " 5|1.663912e-01|9.936787e-05|1.653393e-05\n",
- " 6|1.663852e-01|3.555826e-05|5.916369e-06\n",
- " 7|1.663814e-01|2.305693e-05|3.836245e-06\n",
- " 8|1.663785e-01|1.760450e-05|2.929009e-06\n",
- " 9|1.663767e-01|1.078011e-05|1.793559e-06\n",
- " 10|1.663751e-01|9.525192e-06|1.584755e-06\n",
- " 11|1.663737e-01|8.396466e-06|1.396951e-06\n",
- " 12|1.663727e-01|6.086938e-06|1.012700e-06\n",
- " 13|1.663720e-01|4.042609e-06|6.725769e-07\n",
- " 14|1.663713e-01|4.160914e-06|6.922568e-07\n",
- " 15|1.663707e-01|3.823502e-06|6.361187e-07\n",
- " 16|1.663702e-01|3.022440e-06|5.028438e-07\n",
- " 17|1.663697e-01|3.181249e-06|5.292634e-07\n",
- " 18|1.663692e-01|2.698532e-06|4.489527e-07\n",
- " 19|1.663687e-01|3.258253e-06|5.420712e-07\n",
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 20|1.663682e-01|2.741118e-06|4.560349e-07\n",
- " 21|1.663678e-01|2.624135e-06|4.365715e-07\n",
- " 22|1.663673e-01|2.645179e-06|4.400714e-07\n",
- " 23|1.663670e-01|1.957237e-06|3.256196e-07\n",
- " 24|1.663666e-01|2.261541e-06|3.762450e-07\n",
- " 25|1.663663e-01|1.851305e-06|3.079948e-07\n",
- " 26|1.663660e-01|1.942296e-06|3.231320e-07\n",
- " 27|1.663657e-01|2.092896e-06|3.481860e-07\n",
- " 28|1.663653e-01|1.924361e-06|3.201470e-07\n",
- " 29|1.663651e-01|1.625455e-06|2.704189e-07\n",
- " 30|1.663648e-01|1.641123e-06|2.730250e-07\n",
- " 31|1.663645e-01|1.566666e-06|2.606377e-07\n",
- " 32|1.663643e-01|1.338514e-06|2.226810e-07\n",
- " 33|1.663641e-01|1.222711e-06|2.034152e-07\n",
- " 34|1.663639e-01|1.221805e-06|2.032642e-07\n",
- " 35|1.663637e-01|1.440781e-06|2.396935e-07\n",
- " 36|1.663634e-01|1.520091e-06|2.528875e-07\n",
- " 37|1.663632e-01|1.288193e-06|2.143080e-07\n",
- " 38|1.663630e-01|1.123055e-06|1.868347e-07\n",
- " 39|1.663628e-01|1.024487e-06|1.704365e-07\n",
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 40|1.663627e-01|1.079606e-06|1.796061e-07\n",
- " 41|1.663625e-01|1.172093e-06|1.949922e-07\n",
- " 42|1.663623e-01|1.047880e-06|1.743277e-07\n",
- " 43|1.663621e-01|1.010577e-06|1.681217e-07\n",
- " 44|1.663619e-01|1.064438e-06|1.770820e-07\n",
- " 45|1.663618e-01|9.882375e-07|1.644049e-07\n",
- " 46|1.663616e-01|8.532647e-07|1.419505e-07\n",
- " 47|1.663615e-01|9.930189e-07|1.652001e-07\n",
- " 48|1.663613e-01|8.728955e-07|1.452161e-07\n",
- " 49|1.663612e-01|9.524214e-07|1.584459e-07\n",
- " 50|1.663610e-01|9.088418e-07|1.511958e-07\n",
- " 51|1.663609e-01|7.639430e-07|1.270902e-07\n",
- " 52|1.663608e-01|6.662611e-07|1.108397e-07\n",
- " 53|1.663607e-01|7.133700e-07|1.186767e-07\n",
- " 54|1.663605e-01|7.648141e-07|1.272349e-07\n",
- " 55|1.663604e-01|6.557516e-07|1.090911e-07\n",
- " 56|1.663603e-01|7.304213e-07|1.215131e-07\n",
- " 57|1.663602e-01|6.353809e-07|1.057021e-07\n",
- " 58|1.663601e-01|7.968279e-07|1.325603e-07\n",
- " 59|1.663600e-01|6.367159e-07|1.059240e-07\n",
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 60|1.663599e-01|5.610790e-07|9.334102e-08\n",
- " 61|1.663598e-01|5.787466e-07|9.628015e-08\n",
- " 62|1.663596e-01|6.937777e-07|1.154166e-07\n",
- " 63|1.663596e-01|5.599432e-07|9.315190e-08\n",
- " 64|1.663595e-01|5.813048e-07|9.670555e-08\n",
- " 65|1.663594e-01|5.724600e-07|9.523409e-08\n",
- " 66|1.663593e-01|6.081892e-07|1.011779e-07\n",
- " 67|1.663592e-01|5.948732e-07|9.896260e-08\n",
- " 68|1.663591e-01|4.941833e-07|8.221188e-08\n",
- " 69|1.663590e-01|5.213739e-07|8.673523e-08\n",
- " 70|1.663589e-01|5.127355e-07|8.529811e-08\n",
- " 71|1.663588e-01|4.349251e-07|7.235363e-08\n",
- " 72|1.663588e-01|5.007084e-07|8.329722e-08\n",
- " 73|1.663587e-01|4.880265e-07|8.118744e-08\n",
- " 74|1.663586e-01|4.931950e-07|8.204723e-08\n",
- " 75|1.663585e-01|4.981309e-07|8.286832e-08\n",
- " 76|1.663584e-01|3.952959e-07|6.576082e-08\n",
- " 77|1.663584e-01|4.544857e-07|7.560750e-08\n",
- " 78|1.663583e-01|4.237579e-07|7.049564e-08\n",
- " 79|1.663582e-01|4.382386e-07|7.290460e-08\n",
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 80|1.663582e-01|3.646051e-07|6.065503e-08\n",
- " 81|1.663581e-01|4.197994e-07|6.983702e-08\n",
- " 82|1.663580e-01|4.072764e-07|6.775370e-08\n",
- " 83|1.663580e-01|3.994645e-07|6.645410e-08\n",
- " 84|1.663579e-01|4.842721e-07|8.056248e-08\n",
- " 85|1.663578e-01|3.276486e-07|5.450691e-08\n",
- " 86|1.663578e-01|3.737346e-07|6.217366e-08\n",
- " 87|1.663577e-01|4.282043e-07|7.123508e-08\n",
- " 88|1.663576e-01|4.020937e-07|6.689135e-08\n",
- " 89|1.663576e-01|3.431951e-07|5.709310e-08\n",
- " 90|1.663575e-01|3.052335e-07|5.077789e-08\n",
- " 91|1.663575e-01|3.500538e-07|5.823407e-08\n",
- " 92|1.663574e-01|3.063176e-07|5.095821e-08\n",
- " 93|1.663573e-01|3.576367e-07|5.949549e-08\n",
- " 94|1.663573e-01|3.224681e-07|5.364492e-08\n",
- " 95|1.663572e-01|3.673221e-07|6.110670e-08\n",
- " 96|1.663572e-01|3.635561e-07|6.048017e-08\n",
- " 97|1.663571e-01|3.527236e-07|5.867807e-08\n",
- " 98|1.663571e-01|2.788548e-07|4.638946e-08\n",
- " 99|1.663570e-01|2.727141e-07|4.536791e-08\n",
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 100|1.663570e-01|3.127278e-07|5.202445e-08\n",
- " 101|1.663569e-01|2.637504e-07|4.387670e-08\n",
- " 102|1.663569e-01|2.922750e-07|4.862195e-08\n",
- " 103|1.663568e-01|3.076454e-07|5.117891e-08\n",
- " 104|1.663568e-01|2.911509e-07|4.843492e-08\n",
- " 105|1.663567e-01|2.403398e-07|3.998215e-08\n",
- " 106|1.663567e-01|2.439790e-07|4.058755e-08\n",
- " 107|1.663567e-01|2.634542e-07|4.382735e-08\n",
- " 108|1.663566e-01|2.452203e-07|4.079401e-08\n",
- " 109|1.663566e-01|2.852991e-07|4.746137e-08\n",
- " 110|1.663565e-01|2.165490e-07|3.602434e-08\n",
- " 111|1.663565e-01|2.450250e-07|4.076149e-08\n",
- " 112|1.663564e-01|2.685294e-07|4.467159e-08\n",
- " 113|1.663564e-01|2.821800e-07|4.694245e-08\n",
- " 114|1.663564e-01|2.237390e-07|3.722040e-08\n",
- " 115|1.663563e-01|1.992842e-07|3.315219e-08\n",
- " 116|1.663563e-01|2.166739e-07|3.604506e-08\n",
- " 117|1.663563e-01|2.086064e-07|3.470297e-08\n",
- " 118|1.663562e-01|2.435945e-07|4.052346e-08\n",
- " 119|1.663562e-01|2.292497e-07|3.813711e-08\n",
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 120|1.663561e-01|2.366209e-07|3.936334e-08\n",
- " 121|1.663561e-01|2.138746e-07|3.557935e-08\n",
- " 122|1.663561e-01|2.009637e-07|3.343153e-08\n",
- " 123|1.663560e-01|2.386258e-07|3.969683e-08\n",
- " 124|1.663560e-01|1.927442e-07|3.206415e-08\n",
- " 125|1.663560e-01|2.081681e-07|3.463000e-08\n",
- " 126|1.663559e-01|1.759123e-07|2.926406e-08\n",
- " 127|1.663559e-01|1.890771e-07|3.145409e-08\n",
- " 128|1.663559e-01|1.971315e-07|3.279398e-08\n",
- " 129|1.663558e-01|2.101983e-07|3.496771e-08\n",
- " 130|1.663558e-01|2.035645e-07|3.386414e-08\n",
- " 131|1.663558e-01|1.984492e-07|3.301317e-08\n",
- " 132|1.663557e-01|1.849064e-07|3.076024e-08\n",
- " 133|1.663557e-01|1.795703e-07|2.987255e-08\n",
- " 134|1.663557e-01|1.624087e-07|2.701762e-08\n",
- " 135|1.663557e-01|1.689557e-07|2.810673e-08\n",
- " 136|1.663556e-01|1.644308e-07|2.735399e-08\n",
- " 137|1.663556e-01|1.618007e-07|2.691644e-08\n",
- " 138|1.663556e-01|1.483013e-07|2.467075e-08\n",
- " 139|1.663555e-01|1.708771e-07|2.842636e-08\n",
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 140|1.663555e-01|2.013847e-07|3.350146e-08\n",
- " 141|1.663555e-01|1.721217e-07|2.863339e-08\n",
- " 142|1.663554e-01|2.027911e-07|3.373540e-08\n",
- " 143|1.663554e-01|1.764565e-07|2.935449e-08\n",
- " 144|1.663554e-01|1.677151e-07|2.790030e-08\n",
- " 145|1.663554e-01|1.351982e-07|2.249094e-08\n",
- " 146|1.663553e-01|1.423360e-07|2.367836e-08\n",
- " 147|1.663553e-01|1.541112e-07|2.563722e-08\n",
- " 148|1.663553e-01|1.491601e-07|2.481358e-08\n",
- " 149|1.663553e-01|1.466407e-07|2.439446e-08\n",
- " 150|1.663552e-01|1.801524e-07|2.996929e-08\n",
- " 151|1.663552e-01|1.714107e-07|2.851507e-08\n",
- " 152|1.663552e-01|1.491257e-07|2.480784e-08\n",
- " 153|1.663552e-01|1.513799e-07|2.518282e-08\n",
- " 154|1.663551e-01|1.354539e-07|2.253345e-08\n",
- " 155|1.663551e-01|1.233818e-07|2.052519e-08\n",
- " 156|1.663551e-01|1.576219e-07|2.622121e-08\n",
- " 157|1.663551e-01|1.452791e-07|2.416792e-08\n",
- " 158|1.663550e-01|1.262867e-07|2.100843e-08\n",
- " 159|1.663550e-01|1.316379e-07|2.189863e-08\n",
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 160|1.663550e-01|1.295447e-07|2.155041e-08\n",
- " 161|1.663550e-01|1.283286e-07|2.134810e-08\n",
- " 162|1.663550e-01|1.569222e-07|2.610479e-08\n",
- " 163|1.663549e-01|1.172942e-07|1.951247e-08\n",
- " 164|1.663549e-01|1.399809e-07|2.328651e-08\n",
- " 165|1.663549e-01|1.229432e-07|2.045221e-08\n",
- " 166|1.663549e-01|1.326191e-07|2.206184e-08\n",
- " 167|1.663548e-01|1.209694e-07|2.012384e-08\n",
- " 168|1.663548e-01|1.372136e-07|2.282614e-08\n",
- " 169|1.663548e-01|1.338395e-07|2.226484e-08\n",
- " 170|1.663548e-01|1.416497e-07|2.356410e-08\n",
- " 171|1.663548e-01|1.298576e-07|2.160242e-08\n",
- " 172|1.663547e-01|1.190590e-07|1.980603e-08\n",
- " 173|1.663547e-01|1.167083e-07|1.941497e-08\n",
- " 174|1.663547e-01|1.069425e-07|1.779038e-08\n",
- " 175|1.663547e-01|1.217780e-07|2.025834e-08\n",
- " 176|1.663547e-01|1.140754e-07|1.897697e-08\n",
- " 177|1.663546e-01|1.160707e-07|1.930890e-08\n",
- " 178|1.663546e-01|1.101798e-07|1.832892e-08\n",
- " 179|1.663546e-01|1.114904e-07|1.854694e-08\n",
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 180|1.663546e-01|1.064022e-07|1.770049e-08\n",
- " 181|1.663546e-01|9.258231e-08|1.540149e-08\n",
- " 182|1.663546e-01|1.213120e-07|2.018080e-08\n",
- " 183|1.663545e-01|1.164296e-07|1.936859e-08\n",
- " 184|1.663545e-01|1.188762e-07|1.977559e-08\n",
- " 185|1.663545e-01|9.394153e-08|1.562760e-08\n",
- " 186|1.663545e-01|1.028656e-07|1.711216e-08\n",
- " 187|1.663545e-01|1.115348e-07|1.855431e-08\n",
- " 188|1.663544e-01|9.768310e-08|1.625002e-08\n",
- " 189|1.663544e-01|1.021806e-07|1.699820e-08\n",
- " 190|1.663544e-01|1.086303e-07|1.807113e-08\n",
- " 191|1.663544e-01|9.879008e-08|1.643416e-08\n",
- " 192|1.663544e-01|1.050210e-07|1.747071e-08\n",
- " 193|1.663544e-01|1.002463e-07|1.667641e-08\n",
- " 194|1.663543e-01|1.062747e-07|1.767925e-08\n",
- " 195|1.663543e-01|9.348538e-08|1.555170e-08\n",
- " 196|1.663543e-01|7.992512e-08|1.329589e-08\n",
- " 197|1.663543e-01|9.558020e-08|1.590018e-08\n",
- " 198|1.663543e-01|9.993772e-08|1.662507e-08\n",
- " 199|1.663543e-01|8.588499e-08|1.428734e-08\n",
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 200|1.663543e-01|8.737134e-08|1.453459e-08\n"
- ]
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 432x288 with 3 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "def f(G):\n",
- " return 0.5 * np.sum(G**2)\n",
- "\n",
- "\n",
- "def df(G):\n",
- " return G\n",
- "\n",
- "\n",
- "reg = 1e-1\n",
- "\n",
- "Gl2 = ot.optim.cg(a, b, M, reg, f, df, verbose=True)\n",
- "\n",
- "pl.figure(3)\n",
- "ot.plot.plot1D_mat(a, b, Gl2, 'OT matrix Frob. reg')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Solve EMD with entropic regularization\n",
- "--------------------------------------\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 0|1.692289e-01|0.000000e+00|0.000000e+00\n",
- " 1|1.617643e-01|4.614437e-02|7.464513e-03\n",
- " 2|1.612639e-01|3.102965e-03|5.003963e-04\n",
- " 3|1.611291e-01|8.371098e-04|1.348827e-04\n",
- " 4|1.610468e-01|5.110558e-04|8.230389e-05\n",
- " 5|1.610198e-01|1.672927e-04|2.693743e-05\n",
- " 6|1.610130e-01|4.232417e-05|6.814742e-06\n",
- " 7|1.610090e-01|2.513455e-05|4.046887e-06\n",
- " 8|1.610002e-01|5.443507e-05|8.764057e-06\n",
- " 9|1.609996e-01|3.657071e-06|5.887869e-07\n",
- " 10|1.609948e-01|2.998735e-05|4.827807e-06\n",
- " 11|1.609695e-01|1.569217e-04|2.525962e-05\n",
- " 12|1.609533e-01|1.010779e-04|1.626881e-05\n",
- " 13|1.609520e-01|8.043897e-06|1.294681e-06\n",
- " 14|1.609465e-01|3.415246e-05|5.496718e-06\n",
- " 15|1.609386e-01|4.898605e-05|7.883745e-06\n",
- " 16|1.609324e-01|3.837052e-05|6.175060e-06\n",
- " 17|1.609298e-01|1.617826e-05|2.603564e-06\n",
- " 18|1.609184e-01|7.080015e-05|1.139305e-05\n",
- " 19|1.609083e-01|6.273206e-05|1.009411e-05\n",
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 20|1.608988e-01|5.940805e-05|9.558681e-06\n",
- " 21|1.608853e-01|8.380030e-05|1.348223e-05\n",
- " 22|1.608844e-01|5.185045e-06|8.341930e-07\n",
- " 23|1.608824e-01|1.279113e-05|2.057868e-06\n",
- " 24|1.608819e-01|3.156821e-06|5.078753e-07\n",
- " 25|1.608783e-01|2.205746e-05|3.548567e-06\n",
- " 26|1.608764e-01|1.189894e-05|1.914259e-06\n",
- " 27|1.608755e-01|5.474607e-06|8.807303e-07\n",
- " 28|1.608737e-01|1.144227e-05|1.840760e-06\n",
- " 29|1.608676e-01|3.775335e-05|6.073291e-06\n",
- " 30|1.608638e-01|2.348020e-05|3.777116e-06\n",
- " 31|1.608627e-01|6.863136e-06|1.104023e-06\n",
- " 32|1.608529e-01|6.110230e-05|9.828482e-06\n",
- " 33|1.608487e-01|2.641106e-05|4.248184e-06\n",
- " 34|1.608409e-01|4.823638e-05|7.758383e-06\n",
- " 35|1.608373e-01|2.256641e-05|3.629519e-06\n",
- " 36|1.608338e-01|2.132444e-05|3.429691e-06\n",
- " 37|1.608310e-01|1.786649e-05|2.873484e-06\n",
- " 38|1.608260e-01|3.103848e-05|4.991794e-06\n",
- " 39|1.608206e-01|3.321265e-05|5.341279e-06\n",
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 40|1.608201e-01|3.054747e-06|4.912648e-07\n",
- " 41|1.608195e-01|4.198335e-06|6.751739e-07\n",
- " 42|1.608193e-01|8.458736e-07|1.360328e-07\n",
- " 43|1.608159e-01|2.153759e-05|3.463587e-06\n",
- " 44|1.608115e-01|2.738314e-05|4.403523e-06\n",
- " 45|1.608108e-01|3.960032e-06|6.368161e-07\n",
- " 46|1.608081e-01|1.675447e-05|2.694254e-06\n",
- " 47|1.608072e-01|5.976340e-06|9.610383e-07\n",
- " 48|1.608046e-01|1.604130e-05|2.579515e-06\n",
- " 49|1.608020e-01|1.617036e-05|2.600226e-06\n",
- " 50|1.608014e-01|3.957795e-06|6.364188e-07\n",
- " 51|1.608011e-01|1.292411e-06|2.078211e-07\n",
- " 52|1.607998e-01|8.431795e-06|1.355831e-06\n",
- " 53|1.607964e-01|2.127054e-05|3.420225e-06\n",
- " 54|1.607947e-01|1.021878e-05|1.643126e-06\n",
- " 55|1.607947e-01|3.560621e-07|5.725288e-08\n",
- " 56|1.607900e-01|2.929781e-05|4.710793e-06\n",
- " 57|1.607890e-01|5.740229e-06|9.229659e-07\n",
- " 58|1.607858e-01|2.039550e-05|3.279306e-06\n",
- " 59|1.607836e-01|1.319545e-05|2.121612e-06\n",
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 60|1.607826e-01|6.378947e-06|1.025624e-06\n",
- " 61|1.607808e-01|1.145102e-05|1.841105e-06\n",
- " 62|1.607776e-01|1.941743e-05|3.121889e-06\n",
- " 63|1.607743e-01|2.087422e-05|3.356037e-06\n",
- " 64|1.607741e-01|1.310249e-06|2.106541e-07\n",
- " 65|1.607738e-01|1.682752e-06|2.705425e-07\n",
- " 66|1.607691e-01|2.913936e-05|4.684709e-06\n",
- " 67|1.607671e-01|1.288855e-05|2.072055e-06\n",
- " 68|1.607654e-01|1.002448e-05|1.611590e-06\n",
- " 69|1.607641e-01|8.209492e-06|1.319792e-06\n",
- " 70|1.607632e-01|5.588467e-06|8.984199e-07\n",
- " 71|1.607619e-01|8.050388e-06|1.294196e-06\n",
- " 72|1.607618e-01|9.417493e-07|1.513973e-07\n",
- " 73|1.607598e-01|1.210509e-05|1.946012e-06\n",
- " 74|1.607591e-01|4.392914e-06|7.062009e-07\n",
- " 75|1.607579e-01|7.759587e-06|1.247415e-06\n",
- " 76|1.607574e-01|2.760280e-06|4.437356e-07\n",
- " 77|1.607556e-01|1.146469e-05|1.843012e-06\n",
- " 78|1.607550e-01|3.689456e-06|5.930984e-07\n",
- " 79|1.607550e-01|4.065631e-08|6.535705e-09\n",
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 80|1.607539e-01|6.555681e-06|1.053852e-06\n",
- " 81|1.607528e-01|7.177470e-06|1.153798e-06\n",
- " 82|1.607527e-01|5.306068e-07|8.529648e-08\n",
- " 83|1.607514e-01|7.816045e-06|1.256440e-06\n",
- " 84|1.607511e-01|2.301970e-06|3.700442e-07\n",
- " 85|1.607504e-01|4.281072e-06|6.881840e-07\n",
- " 86|1.607503e-01|7.821886e-07|1.257370e-07\n",
- " 87|1.607480e-01|1.403013e-05|2.255315e-06\n",
- " 88|1.607480e-01|1.169298e-08|1.879624e-09\n",
- " 89|1.607473e-01|4.235982e-06|6.809227e-07\n",
- " 90|1.607470e-01|1.717105e-06|2.760195e-07\n",
- " 91|1.607470e-01|6.148402e-09|9.883374e-10\n"
- ]
- },
- {
- "data": {
- "image/png": "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Wjv5ApSUwPnnwwsvwLJlsN9+XhVLi1ECFilEV1wBDzzgyffiizd+7C67wLPPehI+/HBYtc4iHtJMlIBFCs1zz8Evfwmnnlp38k3tsotXyZMnw4UXNm98Uk0JWKSQzJsHJ5wA220Hf/zjpj334IPhxz+GW26BMWOaJz6pRQlYpJBcdBHMnw+jR0PHjpv+/F/+EsrK4OyzYcmSpo9PalECFikU48fDPffABRfA8OENe402beDmm2HuXG9HlmalBCxSCCorvWrt29e7lTVGWRmMGgU33ABvv9008cl6KQGLFIJ77oHXXvO+vp3qWpW+Hq66Crp08Wpamo0SsEi+W7PGR7ftvjsce2zTvGaPHnDZZfDMM/Cf/zTNa8o6lIBF8t2dd/pQ4l/8AqwJV3E/80wfvPGzn2m+iGaiBCySz1at8uaCL30JvvrVpn3t9u3hJz+BF1/0SlianBKwSD674w747LOmr35T3/sebLkl/PznqoKbgRKwSL4qL4drr/Xqd7/9muccbdv6aLrx4+F//2uec7RiSsAi+eqhh7zt96KLmvc8p57qF+V++9vmPU8rpAQsko9C8IS4ww4+n29z6tDB+xg/9hi8917znquVUQIWyUdPPw1vvulzNxS1wJ/xWWf5Rblrrmn+c7UiSsAi+ei662CLLeD441vmfL16eVPE/ff7MGVpEkrAIvnmww/h3//2frpt27bcec85B9auhdtua7lzFjglYJF8c+ONUFrq8zW0pO2394U8b77Ze2BIoykBi+STZct83odjj/UmiJZ27rne7/jhh1v+3AVICVgkn9x7ryfhc86Jc/6RI31p+xtuiHP+AqMELJIvQoA//Ql2280n3omhqAh+8AN46SXvhSGNogQski9eeMH74Z55Ztw4TjkF2rXzpYukUZSARfLFLbdA165NN+VkQ3Xv7jH85S/eHCINpgQskg/mzIG//92rzw4dYkfjVfjy5d4vWBpMCVgkH9x1l3f9OuOM2JG43XeHnXf2LmmaJa3BlIBFcl1VFdx+u894tv32saNxZvD978Nbb8GECbGjyVtKwCK57plnYNq03Kl+U8cfDx07amRcIygBi+S6226Dnj3hyCNjR1Jb586ehB98EBYvjh1NXlICFslln38Ojz7qF99act6H+jrjDF8WSRfjGkQJWCSX3X03VFT40kC5aNddYcQIuPVWXYxr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MAwoBo4DrgauCyFsCywCvtucgYqIFJr6NkGUAO3NrAToAMwG9gfGJPvvBY5o+vBERApXnQk4hDALuBaYgSfeJcAkYHEIoSI5bCbQb33PN7NRZjbRzCbOmzevaaIWESkA9WmC6AYcDgwC+gIdgYPre4IQwm0hhLIQQlmvXr0aHKiISKGpTxPEgcC0EMK8EEI58DCwN9A1aZIA6A/MaqYYRUQKUn0S8AxgDzPrYGYGHAC8CzwPHJ0cczLwaPOEKCJSmOrTBjwBv9j2GjA5ec5twMXAhWb2EdADuLMZ4xQRKTgldR8CIYSfAz/PengqsHuTRyQi0kpoJJyISCRKwCIikSgBi4hEogQsIhKJErCISCRKwCIikSgBi4hEogQsIhKJErCISCRKwCIikSgBi4hEogQsIhKJErCISCRKwCIikSgBi4hEogQsIhKJErCISCRKwCIikSgBi4hEogQsIhKJErCISCRKwCIikSgBi4hEogQsIhKJErCISCRKwCIikSgBi4hEogQsIhKJErCISCRKwCIikSgBi4hEogQsIhKJErCISCRKwCIikVgIoeVOZjYPmN5iJ5RNsVUIoVfsIERakxZNwCIiUkNNECIikSgBi4hEogQsIhKJErCISCRKwCIikSgBi4hEogQsIhKJErCISCRKwCIikfw/9Ycaei/uNlEAAAAASUVORK5CYII=\n",
- "text/plain": [
- "<Figure size 360x360 with 3 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "def f(G):\n",
- " return np.sum(G * np.log(G))\n",
- "\n",
- "\n",
- "def df(G):\n",
- " return np.log(G) + 1.\n",
- "\n",
- "\n",
- "reg = 1e-3\n",
- "\n",
- "Ge = ot.optim.cg(a, b, M, reg, f, df, verbose=True)\n",
- "\n",
- "pl.figure(4, figsize=(5, 5))\n",
- "ot.plot.plot1D_mat(a, b, Ge, 'OT matrix Entrop. reg')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Solve EMD with Frobenius norm + entropic regularization\n",
- "-------------------------------------------------------\n",
- "\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "It. |Loss |Relative loss|Absolute loss\n",
- "------------------------------------------------\n",
- " 0|1.693084e-01|0.000000e+00|0.000000e+00\n",
- " 1|1.610202e-01|5.147342e-02|8.288260e-03\n",
- " 2|1.609508e-01|4.309685e-04|6.936474e-05\n",
- " 3|1.609484e-01|1.524885e-05|2.454278e-06\n",
- " 4|1.609477e-01|3.863641e-06|6.218444e-07\n",
- " 5|1.609475e-01|1.433633e-06|2.307397e-07\n",
- " 6|1.609474e-01|6.332412e-07|1.019185e-07\n",
- " 7|1.609474e-01|2.950826e-07|4.749276e-08\n",
- " 8|1.609473e-01|1.508393e-07|2.427718e-08\n",
- " 9|1.609473e-01|7.859971e-08|1.265041e-08\n",
- " 10|1.609473e-01|4.337432e-08|6.980981e-09\n"
- ]
- },
- {
- "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": [
- "def f(G):\n",
- " return 0.5 * np.sum(G**2)\n",
- "\n",
- "\n",
- "def df(G):\n",
- " return G\n",
- "\n",
- "\n",
- "reg1 = 1e-3\n",
- "reg2 = 1e-1\n",
- "\n",
- "Gel2 = ot.optim.gcg(a, b, M, reg1, reg2, f, df, verbose=True)\n",
- "\n",
- "pl.figure(5, figsize=(5, 5))\n",
- "ot.plot.plot1D_mat(a, b, Gel2, 'OT entropic + matrix Frob. reg')\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
-}