This file contains a collection of example codes for various functions offered by the OptimalTransport.jl package, and can be treated as an informal mini-tutorial for using the package.
Install the package as follows,
# using Pkg; # Pkg.add("OptimalTransport")
and load into our environment:
using OptimalTransport using Distances using LinearAlgebra using Plots, LaTeXStrings using StatsPlots using Random, Distributions
ERROR: ArgumentError: Package StatsPlots not found in current path:
- Run `import Pkg; Pkg.add("StatsPlots")` to install the StatsPlots package.
First, let us initialise two random probability measures $\mu$ (source measure) and $\nu$ (target measure) in 1D:
N = 200; M = 200 μ_spt = rand(N) ν_spt = rand(M) μ = fill(1/N, N) ν = fill(1/M, M);
Now we compute the quadratic cost matrix $C_{ij} = \| x_i - x_j \|^2$
C = pairwise(SqEuclidean(), μ_spt', ν_spt');
The earth mover's distance is defined as the optimal value of the Monge-Kantorovich problem:
\[ \min_{\gamma \in \Pi(\mu, \nu)} \langle \gamma, C \rangle = \min_{\gamma \in \Pi(\mu, \nu)} \sum_{i, j} \gamma_{ij} C_{ij} \]
where $\Pi(\mu, \nu)$ denotes the set of joint distributions whose marginals agree with $\mu$ and $\nu$. In the case where $C$ is the quadratic cost, this corresponds to what is known as the 2-Wasserstein distance.
N.B. At the moment, this functionality is available through PyCall and the Python OT library.
Using emd() returns the optimal transport plan $\gamma$:
γ = OptimalTransport.emd(μ, ν, C);
ERROR: MethodError: no method matching emd(::Array{Float64,1}, ::Array{Float64,1}, ::Array{Float64,2})
Closest candidates are:
emd(::Any, ::Any, ::Any, !Matched::Any) at /zfs/users/syz/syz/.julia/packages/OptimalTransport/45wZO/src/OptimalTransport.jl:47
whilst using emd2() returns the optimal transport cost at the minimum:
OptimalTransport.emd2(μ, ν, C)
ERROR: MethodError: no method matching emd2(::Array{Float64,1}, ::Array{Float64,1}, ::Array{Float64,2})
Closest candidates are:
emd2(::Any, ::Any, ::Any, !Matched::Any) at /zfs/users/syz/syz/.julia/packages/OptimalTransport/45wZO/src/OptimalTransport.jl:74
We may add an entropy term to the Monge-Kantorovich problem to obtain the entropically regularised optimal transport problem:
\[ \min_{\gamma \in \Pi(\mu, \nu)} \langle \gamma, C \rangle - \epsilon H(\gamma) \]
where $H(\gamma) = -\sum_{i, j} \gamma_{ij} \log(\gamma_{ij})$ is the entropy of the coupling $\gamma$ and $\epsilon$ controls the strength of regularisation.
This problem is strictly convex and admits a very efficient iterative scaling scheme for its solution known as the Sinkhorn algorithm [Peyre 2019].
Compute the transport plan using native Julia vs. POT
ϵ = 0.01 γ_ = OptimalTransport.pot_sinkhorn(μ, ν, C, ϵ); γ = OptimalTransport.sinkhorn(μ, ν, C, ϵ)
200×200 Array{Float64,2}:
1.00006e-24 6.56364e-6 9.51197e-17 0.000131254 0.00013603 1.69017e-
23 2.38572e-10 3.77072e-21 … 0.000109709 1.41985e-5 1.14677e-12 6.3
2456e-7 7.43872e-8 2.85166e-7 1.08118e-6
0.000193881 2.04971e-14 6.25759e-5 3.32854e-27 4.83878e-23 0.0001935
46 1.57911e-7 0.000171382 3.19241e-21 1.47463e-36 3.4518e-6 9.5
228e-12 4.25691e-10 2.75338e-45 1.66218e-42
1.84201e-5 7.73023e-11 0.000133929 2.23481e-21 7.06935e-18 2.88922e-
5 9.24514e-6 6.18718e-5 2.30812e-16 2.16438e-29 5.26422e-5 9.2
682e-9 1.60426e-7 5.36534e-37 1.44115e-34
1.30544e-6 6.00187e-9 7.43768e-5 5.33135e-18 6.15443e-15 2.76028e-
6 4.57418e-5 1.05967e-5 1.26223e-13 3.96649e-25 0.00010705 2.9
3942e-7 2.71763e-6 5.43242e-32 8.54362e-30
6.81945e-9 8.38366e-7 7.79228e-6 1.0927e-13 2.9055e-11 2.22772e-
8 0.000115866 2.00123e-7 3.02739e-10 1.58397e-19 7.42707e-5 1.1
1452e-5 4.13372e-5 2.61525e-25 1.88618e-23
9.03194e-5 9.89365e-13 0.000114152 1.5567e-24 1.15988e-20 0.0001099
09 1.22822e-6 0.000143317 … 5.6222e-19 2.66531e-33 1.48893e-5 2.5
3874e-10 7.48799e-9 1.5457e-41 6.54338e-39
3.7098e-33 5.233e-9 1.30639e-23 4.25771e-5 7.52844e-6 1.05875e-
31 1.5194e-15 6.57655e-29 2.68585e-6 0.000164685 1.53508e-18 1.0
4841e-10 4.10418e-12 6.63338e-5 9.83409e-5
1.88774e-26 1.89361e-6 4.00428e-18 0.000143809 0.000100634 3.58409e-
25 2.35465e-11 1.00378e-22 6.77151e-5 3.44265e-5 8.00462e-14 1.2
8733e-7 1.18591e-8 1.34573e-6 4.14179e-6
5.75199e-28 5.7234e-7 2.39616e-19 0.000133597 6.71796e-5 1.20442e-
26 2.88605e-12 4.08455e-24 3.88131e-5 6.24011e-5 7.33038e-15 2.9
0123e-8 2.17599e-9 4.27182e-6 1.10315e-5
6.02812e-8 1.5749e-7 2.21872e-5 3.1174e-15 1.44349e-12 1.67078e-
7 9.90213e-5 1.08858e-6 1.94257e-11 1.4716e-21 0.000103532 3.4
2663e-6 1.79468e-5 9.48587e-28 9.18471e-26
9.8553e-25 6.53528e-6 9.40224e-17 0.000131348 0.000135925 1.66634e-
23 2.3658e-10 3.72078e-21 … 0.00010955 1.42513e-5 1.1357e-12 6.2
8893e-7 7.39e-8 2.86948e-7 1.08708e-6
1.84455e-38 2.12598e-11 4.66925e-28 4.60426e-6 3.09916e-7 7.00819e-
37 4.41455e-19 7.61538e-34 7.08195e-8 0.000125607 1.90273e-22 1.8
0636e-13 3.87755e-15 0.000260204 0.000230988
1.4819e-12 3.70797e-5 6.16956e-8 1.91464e-9 8.75432e-8 8.15567e-
12 4.18224e-5 2.03064e-10 4.04955e-7 9.76778e-14 5.67383e-6 0.0
00103207 0.000128029 3.19161e-18 9.03835e-17
3.93975e-10 4.46781e-6 1.70359e-6 5.33022e-12 7.38689e-10 1.56109e-
9 0.000104153 2.04522e-8 5.69867e-9 2.88669e-17 3.75761e-5 3.3
2962e-5 8.23356e-5 1.43891e-22 7.34228e-21
2.54812e-26 2.0896e-6 5.09405e-18 0.000143792 0.000103586 4.79648e-
25 2.81269e-11 1.32094e-22 7.06402e-5 3.24602e-5 9.8096e-14 1.4
5766e-7 1.36728e-8 1.20794e-6 3.77546e-6
9.23926e-17 0.00013132 9.62852e-11 1.43857e-6 1.35928e-5 8.11254e-
16 1.99702e-6 5.03319e-14 … 3.03844e-5 1.78091e-9 6.74321e-8 9.0
1008e-5 4.19114e-5 8.43231e-13 1.03377e-11
0.000144048 1.26291e-13 8.66196e-5 5.77459e-26 6.1899e-22 0.0001573
84 4.23354e-7 0.00016625 3.54843e-20 4.73783e-35 7.07336e-6 4.4
7635e-11 1.65553e-9 1.48294e-43 7.61509e-41
1.05526e-8 6.18987e-7 9.69943e-6 5.61673e-14 1.66146e-11 3.34008e-
8 0.00011445 2.82093e-7 1.81838e-10 6.56318e-20 8.05942e-5 9.0
4574e-6 3.58502e-5 9.04479e-26 6.90313e-24
7.93428e-6 3.91486e-10 0.000119101 3.78044e-20 8.38547e-17 1.38251e-
5 1.77587e-5 3.63616e-5 2.32437e-15 7.50632e-28 7.39372e-5 3.4
2457e-8 4.7532e-7 3.39685e-35 7.55673e-33
0.000193815 2.05473e-14 6.26061e-5 3.34127e-27 4.85533e-23 0.0001935
04 1.58125e-7 0.000171384 3.20274e-21 1.48148e-36 3.45525e-6 9.5
4276e-12 4.26476e-10 2.76804e-45 1.67067e-42
1.36118e-5 1.4326e-10 0.000129703 6.49511e-21 1.79975e-17 2.22045e-
5 1.19336e-5 5.134e-5 … 5.52798e-16 8.22248e-29 6.04594e-5 1.5
2704e-8 2.43417e-7 2.55144e-36 6.38791e-34
1.19091e-6 6.75988e-9 7.21907e-5 6.65707e-18 7.45504e-15 2.54085e-
6 4.74198e-5 9.92723e-6 1.50772e-13 5.26643e-25 0.000108045 3.2
2259e-7 2.92369e-6 7.59376e-32 1.17518e-29
2.72856e-26 2.13686e-6 5.38138e-18 0.000143767 0.000104257 5.12606e-
25 2.92888e-11 1.4063e-22 7.13157e-5 3.20221e-5 1.02748e-13 1.4
9943e-7 1.41228e-8 1.17831e-6 3.69583e-6
1.41412e-21 4.21564e-5 2.75182e-14 6.01677e-5 0.000135613 1.89855e-
20 1.27908e-8 2.70106e-18 0.000156511 1.35215e-6 1.22003e-10 8.0
99e-6 1.54458e-6 7.27359e-9 4.16596e-8
4.0133e-5 1.23956e-11 0.000135449 9.99531e-23 4.60401e-19 5.63166e-
5 4.13741e-6 9.70167e-5 1.78769e-17 4.52684e-31 3.2817e-5 2.0
7502e-9 4.53765e-8 5.93377e-39 1.94582e-36
⋮ ⋮
⋱ ⋮
1.18903e-38 1.72764e-11 3.2221e-28 4.19063e-6 2.7282e-7 4.56249e-
37 3.275e-19 5.05448e-34 6.13906e-8 0.000122303 1.37064e-22 1.4
2505e-13 2.9962e-15 0.000268103 0.000233822
2.32368e-29 1.76564e-7 1.76024e-20 0.000111456 4.182e-5 5.30653e-
28 4.00175e-13 2.13211e-25 2.11093e-5 9.41226e-5 7.85078e-16 6.9
0066e-9 4.31379e-10 1.05859e-5 2.34008e-5
0.000184419 2.90868e-14 6.69549e-5 5.74485e-27 7.88383e-23 0.0001872
71 1.9146e-7 0.000171451 5.065e-21 2.85969e-36 3.97776e-6 1.2
8394e-11 5.53743e-10 5.88746e-45 3.4471e-42
2.63602e-8 3.11943e-7 1.51303e-5 1.29321e-14 4.81729e-12 7.79257e-
8 0.000108263 5.75888e-7 5.86384e-11 9.47946e-21 9.3429e-5 5.5
9458e-6 2.5592e-5 8.8367e-27 7.62263e-25
4.4922e-6 1.01429e-9 0.000105475 2.06163e-19 3.6734e-16 8.35225e-
6 2.52952e-5 2.49381e-5 … 9.2038e-15 6.37536e-27 8.68126e-5 7.3
0399e-8 8.84626e-7 4.1827e-34 8.28326e-32
2.09916e-7 4.89487e-8 3.79573e-5 2.96995e-16 1.94764e-13 5.24813e-
7 7.96175e-5 2.79531e-6 3.0774e-12 6.93507e-23 0.000113152 1.4
5075e-6 9.43487e-6 2.4778e-29 2.88607e-27
9.95715e-23 2.29927e-5 3.53825e-15 8.93671e-5 0.000149991 1.45884e-
21 3.1181e-9 2.46189e-19 0.000151093 3.64618e-6 2.29306e-11 3.3
996e-6 5.3969e-7 3.23361e-8 1.58365e-7
0.000158426 7.49365e-14 7.94519e-5 2.53334e-26 2.96794e-22 0.0001685
95 3.20219e-7 0.000169158 1.7726e-20 1.73653e-35 5.78648e-6 2.8
7427e-11 1.12345e-9 4.67495e-44 2.51666e-41
4.1703e-21 5.23537e-5 6.29245e-14 4.89375e-5 0.000124933 5.39602e-
20 2.23219e-8 7.14269e-18 0.000152712 8.54848e-7 2.37638e-10 1.1
2347e-5 2.31523e-6 3.72295e-9 2.27812e-8
4.85646e-17 0.000131913 6.12319e-11 1.98396e-6 1.70765e-5 4.38371e-
16 1.55487e-6 2.87069e-14 … 3.65641e-5 2.96606e-9 4.83555e-8 8.3
3111e-5 3.65683e-5 1.64503e-12 1.91929e-11
0.000159057 7.32432e-14 7.91412e-5 2.4438e-26 2.87412e-22 0.0001690
72 3.16304e-7 0.000169258 1.71963e-20 1.66211e-35 5.73525e-6 2.8
1898e-11 1.10449e-9 4.44538e-44 2.39799e-41
4.82403e-17 0.000131913 6.0943e-11 1.99047e-6 1.71161e-5 4.35568e-
16 1.55077e-6 2.85393e-14 3.66325e-5 2.98162e-9 4.81872e-8 8.3
2398e-5 3.6515e-5 1.65637e-12 1.93153e-11
4.66307e-8 1.96097e-7 1.97424e-5 4.89979e-15 2.11848e-12 1.31896e-
7 0.000102241 8.94157e-7 2.76219e-11 2.65703e-21 0.000100626 4.0
1458e-6 2.01483e-5 1.92385e-27 1.79617e-25
6.745e-8 1.42778e-7 2.33356e-5 2.54963e-15 1.21692e-12 1.85276e-
7 9.75186e-5 1.18615e-6 1.66071e-11 1.13201e-21 0.000104723 3.1
9129e-6 1.70324e-5 6.93136e-28 6.82018e-26
0.000253436 1.88108e-15 3.74461e-5 8.32577e-29 1.77442e-24 0.0002258
87 4.12027e-8 0.000160273 … 1.39662e-22 1.70135e-38 1.26215e-6 1.2
2758e-12 6.96217e-11 1.66052e-47 1.22823e-44
2.63125e-8 3.12389e-7 1.51173e-5 1.29711e-14 4.82956e-12 7.77955e-
8 0.00010828 5.75081e-7 5.87751e-11 9.51701e-21 9.34049e-5 5.6
0025e-6 2.56105e-5 8.87872e-27 7.65698e-25
6.09726e-6 6.15834e-10 0.000112995 8.44388e-20 1.68934e-16 1.0954e-5
2.10753e-5 3.05839e-5 4.46505e-15 2.06567e-27 8.01127e-5 4.9
1535e-8 6.39821e-7 1.1135e-34 2.34506e-32
9.76366e-7 8.69555e-9 6.75706e-5 1.06751e-17 1.12038e-14 2.12354e-
6 5.10935e-5 8.6144e-6 2.19908e-13 9.62928e-25 0.000109941 3.9
1326e-7 3.40987e-6 1.54992e-31 2.31738e-29
0.000316266 6.39022e-17 1.61893e-5 4.84878e-31 1.73652e-26 0.0002417
08 5.77679e-9 0.000126979 1.73648e-24 3.46799e-41 2.79701e-7 6.6
1247e-14 5.17951e-12 1.40383e-50 1.36787e-47
1.50328e-32 9.44692e-9 4.17322e-23 5.17454e-5 1.02796e-5 4.14476e-
31 3.77003e-15 2.40668e-28 … 3.86973e-6 0.000158146 4.22096e-18 2.0
9889e-10 8.8338e-12 5.22855e-5 8.24585e-5
3.13823e-15 0.000109084 1.09788e-9 1.94394e-7 3.13456e-6 2.35198e-
14 7.1412e-6 1.07081e-12 8.96564e-6 8.16417e-11 3.86359e-7 0.0
00120314 7.80406e-5 1.56183e-14 2.5431e-13
4.85779e-17 0.000131913 6.12438e-11 1.98369e-6 1.70749e-5 4.38486e-
16 1.55503e-6 2.87138e-14 3.65613e-5 2.96542e-9 4.83624e-8 8.3
314e-5 3.65704e-5 1.64457e-12 1.91879e-11
8.50901e-25 6.25662e-6 8.36831e-17 0.000132268 0.000134855 1.44507e-
23 2.17473e-10 3.25461e-21 0.000107945 1.47896e-5 1.03037e-12 5.9
4174e-7 6.91769e-8 3.05396e-7 1.14786e-6
7.30777e-9 7.99786e-7 8.0695e-6 9.84759e-14 2.66271e-11 2.37542e-
8 0.000115707 2.11333e-7 2.79592e-10 1.37996e-19 7.52724e-5 1.0
7916e-5 4.0445e-5 2.21463e-25 1.61151e-23
Now we can check that both implementations arrive at the same result:
norm(γ - γ_, Inf)
4.5747369867982224e-11
Again, we can compute the optimal value (a scalar) of the entropic OT problem using sinkhorn2():
OptimalTransport.sinkhorn2(μ, ν, C, ϵ)
0.009683588757086085
Try computing the transport plan for the same problem, this time using a quadratic regularisation [Lorenz 2019] instead of the more common entropic regulariser term. We solve the problem
\[ \min_{\gamma \in \Pi(\mu, \nu)} \langle \gamma, C \rangle + \epsilon \frac{\| \gamma \|_F^2}{2} \]
One property of quadratically regularised OT is that the resulting transport plan $\gamma$ is sparse. We take advantage of this and represent it as a sparse matrix.
γ = OptimalTransport.quadreg(μ, ν, C, ϵ); γ
200×200 SparseArrays.SparseMatrixCSC{Float64,Int64} with 688 stored entries
:
[26 , 1] = 0.00235892
[61 , 1] = 0.000785196
[111, 1] = 6.00416e-5
[191, 1] = 0.00179472
[16 , 2] = 0.00330926
[50 , 2] = 0.00404066
[57 , 2] = 0.00279057
[113, 2] = 0.00194348
[149, 2] = 0.00390947
[3 , 3] = 0.00239125
[29 , 3] = 0.00238983
[114, 3] = 0.000217794
[8 , 4] = 0.00226896
[15 , 4] = 0.000140892
[175, 4] = 0.00259186
[60 , 5] = 0.00145916
[77 , 5] = 0.00161994
[97 , 5] = 0.00182218
[183, 5] = 0.00145827
[2 , 6] = 0.00157347
[20 , 6] = 0.00156927
[116, 6] = 0.00151072
[179, 6] = 0.000345422
[5 , 7] = 0.00141462
⋮
[136, 193] = 0.00101561
[161, 193] = 0.00398601
[24 , 194] = 0.000323591
[110, 194] = 0.00121398
[185, 194] = 0.00640302
[27 , 195] = 0.00181813
[55 , 195] = 0.00141802
[65 , 195] = 0.00176559
[41 , 196] = 0.000450519
[49 , 196] = 0.00323492
[69 , 196] = 0.0011165
[92 , 196] = 0.000196945
[157, 197] = 0.00320402
[172, 197] = 0.00562157
[44 , 198] = 0.00147756
[71 , 198] = 0.00282114
[120, 198] = 0.00550232
[163, 198] = 0.000784002
[62 , 199] = 0.00141127
[82 , 199] = 0.00108189
[107, 199] = 0.000859831
[118, 199] = 0.00164875
[78 , 200] = 0.00257453
[90 , 200] = 0.00202903
[124, 200] = 0.000398191
This is a log-stabilised version of the Sinkhorn algorithm which is useful when $\epsilon$ is very small [Schmitzer 2019]
ϵ = 0.005 γ = sinkhorn_stabilized(μ, ν, C, ϵ, max_iter = 5000); γ_ = pot_sinkhorn(μ, ν, C, ϵ, method = "sinkhorn_stabilized", max_iter = 5000); norm(γ - γ_, Inf) # Check that we get the same result as POT
3.2784934475885673e-10
In addition to log-stabilisation, we can additionally use $\epsilon$-scaling [Schmitzer 2019]
γ = sinkhorn_stabilized_epsscaling(μ, ν, C, ϵ, max_iter = 5000) γ_ = pot_sinkhorn(μ, ν, C, ϵ, method = "sinkhorn_epsilon_scaling", max_iter = 5000) norm(γ - γ_, Inf) # Check that we get the same result as POT
3.5134034066406847e-10
Unbalanced transport was introduced by [Chizat 2019] to interpolate between general positive measures which do not have the same total mass. That is, for $\mu, \nu \in \mathcal{M}_+$ and a cost function (e.g. quadratic) $C$, we solve the following problem:
\[ \min_{\gamma \ge 0} \epsilon \mathrm{KL}(\gamma | \exp(-C/\epsilon)) + \lambda_1 \mathrm{KL}(\gamma_1 | \mu) + \lambda_2 \mathrm{KL}(\gamma_2 | \nu) \]
where $\epsilon$ controls the strength of entropic regularisation, and $\lambda_1, \lambda_2$ control how strongly we enforce the marginal constraints.
We construct two random measures, now with different total masses:
N = 100; M = 200 μ_spt = rand(N) ν_spt = rand(M) μ = fill(1/N, N) ν = fill(1/N, M);
Set up quadratic cost matrix:
C = pairwise(SqEuclidean(), μ_spt', ν_spt')
100×200 Array{Float64,2}:
8.16407e-5 0.180375 0.00362636 0.14397 0.0225504 0.014613
0.512335 0.0259424 … 0.0417258 0.115198 0.554281 0.006
17441 0.0101448 0.398316 0.191951
0.00101127 0.147356 0.0102122 0.114649 0.0119535 0.00640771
0.455543 0.0144553 0.0267103 0.0891457 0.495143 0.014
2596 0.00358628 0.348438 0.157836
0.0167408 0.297086 0.00361578 0.249785 0.0731803 0.0581942
0.699107 0.0791955 0.105378 0.211379 0.747967 0.001
745 0.0488729 0.564712 0.311892
0.102078 0.00924928 0.151128 0.00259099 0.0318139 0.0431178
0.149957 0.0280449 0.0154414 0.000118293 0.173029 0.165
738 0.0518978 0.0915609 0.0120099
0.00309923 0.222162 0.000184527 0.181535 0.0387315 0.0280627
0.58127 0.04314 0.0629529 0.14903 0.625895 0.001
02031 0.021714 0.459356 0.23499
0.240117 0.00552754 0.312786 0.0143087 0.121721 0.143012
0.0469686 0.114235 … 0.0868976 0.0254863 0.0602443 0.333
657 0.158668 0.0174424 0.00371259
0.612718 0.134757 0.725934 0.170044 0.41169 0.450126
0.00577951 0.397823 0.345191 0.204657 0.00223713 0.757
554 0.477587 0.0258167 0.125087
0.00103464 0.200557 0.0013756 0.162058 0.0300323 0.0207402
0.545982 0.0339284 0.0517104 0.131434 0.589257 0.003
07439 0.0153393 0.428047 0.212754
0.612959 0.13487 0.726197 0.170171 0.411888 0.450333
0.00580297 0.398017 0.345372 0.204796 0.00225173 0.757
823 0.4778 0.0258663 0.125196
0.204947 0.001372 0.272448 0.00677527 0.097081 0.116187
0.0645309 0.0904083 0.0662945 0.0149665 0.0799498 0.291
95 0.130339 0.0286884 0.000558101
0.0270285 0.336485 0.00905325 0.286013 0.0933521 0.0763152
0.758891 0.100131 … 0.129339 0.244804 0.809763 0.005
89676 0.0655818 0.618567 0.35223
0.00041104 0.156338 0.00801543 0.122587 0.0146067 0.0083859
0.471235 0.0173598 0.0306108 0.0961614 0.511498 0.011
6396 0.00509967 0.362179 0.167128
0.0331285 0.357224 0.0127143 0.305158 0.104423 0.0863544
0.789881 0.111585 0.142315 0.262539 0.841764 0.008
91127 0.0749109 0.646576 0.373442
0.0176227 0.0800436 0.0408061 0.0564767 7.02576e-5 0.00043688
3 0.329464 0.000371736 0.00390413 0.0390548 0.363264 0.048
56 0.00168628 0.23945 0.0878151
0.204581 0.00134224 0.272026 0.00670893 0.0968295 0.115912
0.0647362 0.0901656 0.0660867 0.0148678 0.0801784 0.291
513 0.130047 0.0288254 0.000539178
0.0823265 0.0165751 0.126865 0.0069677 0.0212557 0.030652
0.176244 0.0181967 … 0.0084075 0.00188767 0.201187 0.140
279 0.0381186 0.112333 0.0202096
0.428934 0.0572457 0.524445 0.0809586 0.263989 0.294938
0.00268418 0.252908 0.211322 0.105338 0.0064857 0.551
371 0.317245 0.00107871 0.0510057
0.474951 0.0748004 0.575203 0.101613 0.300342 0.333296
0.000308817 0.288515 0.24397 0.128733 0.0021435 0.603
387 0.356983 0.00449966 0.0676417
0.635258 0.145436 0.75045 0.182015 0.430202 0.469474
0.00815238 0.416024 0.36216 0.217769 0.00379034 0.782
594 0.497511 0.0306051 0.135383
0.276419 0.0121188 0.354038 0.0241358 0.147935 0.171319
0.0327553 0.13967 0.109245 0.0381743 0.0439778 0.376
221 0.188416 0.00927975 0.00934494
0.0341381 0.0533172 0.0645261 0.0344599 0.00190381 0.00531679
0.272458 0.00107152 … 0.000109589 0.0212017 0.30327 0.074
1898 0.00866369 0.191251 0.059693
0.436604 0.060069 0.532922 0.0843097 0.270013 0.301304
0.00211416 0.258805 0.216715 0.109155 0.0055808 0.560
062 0.323845 0.00149558 0.0536726
0.0776455 0.0187747 0.121037 0.00841793 0.0189109 0.0278225
0.183261 0.0160323 0.00695822 0.00267535 0.20868 0.134
148 0.0349553 0.11795 0.0226313
0.538832 0.101367 0.645301 0.132243 0.351553 0.387136
0.000745926 0.338748 0.290325 0.162956 1.99692e-6 0.675
133 0.412633 0.012536 0.0930037
0.228 0.00382215 0.298934 0.0114693 0.113139 0.133696
0.0525539 0.105926 0.0796708 0.0216444 0.0665491 0.319
345 0.148847 0.0209073 0.00234325
⋮ ⋮
⋱ ⋮
0.153645 0.000561429 0.212733 0.000465564 0.0629223 0.0784711
0.0990766 0.0575735 0.0387075 0.00379486 0.117985 0.230
005 0.0901738 0.0529513 0.00137722
0.217623 0.00258377 0.287034 0.00923565 0.105865 0.125778
0.0577148 0.0988914 0.073586 0.0185308 0.0723415 0.307
042 0.140486 0.0242071 0.00139984
0.488473 0.0802238 0.590074 0.107919 0.311114 0.344639
6.13361e-5 0.299075 0.253688 0.135818 0.00133638 0.618
616 0.368719 0.00590146 0.0728037
0.295803 0.0164373 0.375932 0.0300951 0.162204 0.186649
0.0265239 0.153544 0.121553 0.0455844 0.0367054 0.398
781 0.204478 0.00611665 0.0131771
0.481145 0.0772705 0.582017 0.104489 0.305271 0.338488
0.000171455 0.293347 … 0.248415 0.131967 0.00174882 0.610
365 0.362356 0.00512064 0.0699916
0.0857158 0.0151038 0.131064 0.0060258 0.0229948 0.0327335
0.171369 0.0198082 0.00951388 0.0014138 0.195976 0.144
693 0.0404358 0.108448 0.0185815
0.157012 0.000377261 0.216692 0.000668131 0.0650834 0.0808824
0.0964059 0.0596415 0.0404064 0.00433935 0.115069 0.234
12 0.0927573 0.0510038 0.00107844
0.321674 0.0229501 0.405028 0.0387163 0.181502 0.207311
0.0194817 0.172335 0.138332 0.0560695 0.0283254 0.428
732 0.226078 0.00301665 0.0190652
0.461678 0.0695899 0.560587 0.0955245 0.289806 0.322193
0.000743701 0.278191 0.234484 0.121868 0.00313551 0.588
415 0.345489 0.00329267 0.0626914
0.462342 0.0698476 0.561319 0.0958265 0.290332 0.322747
0.000717317 0.278706 … 0.234957 0.122209 0.00308109 0.589
164 0.346063 0.00334893 0.0629361
0.0468246 0.0397126 0.081593 0.0237187 0.00566371 0.0109289
0.240443 0.0041421 0.000447598 0.0129922 0.269439 0.092
4178 0.0155511 0.16459 0.0452398
1.83316e-5 0.176359 0.00422152 0.140385 0.0211452 0.0134862
0.505552 0.0244336 0.0398062 0.111994 0.547224 0.006
94413 0.00920978 0.392338 0.187808
0.266459 0.0101057 0.342754 0.0212572 0.140674 0.163498
0.0363066 0.132617 0.103018 0.0345305 0.0480783 0.364
587 0.18021 0.0112127 0.00758826
0.325059 0.0238608 0.408825 0.0398964 0.184047 0.210031
0.0186597 0.174815 0.140555 0.0574879 0.0273324 0.432
638 0.228918 0.00269856 0.019896
0.0247684 0.066714 0.0513632 0.0453771 0.000263973 0.00207307
0.301797 2.86093e-5 … 0.00143291 0.0299268 0.334182 0.060
0214 0.00431565 0.215953 0.0738246
0.0644047 0.0262082 0.104352 0.0135997 0.0126896 0.0201447
0.205172 0.010353 0.00342778 0.00586641 0.232019 0.116
55 0.0262747 0.13565 0.0307321
0.0125659 0.278539 0.00183551 0.232803 0.0641254 0.050152
0.670495 0.0697639 0.0944524 0.19578 0.718362 0.000
599499 0.0415278 0.539027 0.29288
0.0136859 0.0892118 0.0346859 0.0642176 0.000583016 2.6399e-5
0.347809 0.0012281 0.00612256 0.0455338 0.382515 0.041
861 0.00064012 0.255127 0.0974063
0.00286625 0.13114 0.0150779 0.100401 0.0076729 0.00340021
0.426674 0.00970098 0.0200778 0.0766381 0.465025 0.019
9234 0.00145533 0.323249 0.141037
0.0169288 0.297877 0.00370345 0.25051 0.0735729 0.0585444
0.700319 0.0796039 … 0.105849 0.212045 0.749221 0.001
80606 0.0491938 0.565802 0.312702
0.138205 0.00192812 0.194494 1.85265e-6 0.053189 0.0675538
0.112212 0.0482808 0.0311615 0.00171285 0.132281 0.211
023 0.0784413 0.0626638 0.00328635
9.61334e-5 0.181029 0.00353431 0.144555 0.022782 0.0147996
0.513436 0.0261908 0.0420407 0.115721 0.555427 0.006
05412 0.0103004 0.399287 0.192626
0.0283124 0.340978 0.0098026 0.290156 0.0957255 0.0784625
0.76563 0.102588 0.13213 0.248638 0.816724 0.006
50441 0.0675735 0.624653 0.356826
0.602596 0.130033 0.714913 0.164732 0.4034 0.441456
0.00483448 0.389675 0.337604 0.198824 0.0016651 0.746
294 0.468656 0.0237724 0.120537
Now we solve the corresponding unbalanced, entropy-regularised transport problem.
ϵ = 0.01 λ = 1.0 γ_ = pot_sinkhorn_unbalanced(μ, ν, C, ϵ, λ) γ = sinkhorn_unbalanced(μ, ν, C, λ, λ, ϵ)
100×200 Array{Float64,2}:
0.00040934 1.51504e-11 0.000268736 5.19769e-10 5.44264e-5 0.0001228
92 2.80471e-25 3.82536e-5 … 7.60805e-6 7.72267e-9 4.98563e-27 0.0
00211731 0.000190054 1.41528e-20 4.83778e-12
0.000349993 3.86162e-10 0.000130514 9.15335e-9 0.00014736 0.0002619
53 7.70285e-23 0.000113213 3.20433e-5 9.80772e-8 1.73128e-24 8.8
5117e-5 0.000343605 1.94691e-18 1.37588e-10
8.79255e-5 1.46973e-16 0.000305712 1.49924e-14 3.913e-7 1.78789e-
6 2.46604e-33 2.11566e-7 1.4874e-8 5.83762e-13 2.19561e-35 0.0
00374697 4.49226e-6 9.54713e-28 3.39791e-17
8.51487e-9 0.000229122 5.90429e-11 0.000401411 1.20574e-5 3.97492e-
6 8.58005e-10 1.73427e-5 5.89582e-5 0.000429913 1.00695e-10 1.3
9238e-11 1.63426e-6 1.66264e-7 0.00017666
0.000322724 2.47414e-13 0.000404206 1.29477e-11 1.15047e-5 3.41356e-
5 3.0329e-28 7.30453e-6 9.70941e-7 2.79434e-10 4.12415e-30 0.0
00377942 6.37137e-5 3.37066e-23 6.9711e-14
5.51912e-15 0.000212982 3.6067e-18 7.96784e-5 9.62254e-10 1.16852e-
10 1.63256e-5 2.00711e-9 … 2.97772e-8 2.17924e-5 5.10316e-6 4.5
4773e-19 2.41544e-11 0.000176346 0.000259496
7.66209e-32 1.09722e-10 8.68177e-37 2.89834e-12 5.18106e-23 1.1328e-2
4 0.000211842 2.04561e-22 3.80777e-20 7.60963e-14 0.000355943 3.7
3671e-38 7.19161e-26 1.61063e-5 2.93242e-10
0.000386083 2.08887e-12 0.000349189 8.83593e-11 2.67216e-5 6.90891e-
5 1.006e-26 1.78579e-5 2.90826e-6 1.57988e-9 1.56574e-28 0.0
00299504 0.000117292 7.50976e-22 6.26874e-13
7.48733e-32 1.08602e-10 8.46566e-37 2.86475e-12 5.08496e-23 1.11078e-
24 0.000211569 2.00834e-22 3.74338e-20 7.51219e-14 0.000355801 3.6
4163e-38 7.04748e-26 1.60437e-5 2.90369e-10
2.06012e-13 0.000357615 2.25709e-16 0.000187548 1.25309e-8 1.89331e-
9 3.12428e-6 2.40962e-8 2.5898e-7 6.91476e-5 7.88205e-7 3.2
6378e-17 4.54901e-10 6.34685e-5 0.00039421
3.56314e-5 3.24095e-18 0.000201221 4.53942e-16 5.90155e-8 3.31029e-
7 7.08153e-36 2.95633e-8 … 1.53579e-9 2.3394e-14 5.15603e-38 0.0
00280465 9.57887e-7 4.95995e-30 6.82085e-19
0.000377542 1.59779e-10 0.000165158 4.20392e-9 0.000114812 0.0002183
48 1.62926e-23 8.60192e-5 2.20385e-5 4.93986e-8 3.42728e-25 0.0
00116848 0.000300035 5.00538e-19 5.51947e-11
2.16803e-5 4.56176e-19 0.000156254 7.49384e-17 2.18441e-8 1.35839e-
7 3.57597e-37 1.05306e-8 4.69842e-10 4.4466e-15 2.35314e-39 0.0
00232335 4.21999e-7 3.37459e-31 9.15754e-20
6.26556e-5 3.05092e-7 5.77169e-6 2.89924e-6 0.00045581 0.0004485
98 2.17035e-17 0.000436381 0.000295476 1.38456e-5 8.71197e-19 2.7
0194e-6 0.000391652 9.93012e-14 1.42522e-7
2.13845e-13 0.000358955 2.35606e-16 0.00018894 1.28599e-8 1.94762e-
9 3.0631e-6 2.47071e-8 2.64621e-7 6.98864e-5 7.70978e-7 3.4
1195e-17 4.68713e-10 6.26526e-5 0.000395258
6.99767e-8 0.000125567 7.61852e-10 0.000295445 3.95143e-5 1.57643e-
5 7.06057e-11 5.29399e-5 … 0.000135828 0.000410679 6.87219e-12 2.0
2488e-10 7.3911e-6 2.37485e-8 8.87142e-5
8.70475e-24 3.02252e-7 5.79399e-28 2.54032e-8 1.59509e-16 7.37335e-
18 0.000342164 4.76626e-16 2.9399e-14 1.85576e-9 0.000275843 3.9
8746e-29 7.83812e-19 0.000226542 5.73237e-7
6.97945e-26 4.17357e-8 2.89135e-30 2.57279e-9 3.3615e-18 1.27155e-
19 0.000346677 1.08227e-17 8.9735e-16 1.42894e-10 0.00034023 1.7
548e-31 1.1774e-20 0.000128561 8.67701e-8
9.00584e-33 4.22272e-11 8.37454e-38 9.80268e-13 9.10951e-24 1.83205e-
25 0.000187077 3.71026e-23 7.81254e-21 2.29593e-14 0.000341183 3.4
2051e-39 1.09806e-26 1.11712e-5 1.17261e-10
1.20706e-16 9.08905e-5 4.80827e-20 2.46028e-5 5.77098e-11 5.68452e-
12 5.57928e-5 1.30125e-10 2.62895e-9 5.05479e-6 2.14148e-5 5.3
1724e-21 1.01734e-12 0.000329077 0.000121885
1.13383e-5 4.16857e-6 5.08161e-7 2.47347e-5 0.000358094 0.0002598
78 6.12517e-15 0.000383988 … 0.000407531 7.78937e-5 3.31499e-16 1.9
6532e-7 0.000183958 1.16168e-11 2.23899e-6
3.86439e-24 2.17846e-7 2.37267e-28 1.73679e-8 8.34765e-17 3.72923e-
18 0.000346246 2.52625e-16 1.63872e-14 1.21092e-9 0.00028864 1.5
9831e-29 3.8722e-19 0.000207702 4.1967e-7
1.15327e-7 0.000104 1.4081e-9 0.000263741 5.15551e-5 2.15896e-
5 3.61202e-11 6.7837e-5 0.000162037 0.000391722 3.3524e-12 3.8
5797e-10 1.04658e-5 1.39766e-8 7.18629e-5
1.0484e-28 2.61677e-9 2.33242e-33 1.0744e-10 1.79252e-20 5.21312e-
22 0.000296456 6.36439e-20 7.77704e-18 4.16609e-12 0.000376526 1.2
005e-34 4.02792e-23 5.14178e-5 6.13667e-9
1.93609e-14 0.000263772 1.50488e-17 0.000110528 2.37039e-9 3.09758e-
10 9.75271e-6 4.81113e-9 6.40565e-8 3.34178e-5 2.83692e-6 1.9
8681e-18 6.73466e-11 0.000130229 0.000310757
⋮ ⋮
⋱ ⋮
3.87428e-11 0.000431417 9.84448e-14 0.000392118 4.2438e-7 9.15116e-
8 1.09832e-7 7.1487e-7 4.54605e-6 0.000235089 1.95471e-8 1.7
7915e-14 2.8089e-8 6.23894e-6 0.000404047
5.63089e-14 0.000307605 5.09658e-17 0.000142385 5.05495e-9 7.04497e-
10 5.99754e-6 1.0017e-8 1.21284e-7 4.70094e-5 1.63783e-6 7.0
0587e-18 1.60112e-10 9.6468e-5 0.000351864
1.72818e-26 2.32267e-8 6.25562e-31 1.31093e-9 1.09577e-18 3.91508e-
20 0.000340163 3.60365e-18 3.2503e-16 6.73474e-11 0.000353053 3.6
6323e-32 3.48554e-21 0.000106966 4.9568e-8
1.51292e-17 5.13936e-5 4.68881e-21 1.18063e-5 1.2064e-11 1.06866e-
12 9.06025e-5 2.82983e-11 6.6863e-10 2.09811e-6 3.85915e-5 4.8
5134e-22 1.77777e-13 0.000393195 7.23538e-5
3.67764e-26 3.19133e-8 1.43188e-30 1.88911e-9 2.00997e-18 7.40622e-
20 0.000344057 6.53479e-18 … 5.63204e-16 1.01226e-10 0.000346459 8.5
485e-32 6.73507e-21 0.000118271 6.71512e-8
4.87284e-8 0.000142167 4.89248e-10 0.000317254 3.2453e-5 1.25114e-
5 1.12351e-10 4.40371e-5 0.00011884 0.000420831 1.13089e-11 1.2
7272e-10 5.72928e-6 3.42283e-8 0.00010203
2.74147e-11 0.000435415 6.56586e-14 0.000380739 3.38772e-7 7.12466e-
8 1.42141e-7 5.76001e-7 3.80066e-6 0.000220593 2.59258e-8 1.1
6815e-14 2.14954e-8 7.511e-6 0.000412492
9.22577e-19 2.17167e-5 2.07101e-22 4.04051e-6 1.41945e-12 1.09709e-
13 0.000148496 3.50293e-12 1.01213e-10 5.95934e-7 7.23041e-5 1.9
6722e-23 1.66149e-14 0.000434483 3.25447e-5
2.77495e-25 7.40986e-8 1.31483e-29 4.98701e-9 1.01645e-17 4.06962e-
19 0.000349985 3.20413e-17 2.44312e-15 2.9934e-10 0.000324863 8.2
6915e-31 3.91857e-20 0.000152946 1.50097e-7
2.58932e-25 7.20052e-8 1.21861e-29 4.82475e-9 9.61615e-18 3.83907e-
19 0.0003499 3.03449e-17 … 2.32355e-15 2.8847e-10 0.000325696 7.6
5027e-31 3.68931e-20 0.000151651 1.46047e-7
3.01228e-6 1.53513e-5 8.71191e-8 6.8408e-5 0.000232286 0.0001400
73 1.42173e-13 0.000266859 0.000372219 0.000167246 9.22755e-15 2.9
9997e-8 8.72811e-5 1.57854e-10 8.97559e-6
0.000408618 2.24542e-11 0.000251167 7.3789e-10 6.21328e-5 0.0001364
4 5.48219e-25 4.4125e-5 9.14375e-6 1.05541e-8 1.00149e-26 0.0
00194465 0.000207 2.55243e-20 7.26208e-12
3.47741e-16 0.000118286 1.5813e-19 3.4913e-5 1.26941e-10 1.32239e-
11 4.1623e-5 2.80327e-10 5.21456e-9 7.7435e-6 1.51224e-5 1.8
1115e-20 2.45963e-12 0.000288626 0.000154607
6.38962e-19 1.92631e-5 1.37642e-22 3.48872e-6 1.06925e-12 8.12142e-
14 0.000156638 2.65588e-12 7.87373e-11 5.02437e-7 7.7584e-5 1.2
9323e-23 1.21527e-14 0.000435783 2.90993e-5
3.00002e-5 1.13195e-6 1.96478e-6 8.60658e-6 0.00043739 0.0003726
46 3.37754e-16 0.00044184 … 0.000370121 3.37469e-5 1.56184e-17 8.4
0257e-7 0.000294582 1.01843e-12 5.64908e-7
4.71889e-7 5.38354e-5 8.13089e-9 0.000171002 0.000104551 5.0647e-5
4.39597e-12 0.000130311 0.000251077 0.000309927 3.53682e-13 2.4
4072e-9 2.71416e-5 2.59157e-9 3.47984e-5
0.000129984 9.14554e-16 0.000355707 7.97738e-14 9.42365e-7 3.89114e-
6 4.19815e-32 5.29079e-7 4.31894e-8 2.7047e-12 4.12809e-34 0.0
00409158 9.11847e-6 1.21286e-26 2.21478e-16
9.37159e-5 1.23067e-7 1.07394e-5 1.3489e-6 0.000436914 0.0004715
91 3.49703e-18 0.000404162 0.000238813 7.30822e-6 1.2822e-19 5.3
2709e-6 0.000438748 2.08945e-14 5.51088e-8
0.000284372 1.9116e-9 7.84744e-5 3.72164e-8 0.000221141 0.0003461
19 1.35154e-21 0.000178142 6.08376e-5 3.35083e-7 3.44176e-23 4.9
1373e-5 0.000415904 2.36427e-17 7.22002e-10
8.64185e-5 1.36009e-16 0.000303504 1.39653e-14 3.76807e-7 1.729e-6
2.18781e-33 2.03408e-7 … 1.42112e-8 5.46933e-13 1.9398e-35 0.0
00372981 4.35698e-6 8.57453e-28 3.13832e-17
1.90911e-10 0.00039596 6.41858e-13 0.00043218 1.18189e-6 2.86892e-
7 3.10732e-8 1.90508e-6 1.01732e-5 0.000304622 4.92381e-9 1.2
4938e-13 9.55395e-8 2.48549e-6 0.00035126
0.000409281 1.42098e-11 0.000271575 4.90908e-10 5.32497e-5 0.0001207
78 2.51539e-25 3.73639e-5 7.38187e-6 7.3389e-9 4.45161e-27 0.0
00214574 0.000187365 1.28593e-20 4.52808e-12
3.20213e-5 2.11315e-18 0.000190764 3.06503e-16 4.75619e-8 2.72882e-
7 3.68815e-36 2.36261e-8 1.1871e-9 1.62914e-14 2.62644e-38 0.0
00269684 8.02017e-7 2.75763e-30 4.40148e-19
2.02271e-31 1.68837e-10 2.50756e-36 4.7299e-12 1.13872e-22 2.5862e-2
4 0.000223377 4.43274e-22 7.80113e-20 1.3081e-13 0.000361583 1.1
0531e-37 1.68542e-25 1.89567e-5 4.43439e-10
Check agreement with POT:
norm(γ - γ_, Inf) # Check that we get the same result as POT
1.8257663176451944e-12
Let's construct source and target measures again
μ_spt = ν_spt = LinRange(-2, 2, 100) C = pairwise(Euclidean(), μ_spt', ν_spt').^2 μ = exp.((-(μ_spt).^2)/0.5^2) μ /= sum(μ) ν = ν_spt.^2 .*exp.((-(ν_spt).^2)/0.5^2) ν /= sum(ν) plot(μ_spt, μ, label = L"\mu") plot!(ν_spt, ν, label = L"\nu") current()
Now compute the entropic transport plan:
γ = OptimalTransport.sinkhorn(μ, ν, C, 0.01) heatmap(γ, title = "Entropically regularised OT", size = (500, 500)) current()
Using a quadratic regularisation, notice how the 'edges' of the transport plan here are sharper compared to the entropic OT transport plan.
γ_quad = Matrix(OptimalTransport.quadreg(μ, ν, C, 5, maxiter = 500)) heatmap(γ_quad, title = "Quadratically regularised OT", size = (500, 500)) current()
For a collection of probability measures $\{ \mu_i \}_{i = 1}^N$ and corresponding cost matrices $C_i$, we define the barycenter to be the measure $\mu$ that solves the following:
\[ \min_{\mu \text{ a distribution}} \sum_{i = 1}^N \lambda_i \mathrm{entropicOT}^{\epsilon}_{C_i}(\mu, \mu_i) \]
where $\mathrm{entropicOT}^\epsilon_{C_i}(\mu, \mu_i)$ denotes the entropic optimal transport cost between measures $(\mu, \mu_i)$ with cost $C_i$ and entropic regularisation strength $\epsilon$.
For instance, below we set up two measures $\mu_0$ and $\mu_1$ and compute the weighted barycenters. The weights are $(w, 1-w)$ where $w = 0.25, 0.5, 0.75$.
spt = LinRange(-1, 1, 250) f(x, σ) = exp.(-x.^2/σ^2) normalize(x) = x./sum(x) mu_all = hcat([normalize(f(spt .- z, 0.1)) for z in [-0.5, 0.5]]...)' C_all = [pairwise(SqEuclidean(), spt', spt') for i = 1:size(mu_all, 1)] plot(size = (400, 200)); plot!(spt, mu_all[1, :], label = L"\mu_0") plot!(spt, mu_all[2, :], label = L"\mu_1") for s = [0.25, 0.5, 0.75] a = sinkhorn_barycenter(mu_all, C_all, 0.01, [s, 1-s]; max_iter = 1000); plot!(spt, a, label= latexstring("\\mu_{$s}")) end current()