summaryrefslogtreecommitdiff
path: root/docs/source/auto_examples/auto_examples_python.zip
blob: ded26139c2994f35b4c33f62ff104ded8bb7882d (plain)
ofshex dumpascii
0000 50 4b 03 04 14 00 00 00 00 00 da 74 d9 4e 0a ba a4 e6 91 06 00 00 91 06 00 00 0e 00 00 00 70 6c PK.........t.N................pl
0020 6f 74 5f 55 4f 54 5f 31 44 2e 70 79 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 ot_UOT_1D.py#.-*-.coding:.utf-8.
0040 2d 2a 2d 0a 22 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d -*-.""".========================
0060 3d 3d 3d 3d 3d 3d 3d 0a 31 44 20 55 6e 62 61 6c 61 6e 63 65 64 20 6f 70 74 69 6d 61 6c 20 74 72 =======.1D.Unbalanced.optimal.tr
0080 61 6e 73 70 6f 72 74 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ansport.========================
00a0 3d 3d 3d 3d 3d 3d 3d 0a 0a 54 68 69 73 20 65 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61 74 65 =======..This.example.illustrate
00c0 73 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 55 6e 62 61 6c 61 6e 63 65 64 20 s.the.computation.of.Unbalanced.
00e0 4f 70 74 69 6d 61 6c 20 74 72 61 6e 73 70 6f 72 74 0a 75 73 69 6e 67 20 61 20 4b 75 6c 6c 62 61 Optimal.transport.using.a.Kullba
0100 63 6b 2d 4c 65 69 62 6c 65 72 20 72 65 6c 61 78 61 74 69 6f 6e 2e 0a 22 22 22 0a 0a 23 20 41 75 ck-Leibler.relaxation.."""..#.Au
0120 74 68 6f 72 3a 20 48 69 63 68 61 6d 20 4a 61 6e 61 74 69 20 3c 68 69 63 68 61 6d 2e 6a 61 6e 61 thor:.Hicham.Janati.<hicham.jana
0140 74 69 40 69 6e 72 69 61 2e 66 72 3e 0a 23 0a 23 20 4c 69 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 ti@inria.fr>.#.#.License:.MIT.Li
0160 63 65 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6e 75 6d 70 79 20 61 73 20 6e 70 0a 69 6d 70 6f 72 74 cense..import.numpy.as.np.import
0180 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 70 79 6c 61 62 20 61 73 20 70 6c 0a 69 6d 70 6f 72 74 20 6f .matplotlib.pylab.as.pl.import.o
01a0 74 0a 69 6d 70 6f 72 74 20 6f 74 2e 70 6c 6f 74 0a 66 72 6f 6d 20 6f 74 2e 64 61 74 61 73 65 74 t.import.ot.plot.from.ot.dataset
01c0 73 20 69 6d 70 6f 72 74 20 6d 61 6b 65 5f 31 44 5f 67 61 75 73 73 20 61 73 20 67 61 75 73 73 0a s.import.make_1D_gauss.as.gauss.
01e0 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 .###############################
0200 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
0220 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 47 65 6e 65 72 61 74 65 20 64 61 74 61 0a ###############.#.Generate.data.
0240 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 0a 23 25 25 20 70 61 72 61 6d 65 74 65 72 73 #.-------------...#%%.parameters
0260 0a 0a 6e 20 3d 20 31 30 30 20 20 23 20 6e 62 20 62 69 6e 73 0a 0a 23 20 62 69 6e 20 70 6f 73 69 ..n.=.100..#.nb.bins..#.bin.posi
0280 74 69 6f 6e 73 0a 78 20 3d 20 6e 70 2e 61 72 61 6e 67 65 28 6e 2c 20 64 74 79 70 65 3d 6e 70 2e tions.x.=.np.arange(n,.dtype=np.
02a0 66 6c 6f 61 74 36 34 29 0a 0a 23 20 47 61 75 73 73 69 61 6e 20 64 69 73 74 72 69 62 75 74 69 6f float64)..#.Gaussian.distributio
02c0 6e 73 0a 61 20 3d 20 67 61 75 73 73 28 6e 2c 20 6d 3d 32 30 2c 20 73 3d 35 29 20 20 23 20 6d 3d ns.a.=.gauss(n,.m=20,.s=5)..#.m=
02e0 20 6d 65 61 6e 2c 20 73 3d 20 73 74 64 0a 62 20 3d 20 67 61 75 73 73 28 6e 2c 20 6d 3d 36 30 2c .mean,.s=.std.b.=.gauss(n,.m=60,
0300 20 73 3d 31 30 29 0a 0a 23 20 6d 61 6b 65 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 75 6e 62 .s=10)..#.make.distributions.unb
0320 61 6c 61 6e 63 65 64 0a 62 20 2a 3d 20 35 2e 0a 0a 23 20 6c 6f 73 73 20 6d 61 74 72 69 78 0a 4d alanced.b.*=.5...#.loss.matrix.M
0340 20 3d 20 6f 74 2e 64 69 73 74 28 78 2e 72 65 73 68 61 70 65 28 28 6e 2c 20 31 29 29 2c 20 78 2e .=.ot.dist(x.reshape((n,.1)),.x.
0360 72 65 73 68 61 70 65 28 28 6e 2c 20 31 29 29 29 0a 4d 20 2f 3d 20 4d 2e 6d 61 78 28 29 0a 0a 0a reshape((n,.1))).M./=.M.max()...
0380 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
03a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
03c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 50 6c 6f 74 20 64 69 73 74 72 69 62 75 74 69 ##############.#.Plot.distributi
03e0 6f 6e 73 20 61 6e 64 20 6c 6f 73 73 20 6d 61 74 72 69 78 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ons.and.loss.matrix.#.----------
0400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 70 6c ------------------------..#%%.pl
0420 6f 74 20 74 68 65 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0a 0a 70 6c 2e 66 69 67 75 72 65 28 ot.the.distributions..pl.figure(
0440 31 2c 20 66 69 67 73 69 7a 65 3d 28 36 2e 34 2c 20 33 29 29 0a 70 6c 2e 70 6c 6f 74 28 78 2c 20 1,.figsize=(6.4,.3)).pl.plot(x,.
0460 61 2c 20 27 62 27 2c 20 6c 61 62 65 6c 3d 27 53 6f 75 72 63 65 20 64 69 73 74 72 69 62 75 74 69 a,.'b',.label='Source.distributi
0480 6f 6e 27 29 0a 70 6c 2e 70 6c 6f 74 28 78 2c 20 62 2c 20 27 72 27 2c 20 6c 61 62 65 6c 3d 27 54 on').pl.plot(x,.b,.'r',.label='T
04a0 61 72 67 65 74 20 64 69 73 74 72 69 62 75 74 69 6f 6e 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 29 arget.distribution').pl.legend()
04c0 0a 0a 23 20 70 6c 6f 74 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 61 6e 64 20 6c 6f 73 73 20 ..#.plot.distributions.and.loss.
04e0 6d 61 74 72 69 78 0a 0a 70 6c 2e 66 69 67 75 72 65 28 32 2c 20 66 69 67 73 69 7a 65 3d 28 35 2c matrix..pl.figure(2,.figsize=(5,
0500 20 35 29 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 31 44 5f 6d 61 74 28 61 2c 20 62 2c 20 4d 2c .5)).ot.plot.plot1D_mat(a,.b,.M,
0520 20 27 43 6f 73 74 20 6d 61 74 72 69 78 20 4d 27 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 .'Cost.matrix.M')...############
0540 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
0560 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
0580 23 23 0a 23 20 53 6f 6c 76 65 20 55 6e 62 61 6c 61 6e 63 65 64 20 53 69 6e 6b 68 6f 72 6e 0a 23 ##.#.Solve.Unbalanced.Sinkhorn.#
05a0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 0a 23 20 53 69 6e 6b 68 6f 72 6e 0a 0a 65 70 .--------------...#.Sinkhorn..ep
05c0 73 69 6c 6f 6e 20 3d 20 30 2e 31 20 20 23 20 65 6e 74 72 6f 70 79 20 70 61 72 61 6d 65 74 65 72 silon.=.0.1..#.entropy.parameter
05e0 0a 61 6c 70 68 61 20 3d 20 31 2e 20 20 23 20 55 6e 62 61 6c 61 6e 63 65 64 20 4b 4c 20 72 65 6c .alpha.=.1...#.Unbalanced.KL.rel
0600 61 78 61 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 0a 47 73 20 3d 20 6f 74 2e 75 6e 62 61 6c 61 axation.parameter.Gs.=.ot.unbala
0620 6e 63 65 64 2e 73 69 6e 6b 68 6f 72 6e 5f 75 6e 62 61 6c 61 6e 63 65 64 28 61 2c 20 62 2c 20 4d nced.sinkhorn_unbalanced(a,.b,.M
0640 2c 20 65 70 73 69 6c 6f 6e 2c 20 61 6c 70 68 61 2c 20 76 65 72 62 6f 73 65 3d 54 72 75 65 29 0a ,.epsilon,.alpha,.verbose=True).
0660 0a 70 6c 2e 66 69 67 75 72 65 28 34 2c 20 66 69 67 73 69 7a 65 3d 28 35 2c 20 35 29 29 0a 6f 74 .pl.figure(4,.figsize=(5,.5)).ot
0680 2e 70 6c 6f 74 2e 70 6c 6f 74 31 44 5f 6d 61 74 28 61 2c 20 62 2c 20 47 73 2c 20 27 55 4f 54 20 .plot.plot1D_mat(a,.b,.Gs,.'UOT.
06a0 6d 61 74 72 69 78 20 53 69 6e 6b 68 6f 72 6e 27 29 0a 0a 70 6c 2e 73 68 6f 77 28 29 0a 50 4b 03 matrix.Sinkhorn')..pl.show().PK.
06c0 04 14 00 00 00 00 00 da 74 d9 4e c6 3b 52 da f3 0a 00 00 f3 0a 00 00 0e 00 00 00 70 6c 6f 74 5f ........t.N.;R.............plot_
06e0 67 72 6f 6d 6f 76 2e 70 79 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d gromov.py#.-*-.coding:.utf-8.-*-
0700 0d 0a 22 22 22 0d 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d .."""..=========================
0720 3d 0d 0a 47 72 6f 6d 6f 76 2d 57 61 73 73 65 72 73 74 65 69 6e 20 65 78 61 6d 70 6c 65 0d 0a 3d =..Gromov-Wasserstein.example..=
0740 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0d 0a 0d 0a 54 68 69 =========================....Thi
0760 73 20 65 78 61 6d 70 6c 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 73 68 6f 77 20 68 6f s.example.is.designed.to.show.ho
0780 77 20 74 6f 20 75 73 65 20 74 68 65 20 47 72 6f 6d 6f 76 2d 57 61 73 73 65 72 74 73 65 69 6e 20 w.to.use.the.Gromov-Wassertsein.
07a0 64 69 73 74 61 6e 63 65 0d 0a 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 6e 20 50 4f 54 2e 0d 0a 22 distance..computation.in.POT..."
07c0 22 22 0d 0a 0d 0a 23 20 41 75 74 68 6f 72 3a 20 45 72 77 61 6e 20 56 61 75 74 69 65 72 20 3c 65 ""....#.Author:.Erwan.Vautier.<e
07e0 72 77 61 6e 2e 76 61 75 74 69 65 72 40 67 6d 61 69 6c 2e 63 6f 6d 3e 0d 0a 23 20 20 20 20 20 20 rwan.vautier@gmail.com>..#......
0800 20 20 20 4e 69 63 6f 6c 61 73 20 43 6f 75 72 74 79 20 3c 6e 63 6f 75 72 74 79 40 69 72 69 73 61 ...Nicolas.Courty.<ncourty@irisa
0820 2e 66 72 3e 0d 0a 23 0d 0a 23 20 4c 69 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 63 65 6e 73 65 0d .fr>..#..#.License:.MIT.License.
0840 0a 0d 0a 69 6d 70 6f 72 74 20 73 63 69 70 79 20 61 73 20 73 70 0d 0a 69 6d 70 6f 72 74 20 6e 75 ...import.scipy.as.sp..import.nu
0860 6d 70 79 20 61 73 20 6e 70 0d 0a 69 6d 70 6f 72 74 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 70 79 6c mpy.as.np..import.matplotlib.pyl
0880 61 62 20 61 73 20 70 6c 0d 0a 66 72 6f 6d 20 6d 70 6c 5f 74 6f 6f 6c 6b 69 74 73 2e 6d 70 6c 6f ab.as.pl..from.mpl_toolkits.mplo
08a0 74 33 64 20 69 6d 70 6f 72 74 20 41 78 65 73 33 44 20 20 23 20 6e 6f 71 61 0d 0a 69 6d 70 6f 72 t3d.import.Axes3D..#.noqa..impor
08c0 74 20 6f 74 0d 0a 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 t.ot....########################
08e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
0900 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 23 0d 0a 23 20 53 61 6d 70 #####################..#..#.Samp
0920 6c 65 20 74 77 6f 20 47 61 75 73 73 69 61 6e 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 28 32 le.two.Gaussian.distributions.(2
0940 44 20 61 6e 64 20 33 44 29 0d 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d D.and.3D)..#.-------------------
0960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 23 0d 0a 23 --------------------------..#..#
0980 20 54 68 65 20 47 72 6f 6d 6f 76 2d 57 61 73 73 65 72 73 74 65 69 6e 20 64 69 73 74 61 6e 63 65 .The.Gromov-Wasserstein.distance
09a0 20 61 6c 6c 6f 77 73 20 74 6f 20 63 6f 6d 70 75 74 65 20 64 69 73 74 61 6e 63 65 73 20 77 69 74 .allows.to.compute.distances.wit
09c0 68 20 73 61 6d 70 6c 65 73 20 74 68 61 74 0d 0a 23 20 64 6f 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 h.samples.that..#.do.not.belong.
09e0 74 6f 20 74 68 65 20 73 61 6d 65 20 6d 65 74 72 69 63 20 73 70 61 63 65 2e 20 46 6f 72 20 64 65 to.the.same.metric.space..For.de
0a00 6d 6f 6e 73 74 72 61 74 69 6f 6e 20 70 75 72 70 6f 73 65 2c 20 77 65 20 73 61 6d 70 6c 65 0d 0a monstration.purpose,.we.sample..
0a20 23 20 74 77 6f 20 47 61 75 73 73 69 61 6e 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 69 6e 20 #.two.Gaussian.distributions.in.
0a40 32 2d 20 61 6e 64 20 33 2d 64 69 6d 65 6e 73 69 6f 6e 61 6c 20 73 70 61 63 65 73 2e 0d 0a 0d 0a 2-.and.3-dimensional.spaces.....
0a60 0d 0a 6e 5f 73 61 6d 70 6c 65 73 20 3d 20 33 30 20 20 23 20 6e 62 20 73 61 6d 70 6c 65 73 0d 0a ..n_samples.=.30..#.nb.samples..
0a80 0d 0a 6d 75 5f 73 20 3d 20 6e 70 2e 61 72 72 61 79 28 5b 30 2c 20 30 5d 29 0d 0a 63 6f 76 5f 73 ..mu_s.=.np.array([0,.0])..cov_s
0aa0 20 3d 20 6e 70 2e 61 72 72 61 79 28 5b 5b 31 2c 20 30 5d 2c 20 5b 30 2c 20 31 5d 5d 29 0d 0a 0d .=.np.array([[1,.0],.[0,.1]])...
0ac0 0a 6d 75 5f 74 20 3d 20 6e 70 2e 61 72 72 61 79 28 5b 34 2c 20 34 2c 20 34 5d 29 0d 0a 63 6f 76 .mu_t.=.np.array([4,.4,.4])..cov
0ae0 5f 74 20 3d 20 6e 70 2e 61 72 72 61 79 28 5b 5b 31 2c 20 30 2c 20 30 5d 2c 20 5b 30 2c 20 31 2c _t.=.np.array([[1,.0,.0],.[0,.1,
0b00 20 30 5d 2c 20 5b 30 2c 20 30 2c 20 31 5d 5d 29 0d 0a 0d 0a 0d 0a 78 73 20 3d 20 6f 74 2e 64 61 .0],.[0,.0,.1]])......xs.=.ot.da
0b20 74 61 73 65 74 73 2e 6d 61 6b 65 5f 32 44 5f 73 61 6d 70 6c 65 73 5f 67 61 75 73 73 28 6e 5f 73 tasets.make_2D_samples_gauss(n_s
0b40 61 6d 70 6c 65 73 2c 20 6d 75 5f 73 2c 20 63 6f 76 5f 73 29 0d 0a 50 20 3d 20 73 70 2e 6c 69 6e amples,.mu_s,.cov_s)..P.=.sp.lin
0b60 61 6c 67 2e 73 71 72 74 6d 28 63 6f 76 5f 74 29 0d 0a 78 74 20 3d 20 6e 70 2e 72 61 6e 64 6f 6d alg.sqrtm(cov_t)..xt.=.np.random
0b80 2e 72 61 6e 64 6e 28 6e 5f 73 61 6d 70 6c 65 73 2c 20 33 29 2e 64 6f 74 28 50 29 20 2b 20 6d 75 .randn(n_samples,.3).dot(P).+.mu
0ba0 5f 74 0d 0a 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 _t....##########################
0bc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
0be0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 23 0d 0a 23 20 50 6c 6f 74 74 69 ###################..#..#.Plotti
0c00 6e 67 20 74 68 65 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0d 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d ng.the.distributions..#.--------
0c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 0d 0a 0d 0a 66 69 67 20 3d 20 70 6c ------------------......fig.=.pl
0c40 2e 66 69 67 75 72 65 28 29 0d 0a 61 78 31 20 3d 20 66 69 67 2e 61 64 64 5f 73 75 62 70 6c 6f 74 .figure()..ax1.=.fig.add_subplot
0c60 28 31 32 31 29 0d 0a 61 78 31 2e 70 6c 6f 74 28 78 73 5b 3a 2c 20 30 5d 2c 20 78 73 5b 3a 2c 20 (121)..ax1.plot(xs[:,.0],.xs[:,.
0c80 31 5d 2c 20 27 2b 62 27 2c 20 6c 61 62 65 6c 3d 27 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 1],.'+b',.label='Source.samples'
0ca0 29 0d 0a 61 78 32 20 3d 20 66 69 67 2e 61 64 64 5f 73 75 62 70 6c 6f 74 28 31 32 32 2c 20 70 72 )..ax2.=.fig.add_subplot(122,.pr
0cc0 6f 6a 65 63 74 69 6f 6e 3d 27 33 64 27 29 0d 0a 61 78 32 2e 73 63 61 74 74 65 72 28 78 74 5b 3a ojection='3d')..ax2.scatter(xt[:
0ce0 2c 20 30 5d 2c 20 78 74 5b 3a 2c 20 31 5d 2c 20 78 74 5b 3a 2c 20 32 5d 2c 20 63 6f 6c 6f 72 3d ,.0],.xt[:,.1],.xt[:,.2],.color=
0d00 27 72 27 29 0d 0a 70 6c 2e 73 68 6f 77 28 29 0d 0a 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 'r')..pl.show()....#############
0d20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
0d40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
0d60 0d 0a 23 0d 0a 23 20 43 6f 6d 70 75 74 65 20 64 69 73 74 61 6e 63 65 20 6b 65 72 6e 65 6c 73 2c ..#..#.Compute.distance.kernels,
0d80 20 6e 6f 72 6d 61 6c 69 7a 65 20 74 68 65 6d 20 61 6e 64 20 74 68 65 6e 20 64 69 73 70 6c 61 79 .normalize.them.and.then.display
0da0 0d 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ..#.----------------------------
0dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 0d -----------------------------...
0de0 0a 0d 0a 43 31 20 3d 20 73 70 2e 73 70 61 74 69 61 6c 2e 64 69 73 74 61 6e 63 65 2e 63 64 69 73 ...C1.=.sp.spatial.distance.cdis
0e00 74 28 78 73 2c 20 78 73 29 0d 0a 43 32 20 3d 20 73 70 2e 73 70 61 74 69 61 6c 2e 64 69 73 74 61 t(xs,.xs)..C2.=.sp.spatial.dista
0e20 6e 63 65 2e 63 64 69 73 74 28 78 74 2c 20 78 74 29 0d 0a 0d 0a 43 31 20 2f 3d 20 43 31 2e 6d 61 nce.cdist(xt,.xt)....C1./=.C1.ma
0e40 78 28 29 0d 0a 43 32 20 2f 3d 20 43 32 2e 6d 61 78 28 29 0d 0a 0d 0a 70 6c 2e 66 69 67 75 72 65 x()..C2./=.C2.max()....pl.figure
0e60 28 29 0d 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 32 31 29 0d 0a 70 6c 2e 69 6d 73 68 6f 77 28 43 ()..pl.subplot(121)..pl.imshow(C
0e80 31 29 0d 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 32 32 29 0d 0a 70 6c 2e 69 6d 73 68 6f 77 28 43 1)..pl.subplot(122)..pl.imshow(C
0ea0 32 29 0d 0a 70 6c 2e 73 68 6f 77 28 29 0d 0a 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 2)..pl.show()....###############
0ec0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
0ee0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a ##############################..
0f00 23 0d 0a 23 20 43 6f 6d 70 75 74 65 20 47 72 6f 6d 6f 76 2d 57 61 73 73 65 72 73 74 65 69 6e 20 #..#.Compute.Gromov-Wasserstein.
0f20 70 6c 61 6e 73 20 61 6e 64 20 64 69 73 74 61 6e 63 65 0d 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d plans.and.distance..#.----------
0f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
0f60 2d 2d 2d 0d 0a 0d 0a 70 20 3d 20 6f 74 2e 75 6e 69 66 28 6e 5f 73 61 6d 70 6c 65 73 29 0d 0a 71 ---....p.=.ot.unif(n_samples)..q
0f80 20 3d 20 6f 74 2e 75 6e 69 66 28 6e 5f 73 61 6d 70 6c 65 73 29 0d 0a 0d 0a 67 77 30 2c 20 6c 6f .=.ot.unif(n_samples)....gw0,.lo
0fa0 67 30 20 3d 20 6f 74 2e 67 72 6f 6d 6f 76 2e 67 72 6f 6d 6f 76 5f 77 61 73 73 65 72 73 74 65 69 g0.=.ot.gromov.gromov_wasserstei
0fc0 6e 28 0d 0a 20 20 20 20 43 31 2c 20 43 32 2c 20 70 2c 20 71 2c 20 27 73 71 75 61 72 65 5f 6c 6f n(......C1,.C2,.p,.q,.'square_lo
0fe0 73 73 27 2c 20 76 65 72 62 6f 73 65 3d 54 72 75 65 2c 20 6c 6f 67 3d 54 72 75 65 29 0d 0a 0d 0a ss',.verbose=True,.log=True)....
1000 67 77 2c 20 6c 6f 67 20 3d 20 6f 74 2e 67 72 6f 6d 6f 76 2e 65 6e 74 72 6f 70 69 63 5f 67 72 6f gw,.log.=.ot.gromov.entropic_gro
1020 6d 6f 76 5f 77 61 73 73 65 72 73 74 65 69 6e 28 0d 0a 20 20 20 20 43 31 2c 20 43 32 2c 20 70 2c mov_wasserstein(......C1,.C2,.p,
1040 20 71 2c 20 27 73 71 75 61 72 65 5f 6c 6f 73 73 27 2c 20 65 70 73 69 6c 6f 6e 3d 35 65 2d 34 2c .q,.'square_loss',.epsilon=5e-4,
1060 20 6c 6f 67 3d 54 72 75 65 2c 20 76 65 72 62 6f 73 65 3d 54 72 75 65 29 0d 0a 0d 0a 0d 0a 70 72 .log=True,.verbose=True)......pr
1080 69 6e 74 28 27 47 72 6f 6d 6f 76 2d 57 61 73 73 65 72 73 74 65 69 6e 20 64 69 73 74 61 6e 63 65 int('Gromov-Wasserstein.distance
10a0 73 3a 20 27 20 2b 20 73 74 72 28 6c 6f 67 30 5b 27 67 77 5f 64 69 73 74 27 5d 29 29 0d 0a 70 72 s:.'.+.str(log0['gw_dist']))..pr
10c0 69 6e 74 28 27 45 6e 74 72 6f 70 69 63 20 47 72 6f 6d 6f 76 2d 57 61 73 73 65 72 73 74 65 69 6e int('Entropic.Gromov-Wasserstein
10e0 20 64 69 73 74 61 6e 63 65 73 3a 20 27 20 2b 20 73 74 72 28 6c 6f 67 5b 27 67 77 5f 64 69 73 74 .distances:.'.+.str(log['gw_dist
1100 27 5d 29 29 0d 0a 0d 0a 0d 0a 70 6c 2e 66 69 67 75 72 65 28 31 2c 20 28 31 30 2c 20 35 29 29 0d ']))......pl.figure(1,.(10,.5)).
1120 0a 0d 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 32 2c 20 31 29 0d 0a 70 6c 2e 69 6d 73 68 6f ...pl.subplot(1,.2,.1)..pl.imsho
1140 77 28 67 77 30 2c 20 63 6d 61 70 3d 27 6a 65 74 27 29 0d 0a 70 6c 2e 74 69 74 6c 65 28 27 47 72 w(gw0,.cmap='jet')..pl.title('Gr
1160 6f 6d 6f 76 20 57 61 73 73 65 72 73 74 65 69 6e 27 29 0d 0a 0d 0a 70 6c 2e 73 75 62 70 6c 6f 74 omov.Wasserstein')....pl.subplot
1180 28 31 2c 20 32 2c 20 32 29 0d 0a 70 6c 2e 69 6d 73 68 6f 77 28 67 77 2c 20 63 6d 61 70 3d 27 6a (1,.2,.2)..pl.imshow(gw,.cmap='j
11a0 65 74 27 29 0d 0a 70 6c 2e 74 69 74 6c 65 28 27 45 6e 74 72 6f 70 69 63 20 47 72 6f 6d 6f 76 20 et')..pl.title('Entropic.Gromov.
11c0 57 61 73 73 65 72 73 74 65 69 6e 27 29 0d 0a 0d 0a 70 6c 2e 73 68 6f 77 28 29 0d 0a 50 4b 03 04 Wasserstein')....pl.show()..PK..
11e0 14 00 00 00 00 00 da 74 d9 4e a4 4f 47 3f 0c 0c 00 00 0c 0c 00 00 0b 00 00 00 70 6c 6f 74 5f 57 .......t.N.OG?............plot_W
1200 44 41 2e 70 79 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0a 22 22 22 DA.py#.-*-.coding:.utf-8.-*-."""
1220 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d .===============================
1240 3d 3d 0a 57 61 73 73 65 72 73 74 65 69 6e 20 44 69 73 63 72 69 6d 69 6e 61 6e 74 20 41 6e 61 6c ==.Wasserstein.Discriminant.Anal
1260 79 73 69 73 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ysis.===========================
1280 3d 3d 3d 3d 3d 3d 0a 0a 54 68 69 73 20 65 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61 74 65 20 ======..This.example.illustrate.
12a0 74 68 65 20 75 73 65 20 6f 66 20 57 44 41 20 61 73 20 70 72 6f 70 6f 73 65 64 20 69 6e 20 5b 31 the.use.of.WDA.as.proposed.in.[1
12c0 31 5d 2e 0a 0a 0a 5b 31 31 5d 20 46 6c 61 6d 61 72 79 2c 20 52 2e 2c 20 43 75 74 75 72 69 2c 20 1]....[11].Flamary,.R.,.Cuturi,.
12e0 4d 2e 2c 20 43 6f 75 72 74 79 2c 20 4e 2e 2c 20 26 20 52 61 6b 6f 74 6f 6d 61 6d 6f 6e 6a 79 2c M.,.Courty,.N.,.&.Rakotomamonjy,
1300 20 41 2e 20 28 32 30 31 36 29 2e 0a 57 61 73 73 65 72 73 74 65 69 6e 20 44 69 73 63 72 69 6d 69 .A..(2016)..Wasserstein.Discrimi
1320 6e 61 6e 74 20 41 6e 61 6c 79 73 69 73 2e 0a 0a 22 22 22 0a 0a 23 20 41 75 74 68 6f 72 3a 20 52 nant.Analysis..."""..#.Author:.R
1340 65 6d 69 20 46 6c 61 6d 61 72 79 20 3c 72 65 6d 69 2e 66 6c 61 6d 61 72 79 40 75 6e 69 63 65 2e emi.Flamary.<remi.flamary@unice.
1360 66 72 3e 0a 23 0a 23 20 4c 69 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 63 65 6e 73 65 0a 0a 69 6d fr>.#.#.License:.MIT.License..im
1380 70 6f 72 74 20 6e 75 6d 70 79 20 61 73 20 6e 70 0a 69 6d 70 6f 72 74 20 6d 61 74 70 6c 6f 74 6c port.numpy.as.np.import.matplotl
13a0 69 62 2e 70 79 6c 61 62 20 61 73 20 70 6c 0a 0a 66 72 6f 6d 20 6f 74 2e 64 72 20 69 6d 70 6f 72 ib.pylab.as.pl..from.ot.dr.impor
13c0 74 20 77 64 61 2c 20 66 64 61 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 t.wda,.fda...###################
13e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
1400 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 47 65 ###########################.#.Ge
1420 6e 65 72 61 74 65 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 nerate.data.#.-------------..#%%
1440 20 70 61 72 61 6d 65 74 65 72 73 0a 0a 6e 20 3d 20 31 30 30 30 20 20 23 20 6e 62 20 73 61 6d 70 .parameters..n.=.1000..#.nb.samp
1460 6c 65 73 20 69 6e 20 73 6f 75 72 63 65 20 61 6e 64 20 74 61 72 67 65 74 20 64 61 74 61 73 65 74 les.in.source.and.target.dataset
1480 73 0a 6e 7a 20 3d 20 30 2e 32 0a 0a 23 20 67 65 6e 65 72 61 74 65 20 63 69 72 63 6c 65 20 64 61 s.nz.=.0.2..#.generate.circle.da
14a0 74 61 73 65 74 0a 74 20 3d 20 6e 70 2e 72 61 6e 64 6f 6d 2e 72 61 6e 64 28 6e 29 20 2a 20 32 20 taset.t.=.np.random.rand(n).*.2.
14c0 2a 20 6e 70 2e 70 69 0a 79 73 20 3d 20 6e 70 2e 66 6c 6f 6f 72 28 28 6e 70 2e 61 72 61 6e 67 65 *.np.pi.ys.=.np.floor((np.arange
14e0 28 6e 29 20 2a 20 31 2e 30 20 2f 20 6e 20 2a 20 33 29 29 20 2b 20 31 0a 78 73 20 3d 20 6e 70 2e (n).*.1.0./.n.*.3)).+.1.xs.=.np.
1500 63 6f 6e 63 61 74 65 6e 61 74 65 28 0a 20 20 20 20 28 6e 70 2e 63 6f 73 28 74 29 2e 72 65 73 68 concatenate(.....(np.cos(t).resh
1520 61 70 65 28 28 2d 31 2c 20 31 29 29 2c 20 6e 70 2e 73 69 6e 28 74 29 2e 72 65 73 68 61 70 65 28 ape((-1,.1)),.np.sin(t).reshape(
1540 28 2d 31 2c 20 31 29 29 29 2c 20 31 29 0a 78 73 20 3d 20 78 73 20 2a 20 79 73 2e 72 65 73 68 61 (-1,.1))),.1).xs.=.xs.*.ys.resha
1560 70 65 28 2d 31 2c 20 31 29 20 2b 20 6e 7a 20 2a 20 6e 70 2e 72 61 6e 64 6f 6d 2e 72 61 6e 64 6e pe(-1,.1).+.nz.*.np.random.randn
1580 28 6e 2c 20 32 29 0a 0a 74 20 3d 20 6e 70 2e 72 61 6e 64 6f 6d 2e 72 61 6e 64 28 6e 29 20 2a 20 (n,.2)..t.=.np.random.rand(n).*.
15a0 32 20 2a 20 6e 70 2e 70 69 0a 79 74 20 3d 20 6e 70 2e 66 6c 6f 6f 72 28 28 6e 70 2e 61 72 61 6e 2.*.np.pi.yt.=.np.floor((np.aran
15c0 67 65 28 6e 29 20 2a 20 31 2e 30 20 2f 20 6e 20 2a 20 33 29 29 20 2b 20 31 0a 78 74 20 3d 20 6e ge(n).*.1.0./.n.*.3)).+.1.xt.=.n
15e0 70 2e 63 6f 6e 63 61 74 65 6e 61 74 65 28 0a 20 20 20 20 28 6e 70 2e 63 6f 73 28 74 29 2e 72 65 p.concatenate(.....(np.cos(t).re
1600 73 68 61 70 65 28 28 2d 31 2c 20 31 29 29 2c 20 6e 70 2e 73 69 6e 28 74 29 2e 72 65 73 68 61 70 shape((-1,.1)),.np.sin(t).reshap
1620 65 28 28 2d 31 2c 20 31 29 29 29 2c 20 31 29 0a 78 74 20 3d 20 78 74 20 2a 20 79 74 2e 72 65 73 e((-1,.1))),.1).xt.=.xt.*.yt.res
1640 68 61 70 65 28 2d 31 2c 20 31 29 20 2b 20 6e 7a 20 2a 20 6e 70 2e 72 61 6e 64 6f 6d 2e 72 61 6e hape(-1,.1).+.nz.*.np.random.ran
1660 64 6e 28 6e 2c 20 32 29 0a 0a 6e 62 6e 6f 69 73 65 20 3d 20 38 0a 0a 78 73 20 3d 20 6e 70 2e 68 dn(n,.2)..nbnoise.=.8..xs.=.np.h
1680 73 74 61 63 6b 28 28 78 73 2c 20 6e 70 2e 72 61 6e 64 6f 6d 2e 72 61 6e 64 6e 28 6e 2c 20 6e 62 stack((xs,.np.random.randn(n,.nb
16a0 6e 6f 69 73 65 29 29 29 0a 78 74 20 3d 20 6e 70 2e 68 73 74 61 63 6b 28 28 78 74 2c 20 6e 70 2e noise))).xt.=.np.hstack((xt,.np.
16c0 72 61 6e 64 6f 6d 2e 72 61 6e 64 6e 28 6e 2c 20 6e 62 6e 6f 69 73 65 29 29 29 0a 0a 23 23 23 23 random.randn(n,.nbnoise)))..####
16e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
1700 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
1720 23 23 23 23 23 23 23 23 23 23 0a 23 20 50 6c 6f 74 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d ##########.#.Plot.data.#.-------
1740 2d 2d 0a 0a 23 25 25 20 70 6c 6f 74 20 73 61 6d 70 6c 65 73 0a 70 6c 2e 66 69 67 75 72 65 28 31 --..#%%.plot.samples.pl.figure(1
1760 2c 20 66 69 67 73 69 7a 65 3d 28 36 2e 34 2c 20 33 2e 35 29 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f ,.figsize=(6.4,.3.5))..pl.subplo
1780 74 28 31 2c 20 32 2c 20 31 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 78 74 5b 3a 2c 20 30 5d 2c 20 t(1,.2,.1).pl.scatter(xt[:,.0],.
17a0 78 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 20 6d 61 72 6b 65 72 3d 27 2b 27 2c 20 6c 61 62 65 xt[:,.1],.c=ys,.marker='+',.labe
17c0 6c 3d 27 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f l='Source.samples').pl.legend(lo
17e0 63 3d 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 44 69 73 63 72 69 6d 69 6e 61 6e 74 20 64 69 6d 65 c=0).pl.title('Discriminant.dime
1800 6e 73 69 6f 6e 73 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 32 2c 20 32 29 0a 70 6c nsions')..pl.subplot(1,.2,.2).pl
1820 2e 73 63 61 74 74 65 72 28 78 74 5b 3a 2c 20 32 5d 2c 20 78 74 5b 3a 2c 20 33 5d 2c 20 63 3d 79 .scatter(xt[:,.2],.xt[:,.3],.c=y
1840 73 2c 20 6d 61 72 6b 65 72 3d 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 53 6f 75 72 63 65 20 73 61 6d s,.marker='+',.label='Source.sam
1860 70 6c 65 73 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 6c 65 ples').pl.legend(loc=0).pl.title
1880 28 27 4f 74 68 65 72 20 64 69 6d 65 6e 73 69 6f 6e 73 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 ('Other.dimensions').pl.tight_la
18a0 79 6f 75 74 28 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 yout()..########################
18c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
18e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 43 6f 6d 70 75 74 65 ######################.#.Compute
1900 20 46 69 73 68 65 72 20 44 69 73 63 72 69 6d 69 6e 61 6e 74 20 41 6e 61 6c 79 73 69 73 0a 23 20 .Fisher.Discriminant.Analysis.#.
1920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
1940 2d 2d 2d 2d 0a 0a 23 25 25 20 43 6f 6d 70 75 74 65 20 46 44 41 0a 70 20 3d 20 32 0a 0a 50 66 64 ----..#%%.Compute.FDA.p.=.2..Pfd
1960 61 2c 20 70 72 6f 6a 66 64 61 20 3d 20 66 64 61 28 78 73 2c 20 79 73 2c 20 70 29 0a 0a 23 23 23 a,.projfda.=.fda(xs,.ys,.p)..###
1980 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
19a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
19c0 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 43 6f 6d 70 75 74 65 20 57 61 73 73 65 72 73 74 65 69 ###########.#.Compute.Wasserstei
19e0 6e 20 44 69 73 63 72 69 6d 69 6e 61 6e 74 20 41 6e 61 6c 79 73 69 73 0a 23 20 2d 2d 2d 2d 2d 2d n.Discriminant.Analysis.#.------
1a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
1a20 2d 2d 2d 0a 0a 23 25 25 20 43 6f 6d 70 75 74 65 20 57 44 41 0a 70 20 3d 20 32 0a 72 65 67 20 3d ---..#%%.Compute.WDA.p.=.2.reg.=
1a40 20 31 65 30 0a 6b 20 3d 20 31 30 0a 6d 61 78 69 74 65 72 20 3d 20 31 30 30 0a 0a 50 77 64 61 2c .1e0.k.=.10.maxiter.=.100..Pwda,
1a60 20 70 72 6f 6a 77 64 61 20 3d 20 77 64 61 28 78 73 2c 20 79 73 2c 20 70 2c 20 72 65 67 2c 20 6b .projwda.=.wda(xs,.ys,.p,.reg,.k
1a80 2c 20 6d 61 78 69 74 65 72 3d 6d 61 78 69 74 65 72 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 ,.maxiter=maxiter)...###########
1aa0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
1ac0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
1ae0 23 23 23 0a 23 20 50 6c 6f 74 20 32 44 20 70 72 6f 6a 65 63 74 69 6f 6e 73 0a 23 20 2d 2d 2d 2d ###.#.Plot.2D.projections.#.----
1b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 70 6c 6f 74 20 73 61 6d 70 6c 65 ---------------..#%%.plot.sample
1b20 73 0a 0a 78 73 70 20 3d 20 70 72 6f 6a 66 64 61 28 78 73 29 0a 78 74 70 20 3d 20 70 72 6f 6a 66 s..xsp.=.projfda(xs).xtp.=.projf
1b40 64 61 28 78 74 29 0a 0a 78 73 70 77 20 3d 20 70 72 6f 6a 77 64 61 28 78 73 29 0a 78 74 70 77 20 da(xt)..xspw.=.projwda(xs).xtpw.
1b60 3d 20 70 72 6f 6a 77 64 61 28 78 74 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 32 29 0a 0a 70 6c 2e =.projwda(xt)..pl.figure(2)..pl.
1b80 73 75 62 70 6c 6f 74 28 32 2c 20 32 2c 20 31 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 78 73 70 5b subplot(2,.2,.1).pl.scatter(xsp[
1ba0 3a 2c 20 30 5d 2c 20 78 73 70 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 20 6d 61 72 6b 65 72 3d 27 :,.0],.xsp[:,.1],.c=ys,.marker='
1bc0 2b 27 2c 20 6c 61 62 65 6c 3d 27 50 72 6f 6a 65 63 74 65 64 20 73 61 6d 70 6c 65 73 27 29 0a 70 +',.label='Projected.samples').p
1be0 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 50 72 6f 6a 65 63 l.legend(loc=0).pl.title('Projec
1c00 74 65 64 20 74 72 61 69 6e 69 6e 67 20 73 61 6d 70 6c 65 73 20 46 44 41 27 29 0a 0a 70 6c 2e 73 ted.training.samples.FDA')..pl.s
1c20 75 62 70 6c 6f 74 28 32 2c 20 32 2c 20 32 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 78 74 70 5b 3a ubplot(2,.2,.2).pl.scatter(xtp[:
1c40 2c 20 30 5d 2c 20 78 74 70 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 20 6d 61 72 6b 65 72 3d 27 2b ,.0],.xtp[:,.1],.c=ys,.marker='+
1c60 27 2c 20 6c 61 62 65 6c 3d 27 50 72 6f 6a 65 63 74 65 64 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c ',.label='Projected.samples').pl
1c80 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 50 72 6f 6a 65 63 74 .legend(loc=0).pl.title('Project
1ca0 65 64 20 74 65 73 74 20 73 61 6d 70 6c 65 73 20 46 44 41 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f ed.test.samples.FDA')..pl.subplo
1cc0 74 28 32 2c 20 32 2c 20 33 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 78 73 70 77 5b 3a 2c 20 30 5d t(2,.2,.3).pl.scatter(xspw[:,.0]
1ce0 2c 20 78 73 70 77 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 20 6d 61 72 6b 65 72 3d 27 2b 27 2c 20 ,.xspw[:,.1],.c=ys,.marker='+',.
1d00 6c 61 62 65 6c 3d 27 50 72 6f 6a 65 63 74 65 64 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 6c 65 label='Projected.samples').pl.le
1d20 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 50 72 6f 6a 65 63 74 65 64 20 gend(loc=0).pl.title('Projected.
1d40 74 72 61 69 6e 69 6e 67 20 73 61 6d 70 6c 65 73 20 57 44 41 27 29 0a 0a 70 6c 2e 73 75 62 70 6c training.samples.WDA')..pl.subpl
1d60 6f 74 28 32 2c 20 32 2c 20 34 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 78 74 70 77 5b 3a 2c 20 30 ot(2,.2,.4).pl.scatter(xtpw[:,.0
1d80 5d 2c 20 78 74 70 77 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 20 6d 61 72 6b 65 72 3d 27 2b 27 2c ],.xtpw[:,.1],.c=ys,.marker='+',
1da0 20 6c 61 62 65 6c 3d 27 50 72 6f 6a 65 63 74 65 64 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 6c .label='Projected.samples').pl.l
1dc0 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 50 72 6f 6a 65 63 74 65 64 egend(loc=0).pl.title('Projected
1de0 20 74 65 73 74 20 73 61 6d 70 6c 65 73 20 57 44 41 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 .test.samples.WDA').pl.tight_lay
1e00 6f 75 74 28 29 0a 0a 70 6c 2e 73 68 6f 77 28 29 0a 50 4b 03 04 14 00 00 00 00 00 dc 74 d9 4e e5 out()..pl.show().PK.........t.N.
1e20 d4 47 7d 9d 1c 00 00 9d 1c 00 00 19 00 00 00 70 6c 6f 74 5f 67 72 6f 6d 6f 76 5f 62 61 72 79 63 .G}............plot_gromov_baryc
1e40 65 6e 74 65 72 2e 70 79 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0d enter.py#.-*-.coding:.utf-8.-*-.
1e60 0a 22 22 22 0d 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ."""..==========================
1e80 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0d 0a 47 72 6f 6d 6f 76 2d 57 61 73 73 65 72 73 74 65 69 6e 20 ===========..Gromov-Wasserstein.
1ea0 42 61 72 79 63 65 6e 74 65 72 20 65 78 61 6d 70 6c 65 0d 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d Barycenter.example..============
1ec0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0d 0a 0d 0a 54 68 69 =========================....Thi
1ee0 73 20 65 78 61 6d 70 6c 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 73 68 6f 77 20 68 6f s.example.is.designed.to.show.ho
1f00 77 20 74 6f 20 75 73 65 20 74 68 65 20 47 72 6f 6d 6f 76 2d 57 61 73 73 65 72 73 74 65 69 6e 20 w.to.use.the.Gromov-Wasserstein.
1f20 64 69 73 74 61 6e 63 65 0d 0a 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 6e 20 50 4f 54 2e 0d 0a 22 distance..computation.in.POT..."
1f40 22 22 0d 0a 0d 0a 23 20 41 75 74 68 6f 72 3a 20 45 72 77 61 6e 20 56 61 75 74 69 65 72 20 3c 65 ""....#.Author:.Erwan.Vautier.<e
1f60 72 77 61 6e 2e 76 61 75 74 69 65 72 40 67 6d 61 69 6c 2e 63 6f 6d 3e 0d 0a 23 20 20 20 20 20 20 rwan.vautier@gmail.com>..#......
1f80 20 20 20 4e 69 63 6f 6c 61 73 20 43 6f 75 72 74 79 20 3c 6e 63 6f 75 72 74 79 40 69 72 69 73 61 ...Nicolas.Courty.<ncourty@irisa
1fa0 2e 66 72 3e 0d 0a 23 0d 0a 23 20 4c 69 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 63 65 6e 73 65 0d .fr>..#..#.License:.MIT.License.
1fc0 0a 0d 0a 0d 0a 69 6d 70 6f 72 74 20 6e 75 6d 70 79 20 61 73 20 6e 70 0d 0a 69 6d 70 6f 72 74 20 .....import.numpy.as.np..import.
1fe0 73 63 69 70 79 20 61 73 20 73 70 0d 0a 0d 0a 69 6d 70 6f 72 74 20 73 63 69 70 79 2e 6e 64 69 6d scipy.as.sp....import.scipy.ndim
2000 61 67 65 20 61 73 20 73 70 69 0d 0a 69 6d 70 6f 72 74 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 70 79 age.as.spi..import.matplotlib.py
2020 6c 61 62 20 61 73 20 70 6c 0d 0a 66 72 6f 6d 20 73 6b 6c 65 61 72 6e 20 69 6d 70 6f 72 74 20 6d lab.as.pl..from.sklearn.import.m
2040 61 6e 69 66 6f 6c 64 0d 0a 66 72 6f 6d 20 73 6b 6c 65 61 72 6e 2e 64 65 63 6f 6d 70 6f 73 69 74 anifold..from.sklearn.decomposit
2060 69 6f 6e 20 69 6d 70 6f 72 74 20 50 43 41 0d 0a 0d 0a 69 6d 70 6f 72 74 20 6f 74 0d 0a 0d 0a 23 ion.import.PCA....import.ot....#
2080 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
20a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
20c0 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 23 20 53 6d 61 63 6f 66 20 4d 44 53 0d 0a 23 20 2d #############..#.Smacof.MDS..#.-
20e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 23 0d 0a 23 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c ---------..#..#.This.function.al
2100 6c 6f 77 73 20 74 6f 20 66 69 6e 64 20 61 6e 20 65 6d 62 65 64 64 69 6e 67 20 6f 66 20 70 6f 69 lows.to.find.an.embedding.of.poi
2120 6e 74 73 20 67 69 76 65 6e 20 61 20 64 69 73 73 69 6d 69 6c 61 72 69 74 79 20 6d 61 74 72 69 78 nts.given.a.dissimilarity.matrix
2140 0d 0a 23 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 67 69 76 65 6e 20 62 79 20 74 68 65 20 6f 75 ..#.that.will.be.given.by.the.ou
2160 74 70 75 74 20 6f 66 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 0d 0a 0d 0a 0d 0a 64 65 66 20 73 tput.of.the.algorithm......def.s
2180 6d 61 63 6f 66 5f 6d 64 73 28 43 2c 20 64 69 6d 2c 20 6d 61 78 5f 69 74 65 72 3d 33 30 30 30 2c macof_mds(C,.dim,.max_iter=3000,
21a0 20 65 70 73 3d 31 65 2d 39 29 3a 0d 0a 20 20 20 20 22 22 22 0d 0a 20 20 20 20 52 65 74 75 72 6e .eps=1e-9):......"""......Return
21c0 73 20 61 6e 20 69 6e 74 65 72 70 6f 6c 61 74 65 64 20 70 6f 69 6e 74 20 63 6c 6f 75 64 20 66 6f s.an.interpolated.point.cloud.fo
21e0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 69 73 73 69 6d 69 6c 61 72 69 74 79 20 6d 61 74 72 69 78 llowing.the.dissimilarity.matrix
2200 20 43 0d 0a 20 20 20 20 75 73 69 6e 67 20 53 4d 41 43 4f 46 20 6d 75 6c 74 69 64 69 6d 65 6e 73 .C......using.SMACOF.multidimens
2220 69 6f 6e 61 6c 20 73 63 61 6c 69 6e 67 20 28 4d 44 53 29 20 69 6e 20 73 70 65 63 69 66 69 63 20 ional.scaling.(MDS).in.specific.
2240 64 69 6d 65 6e 73 69 6f 6e 6e 65 64 0d 0a 20 20 20 20 74 61 72 67 65 74 20 73 70 61 63 65 0d 0a dimensionned......target.space..
2260 0d 0a 20 20 20 20 50 61 72 61 6d 65 74 65 72 73 0d 0a 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ......Parameters......----------
2280 0d 0a 20 20 20 20 43 20 3a 20 6e 64 61 72 72 61 79 2c 20 73 68 61 70 65 20 28 6e 73 2c 20 6e 73 ......C.:.ndarray,.shape.(ns,.ns
22a0 29 0d 0a 20 20 20 20 20 20 20 20 64 69 73 73 69 6d 69 6c 61 72 69 74 79 20 6d 61 74 72 69 78 0d )..........dissimilarity.matrix.
22c0 0a 20 20 20 20 64 69 6d 20 3a 20 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 20 20 64 69 6d 65 6e 73 .....dim.:.int............dimens
22e0 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 72 67 65 74 65 64 20 73 70 61 63 65 0d 0a 20 20 20 20 6d ion.of.the.targeted.space......m
2300 61 78 5f 69 74 65 72 20 3a 20 20 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 4d 61 78 69 6d 75 6d 20 ax_iter.:..int..........Maximum.
2320 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 53 4d 41 43 number.of.iterations.of.the.SMAC
2340 4f 46 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 75 6e 0d 0a 20 OF.algorithm.for.a.single.run...
2360 20 20 20 65 70 73 20 3a 20 66 6c 6f 61 74 0d 0a 20 20 20 20 20 20 20 20 72 65 6c 61 74 69 76 65 ...eps.:.float..........relative
2380 20 74 6f 6c 65 72 61 6e 63 65 20 77 2e 72 2e 74 20 73 74 72 65 73 73 20 74 6f 20 64 65 63 6c 61 .tolerance.w.r.t.stress.to.decla
23a0 72 65 20 63 6f 6e 76 65 72 67 65 0d 0a 0d 0a 20 20 20 20 52 65 74 75 72 6e 73 0d 0a 20 20 20 20 re.converge........Returns......
23c0 2d 2d 2d 2d 2d 2d 2d 0d 0a 20 20 20 20 6e 70 6f 73 20 3a 20 6e 64 61 72 72 61 79 2c 20 73 68 61 -------......npos.:.ndarray,.sha
23e0 70 65 20 28 52 2c 20 64 69 6d 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 45 6d 62 65 64 64 65 64 pe.(R,.dim).............Embedded
2400 20 63 6f 6f 72 64 69 6e 61 74 65 73 20 6f 66 20 74 68 65 20 69 6e 74 65 72 70 6f 6c 61 74 65 64 .coordinates.of.the.interpolated
2420 20 70 6f 69 6e 74 20 63 6c 6f 75 64 20 28 64 65 66 69 6e 65 64 20 77 69 74 68 0d 0a 20 20 20 20 .point.cloud.(defined.with......
2440 20 20 20 20 20 20 20 6f 6e 65 20 69 73 6f 6d 65 74 72 79 29 0d 0a 20 20 20 20 22 22 22 0d 0a 0d .......one.isometry)......"""...
2460 0a 20 20 20 20 72 6e 67 20 3d 20 6e 70 2e 72 61 6e 64 6f 6d 2e 52 61 6e 64 6f 6d 53 74 61 74 65 .....rng.=.np.random.RandomState
2480 28 73 65 65 64 3d 33 29 0d 0a 0d 0a 20 20 20 20 6d 64 73 20 3d 20 6d 61 6e 69 66 6f 6c 64 2e 4d (seed=3)........mds.=.manifold.M
24a0 44 53 28 0d 0a 20 20 20 20 20 20 20 20 64 69 6d 2c 0d 0a 20 20 20 20 20 20 20 20 6d 61 78 5f 69 DS(..........dim,..........max_i
24c0 74 65 72 3d 6d 61 78 5f 69 74 65 72 2c 0d 0a 20 20 20 20 20 20 20 20 65 70 73 3d 31 65 2d 39 2c ter=max_iter,..........eps=1e-9,
24e0 0d 0a 20 20 20 20 20 20 20 20 64 69 73 73 69 6d 69 6c 61 72 69 74 79 3d 27 70 72 65 63 6f 6d 70 ..........dissimilarity='precomp
2500 75 74 65 64 27 2c 0d 0a 20 20 20 20 20 20 20 20 6e 5f 69 6e 69 74 3d 31 29 0d 0a 20 20 20 20 70 uted',..........n_init=1)......p
2520 6f 73 20 3d 20 6d 64 73 2e 66 69 74 28 43 29 2e 65 6d 62 65 64 64 69 6e 67 5f 0d 0a 0d 0a 20 20 os.=.mds.fit(C).embedding_......
2540 20 20 6e 6d 64 73 20 3d 20 6d 61 6e 69 66 6f 6c 64 2e 4d 44 53 28 0d 0a 20 20 20 20 20 20 20 20 ..nmds.=.manifold.MDS(..........
2560 32 2c 0d 0a 20 20 20 20 20 20 20 20 6d 61 78 5f 69 74 65 72 3d 6d 61 78 5f 69 74 65 72 2c 0d 0a 2,..........max_iter=max_iter,..
2580 20 20 20 20 20 20 20 20 65 70 73 3d 31 65 2d 39 2c 0d 0a 20 20 20 20 20 20 20 20 64 69 73 73 69 ........eps=1e-9,..........dissi
25a0 6d 69 6c 61 72 69 74 79 3d 22 70 72 65 63 6f 6d 70 75 74 65 64 22 2c 0d 0a 20 20 20 20 20 20 20 milarity="precomputed",.........
25c0 20 72 61 6e 64 6f 6d 5f 73 74 61 74 65 3d 72 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 6e 5f 69 6e .random_state=rng,..........n_in
25e0 69 74 3d 31 29 0d 0a 20 20 20 20 6e 70 6f 73 20 3d 20 6e 6d 64 73 2e 66 69 74 5f 74 72 61 6e 73 it=1)......npos.=.nmds.fit_trans
2600 66 6f 72 6d 28 43 2c 20 69 6e 69 74 3d 70 6f 73 29 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 form(C,.init=pos)........return.
2620 6e 70 6f 73 0d 0a 0d 0a 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 npos......######################
2640 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
2660 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 23 20 44 61 74 61 ########################..#.Data
2680 20 70 72 65 70 61 72 61 74 69 6f 6e 0d 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .preparation..#.----------------
26a0 0d 0a 23 0d 0a 23 20 54 68 65 20 66 6f 75 72 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 61 72 ..#..#.The.four.distributions.ar
26c0 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 34 20 73 69 6d 70 6c 65 20 69 6d 61 67 e.constructed.from.4.simple.imag
26e0 65 73 0d 0a 0d 0a 0d 0a 64 65 66 20 69 6d 32 6d 61 74 28 49 29 3a 0d 0a 20 20 20 20 22 22 22 43 es......def.im2mat(I):......"""C
2700 6f 6e 76 65 72 74 73 20 61 6e 64 20 69 6d 61 67 65 20 74 6f 20 6d 61 74 72 69 78 20 28 6f 6e 65 onverts.and.image.to.matrix.(one
2720 20 70 69 78 65 6c 20 70 65 72 20 6c 69 6e 65 29 22 22 22 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 .pixel.per.line)"""......return.
2740 49 2e 72 65 73 68 61 70 65 28 28 49 2e 73 68 61 70 65 5b 30 5d 20 2a 20 49 2e 73 68 61 70 65 5b I.reshape((I.shape[0].*.I.shape[
2760 31 5d 2c 20 49 2e 73 68 61 70 65 5b 32 5d 29 29 0d 0a 0d 0a 0d 0a 73 71 75 61 72 65 20 3d 20 73 1],.I.shape[2]))......square.=.s
2780 70 69 2e 69 6d 72 65 61 64 28 27 2e 2e 2f 64 61 74 61 2f 73 71 75 61 72 65 2e 70 6e 67 27 29 2e pi.imread('../data/square.png').
27a0 61 73 74 79 70 65 28 6e 70 2e 66 6c 6f 61 74 36 34 29 5b 3a 2c 20 3a 2c 20 32 5d 20 2f 20 32 35 astype(np.float64)[:,.:,.2]./.25
27c0 36 0d 0a 63 72 6f 73 73 20 3d 20 73 70 69 2e 69 6d 72 65 61 64 28 27 2e 2e 2f 64 61 74 61 2f 63 6..cross.=.spi.imread('../data/c
27e0 72 6f 73 73 2e 70 6e 67 27 29 2e 61 73 74 79 70 65 28 6e 70 2e 66 6c 6f 61 74 36 34 29 5b 3a 2c ross.png').astype(np.float64)[:,
2800 20 3a 2c 20 32 5d 20 2f 20 32 35 36 0d 0a 74 72 69 61 6e 67 6c 65 20 3d 20 73 70 69 2e 69 6d 72 .:,.2]./.256..triangle.=.spi.imr
2820 65 61 64 28 27 2e 2e 2f 64 61 74 61 2f 74 72 69 61 6e 67 6c 65 2e 70 6e 67 27 29 2e 61 73 74 79 ead('../data/triangle.png').asty
2840 70 65 28 6e 70 2e 66 6c 6f 61 74 36 34 29 5b 3a 2c 20 3a 2c 20 32 5d 20 2f 20 32 35 36 0d 0a 73 pe(np.float64)[:,.:,.2]./.256..s
2860 74 61 72 20 3d 20 73 70 69 2e 69 6d 72 65 61 64 28 27 2e 2e 2f 64 61 74 61 2f 73 74 61 72 2e 70 tar.=.spi.imread('../data/star.p
2880 6e 67 27 29 2e 61 73 74 79 70 65 28 6e 70 2e 66 6c 6f 61 74 36 34 29 5b 3a 2c 20 3a 2c 20 32 5d ng').astype(np.float64)[:,.:,.2]
28a0 20 2f 20 32 35 36 0d 0a 0d 0a 73 68 61 70 65 73 20 3d 20 5b 73 71 75 61 72 65 2c 20 63 72 6f 73 ./.256....shapes.=.[square,.cros
28c0 73 2c 20 74 72 69 61 6e 67 6c 65 2c 20 73 74 61 72 5d 0d 0a 0d 0a 53 20 3d 20 34 0d 0a 78 73 20 s,.triangle,.star]....S.=.4..xs.
28e0 3d 20 5b 5b 5d 20 66 6f 72 20 69 20 69 6e 20 72 61 6e 67 65 28 53 29 5d 0d 0a 0d 0a 0d 0a 66 6f =.[[].for.i.in.range(S)]......fo
2900 72 20 6e 62 20 69 6e 20 72 61 6e 67 65 28 34 29 3a 0d 0a 20 20 20 20 66 6f 72 20 69 20 69 6e 20 r.nb.in.range(4):......for.i.in.
2920 72 61 6e 67 65 28 38 29 3a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 6a 20 69 6e 20 72 61 6e 67 range(8):..........for.j.in.rang
2940 65 28 38 29 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73 68 61 70 65 73 5b 6e 62 5d e(8):..............if.shapes[nb]
2960 5b 69 2c 20 6a 5d 20 3c 20 30 2e 39 35 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 [i,.j].<.0.95:..................
2980 78 73 5b 6e 62 5d 2e 61 70 70 65 6e 64 28 5b 6a 2c 20 38 20 2d 20 69 5d 29 0d 0a 0d 0a 78 73 20 xs[nb].append([j,.8.-.i])....xs.
29a0 3d 20 6e 70 2e 61 72 72 61 79 28 5b 6e 70 2e 61 72 72 61 79 28 78 73 5b 30 5d 29 2c 20 6e 70 2e =.np.array([np.array(xs[0]),.np.
29c0 61 72 72 61 79 28 78 73 5b 31 5d 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 70 array(xs[1]),.................np
29e0 2e 61 72 72 61 79 28 78 73 5b 32 5d 29 2c 20 6e 70 2e 61 72 72 61 79 28 78 73 5b 33 5d 29 5d 29 .array(xs[2]),.np.array(xs[3])])
2a00 0d 0a 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ....############################
2a20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
2a40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 23 20 42 61 72 79 63 65 6e 74 65 72 ##################..#.Barycenter
2a60 20 63 6f 6d 70 75 74 61 74 69 6f 6e 0d 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .computation..#.----------------
2a80 2d 2d 2d 2d 2d 2d 0d 0a 0d 0a 0d 0a 6e 73 20 3d 20 5b 6c 65 6e 28 78 73 5b 73 5d 29 20 66 6f 72 ------......ns.=.[len(xs[s]).for
2aa0 20 73 20 69 6e 20 72 61 6e 67 65 28 53 29 5d 0d 0a 6e 5f 73 61 6d 70 6c 65 73 20 3d 20 33 30 0d .s.in.range(S)]..n_samples.=.30.
2ac0 0a 0d 0a 22 22 22 43 6f 6d 70 75 74 65 20 61 6c 6c 20 64 69 73 74 61 6e 63 65 73 20 6d 61 74 72 ..."""Compute.all.distances.matr
2ae0 69 63 65 73 20 66 6f 72 20 74 68 65 20 66 6f 75 72 20 73 68 61 70 65 73 22 22 22 0d 0a 43 73 20 ices.for.the.four.shapes"""..Cs.
2b00 3d 20 5b 73 70 2e 73 70 61 74 69 61 6c 2e 64 69 73 74 61 6e 63 65 2e 63 64 69 73 74 28 78 73 5b =.[sp.spatial.distance.cdist(xs[
2b20 73 5d 2c 20 78 73 5b 73 5d 29 20 66 6f 72 20 73 20 69 6e 20 72 61 6e 67 65 28 53 29 5d 0d 0a 43 s],.xs[s]).for.s.in.range(S)]..C
2b40 73 20 3d 20 5b 63 73 20 2f 20 63 73 2e 6d 61 78 28 29 20 66 6f 72 20 63 73 20 69 6e 20 43 73 5d s.=.[cs./.cs.max().for.cs.in.Cs]
2b60 0d 0a 0d 0a 70 73 20 3d 20 5b 6f 74 2e 75 6e 69 66 28 6e 73 5b 73 5d 29 20 66 6f 72 20 73 20 69 ....ps.=.[ot.unif(ns[s]).for.s.i
2b80 6e 20 72 61 6e 67 65 28 53 29 5d 0d 0a 70 20 3d 20 6f 74 2e 75 6e 69 66 28 6e 5f 73 61 6d 70 6c n.range(S)]..p.=.ot.unif(n_sampl
2ba0 65 73 29 0d 0a 0d 0a 0d 0a 6c 61 6d 62 64 61 73 74 20 3d 20 5b 5b 66 6c 6f 61 74 28 69 29 20 2f es)......lambdast.=.[[float(i)./
2bc0 20 33 2c 20 66 6c 6f 61 74 28 33 20 2d 20 69 29 20 2f 20 33 5d 20 66 6f 72 20 69 20 69 6e 20 5b .3,.float(3.-.i)./.3].for.i.in.[
2be0 31 2c 20 32 5d 5d 0d 0a 0d 0a 43 74 30 31 20 3d 20 5b 30 20 66 6f 72 20 69 20 69 6e 20 72 61 6e 1,.2]]....Ct01.=.[0.for.i.in.ran
2c00 67 65 28 32 29 5d 0d 0a 66 6f 72 20 69 20 69 6e 20 72 61 6e 67 65 28 32 29 3a 0d 0a 20 20 20 20 ge(2)]..for.i.in.range(2):......
2c20 43 74 30 31 5b 69 5d 20 3d 20 6f 74 2e 67 72 6f 6d 6f 76 2e 67 72 6f 6d 6f 76 5f 62 61 72 79 63 Ct01[i].=.ot.gromov.gromov_baryc
2c40 65 6e 74 65 72 73 28 6e 5f 73 61 6d 70 6c 65 73 2c 20 5b 43 73 5b 30 5d 2c 20 43 73 5b 31 5d 5d enters(n_samples,.[Cs[0],.Cs[1]]
2c60 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,...............................
2c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 73 5b 30 5d 2c 20 70 73 5b 31 5d 0d 0a 20 20 20 ..............[ps[0],.ps[1].....
2ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ................................
2cc0 20 20 20 20 20 20 20 20 20 5d 2c 20 70 2c 20 6c 61 6d 62 64 61 73 74 5b 69 5d 2c 20 27 73 71 75 .........],.p,.lambdast[i],.'squ
2ce0 61 72 65 5f 6c 6f 73 73 27 2c 20 20 23 20 35 65 2d 34 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 are_loss',..#.5e-4,.............
2d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ................................
2d20 6d 61 78 5f 69 74 65 72 3d 31 30 30 2c 20 74 6f 6c 3d 31 65 2d 33 29 0d 0a 0d 0a 43 74 30 32 20 max_iter=100,.tol=1e-3)....Ct02.
2d40 3d 20 5b 30 20 66 6f 72 20 69 20 69 6e 20 72 61 6e 67 65 28 32 29 5d 0d 0a 66 6f 72 20 69 20 69 =.[0.for.i.in.range(2)]..for.i.i
2d60 6e 20 72 61 6e 67 65 28 32 29 3a 0d 0a 20 20 20 20 43 74 30 32 5b 69 5d 20 3d 20 6f 74 2e 67 72 n.range(2):......Ct02[i].=.ot.gr
2d80 6f 6d 6f 76 2e 67 72 6f 6d 6f 76 5f 62 61 72 79 63 65 6e 74 65 72 73 28 6e 5f 73 61 6d 70 6c 65 omov.gromov_barycenters(n_sample
2da0 73 2c 20 5b 43 73 5b 30 5d 2c 20 43 73 5b 32 5d 5d 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 s,.[Cs[0],.Cs[2]],..............
2dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b ...............................[
2de0 70 73 5b 30 5d 2c 20 70 73 5b 32 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ps[0],.ps[2]....................
2e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c 20 70 2c 20 ..........................],.p,.
2e20 6c 61 6d 62 64 61 73 74 5b 69 5d 2c 20 27 73 71 75 61 72 65 5f 6c 6f 73 73 27 2c 20 20 23 20 35 lambdast[i],.'square_loss',..#.5
2e40 65 2d 34 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e-4,............................
2e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 78 5f 69 74 65 72 3d 31 30 30 2c 20 74 .................max_iter=100,.t
2e80 6f 6c 3d 31 65 2d 33 29 0d 0a 0d 0a 43 74 31 33 20 3d 20 5b 30 20 66 6f 72 20 69 20 69 6e 20 72 ol=1e-3)....Ct13.=.[0.for.i.in.r
2ea0 61 6e 67 65 28 32 29 5d 0d 0a 66 6f 72 20 69 20 69 6e 20 72 61 6e 67 65 28 32 29 3a 0d 0a 20 20 ange(2)]..for.i.in.range(2):....
2ec0 20 20 43 74 31 33 5b 69 5d 20 3d 20 6f 74 2e 67 72 6f 6d 6f 76 2e 67 72 6f 6d 6f 76 5f 62 61 72 ..Ct13[i].=.ot.gromov.gromov_bar
2ee0 79 63 65 6e 74 65 72 73 28 6e 5f 73 61 6d 70 6c 65 73 2c 20 5b 43 73 5b 31 5d 2c 20 43 73 5b 33 ycenters(n_samples,.[Cs[1],.Cs[3
2f00 5d 5d 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ]],.............................
2f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 73 5b 31 5d 2c 20 70 73 5b 33 5d 0d 0a 20 ................[ps[1],.ps[3]...
2f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ................................
2f60 20 20 20 20 20 20 20 20 20 20 20 5d 2c 20 70 2c 20 6c 61 6d 62 64 61 73 74 5b 69 5d 2c 20 27 73 ...........],.p,.lambdast[i],.'s
2f80 71 75 61 72 65 5f 6c 6f 73 73 27 2c 20 20 23 20 35 65 2d 34 2c 0d 0a 20 20 20 20 20 20 20 20 20 quare_loss',..#.5e-4,...........
2fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ................................
2fc0 20 20 6d 61 78 5f 69 74 65 72 3d 31 30 30 2c 20 74 6f 6c 3d 31 65 2d 33 29 0d 0a 0d 0a 43 74 32 ..max_iter=100,.tol=1e-3)....Ct2
2fe0 33 20 3d 20 5b 30 20 66 6f 72 20 69 20 69 6e 20 72 61 6e 67 65 28 32 29 5d 0d 0a 66 6f 72 20 69 3.=.[0.for.i.in.range(2)]..for.i
3000 20 69 6e 20 72 61 6e 67 65 28 32 29 3a 0d 0a 20 20 20 20 43 74 32 33 5b 69 5d 20 3d 20 6f 74 2e .in.range(2):......Ct23[i].=.ot.
3020 67 72 6f 6d 6f 76 2e 67 72 6f 6d 6f 76 5f 62 61 72 79 63 65 6e 74 65 72 73 28 6e 5f 73 61 6d 70 gromov.gromov_barycenters(n_samp
3040 6c 65 73 2c 20 5b 43 73 5b 32 5d 2c 20 43 73 5b 33 5d 5d 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 les,.[Cs[2],.Cs[3]],............
3060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ................................
3080 20 5b 70 73 5b 32 5d 2c 20 70 73 5b 33 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .[ps[2],.ps[3]..................
30a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c 20 70 ............................],.p
30c0 2c 20 6c 61 6d 62 64 61 73 74 5b 69 5d 2c 20 27 73 71 75 61 72 65 5f 6c 6f 73 73 27 2c 20 20 23 ,.lambdast[i],.'square_loss',..#
30e0 20 35 65 2d 34 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .5e-4,..........................
3100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 78 5f 69 74 65 72 3d 31 30 30 2c ...................max_iter=100,
3120 20 74 6f 6c 3d 31 65 2d 33 29 0d 0a 0d 0a 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 .tol=1e-3)......################
3140 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
3160 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a ##############################..
3180 23 20 56 69 73 75 61 6c 69 7a 61 74 69 6f 6e 0d 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d #.Visualization..#.-------------
31a0 0d 0a 23 0d 0a 23 20 54 68 65 20 50 43 41 20 68 65 6c 70 73 20 69 6e 20 67 65 74 74 69 6e 67 20 ..#..#.The.PCA.helps.in.getting.
31c0 63 6f 6e 73 69 73 74 65 6e 63 79 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 6f 74 61 74 69 6f 6e consistency.between.the.rotation
31e0 73 0d 0a 0d 0a 0d 0a 63 6c 66 20 3d 20 50 43 41 28 6e 5f 63 6f 6d 70 6f 6e 65 6e 74 73 3d 32 29 s......clf.=.PCA(n_components=2)
3200 0d 0a 6e 70 6f 73 20 3d 20 5b 30 2c 20 30 2c 20 30 2c 20 30 5d 0d 0a 6e 70 6f 73 20 3d 20 5b 73 ..npos.=.[0,.0,.0,.0]..npos.=.[s
3220 6d 61 63 6f 66 5f 6d 64 73 28 43 73 5b 73 5d 2c 20 32 29 20 66 6f 72 20 73 20 69 6e 20 72 61 6e macof_mds(Cs[s],.2).for.s.in.ran
3240 67 65 28 53 29 5d 0d 0a 0d 0a 6e 70 6f 73 74 30 31 20 3d 20 5b 30 2c 20 30 5d 0d 0a 6e 70 6f 73 ge(S)]....npost01.=.[0,.0]..npos
3260 74 30 31 20 3d 20 5b 73 6d 61 63 6f 66 5f 6d 64 73 28 43 74 30 31 5b 73 5d 2c 20 32 29 20 66 6f t01.=.[smacof_mds(Ct01[s],.2).fo
3280 72 20 73 20 69 6e 20 72 61 6e 67 65 28 32 29 5d 0d 0a 6e 70 6f 73 74 30 31 20 3d 20 5b 63 6c 66 r.s.in.range(2)]..npost01.=.[clf
32a0 2e 66 69 74 5f 74 72 61 6e 73 66 6f 72 6d 28 6e 70 6f 73 74 30 31 5b 73 5d 29 20 66 6f 72 20 73 .fit_transform(npost01[s]).for.s
32c0 20 69 6e 20 72 61 6e 67 65 28 32 29 5d 0d 0a 0d 0a 6e 70 6f 73 74 30 32 20 3d 20 5b 30 2c 20 30 .in.range(2)]....npost02.=.[0,.0
32e0 5d 0d 0a 6e 70 6f 73 74 30 32 20 3d 20 5b 73 6d 61 63 6f 66 5f 6d 64 73 28 43 74 30 32 5b 73 5d ]..npost02.=.[smacof_mds(Ct02[s]
3300 2c 20 32 29 20 66 6f 72 20 73 20 69 6e 20 72 61 6e 67 65 28 32 29 5d 0d 0a 6e 70 6f 73 74 30 32 ,.2).for.s.in.range(2)]..npost02
3320 20 3d 20 5b 63 6c 66 2e 66 69 74 5f 74 72 61 6e 73 66 6f 72 6d 28 6e 70 6f 73 74 30 32 5b 73 5d .=.[clf.fit_transform(npost02[s]
3340 29 20 66 6f 72 20 73 20 69 6e 20 72 61 6e 67 65 28 32 29 5d 0d 0a 0d 0a 6e 70 6f 73 74 31 33 20 ).for.s.in.range(2)]....npost13.
3360 3d 20 5b 30 2c 20 30 5d 0d 0a 6e 70 6f 73 74 31 33 20 3d 20 5b 73 6d 61 63 6f 66 5f 6d 64 73 28 =.[0,.0]..npost13.=.[smacof_mds(
3380 43 74 31 33 5b 73 5d 2c 20 32 29 20 66 6f 72 20 73 20 69 6e 20 72 61 6e 67 65 28 32 29 5d 0d 0a Ct13[s],.2).for.s.in.range(2)]..
33a0 6e 70 6f 73 74 31 33 20 3d 20 5b 63 6c 66 2e 66 69 74 5f 74 72 61 6e 73 66 6f 72 6d 28 6e 70 6f npost13.=.[clf.fit_transform(npo
33c0 73 74 31 33 5b 73 5d 29 20 66 6f 72 20 73 20 69 6e 20 72 61 6e 67 65 28 32 29 5d 0d 0a 0d 0a 6e st13[s]).for.s.in.range(2)]....n
33e0 70 6f 73 74 32 33 20 3d 20 5b 30 2c 20 30 5d 0d 0a 6e 70 6f 73 74 32 33 20 3d 20 5b 73 6d 61 63 post23.=.[0,.0]..npost23.=.[smac
3400 6f 66 5f 6d 64 73 28 43 74 32 33 5b 73 5d 2c 20 32 29 20 66 6f 72 20 73 20 69 6e 20 72 61 6e 67 of_mds(Ct23[s],.2).for.s.in.rang
3420 65 28 32 29 5d 0d 0a 6e 70 6f 73 74 32 33 20 3d 20 5b 63 6c 66 2e 66 69 74 5f 74 72 61 6e 73 66 e(2)]..npost23.=.[clf.fit_transf
3440 6f 72 6d 28 6e 70 6f 73 74 32 33 5b 73 5d 29 20 66 6f 72 20 73 20 69 6e 20 72 61 6e 67 65 28 32 orm(npost23[s]).for.s.in.range(2
3460 29 5d 0d 0a 0d 0a 0d 0a 66 69 67 20 3d 20 70 6c 2e 66 69 67 75 72 65 28 66 69 67 73 69 7a 65 3d )]......fig.=.pl.figure(figsize=
3480 28 31 30 2c 20 31 30 29 29 0d 0a 0d 0a 61 78 31 20 3d 20 70 6c 2e 73 75 62 70 6c 6f 74 32 67 72 (10,.10))....ax1.=.pl.subplot2gr
34a0 69 64 28 28 34 2c 20 34 29 2c 20 28 30 2c 20 30 29 29 0d 0a 70 6c 2e 78 6c 69 6d 28 28 2d 31 2c id((4,.4),.(0,.0))..pl.xlim((-1,
34c0 20 31 29 29 0d 0a 70 6c 2e 79 6c 69 6d 28 28 2d 31 2c 20 31 29 29 0d 0a 61 78 31 2e 73 63 61 74 .1))..pl.ylim((-1,.1))..ax1.scat
34e0 74 65 72 28 6e 70 6f 73 5b 30 5d 5b 3a 2c 20 30 5d 2c 20 6e 70 6f 73 5b 30 5d 5b 3a 2c 20 31 5d ter(npos[0][:,.0],.npos[0][:,.1]
3500 2c 20 63 6f 6c 6f 72 3d 27 72 27 29 0d 0a 0d 0a 61 78 32 20 3d 20 70 6c 2e 73 75 62 70 6c 6f 74 ,.color='r')....ax2.=.pl.subplot
3520 32 67 72 69 64 28 28 34 2c 20 34 29 2c 20 28 30 2c 20 31 29 29 0d 0a 70 6c 2e 78 6c 69 6d 28 28 2grid((4,.4),.(0,.1))..pl.xlim((
3540 2d 31 2c 20 31 29 29 0d 0a 70 6c 2e 79 6c 69 6d 28 28 2d 31 2c 20 31 29 29 0d 0a 61 78 32 2e 73 -1,.1))..pl.ylim((-1,.1))..ax2.s
3560 63 61 74 74 65 72 28 6e 70 6f 73 74 30 31 5b 31 5d 5b 3a 2c 20 30 5d 2c 20 6e 70 6f 73 74 30 31 catter(npost01[1][:,.0],.npost01
3580 5b 31 5d 5b 3a 2c 20 31 5d 2c 20 63 6f 6c 6f 72 3d 27 62 27 29 0d 0a 0d 0a 61 78 33 20 3d 20 70 [1][:,.1],.color='b')....ax3.=.p
35a0 6c 2e 73 75 62 70 6c 6f 74 32 67 72 69 64 28 28 34 2c 20 34 29 2c 20 28 30 2c 20 32 29 29 0d 0a l.subplot2grid((4,.4),.(0,.2))..
35c0 70 6c 2e 78 6c 69 6d 28 28 2d 31 2c 20 31 29 29 0d 0a 70 6c 2e 79 6c 69 6d 28 28 2d 31 2c 20 31 pl.xlim((-1,.1))..pl.ylim((-1,.1
35e0 29 29 0d 0a 61 78 33 2e 73 63 61 74 74 65 72 28 6e 70 6f 73 74 30 31 5b 30 5d 5b 3a 2c 20 30 5d ))..ax3.scatter(npost01[0][:,.0]
3600 2c 20 6e 70 6f 73 74 30 31 5b 30 5d 5b 3a 2c 20 31 5d 2c 20 63 6f 6c 6f 72 3d 27 62 27 29 0d 0a ,.npost01[0][:,.1],.color='b')..
3620 0d 0a 61 78 34 20 3d 20 70 6c 2e 73 75 62 70 6c 6f 74 32 67 72 69 64 28 28 34 2c 20 34 29 2c 20 ..ax4.=.pl.subplot2grid((4,.4),.
3640 28 30 2c 20 33 29 29 0d 0a 70 6c 2e 78 6c 69 6d 28 28 2d 31 2c 20 31 29 29 0d 0a 70 6c 2e 79 6c (0,.3))..pl.xlim((-1,.1))..pl.yl
3660 69 6d 28 28 2d 31 2c 20 31 29 29 0d 0a 61 78 34 2e 73 63 61 74 74 65 72 28 6e 70 6f 73 5b 31 5d im((-1,.1))..ax4.scatter(npos[1]
3680 5b 3a 2c 20 30 5d 2c 20 6e 70 6f 73 5b 31 5d 5b 3a 2c 20 31 5d 2c 20 63 6f 6c 6f 72 3d 27 72 27 [:,.0],.npos[1][:,.1],.color='r'
36a0 29 0d 0a 0d 0a 61 78 35 20 3d 20 70 6c 2e 73 75 62 70 6c 6f 74 32 67 72 69 64 28 28 34 2c 20 34 )....ax5.=.pl.subplot2grid((4,.4
36c0 29 2c 20 28 31 2c 20 30 29 29 0d 0a 70 6c 2e 78 6c 69 6d 28 28 2d 31 2c 20 31 29 29 0d 0a 70 6c ),.(1,.0))..pl.xlim((-1,.1))..pl
36e0 2e 79 6c 69 6d 28 28 2d 31 2c 20 31 29 29 0d 0a 61 78 35 2e 73 63 61 74 74 65 72 28 6e 70 6f 73 .ylim((-1,.1))..ax5.scatter(npos
3700 74 30 32 5b 31 5d 5b 3a 2c 20 30 5d 2c 20 6e 70 6f 73 74 30 32 5b 31 5d 5b 3a 2c 20 31 5d 2c 20 t02[1][:,.0],.npost02[1][:,.1],.
3720 63 6f 6c 6f 72 3d 27 62 27 29 0d 0a 0d 0a 61 78 36 20 3d 20 70 6c 2e 73 75 62 70 6c 6f 74 32 67 color='b')....ax6.=.pl.subplot2g
3740 72 69 64 28 28 34 2c 20 34 29 2c 20 28 31 2c 20 33 29 29 0d 0a 70 6c 2e 78 6c 69 6d 28 28 2d 31 rid((4,.4),.(1,.3))..pl.xlim((-1
3760 2c 20 31 29 29 0d 0a 70 6c 2e 79 6c 69 6d 28 28 2d 31 2c 20 31 29 29 0d 0a 61 78 36 2e 73 63 61 ,.1))..pl.ylim((-1,.1))..ax6.sca
3780 74 74 65 72 28 6e 70 6f 73 74 31 33 5b 31 5d 5b 3a 2c 20 30 5d 2c 20 6e 70 6f 73 74 31 33 5b 31 tter(npost13[1][:,.0],.npost13[1
37a0 5d 5b 3a 2c 20 31 5d 2c 20 63 6f 6c 6f 72 3d 27 62 27 29 0d 0a 0d 0a 61 78 37 20 3d 20 70 6c 2e ][:,.1],.color='b')....ax7.=.pl.
37c0 73 75 62 70 6c 6f 74 32 67 72 69 64 28 28 34 2c 20 34 29 2c 20 28 32 2c 20 30 29 29 0d 0a 70 6c subplot2grid((4,.4),.(2,.0))..pl
37e0 2e 78 6c 69 6d 28 28 2d 31 2c 20 31 29 29 0d 0a 70 6c 2e 79 6c 69 6d 28 28 2d 31 2c 20 31 29 29 .xlim((-1,.1))..pl.ylim((-1,.1))
3800 0d 0a 61 78 37 2e 73 63 61 74 74 65 72 28 6e 70 6f 73 74 30 32 5b 30 5d 5b 3a 2c 20 30 5d 2c 20 ..ax7.scatter(npost02[0][:,.0],.
3820 6e 70 6f 73 74 30 32 5b 30 5d 5b 3a 2c 20 31 5d 2c 20 63 6f 6c 6f 72 3d 27 62 27 29 0d 0a 0d 0a npost02[0][:,.1],.color='b')....
3840 61 78 38 20 3d 20 70 6c 2e 73 75 62 70 6c 6f 74 32 67 72 69 64 28 28 34 2c 20 34 29 2c 20 28 32 ax8.=.pl.subplot2grid((4,.4),.(2
3860 2c 20 33 29 29 0d 0a 70 6c 2e 78 6c 69 6d 28 28 2d 31 2c 20 31 29 29 0d 0a 70 6c 2e 79 6c 69 6d ,.3))..pl.xlim((-1,.1))..pl.ylim
3880 28 28 2d 31 2c 20 31 29 29 0d 0a 61 78 38 2e 73 63 61 74 74 65 72 28 6e 70 6f 73 74 31 33 5b 30 ((-1,.1))..ax8.scatter(npost13[0
38a0 5d 5b 3a 2c 20 30 5d 2c 20 6e 70 6f 73 74 31 33 5b 30 5d 5b 3a 2c 20 31 5d 2c 20 63 6f 6c 6f 72 ][:,.0],.npost13[0][:,.1],.color
38c0 3d 27 62 27 29 0d 0a 0d 0a 61 78 39 20 3d 20 70 6c 2e 73 75 62 70 6c 6f 74 32 67 72 69 64 28 28 ='b')....ax9.=.pl.subplot2grid((
38e0 34 2c 20 34 29 2c 20 28 33 2c 20 30 29 29 0d 0a 70 6c 2e 78 6c 69 6d 28 28 2d 31 2c 20 31 29 29 4,.4),.(3,.0))..pl.xlim((-1,.1))
3900 0d 0a 70 6c 2e 79 6c 69 6d 28 28 2d 31 2c 20 31 29 29 0d 0a 61 78 39 2e 73 63 61 74 74 65 72 28 ..pl.ylim((-1,.1))..ax9.scatter(
3920 6e 70 6f 73 5b 32 5d 5b 3a 2c 20 30 5d 2c 20 6e 70 6f 73 5b 32 5d 5b 3a 2c 20 31 5d 2c 20 63 6f npos[2][:,.0],.npos[2][:,.1],.co
3940 6c 6f 72 3d 27 72 27 29 0d 0a 0d 0a 61 78 31 30 20 3d 20 70 6c 2e 73 75 62 70 6c 6f 74 32 67 72 lor='r')....ax10.=.pl.subplot2gr
3960 69 64 28 28 34 2c 20 34 29 2c 20 28 33 2c 20 31 29 29 0d 0a 70 6c 2e 78 6c 69 6d 28 28 2d 31 2c id((4,.4),.(3,.1))..pl.xlim((-1,
3980 20 31 29 29 0d 0a 70 6c 2e 79 6c 69 6d 28 28 2d 31 2c 20 31 29 29 0d 0a 61 78 31 30 2e 73 63 61 .1))..pl.ylim((-1,.1))..ax10.sca
39a0 74 74 65 72 28 6e 70 6f 73 74 32 33 5b 31 5d 5b 3a 2c 20 30 5d 2c 20 6e 70 6f 73 74 32 33 5b 31 tter(npost23[1][:,.0],.npost23[1
39c0 5d 5b 3a 2c 20 31 5d 2c 20 63 6f 6c 6f 72 3d 27 62 27 29 0d 0a 0d 0a 61 78 31 31 20 3d 20 70 6c ][:,.1],.color='b')....ax11.=.pl
39e0 2e 73 75 62 70 6c 6f 74 32 67 72 69 64 28 28 34 2c 20 34 29 2c 20 28 33 2c 20 32 29 29 0d 0a 70 .subplot2grid((4,.4),.(3,.2))..p
3a00 6c 2e 78 6c 69 6d 28 28 2d 31 2c 20 31 29 29 0d 0a 70 6c 2e 79 6c 69 6d 28 28 2d 31 2c 20 31 29 l.xlim((-1,.1))..pl.ylim((-1,.1)
3a20 29 0d 0a 61 78 31 31 2e 73 63 61 74 74 65 72 28 6e 70 6f 73 74 32 33 5b 30 5d 5b 3a 2c 20 30 5d )..ax11.scatter(npost23[0][:,.0]
3a40 2c 20 6e 70 6f 73 74 32 33 5b 30 5d 5b 3a 2c 20 31 5d 2c 20 63 6f 6c 6f 72 3d 27 62 27 29 0d 0a ,.npost23[0][:,.1],.color='b')..
3a60 0d 0a 61 78 31 32 20 3d 20 70 6c 2e 73 75 62 70 6c 6f 74 32 67 72 69 64 28 28 34 2c 20 34 29 2c ..ax12.=.pl.subplot2grid((4,.4),
3a80 20 28 33 2c 20 33 29 29 0d 0a 70 6c 2e 78 6c 69 6d 28 28 2d 31 2c 20 31 29 29 0d 0a 70 6c 2e 79 .(3,.3))..pl.xlim((-1,.1))..pl.y
3aa0 6c 69 6d 28 28 2d 31 2c 20 31 29 29 0d 0a 61 78 31 32 2e 73 63 61 74 74 65 72 28 6e 70 6f 73 5b lim((-1,.1))..ax12.scatter(npos[
3ac0 33 5d 5b 3a 2c 20 30 5d 2c 20 6e 70 6f 73 5b 33 5d 5b 3a 2c 20 31 5d 2c 20 63 6f 6c 6f 72 3d 27 3][:,.0],.npos[3][:,.1],.color='
3ae0 72 27 29 0d 0a 50 4b 03 04 14 00 00 00 00 00 da 74 d9 4e b8 cd f6 1b 7e 0b 00 00 7e 0b 00 00 13 r')..PK.........t.N....~...~....
3b00 00 00 00 70 6c 6f 74 5f 6f 70 74 69 6d 5f 4f 54 72 65 67 2e 70 79 23 20 2d 2a 2d 20 63 6f 64 69 ...plot_optim_OTreg.py#.-*-.codi
3b20 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0a 22 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ng:.utf-8.-*-.""".==============
3b40 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 65 67 75 6c 61 72 69 7a 65 64 ====================.Regularized
3b60 20 4f 54 20 77 69 74 68 20 67 65 6e 65 72 69 63 20 73 6f 6c 76 65 72 0a 3d 3d 3d 3d 3d 3d 3d 3d .OT.with.generic.solver.========
3b80 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 49 6c 6c 75 ==========================..Illu
3ba0 73 74 72 61 74 65 73 20 74 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72 69 63 20 73 strates.the.use.of.the.generic.s
3bc0 6f 6c 76 65 72 20 66 6f 72 20 72 65 67 75 6c 61 72 69 7a 65 64 20 4f 54 20 77 69 74 68 0a 75 73 olver.for.regularized.OT.with.us
3be0 65 72 2d 64 65 73 69 67 6e 65 64 20 72 65 67 75 6c 61 72 69 7a 61 74 69 6f 6e 20 74 65 72 6d 2e er-designed.regularization.term.
3c00 20 49 74 20 75 73 65 73 20 43 6f 6e 64 69 74 69 6f 6e 61 6c 20 67 72 61 64 69 65 6e 74 20 61 73 .It.uses.Conditional.gradient.as
3c20 20 69 6e 20 5b 36 5d 20 61 6e 64 0a 67 65 6e 65 72 61 6c 69 7a 65 64 20 43 6f 6e 64 69 74 69 6f .in.[6].and.generalized.Conditio
3c40 6e 61 6c 20 47 72 61 64 69 65 6e 74 20 61 73 20 70 72 6f 70 6f 73 65 64 20 69 6e 20 5b 35 5d 5b nal.Gradient.as.proposed.in.[5][
3c60 37 5d 2e 0a 0a 0a 5b 35 5d 20 4e 2e 20 43 6f 75 72 74 79 3b 20 52 2e 20 46 6c 61 6d 61 72 79 3b 7]....[5].N..Courty;.R..Flamary;
3c80 20 44 2e 20 54 75 69 61 3b 20 41 2e 20 52 61 6b 6f 74 6f 6d 61 6d 6f 6e 6a 79 2c 20 4f 70 74 69 .D..Tuia;.A..Rakotomamonjy,.Opti
3ca0 6d 61 6c 20 54 72 61 6e 73 70 6f 72 74 20 66 6f 72 0a 44 6f 6d 61 69 6e 20 41 64 61 70 74 61 74 mal.Transport.for.Domain.Adaptat
3cc0 69 6f 6e 2c 20 69 6e 20 49 45 45 45 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 6e 20 50 61 74 ion,.in.IEEE.Transactions.on.Pat
3ce0 74 65 72 6e 20 41 6e 61 6c 79 73 69 73 20 61 6e 64 20 4d 61 63 68 69 6e 65 0a 49 6e 74 65 6c 6c tern.Analysis.and.Machine.Intell
3d00 69 67 65 6e 63 65 20 2c 20 76 6f 6c 2e 50 50 2c 20 6e 6f 2e 39 39 2c 20 70 70 2e 31 2d 31 2e 0a igence.,.vol.PP,.no.99,.pp.1-1..
3d20 0a 5b 36 5d 20 46 65 72 72 61 64 61 6e 73 2c 20 53 2e 2c 20 50 61 70 61 64 61 6b 69 73 2c 20 4e .[6].Ferradans,.S.,.Papadakis,.N
3d40 2e 2c 20 50 65 79 72 c3 a9 2c 20 47 2e 2c 20 26 20 41 75 6a 6f 6c 2c 20 4a 2e 20 46 2e 20 28 32 .,.Peyr..,.G.,.&.Aujol,.J..F..(2
3d60 30 31 34 29 2e 0a 52 65 67 75 6c 61 72 69 7a 65 64 20 64 69 73 63 72 65 74 65 20 6f 70 74 69 6d 014)..Regularized.discrete.optim
3d80 61 6c 20 74 72 61 6e 73 70 6f 72 74 2e 20 53 49 41 4d 20 4a 6f 75 72 6e 61 6c 20 6f 6e 20 49 6d al.transport..SIAM.Journal.on.Im
3da0 61 67 69 6e 67 20 53 63 69 65 6e 63 65 73 2c 0a 37 28 33 29 2c 20 31 38 35 33 2d 31 38 38 32 2e aging.Sciences,.7(3),.1853-1882.
3dc0 0a 0a 5b 37 5d 20 52 61 6b 6f 74 6f 6d 61 6d 6f 6e 6a 79 2c 20 41 2e 2c 20 46 6c 61 6d 61 72 79 ..[7].Rakotomamonjy,.A.,.Flamary
3de0 2c 20 52 2e 2c 20 26 20 43 6f 75 72 74 79 2c 20 4e 2e 20 28 32 30 31 35 29 2e 20 47 65 6e 65 72 ,.R.,.&.Courty,.N..(2015)..Gener
3e00 61 6c 69 7a 65 64 0a 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 67 72 61 64 69 65 6e 74 3a 20 61 6e 61 alized.conditional.gradient:.ana
3e20 6c 79 73 69 73 20 6f 66 20 63 6f 6e 76 65 72 67 65 6e 63 65 20 61 6e 64 20 61 70 70 6c 69 63 61 lysis.of.convergence.and.applica
3e40 74 69 6f 6e 73 2e 0a 61 72 58 69 76 20 70 72 65 70 72 69 6e 74 20 61 72 58 69 76 3a 31 35 31 30 tions..arXiv.preprint.arXiv:1510
3e60 2e 30 36 35 36 37 2e 0a 0a 0a 0a 22 22 22 0a 0a 69 6d 70 6f 72 74 20 6e 75 6d 70 79 20 61 73 20 .06567....."""..import.numpy.as.
3e80 6e 70 0a 69 6d 70 6f 72 74 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 70 79 6c 61 62 20 61 73 20 70 6c np.import.matplotlib.pylab.as.pl
3ea0 0a 69 6d 70 6f 72 74 20 6f 74 0a 69 6d 70 6f 72 74 20 6f 74 2e 70 6c 6f 74 0a 0a 23 23 23 23 23 .import.ot.import.ot.plot..#####
3ec0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
3ee0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
3f00 23 23 23 23 23 23 23 23 23 0a 23 20 47 65 6e 65 72 61 74 65 20 64 61 74 61 0a 23 20 2d 2d 2d 2d #########.#.Generate.data.#.----
3f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 70 61 72 61 6d 65 74 65 72 73 0a 0a 6e 20 3d 20 31 ---------..#%%.parameters..n.=.1
3f40 30 30 20 20 23 20 6e 62 20 62 69 6e 73 0a 0a 23 20 62 69 6e 20 70 6f 73 69 74 69 6f 6e 73 0a 78 00..#.nb.bins..#.bin.positions.x
3f60 20 3d 20 6e 70 2e 61 72 61 6e 67 65 28 6e 2c 20 64 74 79 70 65 3d 6e 70 2e 66 6c 6f 61 74 36 34 .=.np.arange(n,.dtype=np.float64
3f80 29 0a 0a 23 20 47 61 75 73 73 69 61 6e 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0a 61 20 3d 20 )..#.Gaussian.distributions.a.=.
3fa0 6f 74 2e 64 61 74 61 73 65 74 73 2e 6d 61 6b 65 5f 31 44 5f 67 61 75 73 73 28 6e 2c 20 6d 3d 32 ot.datasets.make_1D_gauss(n,.m=2
3fc0 30 2c 20 73 3d 35 29 20 20 23 20 6d 3d 20 6d 65 61 6e 2c 20 73 3d 20 73 74 64 0a 62 20 3d 20 6f 0,.s=5)..#.m=.mean,.s=.std.b.=.o
3fe0 74 2e 64 61 74 61 73 65 74 73 2e 6d 61 6b 65 5f 31 44 5f 67 61 75 73 73 28 6e 2c 20 6d 3d 36 30 t.datasets.make_1D_gauss(n,.m=60
4000 2c 20 73 3d 31 30 29 0a 0a 23 20 6c 6f 73 73 20 6d 61 74 72 69 78 0a 4d 20 3d 20 6f 74 2e 64 69 ,.s=10)..#.loss.matrix.M.=.ot.di
4020 73 74 28 78 2e 72 65 73 68 61 70 65 28 28 6e 2c 20 31 29 29 2c 20 78 2e 72 65 73 68 61 70 65 28 st(x.reshape((n,.1)),.x.reshape(
4040 28 6e 2c 20 31 29 29 29 0a 4d 20 2f 3d 20 4d 2e 6d 61 78 28 29 0a 0a 23 23 23 23 23 23 23 23 23 (n,.1))).M./=.M.max()..#########
4060 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
4080 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
40a0 23 23 23 23 23 0a 23 20 53 6f 6c 76 65 20 45 4d 44 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 #####.#.Solve.EMD.#.---------..#
40c0 25 25 20 45 4d 44 0a 0a 47 30 20 3d 20 6f 74 2e 65 6d 64 28 61 2c 20 62 2c 20 4d 29 0a 0a 70 6c %%.EMD..G0.=.ot.emd(a,.b,.M)..pl
40e0 2e 66 69 67 75 72 65 28 33 2c 20 66 69 67 73 69 7a 65 3d 28 35 2c 20 35 29 29 0a 6f 74 2e 70 6c .figure(3,.figsize=(5,.5)).ot.pl
4100 6f 74 2e 70 6c 6f 74 31 44 5f 6d 61 74 28 61 2c 20 62 2c 20 47 30 2c 20 27 4f 54 20 6d 61 74 72 ot.plot1D_mat(a,.b,.G0,.'OT.matr
4120 69 78 20 47 30 27 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ix.G0')..#######################
4140 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
4160 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 53 6f 6c 76 65 20 #######################.#.Solve.
4180 45 4d 44 20 77 69 74 68 20 46 72 6f 62 65 6e 69 75 73 20 6e 6f 72 6d 20 72 65 67 75 6c 61 72 69 EMD.with.Frobenius.norm.regulari
41a0 7a 61 74 69 6f 6e 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d zation.#.-----------------------
41c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 45 78 61 6d 70 ---------------------..#%%.Examp
41e0 6c 65 20 77 69 74 68 20 46 72 6f 62 65 6e 69 75 73 20 6e 6f 72 6d 20 72 65 67 75 6c 61 72 69 7a le.with.Frobenius.norm.regulariz
4200 61 74 69 6f 6e 0a 0a 0a 64 65 66 20 66 28 47 29 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 30 2e 35 ation...def.f(G):.....return.0.5
4220 20 2a 20 6e 70 2e 73 75 6d 28 47 2a 2a 32 29 0a 0a 0a 64 65 66 20 64 66 28 47 29 3a 0a 20 20 20 .*.np.sum(G**2)...def.df(G):....
4240 20 72 65 74 75 72 6e 20 47 0a 0a 0a 72 65 67 20 3d 20 31 65 2d 31 0a 0a 47 6c 32 20 3d 20 6f 74 .return.G...reg.=.1e-1..Gl2.=.ot
4260 2e 6f 70 74 69 6d 2e 63 67 28 61 2c 20 62 2c 20 4d 2c 20 72 65 67 2c 20 66 2c 20 64 66 2c 20 76 .optim.cg(a,.b,.M,.reg,.f,.df,.v
4280 65 72 62 6f 73 65 3d 54 72 75 65 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 33 29 0a 6f 74 2e 70 6c erbose=True)..pl.figure(3).ot.pl
42a0 6f 74 2e 70 6c 6f 74 31 44 5f 6d 61 74 28 61 2c 20 62 2c 20 47 6c 32 2c 20 27 4f 54 20 6d 61 74 ot.plot1D_mat(a,.b,.Gl2,.'OT.mat
42c0 72 69 78 20 46 72 6f 62 2e 20 72 65 67 27 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 rix.Frob..reg')..###############
42e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
4300 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a ###############################.
4320 23 20 53 6f 6c 76 65 20 45 4d 44 20 77 69 74 68 20 65 6e 74 72 6f 70 69 63 20 72 65 67 75 6c 61 #.Solve.EMD.with.entropic.regula
4340 72 69 7a 61 74 69 6f 6e 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d rization.#.---------------------
4360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 45 78 61 6d 70 6c 65 20 77 -----------------..#%%.Example.w
4380 69 74 68 20 65 6e 74 72 6f 70 69 63 20 72 65 67 75 6c 61 72 69 7a 61 74 69 6f 6e 0a 0a 0a 64 65 ith.entropic.regularization...de
43a0 66 20 66 28 47 29 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 70 2e 73 75 6d 28 47 20 2a 20 6e 70 f.f(G):.....return.np.sum(G.*.np
43c0 2e 6c 6f 67 28 47 29 29 0a 0a 0a 64 65 66 20 64 66 28 47 29 3a 0a 20 20 20 20 72 65 74 75 72 6e .log(G))...def.df(G):.....return
43e0 20 6e 70 2e 6c 6f 67 28 47 29 20 2b 20 31 2e 0a 0a 0a 72 65 67 20 3d 20 31 65 2d 33 0a 0a 47 65 .np.log(G).+.1....reg.=.1e-3..Ge
4400 20 3d 20 6f 74 2e 6f 70 74 69 6d 2e 63 67 28 61 2c 20 62 2c 20 4d 2c 20 72 65 67 2c 20 66 2c 20 .=.ot.optim.cg(a,.b,.M,.reg,.f,.
4420 64 66 2c 20 76 65 72 62 6f 73 65 3d 54 72 75 65 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 34 2c 20 df,.verbose=True)..pl.figure(4,.
4440 66 69 67 73 69 7a 65 3d 28 35 2c 20 35 29 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 31 44 5f 6d figsize=(5,.5)).ot.plot.plot1D_m
4460 61 74 28 61 2c 20 62 2c 20 47 65 2c 20 27 4f 54 20 6d 61 74 72 69 78 20 45 6e 74 72 6f 70 2e 20 at(a,.b,.Ge,.'OT.matrix.Entrop..
4480 72 65 67 27 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 reg')..#########################
44a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
44c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 53 6f 6c 76 65 20 45 4d #####################.#.Solve.EM
44e0 44 20 77 69 74 68 20 46 72 6f 62 65 6e 69 75 73 20 6e 6f 72 6d 20 2b 20 65 6e 74 72 6f 70 69 63 D.with.Frobenius.norm.+.entropic
4500 20 72 65 67 75 6c 61 72 69 7a 61 74 69 6f 6e 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .regularization.#.--------------
4520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
4540 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 45 78 61 6d 70 6c 65 20 77 69 74 68 20 46 72 6f 62 ---------..#%%.Example.with.Frob
4560 65 6e 69 75 73 20 6e 6f 72 6d 20 2b 20 65 6e 74 72 6f 70 69 63 20 72 65 67 75 6c 61 72 69 7a 61 enius.norm.+.entropic.regulariza
4580 74 69 6f 6e 20 77 69 74 68 20 67 63 67 0a 0a 0a 64 65 66 20 66 28 47 29 3a 0a 20 20 20 20 72 65 tion.with.gcg...def.f(G):.....re
45a0 74 75 72 6e 20 30 2e 35 20 2a 20 6e 70 2e 73 75 6d 28 47 2a 2a 32 29 0a 0a 0a 64 65 66 20 64 66 turn.0.5.*.np.sum(G**2)...def.df
45c0 28 47 29 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 47 0a 0a 0a 72 65 67 31 20 3d 20 31 65 2d 33 0a (G):.....return.G...reg1.=.1e-3.
45e0 72 65 67 32 20 3d 20 31 65 2d 31 0a 0a 47 65 6c 32 20 3d 20 6f 74 2e 6f 70 74 69 6d 2e 67 63 67 reg2.=.1e-1..Gel2.=.ot.optim.gcg
4600 28 61 2c 20 62 2c 20 4d 2c 20 72 65 67 31 2c 20 72 65 67 32 2c 20 66 2c 20 64 66 2c 20 76 65 72 (a,.b,.M,.reg1,.reg2,.f,.df,.ver
4620 62 6f 73 65 3d 54 72 75 65 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 35 2c 20 66 69 67 73 69 7a 65 bose=True)..pl.figure(5,.figsize
4640 3d 28 35 2c 20 35 29 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 31 44 5f 6d 61 74 28 61 2c 20 62 =(5,.5)).ot.plot.plot1D_mat(a,.b
4660 2c 20 47 65 6c 32 2c 20 27 4f 54 20 65 6e 74 72 6f 70 69 63 20 2b 20 6d 61 74 72 69 78 20 46 72 ,.Gel2,.'OT.entropic.+.matrix.Fr
4680 6f 62 2e 20 72 65 67 27 29 0a 70 6c 2e 73 68 6f 77 28 29 0a 50 4b 03 04 14 00 00 00 00 00 db 74 ob..reg').pl.show().PK.........t
46a0 d9 4e 39 06 7c 60 0c 15 00 00 0c 15 00 00 0f 00 00 00 70 6c 6f 74 5f 6f 74 64 61 5f 64 32 2e 70 .N9.|`............plot_otda_d2.p
46c0 79 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0a 22 22 22 0a 3d 3d 3d y#.-*-.coding:.utf-8.-*-.""".===
46e0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================================
4700 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 4f 54 20 66 6f 72 20 64 6f 6d 61 69 6e 20 61 ================.OT.for.domain.a
4720 64 61 70 74 61 74 69 6f 6e 20 6f 6e 20 65 6d 70 69 72 69 63 61 6c 20 64 69 73 74 72 69 62 75 74 daptation.on.empirical.distribut
4740 69 6f 6e 73 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ions.===========================
4760 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 54 68 69 73 20 65 ========================..This.e
4780 78 61 6d 70 6c 65 20 69 6e 74 72 6f 64 75 63 65 73 20 61 20 64 6f 6d 61 69 6e 20 61 64 61 70 74 xample.introduces.a.domain.adapt
47a0 61 74 69 6f 6e 20 69 6e 20 61 20 32 44 20 73 65 74 74 69 6e 67 2e 20 49 74 20 65 78 70 6c 69 63 ation.in.a.2D.setting..It.explic
47c0 69 74 73 0a 74 68 65 20 70 72 6f 62 6c 65 6d 20 6f 66 20 64 6f 6d 61 69 6e 20 61 64 61 70 74 61 its.the.problem.of.domain.adapta
47e0 74 69 6f 6e 20 61 6e 64 20 69 6e 74 72 6f 64 75 63 65 73 20 73 6f 6d 65 20 6f 70 74 69 6d 61 6c tion.and.introduces.some.optimal
4800 20 74 72 61 6e 73 70 6f 72 74 0a 61 70 70 72 6f 61 63 68 65 73 20 74 6f 20 73 6f 6c 76 65 20 69 .transport.approaches.to.solve.i
4820 74 2e 0a 0a 51 75 61 6e 74 69 74 69 65 73 20 73 75 63 68 20 61 73 20 6f 70 74 69 6d 61 6c 20 63 t...Quantities.such.as.optimal.c
4840 6f 75 70 6c 69 6e 67 73 2c 20 67 72 65 61 74 65 72 20 63 6f 75 70 6c 69 6e 67 20 63 6f 65 66 66 ouplings,.greater.coupling.coeff
4860 69 63 69 65 6e 74 73 20 61 6e 64 0a 74 72 61 6e 73 70 6f 72 74 65 64 20 73 61 6d 70 6c 65 73 20 icients.and.transported.samples.
4880 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 69 76 65 are.represented.in.order.to.give
48a0 20 61 20 76 69 73 75 61 6c 20 75 6e 64 65 72 73 74 61 6e 64 69 6e 67 0a 6f 66 20 77 68 61 74 20 .a.visual.understanding.of.what.
48c0 74 68 65 20 74 72 61 6e 73 70 6f 72 74 20 6d 65 74 68 6f 64 73 20 61 72 65 20 64 6f 69 6e 67 2e the.transport.methods.are.doing.
48e0 0a 22 22 22 0a 0a 23 20 41 75 74 68 6f 72 73 3a 20 52 65 6d 69 20 46 6c 61 6d 61 72 79 20 3c 72 ."""..#.Authors:.Remi.Flamary.<r
4900 65 6d 69 2e 66 6c 61 6d 61 72 79 40 75 6e 69 63 65 2e 66 72 3e 0a 23 20 20 20 20 20 20 20 20 20 emi.flamary@unice.fr>.#.........
4920 20 53 74 61 6e 69 73 6c 61 73 20 43 68 61 6d 62 6f 6e 20 3c 73 74 61 6e 2e 63 68 61 6d 62 6f 6e .Stanislas.Chambon.<stan.chambon
4940 40 67 6d 61 69 6c 2e 63 6f 6d 3e 0a 23 0a 23 20 4c 69 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 63 @gmail.com>.#.#.License:.MIT.Lic
4960 65 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 70 79 6c 61 62 20 61 73 ense..import.matplotlib.pylab.as
4980 20 70 6c 0a 69 6d 70 6f 72 74 20 6f 74 0a 69 6d 70 6f 72 74 20 6f 74 2e 70 6c 6f 74 0a 0a 23 23 .pl.import.ot.import.ot.plot..##
49a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
49c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
49e0 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 67 65 6e 65 72 61 74 65 20 64 61 74 61 0a 23 20 2d ############.#.generate.data.#.-
4a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 6e 5f 73 61 6d 70 6c 65 73 5f 73 6f 75 72 63 65 20 3d ------------..n_samples_source.=
4a20 20 31 35 30 0a 6e 5f 73 61 6d 70 6c 65 73 5f 74 61 72 67 65 74 20 3d 20 31 35 30 0a 0a 58 73 2c .150.n_samples_target.=.150..Xs,
4a40 20 79 73 20 3d 20 6f 74 2e 64 61 74 61 73 65 74 73 2e 6d 61 6b 65 5f 64 61 74 61 5f 63 6c 61 73 .ys.=.ot.datasets.make_data_clas
4a60 73 69 66 28 27 33 67 61 75 73 73 27 2c 20 6e 5f 73 61 6d 70 6c 65 73 5f 73 6f 75 72 63 65 29 0a sif('3gauss',.n_samples_source).
4a80 58 74 2c 20 79 74 20 3d 20 6f 74 2e 64 61 74 61 73 65 74 73 2e 6d 61 6b 65 5f 64 61 74 61 5f 63 Xt,.yt.=.ot.datasets.make_data_c
4aa0 6c 61 73 73 69 66 28 27 33 67 61 75 73 73 32 27 2c 20 6e 5f 73 61 6d 70 6c 65 73 5f 74 61 72 67 lassif('3gauss2',.n_samples_targ
4ac0 65 74 29 0a 0a 23 20 43 6f 73 74 20 6d 61 74 72 69 78 0a 4d 20 3d 20 6f 74 2e 64 69 73 74 28 58 et)..#.Cost.matrix.M.=.ot.dist(X
4ae0 73 2c 20 58 74 2c 20 6d 65 74 72 69 63 3d 27 73 71 65 75 63 6c 69 64 65 61 6e 27 29 0a 0a 0a 23 s,.Xt,.metric='sqeuclidean')...#
4b00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
4b20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
4b40 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 49 6e 73 74 61 6e 74 69 61 74 65 20 74 68 65 20 #############.#.Instantiate.the.
4b60 64 69 66 66 65 72 65 6e 74 20 74 72 61 6e 73 70 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 different.transport.algorithms.a
4b80 6e 64 20 66 69 74 20 74 68 65 6d 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d nd.fit.them.#.------------------
4ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
4bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 20 45 4d 44 20 54 72 61 6e 73 70 6f 72 74 0a 6f 74 5f 65 6d ---------..#.EMD.Transport.ot_em
4be0 64 20 3d 20 6f 74 2e 64 61 2e 45 4d 44 54 72 61 6e 73 70 6f 72 74 28 29 0a 6f 74 5f 65 6d 64 2e d.=.ot.da.EMDTransport().ot_emd.
4c00 66 69 74 28 58 73 3d 58 73 2c 20 58 74 3d 58 74 29 0a 0a 23 20 53 69 6e 6b 68 6f 72 6e 20 54 72 fit(Xs=Xs,.Xt=Xt)..#.Sinkhorn.Tr
4c20 61 6e 73 70 6f 72 74 0a 6f 74 5f 73 69 6e 6b 68 6f 72 6e 20 3d 20 6f 74 2e 64 61 2e 53 69 6e 6b ansport.ot_sinkhorn.=.ot.da.Sink
4c40 68 6f 72 6e 54 72 61 6e 73 70 6f 72 74 28 72 65 67 5f 65 3d 31 65 2d 31 29 0a 6f 74 5f 73 69 6e hornTransport(reg_e=1e-1).ot_sin
4c60 6b 68 6f 72 6e 2e 66 69 74 28 58 73 3d 58 73 2c 20 58 74 3d 58 74 29 0a 0a 23 20 53 69 6e 6b 68 khorn.fit(Xs=Xs,.Xt=Xt)..#.Sinkh
4c80 6f 72 6e 20 54 72 61 6e 73 70 6f 72 74 20 77 69 74 68 20 47 72 6f 75 70 20 6c 61 73 73 6f 20 72 orn.Transport.with.Group.lasso.r
4ca0 65 67 75 6c 61 72 69 7a 61 74 69 6f 6e 0a 6f 74 5f 6c 70 6c 31 20 3d 20 6f 74 2e 64 61 2e 53 69 egularization.ot_lpl1.=.ot.da.Si
4cc0 6e 6b 68 6f 72 6e 4c 70 6c 31 54 72 61 6e 73 70 6f 72 74 28 72 65 67 5f 65 3d 31 65 2d 31 2c 20 nkhornLpl1Transport(reg_e=1e-1,.
4ce0 72 65 67 5f 63 6c 3d 31 65 30 29 0a 6f 74 5f 6c 70 6c 31 2e 66 69 74 28 58 73 3d 58 73 2c 20 79 reg_cl=1e0).ot_lpl1.fit(Xs=Xs,.y
4d00 73 3d 79 73 2c 20 58 74 3d 58 74 29 0a 0a 23 20 74 72 61 6e 73 70 6f 72 74 20 73 6f 75 72 63 65 s=ys,.Xt=Xt)..#.transport.source
4d20 20 73 61 6d 70 6c 65 73 20 6f 6e 74 6f 20 74 61 72 67 65 74 20 73 61 6d 70 6c 65 73 0a 74 72 61 .samples.onto.target.samples.tra
4d40 6e 73 70 5f 58 73 5f 65 6d 64 20 3d 20 6f 74 5f 65 6d 64 2e 74 72 61 6e 73 66 6f 72 6d 28 58 73 nsp_Xs_emd.=.ot_emd.transform(Xs
4d60 3d 58 73 29 0a 74 72 61 6e 73 70 5f 58 73 5f 73 69 6e 6b 68 6f 72 6e 20 3d 20 6f 74 5f 73 69 6e =Xs).transp_Xs_sinkhorn.=.ot_sin
4d80 6b 68 6f 72 6e 2e 74 72 61 6e 73 66 6f 72 6d 28 58 73 3d 58 73 29 0a 74 72 61 6e 73 70 5f 58 73 khorn.transform(Xs=Xs).transp_Xs
4da0 5f 6c 70 6c 31 20 3d 20 6f 74 5f 6c 70 6c 31 2e 74 72 61 6e 73 66 6f 72 6d 28 58 73 3d 58 73 29 _lpl1.=.ot_lpl1.transform(Xs=Xs)
4dc0 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ...#############################
4de0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
4e00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 46 69 67 20 31 20 3a 20 70 6c 6f 74 #################.#.Fig.1.:.plot
4e20 73 20 73 6f 75 72 63 65 20 61 6e 64 20 74 61 72 67 65 74 20 73 61 6d 70 6c 65 73 20 2b 20 6d 61 s.source.and.target.samples.+.ma
4e40 74 72 69 78 20 6f 66 20 70 61 69 72 77 69 73 65 20 64 69 73 74 61 6e 63 65 0a 23 20 2d 2d 2d 2d trix.of.pairwise.distance.#.----
4e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
4e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
4ea0 2d 0a 0a 70 6c 2e 66 69 67 75 72 65 28 31 2c 20 66 69 67 73 69 7a 65 3d 28 31 30 2c 20 31 30 29 -..pl.figure(1,.figsize=(10,.10)
4ec0 29 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 32 2c 20 31 29 0a 70 6c 2e 73 63 61 74 74 65 72 ).pl.subplot(2,.2,.1).pl.scatter
4ee0 28 58 73 5b 3a 2c 20 30 5d 2c 20 58 73 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 20 6d 61 72 6b 65 (Xs[:,.0],.Xs[:,.1],.c=ys,.marke
4f00 72 3d 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a 70 r='+',.label='Source.samples').p
4f20 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 6c 65 l.xticks([]).pl.yticks([]).pl.le
4f40 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 53 6f 75 72 63 65 20 20 73 61 gend(loc=0).pl.title('Source..sa
4f60 6d 70 6c 65 73 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 32 2c 20 32 29 0a 70 6c 2e mples')..pl.subplot(2,.2,.2).pl.
4f80 73 63 61 74 74 65 72 28 58 74 5b 3a 2c 20 30 5d 2c 20 58 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 74 scatter(Xt[:,.0],.Xt[:,.1],.c=yt
4fa0 2c 20 6d 61 72 6b 65 72 3d 27 6f 27 2c 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 ,.marker='o',.label='Target.samp
4fc0 6c 65 73 27 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d les').pl.xticks([]).pl.yticks([]
4fe0 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 54 61 72 ).pl.legend(loc=0).pl.title('Tar
5000 67 65 74 20 73 61 6d 70 6c 65 73 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 32 2c 20 get.samples')..pl.subplot(2,.2,.
5020 33 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 4d 2c 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 3).pl.imshow(M,.interpolation='n
5040 65 61 72 65 73 74 27 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 earest').pl.xticks([]).pl.yticks
5060 28 5b 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 4d 61 74 72 69 78 20 6f 66 20 70 61 69 72 77 69 73 ([]).pl.title('Matrix.of.pairwis
5080 65 20 64 69 73 74 61 6e 63 65 73 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a e.distances').pl.tight_layout().
50a0 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ..##############################
50c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
50e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 46 69 67 20 32 20 3a 20 70 6c 6f 74 73 ################.#.Fig.2.:.plots
5100 20 6f 70 74 69 6d 61 6c 20 63 6f 75 70 6c 69 6e 67 73 20 66 6f 72 20 74 68 65 20 64 69 66 66 65 .optimal.couplings.for.the.diffe
5120 72 65 6e 74 20 6d 65 74 68 6f 64 73 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d rent.methods.#.-----------------
5140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
5160 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 6c 2e 66 69 67 75 72 65 28 32 2c 20 66 69 67 73 69 7a 65 3d 28 31 --------.pl.figure(2,.figsize=(1
5180 30 2c 20 36 29 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 33 2c 20 31 29 0a 70 6c 2e 69 0,.6))..pl.subplot(2,.3,.1).pl.i
51a0 6d 73 68 6f 77 28 6f 74 5f 65 6d 64 2e 63 6f 75 70 6c 69 6e 67 5f 2c 20 69 6e 74 65 72 70 6f 6c mshow(ot_emd.coupling_,.interpol
51c0 61 74 69 6f 6e 3d 27 6e 65 61 72 65 73 74 27 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 ation='nearest').pl.xticks([]).p
51e0 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 4f 70 74 69 6d 61 6c 20 63 l.yticks([]).pl.title('Optimal.c
5200 6f 75 70 6c 69 6e 67 5c 6e 45 4d 44 54 72 61 6e 73 70 6f 72 74 27 29 0a 0a 70 6c 2e 73 75 62 70 oupling\nEMDTransport')..pl.subp
5220 6c 6f 74 28 32 2c 20 33 2c 20 32 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 6f 74 5f 73 69 6e 6b 68 6f lot(2,.3,.2).pl.imshow(ot_sinkho
5240 72 6e 2e 63 6f 75 70 6c 69 6e 67 5f 2c 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 rn.coupling_,.interpolation='nea
5260 72 65 73 74 27 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b rest').pl.xticks([]).pl.yticks([
5280 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 4f 70 74 69 6d 61 6c 20 63 6f 75 70 6c 69 6e 67 5c 6e 53 ]).pl.title('Optimal.coupling\nS
52a0 69 6e 6b 68 6f 72 6e 54 72 61 6e 73 70 6f 72 74 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 inkhornTransport')..pl.subplot(2
52c0 2c 20 33 2c 20 33 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 6f 74 5f 6c 70 6c 31 2e 63 6f 75 70 6c 69 ,.3,.3).pl.imshow(ot_lpl1.coupli
52e0 6e 67 5f 2c 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 72 65 73 74 27 29 0a 70 6c ng_,.interpolation='nearest').pl
5300 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 74 69 74 .xticks([]).pl.yticks([]).pl.tit
5320 6c 65 28 27 4f 70 74 69 6d 61 6c 20 63 6f 75 70 6c 69 6e 67 5c 6e 53 69 6e 6b 68 6f 72 6e 4c 70 le('Optimal.coupling\nSinkhornLp
5340 6c 31 54 72 61 6e 73 70 6f 72 74 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 33 2c 20 l1Transport')..pl.subplot(2,.3,.
5360 34 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 32 44 5f 73 61 6d 70 6c 65 73 5f 6d 61 74 28 58 73 4).ot.plot.plot2D_samples_mat(Xs
5380 2c 20 58 74 2c 20 6f 74 5f 65 6d 64 2e 63 6f 75 70 6c 69 6e 67 5f 2c 20 63 3d 5b 2e 35 2c 20 2e ,.Xt,.ot_emd.coupling_,.c=[.5,..
53a0 35 2c 20 31 5d 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 73 5b 3a 2c 20 30 5d 2c 20 58 73 5b 3a 5,.1]).pl.scatter(Xs[:,.0],.Xs[:
53c0 2c 20 31 5d 2c 20 63 3d 79 73 2c 20 6d 61 72 6b 65 72 3d 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 53 ,.1],.c=ys,.marker='+',.label='S
53e0 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 74 5b 3a 2c ource.samples').pl.scatter(Xt[:,
5400 20 30 5d 2c 20 58 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 74 2c 20 6d 61 72 6b 65 72 3d 27 6f 27 2c .0],.Xt[:,.1],.c=yt,.marker='o',
5420 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 78 74 69 63 .label='Target.samples').pl.xtic
5440 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 4d ks([]).pl.yticks([]).pl.title('M
5460 61 69 6e 20 63 6f 75 70 6c 69 6e 67 20 63 6f 65 66 66 69 63 69 65 6e 74 73 5c 6e 45 4d 44 54 72 ain.coupling.coefficients\nEMDTr
5480 61 6e 73 70 6f 72 74 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 33 2c 20 35 29 0a 6f ansport')..pl.subplot(2,.3,.5).o
54a0 74 2e 70 6c 6f 74 2e 70 6c 6f 74 32 44 5f 73 61 6d 70 6c 65 73 5f 6d 61 74 28 58 73 2c 20 58 74 t.plot.plot2D_samples_mat(Xs,.Xt
54c0 2c 20 6f 74 5f 73 69 6e 6b 68 6f 72 6e 2e 63 6f 75 70 6c 69 6e 67 5f 2c 20 63 3d 5b 2e 35 2c 20 ,.ot_sinkhorn.coupling_,.c=[.5,.
54e0 2e 35 2c 20 31 5d 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 73 5b 3a 2c 20 30 5d 2c 20 58 73 5b .5,.1]).pl.scatter(Xs[:,.0],.Xs[
5500 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 20 6d 61 72 6b 65 72 3d 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 :,.1],.c=ys,.marker='+',.label='
5520 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 74 5b 3a Source.samples').pl.scatter(Xt[:
5540 2c 20 30 5d 2c 20 58 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 74 2c 20 6d 61 72 6b 65 72 3d 27 6f 27 ,.0],.Xt[:,.1],.c=yt,.marker='o'
5560 2c 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 78 74 69 ,.label='Target.samples').pl.xti
5580 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 cks([]).pl.yticks([]).pl.title('
55a0 4d 61 69 6e 20 63 6f 75 70 6c 69 6e 67 20 63 6f 65 66 66 69 63 69 65 6e 74 73 5c 6e 53 69 6e 6b Main.coupling.coefficients\nSink
55c0 68 6f 72 6e 54 72 61 6e 73 70 6f 72 74 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 33 hornTransport')..pl.subplot(2,.3
55e0 2c 20 36 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 32 44 5f 73 61 6d 70 6c 65 73 5f 6d 61 74 28 ,.6).ot.plot.plot2D_samples_mat(
5600 58 73 2c 20 58 74 2c 20 6f 74 5f 6c 70 6c 31 2e 63 6f 75 70 6c 69 6e 67 5f 2c 20 63 3d 5b 2e 35 Xs,.Xt,.ot_lpl1.coupling_,.c=[.5
5620 2c 20 2e 35 2c 20 31 5d 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 73 5b 3a 2c 20 30 5d 2c 20 58 ,..5,.1]).pl.scatter(Xs[:,.0],.X
5640 73 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 20 6d 61 72 6b 65 72 3d 27 2b 27 2c 20 6c 61 62 65 6c s[:,.1],.c=ys,.marker='+',.label
5660 3d 27 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 74 ='Source.samples').pl.scatter(Xt
5680 5b 3a 2c 20 30 5d 2c 20 58 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 74 2c 20 6d 61 72 6b 65 72 3d 27 [:,.0],.Xt[:,.1],.c=yt,.marker='
56a0 6f 27 2c 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 78 o',.label='Target.samples').pl.x
56c0 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 74 69 74 6c 65 ticks([]).pl.yticks([]).pl.title
56e0 28 27 4d 61 69 6e 20 63 6f 75 70 6c 69 6e 67 20 63 6f 65 66 66 69 63 69 65 6e 74 73 5c 6e 53 69 ('Main.coupling.coefficients\nSi
5700 6e 6b 68 6f 72 6e 4c 70 6c 31 54 72 61 6e 73 70 6f 72 74 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c nkhornLpl1Transport').pl.tight_l
5720 61 79 6f 75 74 28 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ayout()...######################
5740 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
5760 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 46 69 67 20 33 ########################.#.Fig.3
5780 20 3a 20 70 6c 6f 74 20 74 72 61 6e 73 70 6f 72 74 65 64 20 73 61 6d 70 6c 65 73 0a 23 20 2d 2d .:.plot.transported.samples.#.--
57a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a ------------------------------..
57c0 23 20 64 69 73 70 6c 61 79 20 74 72 61 6e 73 70 6f 72 74 65 64 20 73 61 6d 70 6c 65 73 0a 70 6c #.display.transported.samples.pl
57e0 2e 66 69 67 75 72 65 28 34 2c 20 66 69 67 73 69 7a 65 3d 28 31 30 2c 20 34 29 29 0a 70 6c 2e 73 .figure(4,.figsize=(10,.4)).pl.s
5800 75 62 70 6c 6f 74 28 31 2c 20 33 2c 20 31 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 74 5b 3a 2c ubplot(1,.3,.1).pl.scatter(Xt[:,
5820 20 30 5d 2c 20 58 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 74 2c 20 6d 61 72 6b 65 72 3d 27 6f 27 2c .0],.Xt[:,.1],.c=yt,.marker='o',
5840 0a 20 20 20 20 20 20 20 20 20 20 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 ............label='Target.sample
5860 73 27 2c 20 61 6c 70 68 61 3d 30 2e 35 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 74 72 61 6e 73 70 s',.alpha=0.5).pl.scatter(transp
5880 5f 58 73 5f 65 6d 64 5b 3a 2c 20 30 5d 2c 20 74 72 61 6e 73 70 5f 58 73 5f 65 6d 64 5b 3a 2c 20 _Xs_emd[:,.0],.transp_Xs_emd[:,.
58a0 31 5d 2c 20 63 3d 79 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6d 61 72 6b 65 72 3d 27 2b 27 2c 1],.c=ys,............marker='+',
58c0 20 6c 61 62 65 6c 3d 27 54 72 61 6e 73 70 20 73 61 6d 70 6c 65 73 27 2c 20 73 3d 33 30 29 0a 70 .label='Transp.samples',.s=30).p
58e0 6c 2e 74 69 74 6c 65 28 27 54 72 61 6e 73 70 6f 72 74 65 64 20 73 61 6d 70 6c 65 73 5c 6e 45 6d l.title('Transported.samples\nEm
5900 64 54 72 61 6e 73 70 6f 72 74 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c dTransport').pl.legend(loc=0).pl
5920 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 0a 70 6c 2e 73 75 .xticks([]).pl.yticks([])..pl.su
5940 62 70 6c 6f 74 28 31 2c 20 33 2c 20 32 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 74 5b 3a 2c 20 bplot(1,.3,.2).pl.scatter(Xt[:,.
5960 30 5d 2c 20 58 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 74 2c 20 6d 61 72 6b 65 72 3d 27 6f 27 2c 0a 0],.Xt[:,.1],.c=yt,.marker='o',.
5980 20 20 20 20 20 20 20 20 20 20 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 ...........label='Target.samples
59a0 27 2c 20 61 6c 70 68 61 3d 30 2e 35 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 74 72 61 6e 73 70 5f ',.alpha=0.5).pl.scatter(transp_
59c0 58 73 5f 73 69 6e 6b 68 6f 72 6e 5b 3a 2c 20 30 5d 2c 20 74 72 61 6e 73 70 5f 58 73 5f 73 69 6e Xs_sinkhorn[:,.0],.transp_Xs_sin
59e0 6b 68 6f 72 6e 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6d 61 khorn[:,.1],.c=ys,............ma
5a00 72 6b 65 72 3d 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 54 72 61 6e 73 70 20 73 61 6d 70 6c 65 73 27 rker='+',.label='Transp.samples'
5a20 2c 20 73 3d 33 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 54 72 61 6e 73 70 6f 72 74 65 64 20 73 61 ,.s=30).pl.title('Transported.sa
5a40 6d 70 6c 65 73 5c 6e 53 69 6e 6b 68 6f 72 6e 54 72 61 6e 73 70 6f 72 74 27 29 0a 70 6c 2e 78 74 mples\nSinkhornTransport').pl.xt
5a60 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 0a 70 6c 2e 73 75 62 70 6c icks([]).pl.yticks([])..pl.subpl
5a80 6f 74 28 31 2c 20 33 2c 20 33 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 74 5b 3a 2c 20 30 5d 2c ot(1,.3,.3).pl.scatter(Xt[:,.0],
5aa0 20 58 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 74 2c 20 6d 61 72 6b 65 72 3d 27 6f 27 2c 0a 20 20 20 .Xt[:,.1],.c=yt,.marker='o',....
5ac0 20 20 20 20 20 20 20 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 2c 20 ........label='Target.samples',.
5ae0 61 6c 70 68 61 3d 30 2e 35 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 74 72 61 6e 73 70 5f 58 73 5f alpha=0.5).pl.scatter(transp_Xs_
5b00 6c 70 6c 31 5b 3a 2c 20 30 5d 2c 20 74 72 61 6e 73 70 5f 58 73 5f 6c 70 6c 31 5b 3a 2c 20 31 5d lpl1[:,.0],.transp_Xs_lpl1[:,.1]
5b20 2c 20 63 3d 79 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6d 61 72 6b 65 72 3d 27 2b 27 2c 20 6c ,.c=ys,............marker='+',.l
5b40 61 62 65 6c 3d 27 54 72 61 6e 73 70 20 73 61 6d 70 6c 65 73 27 2c 20 73 3d 33 30 29 0a 70 6c 2e abel='Transp.samples',.s=30).pl.
5b60 74 69 74 6c 65 28 27 54 72 61 6e 73 70 6f 72 74 65 64 20 73 61 6d 70 6c 65 73 5c 6e 53 69 6e 6b title('Transported.samples\nSink
5b80 68 6f 72 6e 4c 70 6c 31 54 72 61 6e 73 70 6f 72 74 27 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d hornLpl1Transport').pl.xticks([]
5ba0 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 ).pl.yticks([])..pl.tight_layout
5bc0 28 29 0a 70 6c 2e 73 68 6f 77 28 29 0a 50 4b 03 04 14 00 00 00 00 00 db 74 d9 4e 71 12 0d cb 23 ().pl.show().PK.........t.Nq...#
5be0 12 00 00 23 12 00 00 1c 00 00 00 70 6c 6f 74 5f 6f 74 64 61 5f 73 65 6d 69 5f 73 75 70 65 72 76 ...#.......plot_otda_semi_superv
5c00 69 73 65 64 2e 70 79 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0a 22 ised.py#.-*-.coding:.utf-8.-*-."
5c20 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d "".=============================
5c40 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 4f 54 44 41 20 75 6e 73 75 70 65 72 76 69 73 65 ===============.OTDA.unsupervise
5c60 64 20 76 73 20 73 65 6d 69 2d 73 75 70 65 72 76 69 73 65 64 20 73 65 74 74 69 6e 67 0a 3d 3d 3d d.vs.semi-supervised.setting.===
5c80 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================================
5ca0 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 54 68 69 73 20 65 78 61 6d 70 6c 65 20 69 6e 74 72 6f 64 75 63 =========..This.example.introduc
5cc0 65 73 20 61 20 73 65 6d 69 20 73 75 70 65 72 76 69 73 65 64 20 64 6f 6d 61 69 6e 20 61 64 61 70 es.a.semi.supervised.domain.adap
5ce0 74 61 74 69 6f 6e 20 69 6e 20 61 20 32 44 20 73 65 74 74 69 6e 67 2e 0a 49 74 20 65 78 70 6c 69 tation.in.a.2D.setting..It.expli
5d00 63 69 74 73 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 6f 66 20 73 65 6d 69 20 73 75 70 65 72 76 69 cits.the.problem.of.semi.supervi
5d20 73 65 64 20 64 6f 6d 61 69 6e 20 61 64 61 70 74 61 74 69 6f 6e 20 61 6e 64 20 69 6e 74 72 6f 64 sed.domain.adaptation.and.introd
5d40 75 63 65 73 0a 73 6f 6d 65 20 6f 70 74 69 6d 61 6c 20 74 72 61 6e 73 70 6f 72 74 20 61 70 70 72 uces.some.optimal.transport.appr
5d60 6f 61 63 68 65 73 20 74 6f 20 73 6f 6c 76 65 20 69 74 2e 0a 0a 51 75 61 6e 74 69 74 69 65 73 20 oaches.to.solve.it...Quantities.
5d80 73 75 63 68 20 61 73 20 6f 70 74 69 6d 61 6c 20 63 6f 75 70 6c 69 6e 67 73 2c 20 67 72 65 61 74 such.as.optimal.couplings,.great
5da0 65 72 20 63 6f 75 70 6c 69 6e 67 20 63 6f 65 66 66 69 63 69 65 6e 74 73 20 61 6e 64 0a 74 72 61 er.coupling.coefficients.and.tra
5dc0 6e 73 70 6f 72 74 65 64 20 73 61 6d 70 6c 65 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 nsported.samples.are.represented
5de0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 69 76 65 20 61 20 76 69 73 75 61 6c 20 75 6e 64 65 72 .in.order.to.give.a.visual.under
5e00 73 74 61 6e 64 69 6e 67 0a 6f 66 20 77 68 61 74 20 74 68 65 20 74 72 61 6e 73 70 6f 72 74 20 6d standing.of.what.the.transport.m
5e20 65 74 68 6f 64 73 20 61 72 65 20 64 6f 69 6e 67 2e 0a 22 22 22 0a 0a 23 20 41 75 74 68 6f 72 73 ethods.are.doing.."""..#.Authors
5e40 3a 20 52 65 6d 69 20 46 6c 61 6d 61 72 79 20 3c 72 65 6d 69 2e 66 6c 61 6d 61 72 79 40 75 6e 69 :.Remi.Flamary.<remi.flamary@uni
5e60 63 65 2e 66 72 3e 0a 23 20 20 20 20 20 20 20 20 20 20 53 74 61 6e 69 73 6c 61 73 20 43 68 61 6d ce.fr>.#..........Stanislas.Cham
5e80 62 6f 6e 20 3c 73 74 61 6e 2e 63 68 61 6d 62 6f 6e 40 67 6d 61 69 6c 2e 63 6f 6d 3e 0a 23 0a 23 bon.<stan.chambon@gmail.com>.#.#
5ea0 20 4c 69 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 63 65 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6d 61 .License:.MIT.License..import.ma
5ec0 74 70 6c 6f 74 6c 69 62 2e 70 79 6c 61 62 20 61 73 20 70 6c 0a 69 6d 70 6f 72 74 20 6f 74 0a 0a tplotlib.pylab.as.pl.import.ot..
5ee0 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 .###############################
5f00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
5f20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 47 65 6e 65 72 61 74 65 20 64 61 74 61 0a ###############.#.Generate.data.
5f40 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 6e 5f 73 61 6d 70 6c 65 73 5f 73 6f 75 72 63 #.-------------..n_samples_sourc
5f60 65 20 3d 20 31 35 30 0a 6e 5f 73 61 6d 70 6c 65 73 5f 74 61 72 67 65 74 20 3d 20 31 35 30 0a 0a e.=.150.n_samples_target.=.150..
5f80 58 73 2c 20 79 73 20 3d 20 6f 74 2e 64 61 74 61 73 65 74 73 2e 6d 61 6b 65 5f 64 61 74 61 5f 63 Xs,.ys.=.ot.datasets.make_data_c
5fa0 6c 61 73 73 69 66 28 27 33 67 61 75 73 73 27 2c 20 6e 5f 73 61 6d 70 6c 65 73 5f 73 6f 75 72 63 lassif('3gauss',.n_samples_sourc
5fc0 65 29 0a 58 74 2c 20 79 74 20 3d 20 6f 74 2e 64 61 74 61 73 65 74 73 2e 6d 61 6b 65 5f 64 61 74 e).Xt,.yt.=.ot.datasets.make_dat
5fe0 61 5f 63 6c 61 73 73 69 66 28 27 33 67 61 75 73 73 32 27 2c 20 6e 5f 73 61 6d 70 6c 65 73 5f 74 a_classif('3gauss2',.n_samples_t
6000 61 72 67 65 74 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 arget)...#######################
6020 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
6040 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 54 72 61 6e 73 70 #######################.#.Transp
6060 6f 72 74 20 73 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 20 6f 6e 74 6f 20 74 61 72 67 65 74 20 73 ort.source.samples.onto.target.s
6080 61 6d 70 6c 65 73 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d amples.#.-----------------------
60a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 0a 23 20 75 6e 73 75 70 65 ---------------------...#.unsupe
60c0 72 76 69 73 65 64 20 64 6f 6d 61 69 6e 20 61 64 61 70 74 61 74 69 6f 6e 0a 6f 74 5f 73 69 6e 6b rvised.domain.adaptation.ot_sink
60e0 68 6f 72 6e 5f 75 6e 20 3d 20 6f 74 2e 64 61 2e 53 69 6e 6b 68 6f 72 6e 54 72 61 6e 73 70 6f 72 horn_un.=.ot.da.SinkhornTranspor
6100 74 28 72 65 67 5f 65 3d 31 65 2d 31 29 0a 6f 74 5f 73 69 6e 6b 68 6f 72 6e 5f 75 6e 2e 66 69 74 t(reg_e=1e-1).ot_sinkhorn_un.fit
6120 28 58 73 3d 58 73 2c 20 58 74 3d 58 74 29 0a 74 72 61 6e 73 70 5f 58 73 5f 73 69 6e 6b 68 6f 72 (Xs=Xs,.Xt=Xt).transp_Xs_sinkhor
6140 6e 5f 75 6e 20 3d 20 6f 74 5f 73 69 6e 6b 68 6f 72 6e 5f 75 6e 2e 74 72 61 6e 73 66 6f 72 6d 28 n_un.=.ot_sinkhorn_un.transform(
6160 58 73 3d 58 73 29 0a 0a 23 20 73 65 6d 69 2d 73 75 70 65 72 76 69 73 65 64 20 64 6f 6d 61 69 6e Xs=Xs)..#.semi-supervised.domain
6180 20 61 64 61 70 74 61 74 69 6f 6e 0a 6f 74 5f 73 69 6e 6b 68 6f 72 6e 5f 73 65 6d 69 20 3d 20 6f .adaptation.ot_sinkhorn_semi.=.o
61a0 74 2e 64 61 2e 53 69 6e 6b 68 6f 72 6e 54 72 61 6e 73 70 6f 72 74 28 72 65 67 5f 65 3d 31 65 2d t.da.SinkhornTransport(reg_e=1e-
61c0 31 29 0a 6f 74 5f 73 69 6e 6b 68 6f 72 6e 5f 73 65 6d 69 2e 66 69 74 28 58 73 3d 58 73 2c 20 58 1).ot_sinkhorn_semi.fit(Xs=Xs,.X
61e0 74 3d 58 74 2c 20 79 73 3d 79 73 2c 20 79 74 3d 79 74 29 0a 74 72 61 6e 73 70 5f 58 73 5f 73 69 t=Xt,.ys=ys,.yt=yt).transp_Xs_si
6200 6e 6b 68 6f 72 6e 5f 73 65 6d 69 20 3d 20 6f 74 5f 73 69 6e 6b 68 6f 72 6e 5f 73 65 6d 69 2e 74 nkhorn_semi.=.ot_sinkhorn_semi.t
6220 72 61 6e 73 66 6f 72 6d 28 58 73 3d 58 73 29 0a 0a 23 20 73 65 6d 69 20 73 75 70 65 72 76 69 73 ransform(Xs=Xs)..#.semi.supervis
6240 65 64 20 44 41 20 75 73 65 73 20 61 76 61 69 6c 61 62 6c 65 20 6c 61 62 61 6c 65 64 20 74 61 72 ed.DA.uses.available.labaled.tar
6260 67 65 74 20 73 61 6d 70 6c 65 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 63 6f 73 74 0a 23 get.samples.to.modify.the.cost.#
6280 20 6d 61 74 72 69 78 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 4f 54 20 70 72 6f 62 6c .matrix.involved.in.the.OT.probl
62a0 65 6d 2e 20 54 68 65 20 63 6f 73 74 20 6f 66 20 74 72 61 6e 73 70 6f 72 74 69 6e 67 20 61 20 73 em..The.cost.of.transporting.a.s
62c0 6f 75 72 63 65 20 73 61 6d 70 6c 65 0a 23 20 6f 66 20 63 6c 61 73 73 20 41 20 6f 6e 74 6f 20 61 ource.sample.#.of.class.A.onto.a
62e0 20 74 61 72 67 65 74 20 73 61 6d 70 6c 65 20 6f 66 20 63 6c 61 73 73 20 42 20 21 3d 20 41 20 69 .target.sample.of.class.B.!=.A.i
6300 73 20 73 65 74 20 74 6f 20 69 6e 66 69 6e 69 74 65 2c 20 6f 72 20 61 0a 23 20 76 65 72 79 20 6c s.set.to.infinite,.or.a.#.very.l
6320 61 72 67 65 20 76 61 6c 75 65 0a 0a 23 20 6e 6f 74 65 20 74 68 61 74 20 69 6e 20 74 68 65 20 70 arge.value..#.note.that.in.the.p
6340 72 65 73 65 6e 74 20 63 61 73 65 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 61 74 20 61 6c 6c resent.case.we.consider.that.all
6360 20 74 68 65 20 74 61 72 67 65 74 20 73 61 6d 70 6c 65 73 20 61 72 65 0a 23 20 6c 61 62 65 6c 65 .the.target.samples.are.#.labele
6380 64 2e 20 46 6f 72 20 64 61 69 6c 79 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 2c 20 73 6f 6d 65 20 d..For.daily.applications,.some.
63a0 74 61 72 67 65 74 20 73 61 6d 70 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 6c 61 62 target.sample.might.not.have.lab
63c0 65 6c 73 2c 0a 23 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 els,.#.in.this.case.the.element.
63e0 6f 66 20 79 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 73 65 20 73 61 6d of.yt.corresponding.to.these.sam
6400 70 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 0a 23 20 66 69 6c 6c 65 64 20 77 69 74 68 20 2d 31 2e ples.should.be.#.filled.with.-1.
6420 0a 0a 23 20 57 61 72 6e 69 6e 67 3a 20 77 65 20 72 65 63 61 6c 6c 20 74 68 61 74 20 2d 31 20 63 ..#.Warning:.we.recall.that.-1.c
6440 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73 20 61 20 63 6c 61 73 73 20 6c 61 62 65 6c 0a 0a annot.be.used.as.a.class.label..
6460 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 .###############################
6480 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
64a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 46 69 67 20 31 20 3a 20 70 6c 6f 74 73 20 ###############.#.Fig.1.:.plots.
64c0 73 6f 75 72 63 65 20 61 6e 64 20 74 61 72 67 65 74 20 73 61 6d 70 6c 65 73 20 2b 20 6d 61 74 72 source.and.target.samples.+.matr
64e0 69 78 20 6f 66 20 70 61 69 72 77 69 73 65 20 64 69 73 74 61 6e 63 65 0a 23 20 2d 2d 2d 2d 2d 2d ix.of.pairwise.distance.#.------
6500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
6520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a -------------------------------.
6540 0a 70 6c 2e 66 69 67 75 72 65 28 31 2c 20 66 69 67 73 69 7a 65 3d 28 31 30 2c 20 31 30 29 29 0a .pl.figure(1,.figsize=(10,.10)).
6560 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 32 2c 20 31 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 pl.subplot(2,.2,.1).pl.scatter(X
6580 73 5b 3a 2c 20 30 5d 2c 20 58 73 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 20 6d 61 72 6b 65 72 3d s[:,.0],.Xs[:,.1],.c=ys,.marker=
65a0 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e '+',.label='Source.samples').pl.
65c0 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 6c 65 67 65 xticks([]).pl.yticks([]).pl.lege
65e0 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 53 6f 75 72 63 65 20 20 73 61 6d 70 nd(loc=0).pl.title('Source..samp
6600 6c 65 73 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 32 2c 20 32 29 0a 70 6c 2e 73 63 les')..pl.subplot(2,.2,.2).pl.sc
6620 61 74 74 65 72 28 58 74 5b 3a 2c 20 30 5d 2c 20 58 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 74 2c 20 atter(Xt[:,.0],.Xt[:,.1],.c=yt,.
6640 6d 61 72 6b 65 72 3d 27 6f 27 2c 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 marker='o',.label='Target.sample
6660 73 27 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a s').pl.xticks([]).pl.yticks([]).
6680 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 54 61 72 67 65 pl.legend(loc=0).pl.title('Targe
66a0 74 20 73 61 6d 70 6c 65 73 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 32 2c 20 33 29 t.samples')..pl.subplot(2,.2,.3)
66c0 0a 70 6c 2e 69 6d 73 68 6f 77 28 6f 74 5f 73 69 6e 6b 68 6f 72 6e 5f 75 6e 2e 63 6f 73 74 5f 2c .pl.imshow(ot_sinkhorn_un.cost_,
66e0 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 72 65 73 74 27 29 0a 70 6c 2e 78 74 69 .interpolation='nearest').pl.xti
6700 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 cks([]).pl.yticks([]).pl.title('
6720 43 6f 73 74 20 6d 61 74 72 69 78 20 2d 20 75 6e 73 75 70 65 72 76 69 73 65 64 20 44 41 27 29 0a Cost.matrix.-.unsupervised.DA').
6740 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 32 2c 20 34 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 6f .pl.subplot(2,.2,.4).pl.imshow(o
6760 74 5f 73 69 6e 6b 68 6f 72 6e 5f 73 65 6d 69 2e 63 6f 73 74 5f 2c 20 69 6e 74 65 72 70 6f 6c 61 t_sinkhorn_semi.cost_,.interpola
6780 74 69 6f 6e 3d 27 6e 65 61 72 65 73 74 27 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c tion='nearest').pl.xticks([]).pl
67a0 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 43 6f 73 74 20 6d 61 74 72 69 .yticks([]).pl.title('Cost.matri
67c0 78 20 2d 20 73 65 6d 69 73 75 70 65 72 76 69 73 65 64 20 44 41 27 29 0a 0a 70 6c 2e 74 69 67 68 x.-.semisupervised.DA')..pl.tigh
67e0 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 23 20 74 68 65 20 6f 70 74 69 6d 61 6c 20 63 6f 75 70 6c 69 t_layout()..#.the.optimal.coupli
6800 6e 67 20 69 6e 20 74 68 65 20 73 65 6d 69 2d 73 75 70 65 72 76 69 73 65 64 20 44 41 20 63 61 73 ng.in.the.semi-supervised.DA.cas
6820 65 20 77 69 6c 6c 20 65 78 68 69 62 69 74 20 22 20 73 68 61 70 65 0a 23 20 73 69 6d 69 6c 61 72 e.will.exhibit.".shape.#.similar
6840 22 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6d 61 74 72 69 78 2c 20 28 62 6c 6f 63 6b 20 64 69 61 ".to.the.cost.matrix,.(block.dia
6860 67 6f 6e 61 6c 20 6d 61 74 72 69 78 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 gonal.matrix)...################
6880 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
68a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 ##############################.#
68c0 20 46 69 67 20 32 20 3a 20 70 6c 6f 74 73 20 6f 70 74 69 6d 61 6c 20 63 6f 75 70 6c 69 6e 67 73 .Fig.2.:.plots.optimal.couplings
68e0 20 66 6f 72 20 74 68 65 20 64 69 66 66 65 72 65 6e 74 20 6d 65 74 68 6f 64 73 0a 23 20 2d 2d 2d .for.the.different.methods.#.---
6900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
6920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 6c 2e 66 69 67 75 72 ----------------------..pl.figur
6940 65 28 32 2c 20 66 69 67 73 69 7a 65 3d 28 38 2c 20 34 29 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 e(2,.figsize=(8,.4))..pl.subplot
6960 28 31 2c 20 32 2c 20 31 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 6f 74 5f 73 69 6e 6b 68 6f 72 6e 5f (1,.2,.1).pl.imshow(ot_sinkhorn_
6980 75 6e 2e 63 6f 75 70 6c 69 6e 67 5f 2c 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 un.coupling_,.interpolation='nea
69a0 72 65 73 74 27 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b rest').pl.xticks([]).pl.yticks([
69c0 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 4f 70 74 69 6d 61 6c 20 63 6f 75 70 6c 69 6e 67 5c 6e 55 ]).pl.title('Optimal.coupling\nU
69e0 6e 73 75 70 65 72 76 69 73 65 64 20 44 41 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 nsupervised.DA')..pl.subplot(1,.
6a00 32 2c 20 32 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 6f 74 5f 73 69 6e 6b 68 6f 72 6e 5f 73 65 6d 69 2,.2).pl.imshow(ot_sinkhorn_semi
6a20 2e 63 6f 75 70 6c 69 6e 67 5f 2c 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 72 65 .coupling_,.interpolation='neare
6a40 73 74 27 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 st').pl.xticks([]).pl.yticks([])
6a60 0a 70 6c 2e 74 69 74 6c 65 28 27 4f 70 74 69 6d 61 6c 20 63 6f 75 70 6c 69 6e 67 5c 6e 53 65 6d .pl.title('Optimal.coupling\nSem
6a80 69 2d 73 75 70 65 72 76 69 73 65 64 20 44 41 27 29 0a 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f i-supervised.DA')..pl.tight_layo
6aa0 75 74 28 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ut()...#########################
6ac0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
6ae0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 46 69 67 20 33 20 3a 20 #####################.#.Fig.3.:.
6b00 70 6c 6f 74 20 74 72 61 6e 73 70 6f 72 74 65 64 20 73 61 6d 70 6c 65 73 0a 23 20 2d 2d 2d 2d 2d plot.transported.samples.#.-----
6b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 20 64 ---------------------------..#.d
6b40 69 73 70 6c 61 79 20 74 72 61 6e 73 70 6f 72 74 65 64 20 73 61 6d 70 6c 65 73 0a 70 6c 2e 66 69 isplay.transported.samples.pl.fi
6b60 67 75 72 65 28 34 2c 20 66 69 67 73 69 7a 65 3d 28 38 2c 20 34 29 29 0a 70 6c 2e 73 75 62 70 6c gure(4,.figsize=(8,.4)).pl.subpl
6b80 6f 74 28 31 2c 20 32 2c 20 31 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 74 5b 3a 2c 20 30 5d 2c ot(1,.2,.1).pl.scatter(Xt[:,.0],
6ba0 20 58 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 74 2c 20 6d 61 72 6b 65 72 3d 27 6f 27 2c 0a 20 20 20 .Xt[:,.1],.c=yt,.marker='o',....
6bc0 20 20 20 20 20 20 20 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 2c 20 ........label='Target.samples',.
6be0 61 6c 70 68 61 3d 30 2e 35 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 74 72 61 6e 73 70 5f 58 73 5f alpha=0.5).pl.scatter(transp_Xs_
6c00 73 69 6e 6b 68 6f 72 6e 5f 75 6e 5b 3a 2c 20 30 5d 2c 20 74 72 61 6e 73 70 5f 58 73 5f 73 69 6e sinkhorn_un[:,.0],.transp_Xs_sin
6c20 6b 68 6f 72 6e 5f 75 6e 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 0a 20 20 20 20 20 20 20 20 20 20 khorn_un[:,.1],.c=ys,...........
6c40 20 6d 61 72 6b 65 72 3d 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 54 72 61 6e 73 70 20 73 61 6d 70 6c .marker='+',.label='Transp.sampl
6c60 65 73 27 2c 20 73 3d 33 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 54 72 61 6e 73 70 6f 72 74 65 64 es',.s=30).pl.title('Transported
6c80 20 73 61 6d 70 6c 65 73 5c 6e 45 6d 64 54 72 61 6e 73 70 6f 72 74 27 29 0a 70 6c 2e 6c 65 67 65 .samples\nEmdTransport').pl.lege
6ca0 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b nd(loc=0).pl.xticks([]).pl.ytick
6cc0 73 28 5b 5d 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 32 2c 20 32 29 0a 70 6c 2e 73 63 s([])..pl.subplot(1,.2,.2).pl.sc
6ce0 61 74 74 65 72 28 58 74 5b 3a 2c 20 30 5d 2c 20 58 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 74 2c 20 atter(Xt[:,.0],.Xt[:,.1],.c=yt,.
6d00 6d 61 72 6b 65 72 3d 27 6f 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 61 62 65 6c 3d 27 54 61 marker='o',............label='Ta
6d20 72 67 65 74 20 73 61 6d 70 6c 65 73 27 2c 20 61 6c 70 68 61 3d 30 2e 35 29 0a 70 6c 2e 73 63 61 rget.samples',.alpha=0.5).pl.sca
6d40 74 74 65 72 28 74 72 61 6e 73 70 5f 58 73 5f 73 69 6e 6b 68 6f 72 6e 5f 73 65 6d 69 5b 3a 2c 20 tter(transp_Xs_sinkhorn_semi[:,.
6d60 30 5d 2c 20 74 72 61 6e 73 70 5f 58 73 5f 73 69 6e 6b 68 6f 72 6e 5f 73 65 6d 69 5b 3a 2c 20 31 0],.transp_Xs_sinkhorn_semi[:,.1
6d80 5d 2c 20 63 3d 79 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6d 61 72 6b 65 72 3d 27 2b 27 2c 20 ],.c=ys,............marker='+',.
6da0 6c 61 62 65 6c 3d 27 54 72 61 6e 73 70 20 73 61 6d 70 6c 65 73 27 2c 20 73 3d 33 30 29 0a 70 6c label='Transp.samples',.s=30).pl
6dc0 2e 74 69 74 6c 65 28 27 54 72 61 6e 73 70 6f 72 74 65 64 20 73 61 6d 70 6c 65 73 5c 6e 53 69 6e .title('Transported.samples\nSin
6de0 6b 68 6f 72 6e 54 72 61 6e 73 70 6f 72 74 27 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 khornTransport').pl.xticks([]).p
6e00 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a l.yticks([])..pl.tight_layout().
6e20 70 6c 2e 73 68 6f 77 28 29 0a 50 4b 03 04 14 00 00 00 00 00 da 74 d9 4e 0b 5c 2a af a2 06 00 00 pl.show().PK.........t.N.\*.....
6e40 a2 06 00 00 0d 00 00 00 70 6c 6f 74 5f 4f 54 5f 31 44 2e 70 79 23 20 2d 2a 2d 20 63 6f 64 69 6e ........plot_OT_1D.py#.-*-.codin
6e60 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0a 22 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d g:.utf-8.-*-.""".===============
6e80 3d 3d 3d 3d 3d 0a 31 44 20 6f 70 74 69 6d 61 6c 20 74 72 61 6e 73 70 6f 72 74 0a 3d 3d 3d 3d 3d =====.1D.optimal.transport.=====
6ea0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 54 68 69 73 20 65 78 61 6d 70 6c 65 20 69 6c ===============..This.example.il
6ec0 6c 75 73 74 72 61 74 65 73 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 45 4d 44 lustrates.the.computation.of.EMD
6ee0 20 61 6e 64 20 53 69 6e 6b 68 6f 72 6e 20 74 72 61 6e 73 70 6f 72 74 20 70 6c 61 6e 73 0a 61 6e .and.Sinkhorn.transport.plans.an
6f00 64 20 74 68 65 69 72 20 76 69 73 75 61 6c 69 7a 61 74 69 6f 6e 2e 0a 0a 22 22 22 0a 0a 23 20 41 d.their.visualization..."""..#.A
6f20 75 74 68 6f 72 3a 20 52 65 6d 69 20 46 6c 61 6d 61 72 79 20 3c 72 65 6d 69 2e 66 6c 61 6d 61 72 uthor:.Remi.Flamary.<remi.flamar
6f40 79 40 75 6e 69 63 65 2e 66 72 3e 0a 23 0a 23 20 4c 69 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 63 y@unice.fr>.#.#.License:.MIT.Lic
6f60 65 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6e 75 6d 70 79 20 61 73 20 6e 70 0a 69 6d 70 6f 72 74 20 ense..import.numpy.as.np.import.
6f80 6d 61 74 70 6c 6f 74 6c 69 62 2e 70 79 6c 61 62 20 61 73 20 70 6c 0a 69 6d 70 6f 72 74 20 6f 74 matplotlib.pylab.as.pl.import.ot
6fa0 0a 69 6d 70 6f 72 74 20 6f 74 2e 70 6c 6f 74 0a 66 72 6f 6d 20 6f 74 2e 64 61 74 61 73 65 74 73 .import.ot.plot.from.ot.datasets
6fc0 20 69 6d 70 6f 72 74 20 6d 61 6b 65 5f 31 44 5f 67 61 75 73 73 20 61 73 20 67 61 75 73 73 0a 0a .import.make_1D_gauss.as.gauss..
6fe0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
7000 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
7020 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 47 65 6e 65 72 61 74 65 20 64 61 74 61 0a 23 ##############.#.Generate.data.#
7040 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 0a 23 25 25 20 70 61 72 61 6d 65 74 65 72 73 0a .-------------...#%%.parameters.
7060 0a 6e 20 3d 20 31 30 30 20 20 23 20 6e 62 20 62 69 6e 73 0a 0a 23 20 62 69 6e 20 70 6f 73 69 74 .n.=.100..#.nb.bins..#.bin.posit
7080 69 6f 6e 73 0a 78 20 3d 20 6e 70 2e 61 72 61 6e 67 65 28 6e 2c 20 64 74 79 70 65 3d 6e 70 2e 66 ions.x.=.np.arange(n,.dtype=np.f
70a0 6c 6f 61 74 36 34 29 0a 0a 23 20 47 61 75 73 73 69 61 6e 20 64 69 73 74 72 69 62 75 74 69 6f 6e loat64)..#.Gaussian.distribution
70c0 73 0a 61 20 3d 20 67 61 75 73 73 28 6e 2c 20 6d 3d 32 30 2c 20 73 3d 35 29 20 20 23 20 6d 3d 20 s.a.=.gauss(n,.m=20,.s=5)..#.m=.
70e0 6d 65 61 6e 2c 20 73 3d 20 73 74 64 0a 62 20 3d 20 67 61 75 73 73 28 6e 2c 20 6d 3d 36 30 2c 20 mean,.s=.std.b.=.gauss(n,.m=60,.
7100 73 3d 31 30 29 0a 0a 23 20 6c 6f 73 73 20 6d 61 74 72 69 78 0a 4d 20 3d 20 6f 74 2e 64 69 73 74 s=10)..#.loss.matrix.M.=.ot.dist
7120 28 78 2e 72 65 73 68 61 70 65 28 28 6e 2c 20 31 29 29 2c 20 78 2e 72 65 73 68 61 70 65 28 28 6e (x.reshape((n,.1)),.x.reshape((n
7140 2c 20 31 29 29 29 0a 4d 20 2f 3d 20 4d 2e 6d 61 78 28 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 ,.1))).M./=.M.max()...##########
7160 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
7180 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
71a0 23 23 23 23 0a 23 20 50 6c 6f 74 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 61 6e 64 20 6c 6f ####.#.Plot.distributions.and.lo
71c0 73 73 20 6d 61 74 72 69 78 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ss.matrix.#.--------------------
71e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 70 6c 6f 74 20 74 68 65 20 64 69 73 --------------..#%%.plot.the.dis
7200 74 72 69 62 75 74 69 6f 6e 73 0a 0a 70 6c 2e 66 69 67 75 72 65 28 31 2c 20 66 69 67 73 69 7a 65 tributions..pl.figure(1,.figsize
7220 3d 28 36 2e 34 2c 20 33 29 29 0a 70 6c 2e 70 6c 6f 74 28 78 2c 20 61 2c 20 27 62 27 2c 20 6c 61 =(6.4,.3)).pl.plot(x,.a,.'b',.la
7240 62 65 6c 3d 27 53 6f 75 72 63 65 20 64 69 73 74 72 69 62 75 74 69 6f 6e 27 29 0a 70 6c 2e 70 6c bel='Source.distribution').pl.pl
7260 6f 74 28 78 2c 20 62 2c 20 27 72 27 2c 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 64 69 73 74 ot(x,.b,.'r',.label='Target.dist
7280 72 69 62 75 74 69 6f 6e 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 29 0a 0a 23 25 25 20 70 6c 6f 74 ribution').pl.legend()..#%%.plot
72a0 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 61 6e 64 20 6c 6f 73 73 20 6d 61 74 72 69 78 0a 0a .distributions.and.loss.matrix..
72c0 70 6c 2e 66 69 67 75 72 65 28 32 2c 20 66 69 67 73 69 7a 65 3d 28 35 2c 20 35 29 29 0a 6f 74 2e pl.figure(2,.figsize=(5,.5)).ot.
72e0 70 6c 6f 74 2e 70 6c 6f 74 31 44 5f 6d 61 74 28 61 2c 20 62 2c 20 4d 2c 20 27 43 6f 73 74 20 6d plot.plot1D_mat(a,.b,.M,.'Cost.m
7300 61 74 72 69 78 20 4d 27 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 atrix.M')..#####################
7320 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
7340 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 53 6f 6c 76 #########################.#.Solv
7360 65 20 45 4d 44 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 0a 23 25 25 20 45 4d 44 0a 0a 47 30 20 e.EMD.#.---------...#%%.EMD..G0.
7380 3d 20 6f 74 2e 65 6d 64 28 61 2c 20 62 2c 20 4d 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 33 2c 20 =.ot.emd(a,.b,.M)..pl.figure(3,.
73a0 66 69 67 73 69 7a 65 3d 28 35 2c 20 35 29 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 31 44 5f 6d figsize=(5,.5)).ot.plot.plot1D_m
73c0 61 74 28 61 2c 20 62 2c 20 47 30 2c 20 27 4f 54 20 6d 61 74 72 69 78 20 47 30 27 29 0a 0a 23 23 at(a,.b,.G0,.'OT.matrix.G0')..##
73e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
7400 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
7420 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 53 6f 6c 76 65 20 53 69 6e 6b 68 6f 72 6e 0a 23 20 ############.#.Solve.Sinkhorn.#.
7440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 0a 23 25 25 20 53 69 6e 6b 68 6f 72 6e 0a 0a 6c --------------...#%%.Sinkhorn..l
7460 61 6d 62 64 20 3d 20 31 65 2d 33 0a 47 73 20 3d 20 6f 74 2e 73 69 6e 6b 68 6f 72 6e 28 61 2c 20 ambd.=.1e-3.Gs.=.ot.sinkhorn(a,.
7480 62 2c 20 4d 2c 20 6c 61 6d 62 64 2c 20 76 65 72 62 6f 73 65 3d 54 72 75 65 29 0a 0a 70 6c 2e 66 b,.M,.lambd,.verbose=True)..pl.f
74a0 69 67 75 72 65 28 34 2c 20 66 69 67 73 69 7a 65 3d 28 35 2c 20 35 29 29 0a 6f 74 2e 70 6c 6f 74 igure(4,.figsize=(5,.5)).ot.plot
74c0 2e 70 6c 6f 74 31 44 5f 6d 61 74 28 61 2c 20 62 2c 20 47 73 2c 20 27 4f 54 20 6d 61 74 72 69 78 .plot1D_mat(a,.b,.Gs,.'OT.matrix
74e0 20 53 69 6e 6b 68 6f 72 6e 27 29 0a 0a 70 6c 2e 73 68 6f 77 28 29 0a 50 4b 03 04 14 00 00 00 00 .Sinkhorn')..pl.show().PK.......
7500 00 db 74 d9 4e 6d 8a 53 18 e2 17 00 00 e2 17 00 00 12 00 00 00 70 6c 6f 74 5f 73 74 6f 63 68 61 ..t.Nm.S.............plot_stocha
7520 73 74 69 63 2e 70 79 22 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d stic.py""".=====================
7540 3d 3d 3d 3d 3d 0a 53 74 6f 63 68 61 73 74 69 63 20 65 78 61 6d 70 6c 65 73 0a 3d 3d 3d 3d 3d 3d =====.Stochastic.examples.======
7560 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 54 68 69 73 20 65 78 61 6d 70 ====================..This.examp
7580 6c 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 73 68 6f 77 20 68 6f 77 20 74 6f 20 75 73 le.is.designed.to.show.how.to.us
75a0 65 20 74 68 65 20 73 74 6f 63 68 61 74 69 63 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 61 6c 67 e.the.stochatic.optimization.alg
75c0 6f 72 69 74 68 6d 73 20 66 6f 72 20 64 65 73 63 72 65 74 65 20 61 6e 64 20 73 65 6d 69 63 6f 6e orithms.for.descrete.and.semicon
75e0 74 69 6e 6f 75 73 20 6d 65 61 73 75 72 65 73 20 66 72 6f 6d 20 74 68 65 20 50 4f 54 20 6c 69 62 tinous.measures.from.the.POT.lib
7600 72 61 72 79 2e 0a 0a 22 22 22 0a 0a 23 20 41 75 74 68 6f 72 3a 20 4b 69 6c 69 61 6e 20 46 61 74 rary..."""..#.Author:.Kilian.Fat
7620 72 61 73 20 3c 6b 69 6c 69 61 6e 2e 66 61 74 72 61 73 40 67 6d 61 69 6c 2e 63 6f 6d 3e 0a 23 0a ras.<kilian.fatras@gmail.com>.#.
7640 23 20 4c 69 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 63 65 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6d #.License:.MIT.License..import.m
7660 61 74 70 6c 6f 74 6c 69 62 2e 70 79 6c 61 62 20 61 73 20 70 6c 0a 69 6d 70 6f 72 74 20 6e 75 6d atplotlib.pylab.as.pl.import.num
7680 70 79 20 61 73 20 6e 70 0a 69 6d 70 6f 72 74 20 6f 74 0a 69 6d 70 6f 72 74 20 6f 74 2e 70 6c 6f py.as.np.import.ot.import.ot.plo
76a0 74 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 t...############################
76c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
76e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 43 4f 4d 50 55 54 45 20 54 52 41 4e #################.#.COMPUTE.TRAN
7700 53 50 4f 52 54 41 54 49 4f 4e 20 4d 41 54 52 49 58 20 46 4f 52 20 53 45 4d 49 2d 44 55 41 4c 20 SPORTATION.MATRIX.FOR.SEMI-DUAL.
7720 50 52 4f 42 4c 45 4d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 PROBLEM.########################
7740 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
7760 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 23 23 23 23 23 23 23 23 #####################.##########
7780 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
77a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
77c0 23 23 23 0a 23 20 44 49 53 43 52 45 54 45 20 43 41 53 45 3a 0a 23 0a 23 20 53 61 6d 70 6c 65 20 ###.#.DISCRETE.CASE:.#.#.Sample.
77e0 74 77 6f 20 64 69 73 63 72 65 74 65 20 6d 65 61 73 75 72 65 73 20 66 6f 72 20 74 68 65 20 64 69 two.discrete.measures.for.the.di
7800 73 63 72 65 74 65 20 63 61 73 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d screte.case.#.------------------
7820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 23 20 ---------------------------.#.#.
7840 44 65 66 69 6e 65 20 32 20 64 69 73 63 72 65 74 65 20 6d 65 61 73 75 72 65 73 20 61 20 61 6e 64 Define.2.discrete.measures.a.and
7860 20 62 2c 20 74 68 65 20 70 6f 69 6e 74 73 20 77 68 65 72 65 20 61 72 65 20 64 65 66 69 6e 65 64 .b,.the.points.where.are.defined
7880 20 74 68 65 20 73 6f 75 72 63 65 0a 23 20 61 6e 64 20 74 68 65 20 74 61 72 67 65 74 20 6d 65 61 .the.source.#.and.the.target.mea
78a0 73 75 72 65 73 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 63 6f 73 74 20 6d 61 74 72 69 sures.and.finally.the.cost.matri
78c0 78 20 63 2e 0a 0a 6e 5f 73 6f 75 72 63 65 20 3d 20 37 0a 6e 5f 74 61 72 67 65 74 20 3d 20 34 0a x.c...n_source.=.7.n_target.=.4.
78e0 72 65 67 20 3d 20 31 0a 6e 75 6d 49 74 65 72 6d 61 78 20 3d 20 31 30 30 30 0a 0a 61 20 3d 20 6f reg.=.1.numItermax.=.1000..a.=.o
7900 74 2e 75 74 69 6c 73 2e 75 6e 69 66 28 6e 5f 73 6f 75 72 63 65 29 0a 62 20 3d 20 6f 74 2e 75 74 t.utils.unif(n_source).b.=.ot.ut
7920 69 6c 73 2e 75 6e 69 66 28 6e 5f 74 61 72 67 65 74 29 0a 0a 72 6e 67 20 3d 20 6e 70 2e 72 61 6e ils.unif(n_target)..rng.=.np.ran
7940 64 6f 6d 2e 52 61 6e 64 6f 6d 53 74 61 74 65 28 30 29 0a 58 5f 73 6f 75 72 63 65 20 3d 20 72 6e dom.RandomState(0).X_source.=.rn
7960 67 2e 72 61 6e 64 6e 28 6e 5f 73 6f 75 72 63 65 2c 20 32 29 0a 59 5f 74 61 72 67 65 74 20 3d 20 g.randn(n_source,.2).Y_target.=.
7980 72 6e 67 2e 72 61 6e 64 6e 28 6e 5f 74 61 72 67 65 74 2c 20 32 29 0a 4d 20 3d 20 6f 74 2e 64 69 rng.randn(n_target,.2).M.=.ot.di
79a0 73 74 28 58 5f 73 6f 75 72 63 65 2c 20 59 5f 74 61 72 67 65 74 29 0a 0a 23 23 23 23 23 23 23 23 st(X_source,.Y_target)..########
79c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
79e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
7a00 23 23 23 23 23 0a 23 0a 23 20 43 61 6c 6c 20 74 68 65 20 22 53 41 47 22 20 6d 65 74 68 6f 64 20 #####.#.#.Call.the."SAG".method.
7a20 74 6f 20 66 69 6e 64 20 74 68 65 20 74 72 61 6e 73 70 6f 72 74 61 74 69 6f 6e 20 6d 61 74 72 69 to.find.the.transportation.matri
7a40 78 20 69 6e 20 74 68 65 20 64 69 73 63 72 65 74 65 20 63 61 73 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d x.in.the.discrete.case.#.-------
7a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
7a80 2d 2d 2d 2d 2d 2d 0a 23 0a 23 20 44 65 66 69 6e 65 20 74 68 65 20 6d 65 74 68 6f 64 20 22 53 41 ------.#.#.Define.the.method."SA
7aa0 47 22 2c 20 63 61 6c 6c 20 6f 74 2e 73 6f 6c 76 65 5f 73 65 6d 69 5f 64 75 61 6c 5f 65 6e 74 72 G",.call.ot.solve_semi_dual_entr
7ac0 6f 70 69 63 20 61 6e 64 20 70 6c 6f 74 20 74 68 65 0a 23 20 72 65 73 75 6c 74 73 2e 0a 0a 6d 65 opic.and.plot.the.#.results...me
7ae0 74 68 6f 64 20 3d 20 22 53 41 47 22 0a 73 61 67 5f 70 69 20 3d 20 6f 74 2e 73 74 6f 63 68 61 73 thod.=."SAG".sag_pi.=.ot.stochas
7b00 74 69 63 2e 73 6f 6c 76 65 5f 73 65 6d 69 5f 64 75 61 6c 5f 65 6e 74 72 6f 70 69 63 28 61 2c 20 tic.solve_semi_dual_entropic(a,.
7b20 62 2c 20 4d 2c 20 72 65 67 2c 20 6d 65 74 68 6f 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 b,.M,.reg,.method,..............
7b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ................................
7b60 20 20 20 6e 75 6d 49 74 65 72 6d 61 78 29 0a 70 72 69 6e 74 28 73 61 67 5f 70 69 29 0a 0a 23 23 ...numItermax).print(sag_pi)..##
7b80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
7ba0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
7bc0 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 53 45 4d 49 43 4f 4e 54 49 4e 4f 55 53 20 43 41 53 45 ###########.#.SEMICONTINOUS.CASE
7be0 3a 0a 23 0a 23 20 53 61 6d 70 6c 65 20 6f 6e 65 20 67 65 6e 65 72 61 6c 20 6d 65 61 73 75 72 65 :.#.#.Sample.one.general.measure
7c00 20 61 2c 20 6f 6e 65 20 64 69 73 63 72 65 74 65 20 6d 65 61 73 75 72 65 73 20 62 20 66 6f 72 20 .a,.one.discrete.measures.b.for.
7c20 74 68 65 20 73 65 6d 69 63 6f 6e 74 69 6e 6f 75 73 0a 23 20 63 61 73 65 0a 23 20 2d 2d 2d 2d 2d the.semicontinous.#.case.#.-----
7c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
7c60 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 23 20 44 65 66 69 6e 65 20 6f 6e 65 20 67 65 6e 65 72 61 6c 20 --------.#.#.Define.one.general.
7c80 6d 65 61 73 75 72 65 20 61 2c 20 6f 6e 65 20 64 69 73 63 72 65 74 65 20 6d 65 61 73 75 72 65 73 measure.a,.one.discrete.measures
7ca0 20 62 2c 20 74 68 65 20 70 6f 69 6e 74 73 20 77 68 65 72 65 0a 23 20 61 72 65 20 64 65 66 69 6e .b,.the.points.where.#.are.defin
7cc0 65 64 20 74 68 65 20 73 6f 75 72 63 65 20 61 6e 64 20 74 68 65 20 74 61 72 67 65 74 20 6d 65 61 ed.the.source.and.the.target.mea
7ce0 73 75 72 65 73 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 63 6f 73 74 20 6d 61 74 72 69 sures.and.finally.the.cost.matri
7d00 78 20 63 2e 0a 0a 6e 5f 73 6f 75 72 63 65 20 3d 20 37 0a 6e 5f 74 61 72 67 65 74 20 3d 20 34 0a x.c...n_source.=.7.n_target.=.4.
7d20 72 65 67 20 3d 20 31 0a 6e 75 6d 49 74 65 72 6d 61 78 20 3d 20 31 30 30 30 0a 6c 6f 67 20 3d 20 reg.=.1.numItermax.=.1000.log.=.
7d40 54 72 75 65 0a 0a 61 20 3d 20 6f 74 2e 75 74 69 6c 73 2e 75 6e 69 66 28 6e 5f 73 6f 75 72 63 65 True..a.=.ot.utils.unif(n_source
7d60 29 0a 62 20 3d 20 6f 74 2e 75 74 69 6c 73 2e 75 6e 69 66 28 6e 5f 74 61 72 67 65 74 29 0a 0a 72 ).b.=.ot.utils.unif(n_target)..r
7d80 6e 67 20 3d 20 6e 70 2e 72 61 6e 64 6f 6d 2e 52 61 6e 64 6f 6d 53 74 61 74 65 28 30 29 0a 58 5f ng.=.np.random.RandomState(0).X_
7da0 73 6f 75 72 63 65 20 3d 20 72 6e 67 2e 72 61 6e 64 6e 28 6e 5f 73 6f 75 72 63 65 2c 20 32 29 0a source.=.rng.randn(n_source,.2).
7dc0 59 5f 74 61 72 67 65 74 20 3d 20 72 6e 67 2e 72 61 6e 64 6e 28 6e 5f 74 61 72 67 65 74 2c 20 32 Y_target.=.rng.randn(n_target,.2
7de0 29 0a 4d 20 3d 20 6f 74 2e 64 69 73 74 28 58 5f 73 6f 75 72 63 65 2c 20 59 5f 74 61 72 67 65 74 ).M.=.ot.dist(X_source,.Y_target
7e00 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 )..#############################
7e20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
7e40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 0a 23 20 43 61 6c 6c 20 74 68 65 20 22 41 ################.#.#.Call.the."A
7e60 53 47 44 22 20 6d 65 74 68 6f 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 74 72 61 6e 73 70 6f 72 SGD".method.to.find.the.transpor
7e80 74 61 74 69 6f 6e 20 6d 61 74 72 69 78 20 69 6e 20 74 68 65 20 73 65 6d 69 63 6f 6e 74 69 6e 6f tation.matrix.in.the.semicontino
7ea0 75 73 0a 23 20 63 61 73 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d us.#.case.#.--------------------
7ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 23 20 44 65 -------------------------.#.#.De
7ee0 66 69 6e 65 20 74 68 65 20 6d 65 74 68 6f 64 20 22 41 53 47 44 22 2c 20 63 61 6c 6c 20 6f 74 2e fine.the.method."ASGD",.call.ot.
7f00 73 6f 6c 76 65 5f 73 65 6d 69 5f 64 75 61 6c 5f 65 6e 74 72 6f 70 69 63 20 61 6e 64 20 70 6c 6f solve_semi_dual_entropic.and.plo
7f20 74 20 74 68 65 0a 23 20 72 65 73 75 6c 74 73 2e 0a 0a 6d 65 74 68 6f 64 20 3d 20 22 41 53 47 44 t.the.#.results...method.=."ASGD
7f40 22 0a 61 73 67 64 5f 70 69 2c 20 6c 6f 67 5f 61 73 67 64 20 3d 20 6f 74 2e 73 74 6f 63 68 61 73 ".asgd_pi,.log_asgd.=.ot.stochas
7f60 74 69 63 2e 73 6f 6c 76 65 5f 73 65 6d 69 5f 64 75 61 6c 5f 65 6e 74 72 6f 70 69 63 28 61 2c 20 tic.solve_semi_dual_entropic(a,.
7f80 62 2c 20 4d 2c 20 72 65 67 2c 20 6d 65 74 68 6f 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 b,.M,.reg,.method,..............
7fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ................................
7fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 49 74 65 72 6d 61 78 2c 20 6c 6f 67 3d 6c 6f ..............numItermax,.log=lo
7fe0 67 29 0a 70 72 69 6e 74 28 6c 6f 67 5f 61 73 67 64 5b 27 61 6c 70 68 61 27 5d 2c 20 6c 6f 67 5f g).print(log_asgd['alpha'],.log_
8000 61 73 67 64 5b 27 62 65 74 61 27 5d 29 0a 70 72 69 6e 74 28 61 73 67 64 5f 70 69 29 0a 0a 23 23 asgd['beta']).print(asgd_pi)..##
8020 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
8040 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
8060 23 23 23 23 23 23 23 23 23 23 23 0a 23 0a 23 20 43 6f 6d 70 61 72 65 20 74 68 65 20 72 65 73 75 ###########.#.#.Compare.the.resu
8080 6c 74 73 20 77 69 74 68 20 74 68 65 20 53 69 6e 6b 68 6f 72 6e 20 61 6c 67 6f 72 69 74 68 6d 0a lts.with.the.Sinkhorn.algorithm.
80a0 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d #.------------------------------
80c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 23 20 43 61 6c 6c 20 74 68 65 20 53 69 6e ---------------.#.#.Call.the.Sin
80e0 6b 68 6f 72 6e 20 61 6c 67 6f 72 69 74 68 6d 20 66 72 6f 6d 20 50 4f 54 0a 0a 73 69 6e 6b 68 6f khorn.algorithm.from.POT..sinkho
8100 72 6e 5f 70 69 20 3d 20 6f 74 2e 73 69 6e 6b 68 6f 72 6e 28 61 2c 20 62 2c 20 4d 2c 20 72 65 67 rn_pi.=.ot.sinkhorn(a,.b,.M,.reg
8120 29 0a 70 72 69 6e 74 28 73 69 6e 6b 68 6f 72 6e 5f 70 69 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 ).print(sinkhorn_pi)...#########
8140 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
8160 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
8180 23 23 23 23 23 0a 23 20 50 4c 4f 54 20 54 52 41 4e 53 50 4f 52 54 41 54 49 4f 4e 20 4d 41 54 52 #####.#.PLOT.TRANSPORTATION.MATR
81a0 49 58 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 IX.#############################
81c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
81e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 #################..#############
8200 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
8220 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
8240 23 0a 23 20 50 6c 6f 74 20 53 41 47 20 72 65 73 75 6c 74 73 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d #.#.Plot.SAG.results.#.---------
8260 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 6c 2e 66 69 67 75 72 65 28 34 2c 20 66 69 67 73 69 7a 65 3d 28 35 -------..pl.figure(4,.figsize=(5
8280 2c 20 35 29 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 31 44 5f 6d 61 74 28 61 2c 20 62 2c 20 73 ,.5)).ot.plot.plot1D_mat(a,.b,.s
82a0 61 67 5f 70 69 2c 20 27 73 65 6d 69 2d 64 75 61 6c 20 3a 20 4f 54 20 6d 61 74 72 69 78 20 53 41 ag_pi,.'semi-dual.:.OT.matrix.SA
82c0 47 27 29 0a 70 6c 2e 73 68 6f 77 28 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 G').pl.show()...################
82e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
8300 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 ##############################.#
8320 20 50 6c 6f 74 20 41 53 47 44 20 72 65 73 75 6c 74 73 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .Plot.ASGD.results.#.-----------
8340 2d 2d 2d 2d 2d 2d 0a 0a 70 6c 2e 66 69 67 75 72 65 28 34 2c 20 66 69 67 73 69 7a 65 3d 28 35 2c ------..pl.figure(4,.figsize=(5,
8360 20 35 29 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 31 44 5f 6d 61 74 28 61 2c 20 62 2c 20 61 73 .5)).ot.plot.plot1D_mat(a,.b,.as
8380 67 64 5f 70 69 2c 20 27 73 65 6d 69 2d 64 75 61 6c 20 3a 20 4f 54 20 6d 61 74 72 69 78 20 41 53 gd_pi,.'semi-dual.:.OT.matrix.AS
83a0 47 44 27 29 0a 70 6c 2e 73 68 6f 77 28 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 GD').pl.show()...###############
83c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
83e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a ###############################.
8400 23 20 50 6c 6f 74 20 53 69 6e 6b 68 6f 72 6e 20 72 65 73 75 6c 74 73 0a 23 20 2d 2d 2d 2d 2d 2d #.Plot.Sinkhorn.results.#.------
8420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 6c 2e 66 69 67 75 72 65 28 34 2c 20 66 69 ---------------..pl.figure(4,.fi
8440 67 73 69 7a 65 3d 28 35 2c 20 35 29 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 31 44 5f 6d 61 74 gsize=(5,.5)).ot.plot.plot1D_mat
8460 28 61 2c 20 62 2c 20 73 69 6e 6b 68 6f 72 6e 5f 70 69 2c 20 27 4f 54 20 6d 61 74 72 69 78 20 53 (a,.b,.sinkhorn_pi,.'OT.matrix.S
8480 69 6e 6b 68 6f 72 6e 27 29 0a 70 6c 2e 73 68 6f 77 28 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 inkhorn').pl.show()...##########
84a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
84c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
84e0 23 23 23 0a 23 20 43 4f 4d 50 55 54 45 20 54 52 41 4e 53 50 4f 52 54 41 54 49 4f 4e 20 4d 41 54 ###.#.COMPUTE.TRANSPORTATION.MAT
8500 52 49 58 20 46 4f 52 20 44 55 41 4c 20 50 52 4f 42 4c 45 4d 0a 23 23 23 23 23 23 23 23 23 23 23 RIX.FOR.DUAL.PROBLEM.###########
8520 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
8540 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
8560 23 23 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ##.#############################
8580 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
85a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 53 45 4d 49 43 4f 4e 54 49 4e 4f 55 53 ################.#.SEMICONTINOUS
85c0 20 43 41 53 45 3a 0a 23 0a 23 20 53 61 6d 70 6c 65 20 6f 6e 65 20 67 65 6e 65 72 61 6c 20 6d 65 .CASE:.#.#.Sample.one.general.me
85e0 61 73 75 72 65 20 61 2c 20 6f 6e 65 20 64 69 73 63 72 65 74 65 20 6d 65 61 73 75 72 65 73 20 62 asure.a,.one.discrete.measures.b
8600 20 66 6f 72 20 74 68 65 20 73 65 6d 69 63 6f 6e 74 69 6e 6f 75 73 0a 23 20 63 61 73 65 0a 23 20 .for.the.semicontinous.#.case.#.
8620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
8640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 23 20 44 65 66 69 6e 65 20 6f 6e 65 20 67 65 6e -------------.#.#.Define.one.gen
8660 65 72 61 6c 20 6d 65 61 73 75 72 65 20 61 2c 20 6f 6e 65 20 64 69 73 63 72 65 74 65 20 6d 65 61 eral.measure.a,.one.discrete.mea
8680 73 75 72 65 73 20 62 2c 20 74 68 65 20 70 6f 69 6e 74 73 20 77 68 65 72 65 0a 23 20 61 72 65 20 sures.b,.the.points.where.#.are.
86a0 64 65 66 69 6e 65 64 20 74 68 65 20 73 6f 75 72 63 65 20 61 6e 64 20 74 68 65 20 74 61 72 67 65 defined.the.source.and.the.targe
86c0 74 20 6d 65 61 73 75 72 65 73 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20 63 6f 73 74 20 t.measures.and.finally.the.cost.
86e0 6d 61 74 72 69 78 20 63 2e 0a 0a 6e 5f 73 6f 75 72 63 65 20 3d 20 37 0a 6e 5f 74 61 72 67 65 74 matrix.c...n_source.=.7.n_target
8700 20 3d 20 34 0a 72 65 67 20 3d 20 31 0a 6e 75 6d 49 74 65 72 6d 61 78 20 3d 20 31 30 30 30 30 30 .=.4.reg.=.1.numItermax.=.100000
8720 0a 6c 72 20 3d 20 30 2e 31 0a 62 61 74 63 68 5f 73 69 7a 65 20 3d 20 33 0a 6c 6f 67 20 3d 20 54 .lr.=.0.1.batch_size.=.3.log.=.T
8740 72 75 65 0a 0a 61 20 3d 20 6f 74 2e 75 74 69 6c 73 2e 75 6e 69 66 28 6e 5f 73 6f 75 72 63 65 29 rue..a.=.ot.utils.unif(n_source)
8760 0a 62 20 3d 20 6f 74 2e 75 74 69 6c 73 2e 75 6e 69 66 28 6e 5f 74 61 72 67 65 74 29 0a 0a 72 6e .b.=.ot.utils.unif(n_target)..rn
8780 67 20 3d 20 6e 70 2e 72 61 6e 64 6f 6d 2e 52 61 6e 64 6f 6d 53 74 61 74 65 28 30 29 0a 58 5f 73 g.=.np.random.RandomState(0).X_s
87a0 6f 75 72 63 65 20 3d 20 72 6e 67 2e 72 61 6e 64 6e 28 6e 5f 73 6f 75 72 63 65 2c 20 32 29 0a 59 ource.=.rng.randn(n_source,.2).Y
87c0 5f 74 61 72 67 65 74 20 3d 20 72 6e 67 2e 72 61 6e 64 6e 28 6e 5f 74 61 72 67 65 74 2c 20 32 29 _target.=.rng.randn(n_target,.2)
87e0 0a 4d 20 3d 20 6f 74 2e 64 69 73 74 28 58 5f 73 6f 75 72 63 65 2c 20 59 5f 74 61 72 67 65 74 29 .M.=.ot.dist(X_source,.Y_target)
8800 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ..##############################
8820 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
8840 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 0a 23 20 43 61 6c 6c 20 74 68 65 20 22 53 47 ###############.#.#.Call.the."SG
8860 44 22 20 64 75 61 6c 20 6d 65 74 68 6f 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 74 72 61 6e 73 D".dual.method.to.find.the.trans
8880 70 6f 72 74 61 74 69 6f 6e 20 6d 61 74 72 69 78 20 69 6e 20 74 68 65 0a 23 20 73 65 6d 69 63 6f portation.matrix.in.the.#.semico
88a0 6e 74 69 6e 6f 75 73 20 63 61 73 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ntinous.case.#.-----------------
88c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 23 ----------------------------.#.#
88e0 20 43 61 6c 6c 20 6f 74 2e 73 6f 6c 76 65 5f 64 75 61 6c 5f 65 6e 74 72 6f 70 69 63 20 61 6e 64 .Call.ot.solve_dual_entropic.and
8900 20 70 6c 6f 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 0a 0a 73 67 64 5f 64 75 61 6c 5f 70 69 2c .plot.the.results...sgd_dual_pi,
8920 20 6c 6f 67 5f 73 67 64 20 3d 20 6f 74 2e 73 74 6f 63 68 61 73 74 69 63 2e 73 6f 6c 76 65 5f 64 .log_sgd.=.ot.stochastic.solve_d
8940 75 61 6c 5f 65 6e 74 72 6f 70 69 63 28 61 2c 20 62 2c 20 4d 2c 20 72 65 67 2c 0a 20 20 20 20 20 ual_entropic(a,.b,.M,.reg,......
8960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ................................
8980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 61 74 63 68 5f 73 69 7a 65 2c 20 ....................batch_size,.
89a0 6e 75 6d 49 74 65 72 6d 61 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 numItermax,.....................
89c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ................................
89e0 20 20 20 20 20 6c 72 2c 20 6c 6f 67 3d 6c 6f 67 29 0a 70 72 69 6e 74 28 6c 6f 67 5f 73 67 64 5b .....lr,.log=log).print(log_sgd[
8a00 27 61 6c 70 68 61 27 5d 2c 20 6c 6f 67 5f 73 67 64 5b 27 62 65 74 61 27 5d 29 0a 70 72 69 6e 74 'alpha'],.log_sgd['beta']).print
8a20 28 73 67 64 5f 64 75 61 6c 5f 70 69 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 (sgd_dual_pi)..#################
8a40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
8a60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 0a 23 ############################.#.#
8a80 20 43 6f 6d 70 61 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 20 53 69 .Compare.the.results.with.the.Si
8aa0 6e 6b 68 6f 72 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d nkhorn.algorithm.#.-------------
8ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
8ae0 0a 23 0a 23 20 43 61 6c 6c 20 74 68 65 20 53 69 6e 6b 68 6f 72 6e 20 61 6c 67 6f 72 69 74 68 6d .#.#.Call.the.Sinkhorn.algorithm
8b00 20 66 72 6f 6d 20 50 4f 54 0a 0a 73 69 6e 6b 68 6f 72 6e 5f 70 69 20 3d 20 6f 74 2e 73 69 6e 6b .from.POT..sinkhorn_pi.=.ot.sink
8b20 68 6f 72 6e 28 61 2c 20 62 2c 20 4d 2c 20 72 65 67 29 0a 70 72 69 6e 74 28 73 69 6e 6b 68 6f 72 horn(a,.b,.M,.reg).print(sinkhor
8b40 6e 5f 70 69 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 n_pi)..#########################
8b60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
8b80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 50 6c 6f 74 20 20 53 47 #####################.#.Plot..SG
8ba0 44 20 72 65 73 75 6c 74 73 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 D.results.#.-----------------..p
8bc0 6c 2e 66 69 67 75 72 65 28 34 2c 20 66 69 67 73 69 7a 65 3d 28 35 2c 20 35 29 29 0a 6f 74 2e 70 l.figure(4,.figsize=(5,.5)).ot.p
8be0 6c 6f 74 2e 70 6c 6f 74 31 44 5f 6d 61 74 28 61 2c 20 62 2c 20 73 67 64 5f 64 75 61 6c 5f 70 69 lot.plot1D_mat(a,.b,.sgd_dual_pi
8c00 2c 20 27 64 75 61 6c 20 3a 20 4f 54 20 6d 61 74 72 69 78 20 53 47 44 27 29 0a 70 6c 2e 73 68 6f ,.'dual.:.OT.matrix.SGD').pl.sho
8c20 77 28 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 w()...##########################
8c40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
8c60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 50 6c 6f 74 20 53 69 6e 6b ####################.#.Plot.Sink
8c80 68 6f 72 6e 20 72 65 73 75 6c 74 73 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d horn.results.#.-----------------
8ca0 2d 2d 2d 2d 0a 0a 70 6c 2e 66 69 67 75 72 65 28 34 2c 20 66 69 67 73 69 7a 65 3d 28 35 2c 20 35 ----..pl.figure(4,.figsize=(5,.5
8cc0 29 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 31 44 5f 6d 61 74 28 61 2c 20 62 2c 20 73 69 6e 6b )).ot.plot.plot1D_mat(a,.b,.sink
8ce0 68 6f 72 6e 5f 70 69 2c 20 27 4f 54 20 6d 61 74 72 69 78 20 53 69 6e 6b 68 6f 72 6e 27 29 0a 70 horn_pi,.'OT.matrix.Sinkhorn').p
8d00 6c 2e 73 68 6f 77 28 29 0a 50 4b 03 04 14 00 00 00 00 00 db 74 d9 4e f2 7c 7e 9e 5c 0e 00 00 5c l.show().PK.........t.N.|~.\...\
8d20 0e 00 00 15 00 00 00 70 6c 6f 74 5f 62 61 72 79 63 65 6e 74 65 72 5f 31 44 2e 70 79 23 20 2d 2a .......plot_barycenter_1D.py#.-*
8d40 2d 20 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0a 22 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d -.coding:.utf-8.-*-.""".========
8d60 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 31 44 20 57 61 73 73 65 72 ======================.1D.Wasser
8d80 73 74 65 69 6e 20 62 61 72 79 63 65 6e 74 65 72 20 64 65 6d 6f 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d stein.barycenter.demo.==========
8da0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 54 68 69 73 20 65 78 61 6d 70 ====================..This.examp
8dc0 6c 65 20 69 6c 6c 75 73 74 72 61 74 65 73 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f le.illustrates.the.computation.o
8de0 66 20 72 65 67 75 6c 61 72 69 7a 65 64 20 57 61 73 73 65 72 73 79 65 69 6e 20 42 61 72 79 63 65 f.regularized.Wassersyein.Baryce
8e00 6e 74 65 72 0a 61 73 20 70 72 6f 70 6f 73 65 64 20 69 6e 20 5b 33 5d 2e 0a 0a 0a 5b 33 5d 20 42 nter.as.proposed.in.[3]....[3].B
8e20 65 6e 61 6d 6f 75 2c 20 4a 2e 20 44 2e 2c 20 43 61 72 6c 69 65 72 2c 20 47 2e 2c 20 43 75 74 75 enamou,.J..D.,.Carlier,.G.,.Cutu
8e40 72 69 2c 20 4d 2e 2c 20 4e 65 6e 6e 61 2c 20 4c 2e 2c 20 26 20 50 65 79 72 c3 a9 2c 20 47 2e 20 ri,.M.,.Nenna,.L.,.&.Peyr..,.G..
8e60 28 32 30 31 35 29 2e 0a 49 74 65 72 61 74 69 76 65 20 42 72 65 67 6d 61 6e 20 70 72 6f 6a 65 63 (2015)..Iterative.Bregman.projec
8e80 74 69 6f 6e 73 20 66 6f 72 20 72 65 67 75 6c 61 72 69 7a 65 64 20 74 72 61 6e 73 70 6f 72 74 61 tions.for.regularized.transporta
8ea0 74 69 6f 6e 20 70 72 6f 62 6c 65 6d 73 0a 53 49 41 4d 20 4a 6f 75 72 6e 61 6c 20 6f 6e 20 53 63 tion.problems.SIAM.Journal.on.Sc
8ec0 69 65 6e 74 69 66 69 63 20 43 6f 6d 70 75 74 69 6e 67 2c 20 33 37 28 32 29 2c 20 41 31 31 31 31 ientific.Computing,.37(2),.A1111
8ee0 2d 41 31 31 33 38 2e 0a 0a 22 22 22 0a 0a 23 20 41 75 74 68 6f 72 3a 20 52 65 6d 69 20 46 6c 61 -A1138..."""..#.Author:.Remi.Fla
8f00 6d 61 72 79 20 3c 72 65 6d 69 2e 66 6c 61 6d 61 72 79 40 75 6e 69 63 65 2e 66 72 3e 0a 23 0a 23 mary.<remi.flamary@unice.fr>.#.#
8f20 20 4c 69 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 63 65 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6e 75 .License:.MIT.License..import.nu
8f40 6d 70 79 20 61 73 20 6e 70 0a 69 6d 70 6f 72 74 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 70 79 6c 61 mpy.as.np.import.matplotlib.pyla
8f60 62 20 61 73 20 70 6c 0a 69 6d 70 6f 72 74 20 6f 74 0a 23 20 6e 65 63 65 73 73 61 72 79 20 66 6f b.as.pl.import.ot.#.necessary.fo
8f80 72 20 33 64 20 70 6c 6f 74 20 65 76 65 6e 20 69 66 20 6e 6f 74 20 75 73 65 64 0a 66 72 6f 6d 20 r.3d.plot.even.if.not.used.from.
8fa0 6d 70 6c 5f 74 6f 6f 6c 6b 69 74 73 2e 6d 70 6c 6f 74 33 64 20 69 6d 70 6f 72 74 20 41 78 65 73 mpl_toolkits.mplot3d.import.Axes
8fc0 33 44 20 20 23 20 6e 6f 71 61 0a 66 72 6f 6d 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 63 6f 6c 6c 65 3D..#.noqa.from.matplotlib.colle
8fe0 63 74 69 6f 6e 73 20 69 6d 70 6f 72 74 20 50 6f 6c 79 43 6f 6c 6c 65 63 74 69 6f 6e 0a 0a 23 23 ctions.import.PolyCollection..##
9000 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
9020 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
9040 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 47 65 6e 65 72 61 74 65 20 64 61 74 61 0a 23 20 2d ############.#.Generate.data.#.-
9060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 70 61 72 61 6d 65 74 65 72 73 0a 0a 6e 20 ------------..#%%.parameters..n.
9080 3d 20 31 30 30 20 20 23 20 6e 62 20 62 69 6e 73 0a 0a 23 20 62 69 6e 20 70 6f 73 69 74 69 6f 6e =.100..#.nb.bins..#.bin.position
90a0 73 0a 78 20 3d 20 6e 70 2e 61 72 61 6e 67 65 28 6e 2c 20 64 74 79 70 65 3d 6e 70 2e 66 6c 6f 61 s.x.=.np.arange(n,.dtype=np.floa
90c0 74 36 34 29 0a 0a 23 20 47 61 75 73 73 69 61 6e 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0a 61 t64)..#.Gaussian.distributions.a
90e0 31 20 3d 20 6f 74 2e 64 61 74 61 73 65 74 73 2e 6d 61 6b 65 5f 31 44 5f 67 61 75 73 73 28 6e 2c 1.=.ot.datasets.make_1D_gauss(n,
9100 20 6d 3d 32 30 2c 20 73 3d 35 29 20 20 23 20 6d 3d 20 6d 65 61 6e 2c 20 73 3d 20 73 74 64 0a 61 .m=20,.s=5)..#.m=.mean,.s=.std.a
9120 32 20 3d 20 6f 74 2e 64 61 74 61 73 65 74 73 2e 6d 61 6b 65 5f 31 44 5f 67 61 75 73 73 28 6e 2c 2.=.ot.datasets.make_1D_gauss(n,
9140 20 6d 3d 36 30 2c 20 73 3d 38 29 0a 0a 23 20 63 72 65 61 74 69 6e 67 20 6d 61 74 72 69 78 20 41 .m=60,.s=8)..#.creating.matrix.A
9160 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0a 41 20 .containing.all.distributions.A.
9180 3d 20 6e 70 2e 76 73 74 61 63 6b 28 28 61 31 2c 20 61 32 29 29 2e 54 0a 6e 5f 64 69 73 74 72 69 =.np.vstack((a1,.a2)).T.n_distri
91a0 62 75 74 69 6f 6e 73 20 3d 20 41 2e 73 68 61 70 65 5b 31 5d 0a 0a 23 20 6c 6f 73 73 20 6d 61 74 butions.=.A.shape[1]..#.loss.mat
91c0 72 69 78 20 2b 20 6e 6f 72 6d 61 6c 69 7a 61 74 69 6f 6e 0a 4d 20 3d 20 6f 74 2e 75 74 69 6c 73 rix.+.normalization.M.=.ot.utils
91e0 2e 64 69 73 74 30 28 6e 29 0a 4d 20 2f 3d 20 4d 2e 6d 61 78 28 29 0a 0a 23 23 23 23 23 23 23 23 .dist0(n).M./=.M.max()..########
9200 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
9220 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
9240 23 23 23 23 23 23 0a 23 20 50 6c 6f 74 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a ######.#.Plot.data.#.---------..
9260 23 25 25 20 70 6c 6f 74 20 74 68 65 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0a 0a 70 6c 2e 66 #%%.plot.the.distributions..pl.f
9280 69 67 75 72 65 28 31 2c 20 66 69 67 73 69 7a 65 3d 28 36 2e 34 2c 20 33 29 29 0a 66 6f 72 20 69 igure(1,.figsize=(6.4,.3)).for.i
92a0 20 69 6e 20 72 61 6e 67 65 28 6e 5f 64 69 73 74 72 69 62 75 74 69 6f 6e 73 29 3a 0a 20 20 20 20 .in.range(n_distributions):.....
92c0 70 6c 2e 70 6c 6f 74 28 78 2c 20 41 5b 3a 2c 20 69 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 44 69 pl.plot(x,.A[:,.i]).pl.title('Di
92e0 73 74 72 69 62 75 74 69 6f 6e 73 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a stributions').pl.tight_layout().
9300 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 .###############################
9320 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
9340 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 42 61 72 79 63 65 6e 74 65 72 20 63 6f 6d ###############.#.Barycenter.com
9360 70 75 74 61 74 69 6f 6e 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d putation.#.---------------------
9380 2d 0a 0a 23 25 25 20 62 61 72 79 63 65 6e 74 65 72 20 63 6f 6d 70 75 74 61 74 69 6f 6e 0a 0a 61 -..#%%.barycenter.computation..a
93a0 6c 70 68 61 20 3d 20 30 2e 32 20 20 23 20 30 3c 3d 61 6c 70 68 61 3c 3d 31 0a 77 65 69 67 68 74 lpha.=.0.2..#.0<=alpha<=1.weight
93c0 73 20 3d 20 6e 70 2e 61 72 72 61 79 28 5b 31 20 2d 20 61 6c 70 68 61 2c 20 61 6c 70 68 61 5d 29 s.=.np.array([1.-.alpha,.alpha])
93e0 0a 0a 23 20 6c 32 62 61 72 79 0a 62 61 72 79 5f 6c 32 20 3d 20 41 2e 64 6f 74 28 77 65 69 67 68 ..#.l2bary.bary_l2.=.A.dot(weigh
9400 74 73 29 0a 0a 23 20 77 61 73 73 65 72 73 74 65 69 6e 0a 72 65 67 20 3d 20 31 65 2d 33 0a 62 61 ts)..#.wasserstein.reg.=.1e-3.ba
9420 72 79 5f 77 61 73 73 20 3d 20 6f 74 2e 62 72 65 67 6d 61 6e 2e 62 61 72 79 63 65 6e 74 65 72 28 ry_wass.=.ot.bregman.barycenter(
9440 41 2c 20 4d 2c 20 72 65 67 2c 20 77 65 69 67 68 74 73 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 32 A,.M,.reg,.weights)..pl.figure(2
9460 29 0a 70 6c 2e 63 6c 66 28 29 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 31 2c 20 31 29 0a 66 ).pl.clf().pl.subplot(2,.1,.1).f
9480 6f 72 20 69 20 69 6e 20 72 61 6e 67 65 28 6e 5f 64 69 73 74 72 69 62 75 74 69 6f 6e 73 29 3a 0a or.i.in.range(n_distributions):.
94a0 20 20 20 20 70 6c 2e 70 6c 6f 74 28 78 2c 20 41 5b 3a 2c 20 69 5d 29 0a 70 6c 2e 74 69 74 6c 65 ....pl.plot(x,.A[:,.i]).pl.title
94c0 28 27 44 69 73 74 72 69 62 75 74 69 6f 6e 73 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c ('Distributions')..pl.subplot(2,
94e0 20 31 2c 20 32 29 0a 70 6c 2e 70 6c 6f 74 28 78 2c 20 62 61 72 79 5f 6c 32 2c 20 27 72 27 2c 20 .1,.2).pl.plot(x,.bary_l2,.'r',.
9500 6c 61 62 65 6c 3d 27 6c 32 27 29 0a 70 6c 2e 70 6c 6f 74 28 78 2c 20 62 61 72 79 5f 77 61 73 73 label='l2').pl.plot(x,.bary_wass
9520 2c 20 27 67 27 2c 20 6c 61 62 65 6c 3d 27 57 61 73 73 65 72 73 74 65 69 6e 27 29 0a 70 6c 2e 6c ,.'g',.label='Wasserstein').pl.l
9540 65 67 65 6e 64 28 29 0a 70 6c 2e 74 69 74 6c 65 28 27 42 61 72 79 63 65 6e 74 65 72 73 27 29 0a egend().pl.title('Barycenters').
9560 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 pl.tight_layout()..#############
9580 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
95a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
95c0 23 0a 23 20 42 61 72 79 63 65 6e 74 72 69 63 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 0a 23 20 #.#.Barycentric.interpolation.#.
95e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 62 -------------------------..#%%.b
9600 61 72 79 63 65 6e 74 65 72 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 0a 0a 6e 5f 61 6c 70 68 61 arycenter.interpolation..n_alpha
9620 20 3d 20 31 31 0a 61 6c 70 68 61 5f 6c 69 73 74 20 3d 20 6e 70 2e 6c 69 6e 73 70 61 63 65 28 30 .=.11.alpha_list.=.np.linspace(0
9640 2c 20 31 2c 20 6e 5f 61 6c 70 68 61 29 0a 0a 0a 42 5f 6c 32 20 3d 20 6e 70 2e 7a 65 72 6f 73 28 ,.1,.n_alpha)...B_l2.=.np.zeros(
9660 28 6e 2c 20 6e 5f 61 6c 70 68 61 29 29 0a 0a 42 5f 77 61 73 73 20 3d 20 6e 70 2e 63 6f 70 79 28 (n,.n_alpha))..B_wass.=.np.copy(
9680 42 5f 6c 32 29 0a 0a 66 6f 72 20 69 20 69 6e 20 72 61 6e 67 65 28 30 2c 20 6e 5f 61 6c 70 68 61 B_l2)..for.i.in.range(0,.n_alpha
96a0 29 3a 0a 20 20 20 20 61 6c 70 68 61 20 3d 20 61 6c 70 68 61 5f 6c 69 73 74 5b 69 5d 0a 20 20 20 ):.....alpha.=.alpha_list[i]....
96c0 20 77 65 69 67 68 74 73 20 3d 20 6e 70 2e 61 72 72 61 79 28 5b 31 20 2d 20 61 6c 70 68 61 2c 20 .weights.=.np.array([1.-.alpha,.
96e0 61 6c 70 68 61 5d 29 0a 20 20 20 20 42 5f 6c 32 5b 3a 2c 20 69 5d 20 3d 20 41 2e 64 6f 74 28 77 alpha]).....B_l2[:,.i].=.A.dot(w
9700 65 69 67 68 74 73 29 0a 20 20 20 20 42 5f 77 61 73 73 5b 3a 2c 20 69 5d 20 3d 20 6f 74 2e 62 72 eights).....B_wass[:,.i].=.ot.br
9720 65 67 6d 61 6e 2e 62 61 72 79 63 65 6e 74 65 72 28 41 2c 20 4d 2c 20 72 65 67 2c 20 77 65 69 67 egman.barycenter(A,.M,.reg,.weig
9740 68 74 73 29 0a 0a 23 25 25 20 70 6c 6f 74 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 0a 0a 70 6c hts)..#%%.plot.interpolation..pl
9760 2e 66 69 67 75 72 65 28 33 29 0a 0a 63 6d 61 70 20 3d 20 70 6c 2e 63 6d 2e 67 65 74 5f 63 6d 61 .figure(3)..cmap.=.pl.cm.get_cma
9780 70 28 27 76 69 72 69 64 69 73 27 29 0a 76 65 72 74 73 20 3d 20 5b 5d 0a 7a 73 20 3d 20 61 6c 70 p('viridis').verts.=.[].zs.=.alp
97a0 68 61 5f 6c 69 73 74 0a 66 6f 72 20 69 2c 20 7a 20 69 6e 20 65 6e 75 6d 65 72 61 74 65 28 7a 73 ha_list.for.i,.z.in.enumerate(zs
97c0 29 3a 0a 20 20 20 20 79 73 20 3d 20 42 5f 6c 32 5b 3a 2c 20 69 5d 0a 20 20 20 20 76 65 72 74 73 ):.....ys.=.B_l2[:,.i].....verts
97e0 2e 61 70 70 65 6e 64 28 6c 69 73 74 28 7a 69 70 28 78 2c 20 79 73 29 29 29 0a 0a 61 78 20 3d 20 .append(list(zip(x,.ys)))..ax.=.
9800 70 6c 2e 67 63 66 28 29 2e 67 63 61 28 70 72 6f 6a 65 63 74 69 6f 6e 3d 27 33 64 27 29 0a 0a 70 pl.gcf().gca(projection='3d')..p
9820 6f 6c 79 20 3d 20 50 6f 6c 79 43 6f 6c 6c 65 63 74 69 6f 6e 28 76 65 72 74 73 2c 20 66 61 63 65 oly.=.PolyCollection(verts,.face
9840 63 6f 6c 6f 72 73 3d 5b 63 6d 61 70 28 61 29 20 66 6f 72 20 61 20 69 6e 20 61 6c 70 68 61 5f 6c colors=[cmap(a).for.a.in.alpha_l
9860 69 73 74 5d 29 0a 70 6f 6c 79 2e 73 65 74 5f 61 6c 70 68 61 28 30 2e 37 29 0a 61 78 2e 61 64 64 ist]).poly.set_alpha(0.7).ax.add
9880 5f 63 6f 6c 6c 65 63 74 69 6f 6e 33 64 28 70 6f 6c 79 2c 20 7a 73 3d 7a 73 2c 20 7a 64 69 72 3d _collection3d(poly,.zs=zs,.zdir=
98a0 27 79 27 29 0a 61 78 2e 73 65 74 5f 78 6c 61 62 65 6c 28 27 78 27 29 0a 61 78 2e 73 65 74 5f 78 'y').ax.set_xlabel('x').ax.set_x
98c0 6c 69 6d 33 64 28 30 2c 20 6e 29 0a 61 78 2e 73 65 74 5f 79 6c 61 62 65 6c 28 27 24 5c 5c 61 6c lim3d(0,.n).ax.set_ylabel('$\\al
98e0 70 68 61 24 27 29 0a 61 78 2e 73 65 74 5f 79 6c 69 6d 33 64 28 30 2c 20 31 29 0a 61 78 2e 73 65 pha$').ax.set_ylim3d(0,.1).ax.se
9900 74 5f 7a 6c 61 62 65 6c 28 27 27 29 0a 61 78 2e 73 65 74 5f 7a 6c 69 6d 33 64 28 30 2c 20 42 5f t_zlabel('').ax.set_zlim3d(0,.B_
9920 6c 32 2e 6d 61 78 28 29 20 2a 20 31 2e 30 31 29 0a 70 6c 2e 74 69 74 6c 65 28 27 42 61 72 79 63 l2.max().*.1.01).pl.title('Baryc
9940 65 6e 74 65 72 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 20 77 69 74 68 20 6c 32 27 29 0a 70 6c enter.interpolation.with.l2').pl
9960 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 34 29 0a 63 6d .tight_layout()..pl.figure(4).cm
9980 61 70 20 3d 20 70 6c 2e 63 6d 2e 67 65 74 5f 63 6d 61 70 28 27 76 69 72 69 64 69 73 27 29 0a 76 ap.=.pl.cm.get_cmap('viridis').v
99a0 65 72 74 73 20 3d 20 5b 5d 0a 7a 73 20 3d 20 61 6c 70 68 61 5f 6c 69 73 74 0a 66 6f 72 20 69 2c erts.=.[].zs.=.alpha_list.for.i,
99c0 20 7a 20 69 6e 20 65 6e 75 6d 65 72 61 74 65 28 7a 73 29 3a 0a 20 20 20 20 79 73 20 3d 20 42 5f .z.in.enumerate(zs):.....ys.=.B_
99e0 77 61 73 73 5b 3a 2c 20 69 5d 0a 20 20 20 20 76 65 72 74 73 2e 61 70 70 65 6e 64 28 6c 69 73 74 wass[:,.i].....verts.append(list
9a00 28 7a 69 70 28 78 2c 20 79 73 29 29 29 0a 0a 61 78 20 3d 20 70 6c 2e 67 63 66 28 29 2e 67 63 61 (zip(x,.ys)))..ax.=.pl.gcf().gca
9a20 28 70 72 6f 6a 65 63 74 69 6f 6e 3d 27 33 64 27 29 0a 0a 70 6f 6c 79 20 3d 20 50 6f 6c 79 43 6f (projection='3d')..poly.=.PolyCo
9a40 6c 6c 65 63 74 69 6f 6e 28 76 65 72 74 73 2c 20 66 61 63 65 63 6f 6c 6f 72 73 3d 5b 63 6d 61 70 llection(verts,.facecolors=[cmap
9a60 28 61 29 20 66 6f 72 20 61 20 69 6e 20 61 6c 70 68 61 5f 6c 69 73 74 5d 29 0a 70 6f 6c 79 2e 73 (a).for.a.in.alpha_list]).poly.s
9a80 65 74 5f 61 6c 70 68 61 28 30 2e 37 29 0a 61 78 2e 61 64 64 5f 63 6f 6c 6c 65 63 74 69 6f 6e 33 et_alpha(0.7).ax.add_collection3
9aa0 64 28 70 6f 6c 79 2c 20 7a 73 3d 7a 73 2c 20 7a 64 69 72 3d 27 79 27 29 0a 61 78 2e 73 65 74 5f d(poly,.zs=zs,.zdir='y').ax.set_
9ac0 78 6c 61 62 65 6c 28 27 78 27 29 0a 61 78 2e 73 65 74 5f 78 6c 69 6d 33 64 28 30 2c 20 6e 29 0a xlabel('x').ax.set_xlim3d(0,.n).
9ae0 61 78 2e 73 65 74 5f 79 6c 61 62 65 6c 28 27 24 5c 5c 61 6c 70 68 61 24 27 29 0a 61 78 2e 73 65 ax.set_ylabel('$\\alpha$').ax.se
9b00 74 5f 79 6c 69 6d 33 64 28 30 2c 20 31 29 0a 61 78 2e 73 65 74 5f 7a 6c 61 62 65 6c 28 27 27 29 t_ylim3d(0,.1).ax.set_zlabel('')
9b20 0a 61 78 2e 73 65 74 5f 7a 6c 69 6d 33 64 28 30 2c 20 42 5f 6c 32 2e 6d 61 78 28 29 20 2a 20 31 .ax.set_zlim3d(0,.B_l2.max().*.1
9b40 2e 30 31 29 0a 70 6c 2e 74 69 74 6c 65 28 27 42 61 72 79 63 65 6e 74 65 72 20 69 6e 74 65 72 70 .01).pl.title('Barycenter.interp
9b60 6f 6c 61 74 69 6f 6e 20 77 69 74 68 20 57 61 73 73 65 72 73 74 65 69 6e 27 29 0a 70 6c 2e 74 69 olation.with.Wasserstein').pl.ti
9b80 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 70 6c 2e 73 68 6f 77 28 29 0a 50 4b 03 04 14 00 00 00 ght_layout()..pl.show().PK......
9ba0 00 00 db 74 d9 4e b0 31 70 de ee 10 00 00 ee 10 00 00 14 00 00 00 70 6c 6f 74 5f 6f 74 64 61 5f ...t.N.1p.............plot_otda_
9bc0 63 6c 61 73 73 65 73 2e 70 79 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a classes.py#.-*-.coding:.utf-8.-*
9be0 2d 0a 22 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 4f -.""".========================.O
9c00 54 20 66 6f 72 20 64 6f 6d 61 69 6e 20 61 64 61 70 74 61 74 69 6f 6e 0a 3d 3d 3d 3d 3d 3d 3d 3d T.for.domain.adaptation.========
9c20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 54 68 69 73 20 65 78 61 6d 70 6c 65 20 69 ================..This.example.i
9c40 6e 74 72 6f 64 75 63 65 73 20 61 20 64 6f 6d 61 69 6e 20 61 64 61 70 74 61 74 69 6f 6e 20 69 6e ntroduces.a.domain.adaptation.in
9c60 20 61 20 32 44 20 73 65 74 74 69 6e 67 20 61 6e 64 20 74 68 65 20 34 20 4f 54 44 41 0a 61 70 70 .a.2D.setting.and.the.4.OTDA.app
9c80 72 6f 61 63 68 65 73 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 50 roaches.currently.supported.in.P
9ca0 4f 54 2e 0a 0a 22 22 22 0a 0a 23 20 41 75 74 68 6f 72 73 3a 20 52 65 6d 69 20 46 6c 61 6d 61 72 OT..."""..#.Authors:.Remi.Flamar
9cc0 79 20 3c 72 65 6d 69 2e 66 6c 61 6d 61 72 79 40 75 6e 69 63 65 2e 66 72 3e 0a 23 20 20 20 20 20 y.<remi.flamary@unice.fr>.#.....
9ce0 20 20 20 20 20 53 74 61 6e 69 73 6c 61 73 20 43 68 61 6d 62 6f 6e 20 3c 73 74 61 6e 2e 63 68 61 .....Stanislas.Chambon.<stan.cha
9d00 6d 62 6f 6e 40 67 6d 61 69 6c 2e 63 6f 6d 3e 0a 23 0a 23 20 4c 69 63 65 6e 73 65 3a 20 4d 49 54 mbon@gmail.com>.#.#.License:.MIT
9d20 20 4c 69 63 65 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 70 79 6c 61 .License..import.matplotlib.pyla
9d40 62 20 61 73 20 70 6c 0a 69 6d 70 6f 72 74 20 6f 74 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 b.as.pl.import.ot...############
9d60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
9d80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
9da0 23 23 0a 23 20 47 65 6e 65 72 61 74 65 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ##.#.Generate.data.#.-----------
9dc0 2d 2d 0a 0a 6e 5f 73 6f 75 72 63 65 5f 73 61 6d 70 6c 65 73 20 3d 20 31 35 30 0a 6e 5f 74 61 72 --..n_source_samples.=.150.n_tar
9de0 67 65 74 5f 73 61 6d 70 6c 65 73 20 3d 20 31 35 30 0a 0a 58 73 2c 20 79 73 20 3d 20 6f 74 2e 64 get_samples.=.150..Xs,.ys.=.ot.d
9e00 61 74 61 73 65 74 73 2e 6d 61 6b 65 5f 64 61 74 61 5f 63 6c 61 73 73 69 66 28 27 33 67 61 75 73 atasets.make_data_classif('3gaus
9e20 73 27 2c 20 6e 5f 73 6f 75 72 63 65 5f 73 61 6d 70 6c 65 73 29 0a 58 74 2c 20 79 74 20 3d 20 6f s',.n_source_samples).Xt,.yt.=.o
9e40 74 2e 64 61 74 61 73 65 74 73 2e 6d 61 6b 65 5f 64 61 74 61 5f 63 6c 61 73 73 69 66 28 27 33 67 t.datasets.make_data_classif('3g
9e60 61 75 73 73 32 27 2c 20 6e 5f 74 61 72 67 65 74 5f 73 61 6d 70 6c 65 73 29 0a 0a 0a 23 23 23 23 auss2',.n_target_samples)...####
9e80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
9ea0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
9ec0 23 23 23 23 23 23 23 23 23 23 0a 23 20 49 6e 73 74 61 6e 74 69 61 74 65 20 74 68 65 20 64 69 66 ##########.#.Instantiate.the.dif
9ee0 66 65 72 65 6e 74 20 74 72 61 6e 73 70 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 6e 64 20 ferent.transport.algorithms.and.
9f00 66 69 74 20 74 68 65 6d 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d fit.them.#.---------------------
9f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
9f40 2d 2d 2d 2d 2d 2d 0a 0a 23 20 45 4d 44 20 54 72 61 6e 73 70 6f 72 74 0a 6f 74 5f 65 6d 64 20 3d ------..#.EMD.Transport.ot_emd.=
9f60 20 6f 74 2e 64 61 2e 45 4d 44 54 72 61 6e 73 70 6f 72 74 28 29 0a 6f 74 5f 65 6d 64 2e 66 69 74 .ot.da.EMDTransport().ot_emd.fit
9f80 28 58 73 3d 58 73 2c 20 58 74 3d 58 74 29 0a 0a 23 20 53 69 6e 6b 68 6f 72 6e 20 54 72 61 6e 73 (Xs=Xs,.Xt=Xt)..#.Sinkhorn.Trans
9fa0 70 6f 72 74 0a 6f 74 5f 73 69 6e 6b 68 6f 72 6e 20 3d 20 6f 74 2e 64 61 2e 53 69 6e 6b 68 6f 72 port.ot_sinkhorn.=.ot.da.Sinkhor
9fc0 6e 54 72 61 6e 73 70 6f 72 74 28 72 65 67 5f 65 3d 31 65 2d 31 29 0a 6f 74 5f 73 69 6e 6b 68 6f nTransport(reg_e=1e-1).ot_sinkho
9fe0 72 6e 2e 66 69 74 28 58 73 3d 58 73 2c 20 58 74 3d 58 74 29 0a 0a 23 20 53 69 6e 6b 68 6f 72 6e rn.fit(Xs=Xs,.Xt=Xt)..#.Sinkhorn
a000 20 54 72 61 6e 73 70 6f 72 74 20 77 69 74 68 20 47 72 6f 75 70 20 6c 61 73 73 6f 20 72 65 67 75 .Transport.with.Group.lasso.regu
a020 6c 61 72 69 7a 61 74 69 6f 6e 0a 6f 74 5f 6c 70 6c 31 20 3d 20 6f 74 2e 64 61 2e 53 69 6e 6b 68 larization.ot_lpl1.=.ot.da.Sinkh
a040 6f 72 6e 4c 70 6c 31 54 72 61 6e 73 70 6f 72 74 28 72 65 67 5f 65 3d 31 65 2d 31 2c 20 72 65 67 ornLpl1Transport(reg_e=1e-1,.reg
a060 5f 63 6c 3d 31 65 30 29 0a 6f 74 5f 6c 70 6c 31 2e 66 69 74 28 58 73 3d 58 73 2c 20 79 73 3d 79 _cl=1e0).ot_lpl1.fit(Xs=Xs,.ys=y
a080 73 2c 20 58 74 3d 58 74 29 0a 0a 23 20 53 69 6e 6b 68 6f 72 6e 20 54 72 61 6e 73 70 6f 72 74 20 s,.Xt=Xt)..#.Sinkhorn.Transport.
a0a0 77 69 74 68 20 47 72 6f 75 70 20 6c 61 73 73 6f 20 72 65 67 75 6c 61 72 69 7a 61 74 69 6f 6e 20 with.Group.lasso.regularization.
a0c0 6c 31 6c 32 0a 6f 74 5f 6c 31 6c 32 20 3d 20 6f 74 2e 64 61 2e 53 69 6e 6b 68 6f 72 6e 4c 31 6c l1l2.ot_l1l2.=.ot.da.SinkhornL1l
a0e0 32 54 72 61 6e 73 70 6f 72 74 28 72 65 67 5f 65 3d 31 65 2d 31 2c 20 72 65 67 5f 63 6c 3d 32 65 2Transport(reg_e=1e-1,.reg_cl=2e
a100 30 2c 20 6d 61 78 5f 69 74 65 72 3d 32 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,.max_iter=20,.................
a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 65 72 62 6f 73 65 3d 54 72 ......................verbose=Tr
a140 75 65 29 0a 6f 74 5f 6c 31 6c 32 2e 66 69 74 28 58 73 3d 58 73 2c 20 79 73 3d 79 73 2c 20 58 74 ue).ot_l1l2.fit(Xs=Xs,.ys=ys,.Xt
a160 3d 58 74 29 0a 0a 23 20 74 72 61 6e 73 70 6f 72 74 20 73 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 =Xt)..#.transport.source.samples
a180 20 6f 6e 74 6f 20 74 61 72 67 65 74 20 73 61 6d 70 6c 65 73 0a 74 72 61 6e 73 70 5f 58 73 5f 65 .onto.target.samples.transp_Xs_e
a1a0 6d 64 20 3d 20 6f 74 5f 65 6d 64 2e 74 72 61 6e 73 66 6f 72 6d 28 58 73 3d 58 73 29 0a 74 72 61 md.=.ot_emd.transform(Xs=Xs).tra
a1c0 6e 73 70 5f 58 73 5f 73 69 6e 6b 68 6f 72 6e 20 3d 20 6f 74 5f 73 69 6e 6b 68 6f 72 6e 2e 74 72 nsp_Xs_sinkhorn.=.ot_sinkhorn.tr
a1e0 61 6e 73 66 6f 72 6d 28 58 73 3d 58 73 29 0a 74 72 61 6e 73 70 5f 58 73 5f 6c 70 6c 31 20 3d 20 ansform(Xs=Xs).transp_Xs_lpl1.=.
a200 6f 74 5f 6c 70 6c 31 2e 74 72 61 6e 73 66 6f 72 6d 28 58 73 3d 58 73 29 0a 74 72 61 6e 73 70 5f ot_lpl1.transform(Xs=Xs).transp_
a220 58 73 5f 6c 31 6c 32 20 3d 20 6f 74 5f 6c 31 6c 32 2e 74 72 61 6e 73 66 6f 72 6d 28 58 73 3d 58 Xs_l1l2.=.ot_l1l2.transform(Xs=X
a240 73 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 s)...###########################
a260 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
a280 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 46 69 67 20 31 20 3a 20 70 6c ###################.#.Fig.1.:.pl
a2a0 6f 74 73 20 73 6f 75 72 63 65 20 61 6e 64 20 74 61 72 67 65 74 20 73 61 6d 70 6c 65 73 0a 23 20 ots.source.and.target.samples.#.
a2c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
a2e0 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 6c 2e 66 69 67 75 72 65 28 31 2c 20 66 69 67 73 69 7a 65 3d 28 31 -------..pl.figure(1,.figsize=(1
a300 30 2c 20 35 29 29 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 32 2c 20 31 29 0a 70 6c 2e 73 63 0,.5)).pl.subplot(1,.2,.1).pl.sc
a320 61 74 74 65 72 28 58 73 5b 3a 2c 20 30 5d 2c 20 58 73 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 20 atter(Xs[:,.0],.Xs[:,.1],.c=ys,.
a340 6d 61 72 6b 65 72 3d 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 marker='+',.label='Source.sample
a360 73 27 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a s').pl.xticks([]).pl.yticks([]).
a380 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 53 6f 75 72 63 pl.legend(loc=0).pl.title('Sourc
a3a0 65 20 20 73 61 6d 70 6c 65 73 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 32 2c 20 32 e..samples')..pl.subplot(1,.2,.2
a3c0 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 74 5b 3a 2c 20 30 5d 2c 20 58 74 5b 3a 2c 20 31 5d 2c ).pl.scatter(Xt[:,.0],.Xt[:,.1],
a3e0 20 63 3d 79 74 2c 20 6d 61 72 6b 65 72 3d 27 6f 27 2c 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 .c=yt,.marker='o',.label='Target
a400 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 .samples').pl.xticks([]).pl.ytic
a420 6b 73 28 5b 5d 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 6c 65 ks([]).pl.legend(loc=0).pl.title
a440 28 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f ('Target.samples').pl.tight_layo
a460 75 74 28 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ut()...#########################
a480 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
a4a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 46 69 67 20 32 20 3a 20 #####################.#.Fig.2.:.
a4c0 70 6c 6f 74 20 6f 70 74 69 6d 61 6c 20 63 6f 75 70 6c 69 6e 67 73 20 61 6e 64 20 74 72 61 6e 73 plot.optimal.couplings.and.trans
a4e0 70 6f 72 74 65 64 20 73 61 6d 70 6c 65 73 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ported.samples.#.---------------
a500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
a520 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 61 72 61 6d 5f 69 6d 67 20 3d 20 7b 27 69 6e 74 65 72 70 6f 6c 61 -------..param_img.=.{'interpola
a540 74 69 6f 6e 27 3a 20 27 6e 65 61 72 65 73 74 27 7d 0a 0a 70 6c 2e 66 69 67 75 72 65 28 32 2c 20 tion':.'nearest'}..pl.figure(2,.
a560 66 69 67 73 69 7a 65 3d 28 31 35 2c 20 38 29 29 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 34 figsize=(15,.8)).pl.subplot(2,.4
a580 2c 20 31 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 6f 74 5f 65 6d 64 2e 63 6f 75 70 6c 69 6e 67 5f 2c ,.1).pl.imshow(ot_emd.coupling_,
a5a0 20 2a 2a 70 61 72 61 6d 5f 69 6d 67 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 .**param_img).pl.xticks([]).pl.y
a5c0 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 4f 70 74 69 6d 61 6c 20 63 6f 75 70 ticks([]).pl.title('Optimal.coup
a5e0 6c 69 6e 67 5c 6e 45 4d 44 54 72 61 6e 73 70 6f 72 74 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 ling\nEMDTransport')..pl.subplot
a600 28 32 2c 20 34 2c 20 32 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 6f 74 5f 73 69 6e 6b 68 6f 72 6e 2e (2,.4,.2).pl.imshow(ot_sinkhorn.
a620 63 6f 75 70 6c 69 6e 67 5f 2c 20 2a 2a 70 61 72 61 6d 5f 69 6d 67 29 0a 70 6c 2e 78 74 69 63 6b coupling_,.**param_img).pl.xtick
a640 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 4f 70 s([]).pl.yticks([]).pl.title('Op
a660 74 69 6d 61 6c 20 63 6f 75 70 6c 69 6e 67 5c 6e 53 69 6e 6b 68 6f 72 6e 54 72 61 6e 73 70 6f 72 timal.coupling\nSinkhornTranspor
a680 74 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 34 2c 20 33 29 0a 70 6c 2e 69 6d 73 68 t')..pl.subplot(2,.4,.3).pl.imsh
a6a0 6f 77 28 6f 74 5f 6c 70 6c 31 2e 63 6f 75 70 6c 69 6e 67 5f 2c 20 2a 2a 70 61 72 61 6d 5f 69 6d ow(ot_lpl1.coupling_,.**param_im
a6c0 67 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 70 g).pl.xticks([]).pl.yticks([]).p
a6e0 6c 2e 74 69 74 6c 65 28 27 4f 70 74 69 6d 61 6c 20 63 6f 75 70 6c 69 6e 67 5c 6e 53 69 6e 6b 68 l.title('Optimal.coupling\nSinkh
a700 6f 72 6e 4c 70 6c 31 54 72 61 6e 73 70 6f 72 74 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 ornLpl1Transport')..pl.subplot(2
a720 2c 20 34 2c 20 34 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 6f 74 5f 6c 31 6c 32 2e 63 6f 75 70 6c 69 ,.4,.4).pl.imshow(ot_l1l2.coupli
a740 6e 67 5f 2c 20 2a 2a 70 61 72 61 6d 5f 69 6d 67 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a ng_,.**param_img).pl.xticks([]).
a760 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 4f 70 74 69 6d 61 6c 20 pl.yticks([]).pl.title('Optimal.
a780 63 6f 75 70 6c 69 6e 67 5c 6e 53 69 6e 6b 68 6f 72 6e 4c 31 6c 32 54 72 61 6e 73 70 6f 72 74 27 coupling\nSinkhornL1l2Transport'
a7a0 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 34 2c 20 35 29 0a 70 6c 2e 73 63 61 74 74 65 )..pl.subplot(2,.4,.5).pl.scatte
a7c0 72 28 58 74 5b 3a 2c 20 30 5d 2c 20 58 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 74 2c 20 6d 61 72 6b r(Xt[:,.0],.Xt[:,.1],.c=yt,.mark
a7e0 65 72 3d 27 6f 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 er='o',............label='Target
a800 20 73 61 6d 70 6c 65 73 27 2c 20 61 6c 70 68 61 3d 30 2e 33 29 0a 70 6c 2e 73 63 61 74 74 65 72 .samples',.alpha=0.3).pl.scatter
a820 28 74 72 61 6e 73 70 5f 58 73 5f 65 6d 64 5b 3a 2c 20 30 5d 2c 20 74 72 61 6e 73 70 5f 58 73 5f (transp_Xs_emd[:,.0],.transp_Xs_
a840 65 6d 64 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6d 61 72 6b emd[:,.1],.c=ys,............mark
a860 65 72 3d 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 54 72 61 6e 73 70 20 73 61 6d 70 6c 65 73 27 2c 20 er='+',.label='Transp.samples',.
a880 73 3d 33 30 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d s=30).pl.xticks([]).pl.yticks([]
a8a0 29 0a 70 6c 2e 74 69 74 6c 65 28 27 54 72 61 6e 73 70 6f 72 74 65 64 20 73 61 6d 70 6c 65 73 5c ).pl.title('Transported.samples\
a8c0 6e 45 6d 64 54 72 61 6e 73 70 6f 72 74 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 22 6c nEmdTransport').pl.legend(loc="l
a8e0 6f 77 65 72 20 6c 65 66 74 22 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 34 2c 20 36 29 ower.left")..pl.subplot(2,.4,.6)
a900 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 74 5b 3a 2c 20 30 5d 2c 20 58 74 5b 3a 2c 20 31 5d 2c 20 .pl.scatter(Xt[:,.0],.Xt[:,.1],.
a920 63 3d 79 74 2c 20 6d 61 72 6b 65 72 3d 27 6f 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 61 62 c=yt,.marker='o',............lab
a940 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 2c 20 61 6c 70 68 61 3d 30 2e 33 29 0a el='Target.samples',.alpha=0.3).
a960 70 6c 2e 73 63 61 74 74 65 72 28 74 72 61 6e 73 70 5f 58 73 5f 73 69 6e 6b 68 6f 72 6e 5b 3a 2c pl.scatter(transp_Xs_sinkhorn[:,
a980 20 30 5d 2c 20 74 72 61 6e 73 70 5f 58 73 5f 73 69 6e 6b 68 6f 72 6e 5b 3a 2c 20 31 5d 2c 20 63 .0],.transp_Xs_sinkhorn[:,.1],.c
a9a0 3d 79 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6d 61 72 6b 65 72 3d 27 2b 27 2c 20 6c 61 62 65 =ys,............marker='+',.labe
a9c0 6c 3d 27 54 72 61 6e 73 70 20 73 61 6d 70 6c 65 73 27 2c 20 73 3d 33 30 29 0a 70 6c 2e 78 74 69 l='Transp.samples',.s=30).pl.xti
a9e0 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 cks([]).pl.yticks([]).pl.title('
aa00 54 72 61 6e 73 70 6f 72 74 65 64 20 73 61 6d 70 6c 65 73 5c 6e 53 69 6e 6b 68 6f 72 6e 54 72 61 Transported.samples\nSinkhornTra
aa20 6e 73 70 6f 72 74 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 34 2c 20 37 29 0a 70 6c nsport')..pl.subplot(2,.4,.7).pl
aa40 2e 73 63 61 74 74 65 72 28 58 74 5b 3a 2c 20 30 5d 2c 20 58 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 .scatter(Xt[:,.0],.Xt[:,.1],.c=y
aa60 74 2c 20 6d 61 72 6b 65 72 3d 27 6f 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 61 62 65 6c 3d t,.marker='o',............label=
aa80 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 2c 20 61 6c 70 68 61 3d 30 2e 33 29 0a 70 6c 2e 'Target.samples',.alpha=0.3).pl.
aaa0 73 63 61 74 74 65 72 28 74 72 61 6e 73 70 5f 58 73 5f 6c 70 6c 31 5b 3a 2c 20 30 5d 2c 20 74 72 scatter(transp_Xs_lpl1[:,.0],.tr
aac0 61 6e 73 70 5f 58 73 5f 6c 70 6c 31 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 0a 20 20 20 20 20 20 ansp_Xs_lpl1[:,.1],.c=ys,.......
aae0 20 20 20 20 20 6d 61 72 6b 65 72 3d 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 54 72 61 6e 73 70 20 73 .....marker='+',.label='Transp.s
ab00 61 6d 70 6c 65 73 27 2c 20 73 3d 33 30 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e amples',.s=30).pl.xticks([]).pl.
ab20 79 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 54 72 61 6e 73 70 6f 72 74 65 64 yticks([]).pl.title('Transported
ab40 20 73 61 6d 70 6c 65 73 5c 6e 53 69 6e 6b 68 6f 72 6e 4c 70 6c 31 54 72 61 6e 73 70 6f 72 74 27 .samples\nSinkhornLpl1Transport'
ab60 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 34 2c 20 38 29 0a 70 6c 2e 73 63 61 74 74 65 )..pl.subplot(2,.4,.8).pl.scatte
ab80 72 28 58 74 5b 3a 2c 20 30 5d 2c 20 58 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 74 2c 20 6d 61 72 6b r(Xt[:,.0],.Xt[:,.1],.c=yt,.mark
aba0 65 72 3d 27 6f 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 er='o',............label='Target
abc0 20 73 61 6d 70 6c 65 73 27 2c 20 61 6c 70 68 61 3d 30 2e 33 29 0a 70 6c 2e 73 63 61 74 74 65 72 .samples',.alpha=0.3).pl.scatter
abe0 28 74 72 61 6e 73 70 5f 58 73 5f 6c 31 6c 32 5b 3a 2c 20 30 5d 2c 20 74 72 61 6e 73 70 5f 58 73 (transp_Xs_l1l2[:,.0],.transp_Xs
ac00 5f 6c 31 6c 32 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6d 61 _l1l2[:,.1],.c=ys,............ma
ac20 72 6b 65 72 3d 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 54 72 61 6e 73 70 20 73 61 6d 70 6c 65 73 27 rker='+',.label='Transp.samples'
ac40 2c 20 73 3d 33 30 29 0a 70 6c 2e 78 74 69 63 6b 73 28 5b 5d 29 0a 70 6c 2e 79 74 69 63 6b 73 28 ,.s=30).pl.xticks([]).pl.yticks(
ac60 5b 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 54 72 61 6e 73 70 6f 72 74 65 64 20 73 61 6d 70 6c 65 []).pl.title('Transported.sample
ac80 73 5c 6e 53 69 6e 6b 68 6f 72 6e 4c 31 6c 32 54 72 61 6e 73 70 6f 72 74 27 29 0a 70 6c 2e 74 69 s\nSinkhornL1l2Transport').pl.ti
aca0 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 70 6c 2e 73 68 6f 77 28 29 0a 50 4b 03 04 14 00 00 00 ght_layout()..pl.show().PK......
acc0 00 00 da 74 d9 4e ff 09 e8 78 dd 08 00 00 dd 08 00 00 14 00 00 00 70 6c 6f 74 5f 4f 54 5f 31 44 ...t.N...x............plot_OT_1D
ace0 5f 73 6d 6f 6f 74 68 2e 70 79 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a _smooth.py#.-*-.coding:.utf-8.-*
ad00 2d 0a 22 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d -.""".==========================
ad20 3d 0a 31 44 20 73 6d 6f 6f 74 68 20 6f 70 74 69 6d 61 6c 20 74 72 61 6e 73 70 6f 72 74 0a 3d 3d =.1D.smooth.optimal.transport.==
ad40 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 54 68 69 73 20 =========================..This.
ad60 65 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61 74 65 73 20 74 68 65 20 63 6f 6d 70 75 74 61 74 example.illustrates.the.computat
ad80 69 6f 6e 20 6f 66 20 45 4d 44 2c 20 53 69 6e 6b 68 6f 72 6e 20 61 6e 64 20 73 6d 6f 6f 74 68 20 ion.of.EMD,.Sinkhorn.and.smooth.
ada0 4f 54 20 70 6c 61 6e 73 0a 61 6e 64 20 74 68 65 69 72 20 76 69 73 75 61 6c 69 7a 61 74 69 6f 6e OT.plans.and.their.visualization
adc0 2e 0a 0a 22 22 22 0a 0a 23 20 41 75 74 68 6f 72 3a 20 52 65 6d 69 20 46 6c 61 6d 61 72 79 20 3c ..."""..#.Author:.Remi.Flamary.<
ade0 72 65 6d 69 2e 66 6c 61 6d 61 72 79 40 75 6e 69 63 65 2e 66 72 3e 0a 23 0a 23 20 4c 69 63 65 6e remi.flamary@unice.fr>.#.#.Licen
ae00 73 65 3a 20 4d 49 54 20 4c 69 63 65 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6e 75 6d 70 79 20 61 73 se:.MIT.License..import.numpy.as
ae20 20 6e 70 0a 69 6d 70 6f 72 74 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 70 79 6c 61 62 20 61 73 20 70 .np.import.matplotlib.pylab.as.p
ae40 6c 0a 69 6d 70 6f 72 74 20 6f 74 0a 69 6d 70 6f 72 74 20 6f 74 2e 70 6c 6f 74 0a 66 72 6f 6d 20 l.import.ot.import.ot.plot.from.
ae60 6f 74 2e 64 61 74 61 73 65 74 73 20 69 6d 70 6f 72 74 20 6d 61 6b 65 5f 31 44 5f 67 61 75 73 73 ot.datasets.import.make_1D_gauss
ae80 20 61 73 20 67 61 75 73 73 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 .as.gauss..#####################
aea0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
aec0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 47 65 6e 65 #########################.#.Gene
aee0 72 61 74 65 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 0a 23 25 25 20 rate.data.#.-------------...#%%.
af00 70 61 72 61 6d 65 74 65 72 73 0a 0a 6e 20 3d 20 31 30 30 20 20 23 20 6e 62 20 62 69 6e 73 0a 0a parameters..n.=.100..#.nb.bins..
af20 23 20 62 69 6e 20 70 6f 73 69 74 69 6f 6e 73 0a 78 20 3d 20 6e 70 2e 61 72 61 6e 67 65 28 6e 2c #.bin.positions.x.=.np.arange(n,
af40 20 64 74 79 70 65 3d 6e 70 2e 66 6c 6f 61 74 36 34 29 0a 0a 23 20 47 61 75 73 73 69 61 6e 20 64 .dtype=np.float64)..#.Gaussian.d
af60 69 73 74 72 69 62 75 74 69 6f 6e 73 0a 61 20 3d 20 67 61 75 73 73 28 6e 2c 20 6d 3d 32 30 2c 20 istributions.a.=.gauss(n,.m=20,.
af80 73 3d 35 29 20 20 23 20 6d 3d 20 6d 65 61 6e 2c 20 73 3d 20 73 74 64 0a 62 20 3d 20 67 61 75 73 s=5)..#.m=.mean,.s=.std.b.=.gaus
afa0 73 28 6e 2c 20 6d 3d 36 30 2c 20 73 3d 31 30 29 0a 0a 23 20 6c 6f 73 73 20 6d 61 74 72 69 78 0a s(n,.m=60,.s=10)..#.loss.matrix.
afc0 4d 20 3d 20 6f 74 2e 64 69 73 74 28 78 2e 72 65 73 68 61 70 65 28 28 6e 2c 20 31 29 29 2c 20 78 M.=.ot.dist(x.reshape((n,.1)),.x
afe0 2e 72 65 73 68 61 70 65 28 28 6e 2c 20 31 29 29 29 0a 4d 20 2f 3d 20 4d 2e 6d 61 78 28 29 0a 0a .reshape((n,.1))).M./=.M.max()..
b000 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 .###############################
b020 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
b040 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 50 6c 6f 74 20 64 69 73 74 72 69 62 75 74 ###############.#.Plot.distribut
b060 69 6f 6e 73 20 61 6e 64 20 6c 6f 73 73 20 6d 61 74 72 69 78 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d ions.and.loss.matrix.#.---------
b080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 70 -------------------------..#%%.p
b0a0 6c 6f 74 20 74 68 65 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0a 0a 70 6c 2e 66 69 67 75 72 65 lot.the.distributions..pl.figure
b0c0 28 31 2c 20 66 69 67 73 69 7a 65 3d 28 36 2e 34 2c 20 33 29 29 0a 70 6c 2e 70 6c 6f 74 28 78 2c (1,.figsize=(6.4,.3)).pl.plot(x,
b0e0 20 61 2c 20 27 62 27 2c 20 6c 61 62 65 6c 3d 27 53 6f 75 72 63 65 20 64 69 73 74 72 69 62 75 74 .a,.'b',.label='Source.distribut
b100 69 6f 6e 27 29 0a 70 6c 2e 70 6c 6f 74 28 78 2c 20 62 2c 20 27 72 27 2c 20 6c 61 62 65 6c 3d 27 ion').pl.plot(x,.b,.'r',.label='
b120 54 61 72 67 65 74 20 64 69 73 74 72 69 62 75 74 69 6f 6e 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 Target.distribution').pl.legend(
b140 29 0a 0a 23 25 25 20 70 6c 6f 74 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 61 6e 64 20 6c 6f )..#%%.plot.distributions.and.lo
b160 73 73 20 6d 61 74 72 69 78 0a 0a 70 6c 2e 66 69 67 75 72 65 28 32 2c 20 66 69 67 73 69 7a 65 3d ss.matrix..pl.figure(2,.figsize=
b180 28 35 2c 20 35 29 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 31 44 5f 6d 61 74 28 61 2c 20 62 2c (5,.5)).ot.plot.plot1D_mat(a,.b,
b1a0 20 4d 2c 20 27 43 6f 73 74 20 6d 61 74 72 69 78 20 4d 27 29 0a 0a 23 23 23 23 23 23 23 23 23 23 .M,.'Cost.matrix.M')..##########
b1c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
b1e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
b200 23 23 23 23 0a 23 20 53 6f 6c 76 65 20 45 4d 44 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 0a 23 ####.#.Solve.EMD.#.---------...#
b220 25 25 20 45 4d 44 0a 0a 47 30 20 3d 20 6f 74 2e 65 6d 64 28 61 2c 20 62 2c 20 4d 29 0a 0a 70 6c %%.EMD..G0.=.ot.emd(a,.b,.M)..pl
b240 2e 66 69 67 75 72 65 28 33 2c 20 66 69 67 73 69 7a 65 3d 28 35 2c 20 35 29 29 0a 6f 74 2e 70 6c .figure(3,.figsize=(5,.5)).ot.pl
b260 6f 74 2e 70 6c 6f 74 31 44 5f 6d 61 74 28 61 2c 20 62 2c 20 47 30 2c 20 27 4f 54 20 6d 61 74 72 ot.plot1D_mat(a,.b,.G0,.'OT.matr
b280 69 78 20 47 30 27 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ix.G0')..#######################
b2a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
b2c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 53 6f 6c 76 65 20 #######################.#.Solve.
b2e0 53 69 6e 6b 68 6f 72 6e 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 0a 23 25 25 20 Sinkhorn.#.--------------...#%%.
b300 53 69 6e 6b 68 6f 72 6e 0a 0a 6c 61 6d 62 64 20 3d 20 32 65 2d 33 0a 47 73 20 3d 20 6f 74 2e 73 Sinkhorn..lambd.=.2e-3.Gs.=.ot.s
b320 69 6e 6b 68 6f 72 6e 28 61 2c 20 62 2c 20 4d 2c 20 6c 61 6d 62 64 2c 20 76 65 72 62 6f 73 65 3d inkhorn(a,.b,.M,.lambd,.verbose=
b340 54 72 75 65 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 34 2c 20 66 69 67 73 69 7a 65 3d 28 35 2c 20 True)..pl.figure(4,.figsize=(5,.
b360 35 29 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 31 44 5f 6d 61 74 28 61 2c 20 62 2c 20 47 73 2c 5)).ot.plot.plot1D_mat(a,.b,.Gs,
b380 20 27 4f 54 20 6d 61 74 72 69 78 20 53 69 6e 6b 68 6f 72 6e 27 29 0a 0a 70 6c 2e 73 68 6f 77 28 .'OT.matrix.Sinkhorn')..pl.show(
b3a0 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 )..#############################
b3c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
b3e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 53 6f 6c 76 65 20 53 6d 6f 6f 74 68 #################.#.Solve.Smooth
b400 20 4f 54 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 0a 23 25 25 20 53 6d 6f 6f 74 .OT.#.--------------...#%%.Smoot
b420 68 20 4f 54 20 77 69 74 68 20 4b 4c 20 72 65 67 75 6c 61 72 69 7a 61 74 69 6f 6e 0a 0a 6c 61 6d h.OT.with.KL.regularization..lam
b440 62 64 20 3d 20 32 65 2d 33 0a 47 73 6d 20 3d 20 6f 74 2e 73 6d 6f 6f 74 68 2e 73 6d 6f 6f 74 68 bd.=.2e-3.Gsm.=.ot.smooth.smooth
b460 5f 6f 74 5f 64 75 61 6c 28 61 2c 20 62 2c 20 4d 2c 20 6c 61 6d 62 64 2c 20 72 65 67 5f 74 79 70 _ot_dual(a,.b,.M,.lambd,.reg_typ
b480 65 3d 27 6b 6c 27 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 35 2c 20 66 69 67 73 69 7a 65 3d 28 35 e='kl')..pl.figure(5,.figsize=(5
b4a0 2c 20 35 29 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 31 44 5f 6d 61 74 28 61 2c 20 62 2c 20 47 ,.5)).ot.plot.plot1D_mat(a,.b,.G
b4c0 73 6d 2c 20 27 4f 54 20 6d 61 74 72 69 78 20 53 6d 6f 6f 74 68 20 4f 54 20 4b 4c 20 72 65 67 2e sm,.'OT.matrix.Smooth.OT.KL.reg.
b4e0 27 29 0a 0a 70 6c 2e 73 68 6f 77 28 29 0a 0a 0a 23 25 25 20 53 6d 6f 6f 74 68 20 4f 54 20 77 69 ')..pl.show()...#%%.Smooth.OT.wi
b500 74 68 20 4b 4c 20 72 65 67 75 6c 61 72 69 7a 61 74 69 6f 6e 0a 0a 6c 61 6d 62 64 20 3d 20 31 65 th.KL.regularization..lambd.=.1e
b520 2d 31 0a 47 73 6d 20 3d 20 6f 74 2e 73 6d 6f 6f 74 68 2e 73 6d 6f 6f 74 68 5f 6f 74 5f 64 75 61 -1.Gsm.=.ot.smooth.smooth_ot_dua
b540 6c 28 61 2c 20 62 2c 20 4d 2c 20 6c 61 6d 62 64 2c 20 72 65 67 5f 74 79 70 65 3d 27 6c 32 27 29 l(a,.b,.M,.lambd,.reg_type='l2')
b560 0a 0a 70 6c 2e 66 69 67 75 72 65 28 36 2c 20 66 69 67 73 69 7a 65 3d 28 35 2c 20 35 29 29 0a 6f ..pl.figure(6,.figsize=(5,.5)).o
b580 74 2e 70 6c 6f 74 2e 70 6c 6f 74 31 44 5f 6d 61 74 28 61 2c 20 62 2c 20 47 73 6d 2c 20 27 4f 54 t.plot.plot1D_mat(a,.b,.Gsm,.'OT
b5a0 20 6d 61 74 72 69 78 20 53 6d 6f 6f 74 68 20 4f 54 20 6c 32 20 72 65 67 2e 27 29 0a 0a 70 6c 2e .matrix.Smooth.OT.l2.reg.')..pl.
b5c0 73 68 6f 77 28 29 0a 50 4b 03 04 14 00 00 00 00 00 db 74 d9 4e b0 ed ff 28 54 10 00 00 54 10 00 show().PK.........t.N...(T...T..
b5e0 00 22 00 00 00 70 6c 6f 74 5f 6f 74 64 61 5f 6d 61 70 70 69 6e 67 5f 63 6f 6c 6f 72 73 5f 69 6d ."...plot_otda_mapping_colors_im
b600 61 67 65 73 2e 70 79 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0a 22 ages.py#.-*-.coding:.utf-8.-*-."
b620 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d "".=============================
b640 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 4f 54 20 66 6f 72 20 ========================.OT.for.
b660 69 6d 61 67 65 20 63 6f 6c 6f 72 20 61 64 61 70 74 61 74 69 6f 6e 20 77 69 74 68 20 6d 61 70 70 image.color.adaptation.with.mapp
b680 69 6e 67 20 65 73 74 69 6d 61 74 69 6f 6e 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ing.estimation.=================
b6a0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================================
b6c0 3d 3d 3d 3d 0a 0a 4f 54 20 66 6f 72 20 64 6f 6d 61 69 6e 20 61 64 61 70 74 61 74 69 6f 6e 20 77 ====..OT.for.domain.adaptation.w
b6e0 69 74 68 20 69 6d 61 67 65 20 63 6f 6c 6f 72 20 61 64 61 70 74 61 74 69 6f 6e 20 5b 36 5d 20 77 ith.image.color.adaptation.[6].w
b700 69 74 68 20 6d 61 70 70 69 6e 67 0a 65 73 74 69 6d 61 74 69 6f 6e 20 5b 38 5d 2e 0a 0a 5b 36 5d ith.mapping.estimation.[8]...[6]
b720 20 46 65 72 72 61 64 61 6e 73 2c 20 53 2e 2c 20 50 61 70 61 64 61 6b 69 73 2c 20 4e 2e 2c 20 50 .Ferradans,.S.,.Papadakis,.N.,.P
b740 65 79 72 65 2c 20 47 2e 2c 20 26 20 41 75 6a 6f 6c 2c 20 4a 2e 20 46 2e 20 28 32 30 31 34 29 2e eyre,.G.,.&.Aujol,.J..F..(2014).
b760 20 52 65 67 75 6c 61 72 69 7a 65 64 0a 20 20 20 20 64 69 73 63 72 65 74 65 20 6f 70 74 69 6d 61 .Regularized.....discrete.optima
b780 6c 20 74 72 61 6e 73 70 6f 72 74 2e 20 53 49 41 4d 20 4a 6f 75 72 6e 61 6c 20 6f 6e 20 49 6d 61 l.transport..SIAM.Journal.on.Ima
b7a0 67 69 6e 67 20 53 63 69 65 6e 63 65 73 2c 20 37 28 33 29 2c 0a 20 20 20 20 31 38 35 33 2d 31 38 ging.Sciences,.7(3),.....1853-18
b7c0 38 32 2e 0a 5b 38 5d 20 4d 2e 20 50 65 72 72 6f 74 2c 20 4e 2e 20 43 6f 75 72 74 79 2c 20 52 2e 82..[8].M..Perrot,.N..Courty,.R.
b7e0 20 46 6c 61 6d 61 72 79 2c 20 41 2e 20 48 61 62 72 61 72 64 2c 20 22 4d 61 70 70 69 6e 67 20 65 .Flamary,.A..Habrard,."Mapping.e
b800 73 74 69 6d 61 74 69 6f 6e 20 66 6f 72 0a 20 20 20 20 64 69 73 63 72 65 74 65 20 6f 70 74 69 6d stimation.for.....discrete.optim
b820 61 6c 20 74 72 61 6e 73 70 6f 72 74 22 2c 20 4e 65 75 72 61 6c 20 49 6e 66 6f 72 6d 61 74 69 6f al.transport",.Neural.Informatio
b840 6e 20 50 72 6f 63 65 73 73 69 6e 67 20 53 79 73 74 65 6d 73 20 28 4e 49 50 53 29 2c 0a 20 20 20 n.Processing.Systems.(NIPS),....
b860 20 32 30 31 36 2e 0a 0a 22 22 22 0a 0a 23 20 41 75 74 68 6f 72 73 3a 20 52 65 6d 69 20 46 6c 61 .2016..."""..#.Authors:.Remi.Fla
b880 6d 61 72 79 20 3c 72 65 6d 69 2e 66 6c 61 6d 61 72 79 40 75 6e 69 63 65 2e 66 72 3e 0a 23 20 20 mary.<remi.flamary@unice.fr>.#..
b8a0 20 20 20 20 20 20 20 20 53 74 61 6e 69 73 6c 61 73 20 43 68 61 6d 62 6f 6e 20 3c 73 74 61 6e 2e ........Stanislas.Chambon.<stan.
b8c0 63 68 61 6d 62 6f 6e 40 67 6d 61 69 6c 2e 63 6f 6d 3e 0a 23 0a 23 20 4c 69 63 65 6e 73 65 3a 20 chambon@gmail.com>.#.#.License:.
b8e0 4d 49 54 20 4c 69 63 65 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6e 75 6d 70 79 20 61 73 20 6e 70 0a MIT.License..import.numpy.as.np.
b900 66 72 6f 6d 20 73 63 69 70 79 20 69 6d 70 6f 72 74 20 6e 64 69 6d 61 67 65 0a 69 6d 70 6f 72 74 from.scipy.import.ndimage.import
b920 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 70 79 6c 61 62 20 61 73 20 70 6c 0a 69 6d 70 6f 72 74 20 6f .matplotlib.pylab.as.pl.import.o
b940 74 0a 0a 72 20 3d 20 6e 70 2e 72 61 6e 64 6f 6d 2e 52 61 6e 64 6f 6d 53 74 61 74 65 28 34 32 29 t..r.=.np.random.RandomState(42)
b960 0a 0a 0a 64 65 66 20 69 6d 32 6d 61 74 28 49 29 3a 0a 20 20 20 20 22 22 22 43 6f 6e 76 65 72 74 ...def.im2mat(I):....."""Convert
b980 73 20 61 6e 64 20 69 6d 61 67 65 20 74 6f 20 6d 61 74 72 69 78 20 28 6f 6e 65 20 70 69 78 65 6c s.and.image.to.matrix.(one.pixel
b9a0 20 70 65 72 20 6c 69 6e 65 29 22 22 22 0a 20 20 20 20 72 65 74 75 72 6e 20 49 2e 72 65 73 68 61 .per.line)""".....return.I.resha
b9c0 70 65 28 28 49 2e 73 68 61 70 65 5b 30 5d 20 2a 20 49 2e 73 68 61 70 65 5b 31 5d 2c 20 49 2e 73 pe((I.shape[0].*.I.shape[1],.I.s
b9e0 68 61 70 65 5b 32 5d 29 29 0a 0a 0a 64 65 66 20 6d 61 74 32 69 6d 28 58 2c 20 73 68 61 70 65 29 hape[2]))...def.mat2im(X,.shape)
ba00 3a 0a 20 20 20 20 22 22 22 43 6f 6e 76 65 72 74 73 20 62 61 63 6b 20 61 20 6d 61 74 72 69 78 20 :....."""Converts.back.a.matrix.
ba20 74 6f 20 61 6e 20 69 6d 61 67 65 22 22 22 0a 20 20 20 20 72 65 74 75 72 6e 20 58 2e 72 65 73 68 to.an.image""".....return.X.resh
ba40 61 70 65 28 73 68 61 70 65 29 0a 0a 0a 64 65 66 20 6d 69 6e 6d 61 78 28 49 29 3a 0a 20 20 20 20 ape(shape)...def.minmax(I):.....
ba60 72 65 74 75 72 6e 20 6e 70 2e 63 6c 69 70 28 49 2c 20 30 2c 20 31 29 0a 0a 0a 23 23 23 23 23 23 return.np.clip(I,.0,.1)...######
ba80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
baa0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
bac0 23 23 23 23 23 23 23 23 0a 23 20 47 65 6e 65 72 61 74 65 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d ########.#.Generate.data.#.-----
bae0 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 20 4c 6f 61 64 69 6e 67 20 69 6d 61 67 65 73 0a 49 31 20 3d 20 --------..#.Loading.images.I1.=.
bb00 6e 64 69 6d 61 67 65 2e 69 6d 72 65 61 64 28 27 2e 2e 2f 64 61 74 61 2f 6f 63 65 61 6e 5f 64 61 ndimage.imread('../data/ocean_da
bb20 79 2e 6a 70 67 27 29 2e 61 73 74 79 70 65 28 6e 70 2e 66 6c 6f 61 74 36 34 29 20 2f 20 32 35 36 y.jpg').astype(np.float64)./.256
bb40 0a 49 32 20 3d 20 6e 64 69 6d 61 67 65 2e 69 6d 72 65 61 64 28 27 2e 2e 2f 64 61 74 61 2f 6f 63 .I2.=.ndimage.imread('../data/oc
bb60 65 61 6e 5f 73 75 6e 73 65 74 2e 6a 70 67 27 29 2e 61 73 74 79 70 65 28 6e 70 2e 66 6c 6f 61 74 ean_sunset.jpg').astype(np.float
bb80 36 34 29 20 2f 20 32 35 36 0a 0a 0a 58 31 20 3d 20 69 6d 32 6d 61 74 28 49 31 29 0a 58 32 20 3d 64)./.256...X1.=.im2mat(I1).X2.=
bba0 20 69 6d 32 6d 61 74 28 49 32 29 0a 0a 23 20 74 72 61 69 6e 69 6e 67 20 73 61 6d 70 6c 65 73 0a .im2mat(I2)..#.training.samples.
bbc0 6e 62 20 3d 20 31 30 30 30 0a 69 64 78 31 20 3d 20 72 2e 72 61 6e 64 69 6e 74 28 58 31 2e 73 68 nb.=.1000.idx1.=.r.randint(X1.sh
bbe0 61 70 65 5b 30 5d 2c 20 73 69 7a 65 3d 28 6e 62 2c 29 29 0a 69 64 78 32 20 3d 20 72 2e 72 61 6e ape[0],.size=(nb,)).idx2.=.r.ran
bc00 64 69 6e 74 28 58 32 2e 73 68 61 70 65 5b 30 5d 2c 20 73 69 7a 65 3d 28 6e 62 2c 29 29 0a 0a 58 dint(X2.shape[0],.size=(nb,))..X
bc20 73 20 3d 20 58 31 5b 69 64 78 31 2c 20 3a 5d 0a 58 74 20 3d 20 58 32 5b 69 64 78 32 2c 20 3a 5d s.=.X1[idx1,.:].Xt.=.X2[idx2,.:]
bc40 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ...#############################
bc60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
bc80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 44 6f 6d 61 69 6e 20 61 64 61 70 74 #################.#.Domain.adapt
bca0 61 74 69 6f 6e 20 66 6f 72 20 70 69 78 65 6c 20 64 69 73 74 72 69 62 75 74 69 6f 6e 20 74 72 61 ation.for.pixel.distribution.tra
bcc0 6e 73 66 65 72 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d nsfer.#.------------------------
bce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 20 45 4d 44 -------------------------..#.EMD
bd00 54 72 61 6e 73 70 6f 72 74 0a 6f 74 5f 65 6d 64 20 3d 20 6f 74 2e 64 61 2e 45 4d 44 54 72 61 6e Transport.ot_emd.=.ot.da.EMDTran
bd20 73 70 6f 72 74 28 29 0a 6f 74 5f 65 6d 64 2e 66 69 74 28 58 73 3d 58 73 2c 20 58 74 3d 58 74 29 sport().ot_emd.fit(Xs=Xs,.Xt=Xt)
bd40 0a 74 72 61 6e 73 70 5f 58 73 5f 65 6d 64 20 3d 20 6f 74 5f 65 6d 64 2e 74 72 61 6e 73 66 6f 72 .transp_Xs_emd.=.ot_emd.transfor
bd60 6d 28 58 73 3d 58 31 29 0a 49 6d 61 67 65 5f 65 6d 64 20 3d 20 6d 69 6e 6d 61 78 28 6d 61 74 32 m(Xs=X1).Image_emd.=.minmax(mat2
bd80 69 6d 28 74 72 61 6e 73 70 5f 58 73 5f 65 6d 64 2c 20 49 31 2e 73 68 61 70 65 29 29 0a 0a 23 20 im(transp_Xs_emd,.I1.shape))..#.
bda0 53 69 6e 6b 68 6f 72 6e 54 72 61 6e 73 70 6f 72 74 0a 6f 74 5f 73 69 6e 6b 68 6f 72 6e 20 3d 20 SinkhornTransport.ot_sinkhorn.=.
bdc0 6f 74 2e 64 61 2e 53 69 6e 6b 68 6f 72 6e 54 72 61 6e 73 70 6f 72 74 28 72 65 67 5f 65 3d 31 65 ot.da.SinkhornTransport(reg_e=1e
bde0 2d 31 29 0a 6f 74 5f 73 69 6e 6b 68 6f 72 6e 2e 66 69 74 28 58 73 3d 58 73 2c 20 58 74 3d 58 74 -1).ot_sinkhorn.fit(Xs=Xs,.Xt=Xt
be00 29 0a 74 72 61 6e 73 70 5f 58 73 5f 73 69 6e 6b 68 6f 72 6e 20 3d 20 6f 74 5f 73 69 6e 6b 68 6f ).transp_Xs_sinkhorn.=.ot_sinkho
be20 72 6e 2e 74 72 61 6e 73 66 6f 72 6d 28 58 73 3d 58 31 29 0a 49 6d 61 67 65 5f 73 69 6e 6b 68 6f rn.transform(Xs=X1).Image_sinkho
be40 72 6e 20 3d 20 6d 69 6e 6d 61 78 28 6d 61 74 32 69 6d 28 74 72 61 6e 73 70 5f 58 73 5f 73 69 6e rn.=.minmax(mat2im(transp_Xs_sin
be60 6b 68 6f 72 6e 2c 20 49 31 2e 73 68 61 70 65 29 29 0a 0a 6f 74 5f 6d 61 70 70 69 6e 67 5f 6c 69 khorn,.I1.shape))..ot_mapping_li
be80 6e 65 61 72 20 3d 20 6f 74 2e 64 61 2e 4d 61 70 70 69 6e 67 54 72 61 6e 73 70 6f 72 74 28 0a 20 near.=.ot.da.MappingTransport(..
bea0 20 20 20 6d 75 3d 31 65 30 2c 20 65 74 61 3d 31 65 2d 38 2c 20 62 69 61 73 3d 54 72 75 65 2c 20 ...mu=1e0,.eta=1e-8,.bias=True,.
bec0 6d 61 78 5f 69 74 65 72 3d 32 30 2c 20 76 65 72 62 6f 73 65 3d 54 72 75 65 29 0a 6f 74 5f 6d 61 max_iter=20,.verbose=True).ot_ma
bee0 70 70 69 6e 67 5f 6c 69 6e 65 61 72 2e 66 69 74 28 58 73 3d 58 73 2c 20 58 74 3d 58 74 29 0a 0a pping_linear.fit(Xs=Xs,.Xt=Xt)..
bf00 58 31 74 6c 20 3d 20 6f 74 5f 6d 61 70 70 69 6e 67 5f 6c 69 6e 65 61 72 2e 74 72 61 6e 73 66 6f X1tl.=.ot_mapping_linear.transfo
bf20 72 6d 28 58 73 3d 58 31 29 0a 49 6d 61 67 65 5f 6d 61 70 70 69 6e 67 5f 6c 69 6e 65 61 72 20 3d rm(Xs=X1).Image_mapping_linear.=
bf40 20 6d 69 6e 6d 61 78 28 6d 61 74 32 69 6d 28 58 31 74 6c 2c 20 49 31 2e 73 68 61 70 65 29 29 0a .minmax(mat2im(X1tl,.I1.shape)).
bf60 0a 6f 74 5f 6d 61 70 70 69 6e 67 5f 67 61 75 73 73 69 61 6e 20 3d 20 6f 74 2e 64 61 2e 4d 61 70 .ot_mapping_gaussian.=.ot.da.Map
bf80 70 69 6e 67 54 72 61 6e 73 70 6f 72 74 28 0a 20 20 20 20 6d 75 3d 31 65 30 2c 20 65 74 61 3d 31 pingTransport(.....mu=1e0,.eta=1
bfa0 65 2d 32 2c 20 73 69 67 6d 61 3d 31 2c 20 62 69 61 73 3d 46 61 6c 73 65 2c 20 6d 61 78 5f 69 74 e-2,.sigma=1,.bias=False,.max_it
bfc0 65 72 3d 31 30 2c 20 76 65 72 62 6f 73 65 3d 54 72 75 65 29 0a 6f 74 5f 6d 61 70 70 69 6e 67 5f er=10,.verbose=True).ot_mapping_
bfe0 67 61 75 73 73 69 61 6e 2e 66 69 74 28 58 73 3d 58 73 2c 20 58 74 3d 58 74 29 0a 0a 58 31 74 6e gaussian.fit(Xs=Xs,.Xt=Xt)..X1tn
c000 20 3d 20 6f 74 5f 6d 61 70 70 69 6e 67 5f 67 61 75 73 73 69 61 6e 2e 74 72 61 6e 73 66 6f 72 6d .=.ot_mapping_gaussian.transform
c020 28 58 73 3d 58 31 29 20 20 23 20 75 73 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6d 61 70 (Xs=X1)..#.use.the.estimated.map
c040 70 69 6e 67 0a 49 6d 61 67 65 5f 6d 61 70 70 69 6e 67 5f 67 61 75 73 73 69 61 6e 20 3d 20 6d 69 ping.Image_mapping_gaussian.=.mi
c060 6e 6d 61 78 28 6d 61 74 32 69 6d 28 58 31 74 6e 2c 20 49 31 2e 73 68 61 70 65 29 29 0a 0a 0a 23 nmax(mat2im(X1tn,.I1.shape))...#
c080 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
c0a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
c0c0 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 50 6c 6f 74 20 6f 72 69 67 69 6e 61 6c 20 69 6d #############.#.Plot.original.im
c0e0 61 67 65 73 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 6c 2e ages.#.--------------------..pl.
c100 66 69 67 75 72 65 28 31 2c 20 66 69 67 73 69 7a 65 3d 28 36 2e 34 2c 20 33 29 29 0a 70 6c 2e 73 figure(1,.figsize=(6.4,.3)).pl.s
c120 75 62 70 6c 6f 74 28 31 2c 20 32 2c 20 31 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 49 31 29 0a 70 6c ubplot(1,.2,.1).pl.imshow(I1).pl
c140 2e 61 78 69 73 28 27 6f 66 66 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 49 6d 61 67 65 20 31 27 29 .axis('off').pl.title('Image.1')
c160 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 32 2c 20 32 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 ..pl.subplot(1,.2,.2).pl.imshow(
c180 49 32 29 0a 70 6c 2e 61 78 69 73 28 27 6f 66 66 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 49 6d 61 I2).pl.axis('off').pl.title('Ima
c1a0 67 65 20 32 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 0a 23 23 23 23 23 ge.2').pl.tight_layout()...#####
c1c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
c1e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
c200 23 23 23 23 23 23 23 23 23 0a 23 20 50 6c 6f 74 20 70 69 78 65 6c 20 76 61 6c 75 65 73 20 64 69 #########.#.Plot.pixel.values.di
c220 73 74 72 69 62 75 74 69 6f 6e 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d stribution.#.-------------------
c240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 6c 2e 66 69 67 75 72 65 28 32 2c 20 66 69 67 73 69 7a -----------..pl.figure(2,.figsiz
c260 65 3d 28 36 2e 34 2c 20 35 29 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 32 2c 20 31 29 e=(6.4,.5))..pl.subplot(1,.2,.1)
c280 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 73 5b 3a 2c 20 30 5d 2c 20 58 73 5b 3a 2c 20 32 5d 2c 20 .pl.scatter(Xs[:,.0],.Xs[:,.2],.
c2a0 63 3d 58 73 29 0a 70 6c 2e 61 78 69 73 28 5b 30 2c 20 31 2c 20 30 2c 20 31 5d 29 0a 70 6c 2e 78 c=Xs).pl.axis([0,.1,.0,.1]).pl.x
c2c0 6c 61 62 65 6c 28 27 52 65 64 27 29 0a 70 6c 2e 79 6c 61 62 65 6c 28 27 42 6c 75 65 27 29 0a 70 label('Red').pl.ylabel('Blue').p
c2e0 6c 2e 74 69 74 6c 65 28 27 49 6d 61 67 65 20 31 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 l.title('Image.1')..pl.subplot(1
c300 2c 20 32 2c 20 32 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 74 5b 3a 2c 20 30 5d 2c 20 58 74 5b ,.2,.2).pl.scatter(Xt[:,.0],.Xt[
c320 3a 2c 20 32 5d 2c 20 63 3d 58 74 29 0a 70 6c 2e 61 78 69 73 28 5b 30 2c 20 31 2c 20 30 2c 20 31 :,.2],.c=Xt).pl.axis([0,.1,.0,.1
c340 5d 29 0a 70 6c 2e 78 6c 61 62 65 6c 28 27 52 65 64 27 29 0a 70 6c 2e 79 6c 61 62 65 6c 28 27 42 ]).pl.xlabel('Red').pl.ylabel('B
c360 6c 75 65 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 49 6d 61 67 65 20 32 27 29 0a 70 6c 2e 74 69 67 lue').pl.title('Image.2').pl.tig
c380 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ht_layout()...##################
c3a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
c3c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 50 ############################.#.P
c3e0 6c 6f 74 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6d 61 67 65 73 0a 23 20 2d 2d 2d 2d 2d 2d 2d lot.transformed.images.#.-------
c400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 6c 2e 66 69 67 75 72 65 28 32 2c 20 66 ----------------..pl.figure(2,.f
c420 69 67 73 69 7a 65 3d 28 31 30 2c 20 35 29 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 33 igsize=(10,.5))..pl.subplot(2,.3
c440 2c 20 31 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 49 31 29 0a 70 6c 2e 61 78 69 73 28 27 6f 66 66 27 ,.1).pl.imshow(I1).pl.axis('off'
c460 29 0a 70 6c 2e 74 69 74 6c 65 28 27 49 6d 2e 20 31 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 ).pl.title('Im..1')..pl.subplot(
c480 32 2c 20 33 2c 20 34 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 49 32 29 0a 70 6c 2e 61 78 69 73 28 27 2,.3,.4).pl.imshow(I2).pl.axis('
c4a0 6f 66 66 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 49 6d 2e 20 32 27 29 0a 0a 70 6c 2e 73 75 62 70 off').pl.title('Im..2')..pl.subp
c4c0 6c 6f 74 28 32 2c 20 33 2c 20 32 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 49 6d 61 67 65 5f 65 6d 64 lot(2,.3,.2).pl.imshow(Image_emd
c4e0 29 0a 70 6c 2e 61 78 69 73 28 27 6f 66 66 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 45 6d 64 54 72 ).pl.axis('off').pl.title('EmdTr
c500 61 6e 73 70 6f 72 74 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 33 2c 20 35 29 0a 70 ansport')..pl.subplot(2,.3,.5).p
c520 6c 2e 69 6d 73 68 6f 77 28 49 6d 61 67 65 5f 73 69 6e 6b 68 6f 72 6e 29 0a 70 6c 2e 61 78 69 73 l.imshow(Image_sinkhorn).pl.axis
c540 28 27 6f 66 66 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 53 69 6e 6b 68 6f 72 6e 54 72 61 6e 73 70 ('off').pl.title('SinkhornTransp
c560 6f 72 74 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 33 2c 20 33 29 0a 70 6c 2e 69 6d ort')..pl.subplot(2,.3,.3).pl.im
c580 73 68 6f 77 28 49 6d 61 67 65 5f 6d 61 70 70 69 6e 67 5f 6c 69 6e 65 61 72 29 0a 70 6c 2e 61 78 show(Image_mapping_linear).pl.ax
c5a0 69 73 28 27 6f 66 66 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 4d 61 70 70 69 6e 67 54 72 61 6e 73 is('off').pl.title('MappingTrans
c5c0 70 6f 72 74 20 28 6c 69 6e 65 61 72 29 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 33 port.(linear)')..pl.subplot(2,.3
c5e0 2c 20 36 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 49 6d 61 67 65 5f 6d 61 70 70 69 6e 67 5f 67 61 75 ,.6).pl.imshow(Image_mapping_gau
c600 73 73 69 61 6e 29 0a 70 6c 2e 61 78 69 73 28 27 6f 66 66 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 ssian).pl.axis('off').pl.title('
c620 4d 61 70 70 69 6e 67 54 72 61 6e 73 70 6f 72 74 20 28 67 61 75 73 73 69 61 6e 29 27 29 0a 70 6c MappingTransport.(gaussian)').pl
c640 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 70 6c 2e 73 68 6f 77 28 29 0a 50 4b 03 04 14 .tight_layout()..pl.show().PK...
c660 00 00 00 00 00 da 74 d9 4e 90 0c 61 ee fa 07 00 00 fa 07 00 00 1f 00 00 00 70 6c 6f 74 5f 66 72 ......t.N..a.............plot_fr
c680 65 65 5f 73 75 70 70 6f 72 74 5f 62 61 72 79 63 65 6e 74 65 72 2e 70 79 23 20 2d 2a 2d 20 63 6f ee_support_barycenter.py#.-*-.co
c6a0 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0a 22 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ding:.utf-8.-*-.""".============
c6c0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================================
c6e0 3d 3d 3d 3d 3d 3d 3d 3d 0a 32 44 20 66 72 65 65 20 73 75 70 70 6f 72 74 20 57 61 73 73 65 72 73 ========.2D.free.support.Wassers
c700 74 65 69 6e 20 62 61 72 79 63 65 6e 74 65 72 73 20 6f 66 20 64 69 73 74 72 69 62 75 74 69 6f 6e tein.barycenters.of.distribution
c720 73 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d s.==============================
c740 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 49 6c 6c 75 73 74 72 61 ======================..Illustra
c760 74 69 6f 6e 20 6f 66 20 32 44 20 57 61 73 73 65 72 73 74 65 69 6e 20 62 61 72 79 63 65 6e 74 65 tion.of.2D.Wasserstein.barycente
c780 72 73 20 69 66 20 64 69 73 63 72 69 62 75 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 77 65 69 rs.if.discributions.that.are.wei
c7a0 67 68 74 65 64 0a 73 75 6d 20 6f 66 20 64 69 72 61 63 73 2e 0a 0a 22 22 22 0a 0a 23 20 41 75 74 ghted.sum.of.diracs..."""..#.Aut
c7c0 68 6f 72 3a 20 56 69 76 69 65 6e 20 53 65 67 75 79 20 3c 76 69 76 69 65 6e 2e 73 65 67 75 79 40 hor:.Vivien.Seguy.<vivien.seguy@
c7e0 69 69 70 2e 69 73 74 2e 69 2e 6b 79 6f 74 6f 2d 75 2e 61 63 2e 6a 70 3e 0a 23 0a 23 20 4c 69 63 iip.ist.i.kyoto-u.ac.jp>.#.#.Lic
c800 65 6e 73 65 3a 20 4d 49 54 20 4c 69 63 65 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6e 75 6d 70 79 20 ense:.MIT.License..import.numpy.
c820 61 73 20 6e 70 0a 69 6d 70 6f 72 74 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 70 79 6c 61 62 20 61 73 as.np.import.matplotlib.pylab.as
c840 20 70 6c 0a 69 6d 70 6f 72 74 20 6f 74 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 .pl.import.ot...################
c860 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
c880 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 ##############################.#
c8a0 20 47 65 6e 65 72 61 74 65 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 .Generate.data.#.-------------.#
c8c0 25 25 20 70 61 72 61 6d 65 74 65 72 73 20 61 6e 64 20 64 61 74 61 20 67 65 6e 65 72 61 74 69 6f %%.parameters.and.data.generatio
c8e0 6e 0a 4e 20 3d 20 33 0a 64 20 3d 20 32 0a 6d 65 61 73 75 72 65 73 5f 6c 6f 63 61 74 69 6f 6e 73 n.N.=.3.d.=.2.measures_locations
c900 20 3d 20 5b 5d 0a 6d 65 61 73 75 72 65 73 5f 77 65 69 67 68 74 73 20 3d 20 5b 5d 0a 0a 66 6f 72 .=.[].measures_weights.=.[]..for
c920 20 69 20 69 6e 20 72 61 6e 67 65 28 4e 29 3a 0a 0a 20 20 20 20 6e 5f 69 20 3d 20 6e 70 2e 72 61 .i.in.range(N):......n_i.=.np.ra
c940 6e 64 6f 6d 2e 72 61 6e 64 69 6e 74 28 6c 6f 77 3d 31 2c 20 68 69 67 68 3d 32 30 29 20 20 23 20 ndom.randint(low=1,.high=20)..#.
c960 6e 62 20 73 61 6d 70 6c 65 73 0a 0a 20 20 20 20 6d 75 5f 69 20 3d 20 6e 70 2e 72 61 6e 64 6f 6d nb.samples......mu_i.=.np.random
c980 2e 6e 6f 72 6d 61 6c 28 30 2e 2c 20 34 2e 2c 20 28 64 2c 29 29 20 20 23 20 47 61 75 73 73 69 61 .normal(0.,.4.,.(d,))..#.Gaussia
c9a0 6e 20 6d 65 61 6e 0a 0a 20 20 20 20 41 5f 69 20 3d 20 6e 70 2e 72 61 6e 64 6f 6d 2e 72 61 6e 64 n.mean......A_i.=.np.random.rand
c9c0 28 64 2c 20 64 29 0a 20 20 20 20 63 6f 76 5f 69 20 3d 20 6e 70 2e 64 6f 74 28 41 5f 69 2c 20 41 (d,.d).....cov_i.=.np.dot(A_i,.A
c9e0 5f 69 2e 74 72 61 6e 73 70 6f 73 65 28 29 29 20 20 23 20 47 61 75 73 73 69 61 6e 20 63 6f 76 61 _i.transpose())..#.Gaussian.cova
ca00 72 69 61 6e 63 65 20 6d 61 74 72 69 78 0a 0a 20 20 20 20 78 5f 69 20 3d 20 6f 74 2e 64 61 74 61 riance.matrix......x_i.=.ot.data
ca20 73 65 74 73 2e 6d 61 6b 65 5f 32 44 5f 73 61 6d 70 6c 65 73 5f 67 61 75 73 73 28 6e 5f 69 2c 20 sets.make_2D_samples_gauss(n_i,.
ca40 6d 75 5f 69 2c 20 63 6f 76 5f 69 29 20 20 23 20 44 69 72 61 63 20 6c 6f 63 61 74 69 6f 6e 73 0a mu_i,.cov_i)..#.Dirac.locations.
ca60 20 20 20 20 62 5f 69 20 3d 20 6e 70 2e 72 61 6e 64 6f 6d 2e 75 6e 69 66 6f 72 6d 28 30 2e 2c 20 ....b_i.=.np.random.uniform(0.,.
ca80 31 2e 2c 20 28 6e 5f 69 2c 29 29 0a 20 20 20 20 62 5f 69 20 3d 20 62 5f 69 20 2f 20 6e 70 2e 73 1.,.(n_i,)).....b_i.=.b_i./.np.s
caa0 75 6d 28 62 5f 69 29 20 20 23 20 44 69 72 61 63 20 77 65 69 67 68 74 73 0a 0a 20 20 20 20 6d 65 um(b_i)..#.Dirac.weights......me
cac0 61 73 75 72 65 73 5f 6c 6f 63 61 74 69 6f 6e 73 2e 61 70 70 65 6e 64 28 78 5f 69 29 0a 20 20 20 asures_locations.append(x_i)....
cae0 20 6d 65 61 73 75 72 65 73 5f 77 65 69 67 68 74 73 2e 61 70 70 65 6e 64 28 62 5f 69 29 0a 0a 0a .measures_weights.append(b_i)...
cb00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
cb20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
cb40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 43 6f 6d 70 75 74 65 20 66 72 65 65 20 73 75 ##############.#.Compute.free.su
cb60 70 70 6f 72 74 20 62 61 72 79 63 65 6e 74 65 72 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d pport.barycenter.#.-------------
cb80 0a 0a 6b 20 3d 20 31 30 20 20 23 20 6e 75 6d 62 65 72 20 6f 66 20 44 69 72 61 63 73 20 6f 66 20 ..k.=.10..#.number.of.Diracs.of.
cba0 74 68 65 20 62 61 72 79 63 65 6e 74 65 72 0a 58 5f 69 6e 69 74 20 3d 20 6e 70 2e 72 61 6e 64 6f the.barycenter.X_init.=.np.rando
cbc0 6d 2e 6e 6f 72 6d 61 6c 28 30 2e 2c 20 31 2e 2c 20 28 6b 2c 20 64 29 29 20 20 23 20 69 6e 69 74 m.normal(0.,.1.,.(k,.d))..#.init
cbe0 69 61 6c 20 44 69 72 61 63 20 6c 6f 63 61 74 69 6f 6e 73 0a 62 20 3d 20 6e 70 2e 6f 6e 65 73 28 ial.Dirac.locations.b.=.np.ones(
cc00 28 6b 2c 29 29 20 2f 20 6b 20 20 23 20 77 65 69 67 68 74 73 20 6f 66 20 74 68 65 20 62 61 72 79 (k,))./.k..#.weights.of.the.bary
cc20 63 65 6e 74 65 72 20 28 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 center.(it.will.not.be.optimized
cc40 2c 20 6f 6e 6c 79 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73 20 61 72 65 20 6f 70 74 69 6d 69 7a ,.only.the.locations.are.optimiz
cc60 65 64 29 0a 0a 58 20 3d 20 6f 74 2e 6c 70 2e 66 72 65 65 5f 73 75 70 70 6f 72 74 5f 62 61 72 79 ed)..X.=.ot.lp.free_support_bary
cc80 63 65 6e 74 65 72 28 6d 65 61 73 75 72 65 73 5f 6c 6f 63 61 74 69 6f 6e 73 2c 20 6d 65 61 73 75 center(measures_locations,.measu
cca0 72 65 73 5f 77 65 69 67 68 74 73 2c 20 58 5f 69 6e 69 74 2c 20 62 29 0a 0a 0a 23 23 23 23 23 23 res_weights,.X_init,.b)...######
ccc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
cce0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
cd00 23 23 23 23 23 23 23 23 0a 23 20 50 6c 6f 74 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d ########.#.Plot.data.#.---------
cd20 0a 0a 70 6c 2e 66 69 67 75 72 65 28 31 29 0a 66 6f 72 20 28 78 5f 69 2c 20 62 5f 69 29 20 69 6e ..pl.figure(1).for.(x_i,.b_i).in
cd40 20 7a 69 70 28 6d 65 61 73 75 72 65 73 5f 6c 6f 63 61 74 69 6f 6e 73 2c 20 6d 65 61 73 75 72 65 .zip(measures_locations,.measure
cd60 73 5f 77 65 69 67 68 74 73 29 3a 0a 20 20 20 20 63 6f 6c 6f 72 20 3d 20 6e 70 2e 72 61 6e 64 6f s_weights):.....color.=.np.rando
cd80 6d 2e 72 61 6e 64 69 6e 74 28 6c 6f 77 3d 31 2c 20 68 69 67 68 3d 31 30 20 2a 20 4e 29 0a 20 20 m.randint(low=1,.high=10.*.N)...
cda0 20 20 70 6c 2e 73 63 61 74 74 65 72 28 78 5f 69 5b 3a 2c 20 30 5d 2c 20 78 5f 69 5b 3a 2c 20 31 ..pl.scatter(x_i[:,.0],.x_i[:,.1
cdc0 5d 2c 20 73 3d 62 20 2a 20 31 30 30 30 2c 20 6c 61 62 65 6c 3d 27 69 6e 70 75 74 20 6d 65 61 73 ],.s=b.*.1000,.label='input.meas
cde0 75 72 65 27 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 5b 3a 2c 20 30 5d 2c 20 58 5b 3a 2c 20 31 ure').pl.scatter(X[:,.0],.X[:,.1
ce00 5d 2c 20 73 3d 62 20 2a 20 31 30 30 30 2c 20 63 3d 27 62 6c 61 63 6b 27 2c 20 6d 61 72 6b 65 72 ],.s=b.*.1000,.c='black',.marker
ce20 3d 27 5e 27 2c 20 6c 61 62 65 6c 3d 27 32 2d 57 61 73 73 65 72 73 74 65 69 6e 20 62 61 72 79 63 ='^',.label='2-Wasserstein.baryc
ce40 65 6e 74 65 72 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 44 61 74 61 20 6d 65 61 73 75 72 65 73 20 enter').pl.title('Data.measures.
ce60 61 6e 64 20 74 68 65 69 72 20 62 61 72 79 63 65 6e 74 65 72 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 and.their.barycenter').pl.legend
ce80 28 6c 6f 63 3d 30 29 0a 70 6c 2e 73 68 6f 77 28 29 0a 50 4b 03 04 14 00 00 00 00 00 db 74 d9 4e (loc=0).pl.show().PK.........t.N
cea0 e5 5f 4e 9c 14 11 00 00 14 11 00 00 0b 00 00 00 70 6c 6f 74 5f 66 67 77 2e 70 79 23 20 2d 2a 2d ._N.............plot_fgw.py#.-*-
cec0 20 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0a 22 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d .coding:.utf-8.-*-.""".=========
cee0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 50 6c 6f 74 20 46 75 73 65 64 =====================.Plot.Fused
cf00 2d 67 72 6f 6d 6f 76 2d 57 61 73 73 65 72 73 74 65 69 6e 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d -gromov-Wasserstein.============
cf20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 54 68 69 73 20 65 78 61 6d 70 6c 65 ==================..This.example
cf40 20 69 6c 6c 75 73 74 72 61 74 65 73 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 .illustrates.the.computation.of.
cf60 46 47 57 20 66 6f 72 20 31 44 20 6d 65 61 73 75 72 65 73 5b 31 38 5d 2e 0a 0a 2e 2e 20 5b 31 38 FGW.for.1D.measures[18]......[18
cf80 5d 20 56 61 79 65 72 20 54 69 74 6f 75 61 6e 2c 20 43 68 61 70 65 6c 20 4c 61 65 74 69 74 69 61 ].Vayer.Titouan,.Chapel.Laetitia
cfa0 2c 20 46 6c 61 6d 61 72 79 20 52 7b 5c 27 65 7d 6d 69 2c 20 54 61 76 65 6e 61 72 64 20 52 6f 6d ,.Flamary.R{\'e}mi,.Tavenard.Rom
cfc0 61 69 6e 0a 20 20 20 20 20 20 61 6e 64 20 43 6f 75 72 74 79 20 4e 69 63 6f 6c 61 73 0a 20 20 20 ain.......and.Courty.Nicolas....
cfe0 20 22 4f 70 74 69 6d 61 6c 20 54 72 61 6e 73 70 6f 72 74 20 66 6f 72 20 73 74 72 75 63 74 75 72 ."Optimal.Transport.for.structur
d000 65 64 20 64 61 74 61 20 77 69 74 68 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 6e 20 67 72 61 70 ed.data.with.application.on.grap
d020 68 73 22 0a 20 20 20 20 49 6e 74 65 72 6e 61 74 69 6f 6e 61 6c 20 43 6f 6e 66 65 72 65 6e 63 65 hs".....International.Conference
d040 20 6f 6e 20 4d 61 63 68 69 6e 65 20 4c 65 61 72 6e 69 6e 67 20 28 49 43 4d 4c 29 2e 20 32 30 31 .on.Machine.Learning.(ICML)..201
d060 39 2e 0a 0a 22 22 22 0a 0a 23 20 41 75 74 68 6f 72 3a 20 54 69 74 6f 75 61 6e 20 56 61 79 65 72 9..."""..#.Author:.Titouan.Vayer
d080 20 3c 74 69 74 6f 75 61 6e 2e 76 61 79 65 72 40 69 72 69 73 61 2e 66 72 3e 0a 23 0a 23 20 4c 69 .<titouan.vayer@irisa.fr>.#.#.Li
d0a0 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 63 65 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6d 61 74 70 6c cense:.MIT.License..import.matpl
d0c0 6f 74 6c 69 62 2e 70 79 70 6c 6f 74 20 61 73 20 70 6c 0a 69 6d 70 6f 72 74 20 6e 75 6d 70 79 20 otlib.pyplot.as.pl.import.numpy.
d0e0 61 73 20 6e 70 0a 69 6d 70 6f 72 74 20 6f 74 0a 66 72 6f 6d 20 6f 74 2e 67 72 6f 6d 6f 76 20 69 as.np.import.ot.from.ot.gromov.i
d100 6d 70 6f 72 74 20 67 72 6f 6d 6f 76 5f 77 61 73 73 65 72 73 74 65 69 6e 2c 20 66 75 73 65 64 5f mport.gromov_wasserstein,.fused_
d120 67 72 6f 6d 6f 76 5f 77 61 73 73 65 72 73 74 65 69 6e 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 gromov_wasserstein..############
d140 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
d160 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
d180 23 23 0a 23 20 47 65 6e 65 72 61 74 65 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a ##.#.Generate.data.#.---------..
d1a0 23 25 25 20 70 61 72 61 6d 65 74 65 72 73 0a 23 20 57 65 20 63 72 65 61 74 65 20 74 77 6f 20 31 #%%.parameters.#.We.create.two.1
d1c0 44 20 72 61 6e 64 6f 6d 20 6d 65 61 73 75 72 65 73 0a 6e 20 3d 20 32 30 20 20 23 20 6e 75 6d 62 D.random.measures.n.=.20..#.numb
d1e0 65 72 20 6f 66 20 70 6f 69 6e 74 73 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 64 69 73 74 72 69 er.of.points.in.the.first.distri
d200 62 75 74 69 6f 6e 0a 6e 32 20 3d 20 33 30 20 20 23 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e bution.n2.=.30..#.number.of.poin
d220 74 73 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 64 69 73 74 72 69 62 75 74 69 6f 6e 0a 73 69 ts.in.the.second.distribution.si
d240 67 20 3d 20 31 20 20 23 20 73 74 64 20 6f 66 20 66 69 72 73 74 20 64 69 73 74 72 69 62 75 74 69 g.=.1..#.std.of.first.distributi
d260 6f 6e 0a 73 69 67 32 20 3d 20 30 2e 31 20 20 23 20 73 74 64 20 6f 66 20 73 65 63 6f 6e 64 20 64 on.sig2.=.0.1..#.std.of.second.d
d280 69 73 74 72 69 62 75 74 69 6f 6e 0a 0a 6e 70 2e 72 61 6e 64 6f 6d 2e 73 65 65 64 28 30 29 0a 0a istribution..np.random.seed(0)..
d2a0 70 68 69 20 3d 20 6e 70 2e 61 72 61 6e 67 65 28 6e 29 5b 3a 2c 20 4e 6f 6e 65 5d 0a 78 73 20 3d phi.=.np.arange(n)[:,.None].xs.=
d2c0 20 70 68 69 20 2b 20 73 69 67 20 2a 20 6e 70 2e 72 61 6e 64 6f 6d 2e 72 61 6e 64 6e 28 6e 2c 20 .phi.+.sig.*.np.random.randn(n,.
d2e0 31 29 0a 79 73 20 3d 20 6e 70 2e 76 73 74 61 63 6b 28 28 6e 70 2e 6f 6e 65 73 28 28 6e 20 2f 2f 1).ys.=.np.vstack((np.ones((n.//
d300 20 32 2c 20 31 29 29 2c 20 30 20 2a 20 6e 70 2e 6f 6e 65 73 28 28 6e 20 2f 2f 20 32 2c 20 31 29 .2,.1)),.0.*.np.ones((n.//.2,.1)
d320 29 29 29 20 2b 20 73 69 67 32 20 2a 20 6e 70 2e 72 61 6e 64 6f 6d 2e 72 61 6e 64 6e 28 6e 2c 20 ))).+.sig2.*.np.random.randn(n,.
d340 31 29 0a 0a 70 68 69 32 20 3d 20 6e 70 2e 61 72 61 6e 67 65 28 6e 32 29 5b 3a 2c 20 4e 6f 6e 65 1)..phi2.=.np.arange(n2)[:,.None
d360 5d 0a 78 74 20 3d 20 70 68 69 32 20 2b 20 73 69 67 20 2a 20 6e 70 2e 72 61 6e 64 6f 6d 2e 72 61 ].xt.=.phi2.+.sig.*.np.random.ra
d380 6e 64 6e 28 6e 32 2c 20 31 29 0a 79 74 20 3d 20 6e 70 2e 76 73 74 61 63 6b 28 28 6e 70 2e 6f 6e ndn(n2,.1).yt.=.np.vstack((np.on
d3a0 65 73 28 28 6e 32 20 2f 2f 20 32 2c 20 31 29 29 2c 20 30 20 2a 20 6e 70 2e 6f 6e 65 73 28 28 6e es((n2.//.2,.1)),.0.*.np.ones((n
d3c0 32 20 2f 2f 20 32 2c 20 31 29 29 29 29 20 2b 20 73 69 67 32 20 2a 20 6e 70 2e 72 61 6e 64 6f 6d 2.//.2,.1)))).+.sig2.*.np.random
d3e0 2e 72 61 6e 64 6e 28 6e 32 2c 20 31 29 0a 79 74 20 3d 20 79 74 5b 3a 3a 2d 31 2c 20 3a 5d 0a 0a .randn(n2,.1).yt.=.yt[::-1,.:]..
d400 70 20 3d 20 6f 74 2e 75 6e 69 66 28 6e 29 0a 71 20 3d 20 6f 74 2e 75 6e 69 66 28 6e 32 29 0a 0a p.=.ot.unif(n).q.=.ot.unif(n2)..
d420 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
d440 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
d460 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 50 6c 6f 74 20 64 61 74 61 0a 23 20 2d 2d 2d ##############.#.Plot.data.#.---
d480 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 70 6c 6f 74 20 74 68 65 20 64 69 73 74 72 69 62 75 74 69 6f ------..#%%.plot.the.distributio
d4a0 6e 73 0a 0a 70 6c 2e 63 6c 6f 73 65 28 31 30 29 0a 70 6c 2e 66 69 67 75 72 65 28 31 30 2c 20 28 ns..pl.close(10).pl.figure(10,.(
d4c0 37 2c 20 37 29 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 31 2c 20 31 29 0a 0a 70 6c 2e 7,.7))..pl.subplot(2,.1,.1)..pl.
d4e0 73 63 61 74 74 65 72 28 79 73 2c 20 78 73 2c 20 63 3d 70 68 69 2c 20 73 3d 37 30 29 0a 70 6c 2e scatter(ys,.xs,.c=phi,.s=70).pl.
d500 79 6c 61 62 65 6c 28 27 46 65 61 74 75 72 65 20 76 61 6c 75 65 20 61 27 2c 20 66 6f 6e 74 73 69 ylabel('Feature.value.a',.fontsi
d520 7a 65 3d 32 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 24 5c 6d 75 3d 5c 73 75 6d 5f 69 20 5c 64 65 ze=20).pl.title('$\mu=\sum_i.\de
d540 6c 74 61 5f 7b 78 5f 69 2c 61 5f 69 7d 24 27 2c 20 66 6f 6e 74 73 69 7a 65 3d 32 35 2c 20 75 73 lta_{x_i,a_i}$',.fontsize=25,.us
d560 65 74 65 78 3d 54 72 75 65 2c 20 79 3d 31 29 0a 70 6c 2e 78 74 69 63 6b 73 28 28 29 29 0a 70 6c etex=True,.y=1).pl.xticks(()).pl
d580 2e 79 74 69 63 6b 73 28 28 29 29 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 31 2c 20 32 29 0a .yticks(()).pl.subplot(2,.1,.2).
d5a0 70 6c 2e 73 63 61 74 74 65 72 28 79 74 2c 20 78 74 2c 20 63 3d 70 68 69 32 2c 20 73 3d 37 30 29 pl.scatter(yt,.xt,.c=phi2,.s=70)
d5c0 0a 70 6c 2e 78 6c 61 62 65 6c 28 27 63 6f 6f 72 64 69 6e 61 74 65 73 20 78 2f 79 27 2c 20 66 6f .pl.xlabel('coordinates.x/y',.fo
d5e0 6e 74 73 69 7a 65 3d 32 35 29 0a 70 6c 2e 79 6c 61 62 65 6c 28 27 46 65 61 74 75 72 65 20 76 61 ntsize=25).pl.ylabel('Feature.va
d600 6c 75 65 20 62 27 2c 20 66 6f 6e 74 73 69 7a 65 3d 32 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 24 lue.b',.fontsize=20).pl.title('$
d620 5c 5c 6e 75 3d 5c 73 75 6d 5f 6a 20 5c 64 65 6c 74 61 5f 7b 79 5f 6a 2c 62 5f 6a 7d 24 27 2c 20 \\nu=\sum_j.\delta_{y_j,b_j}$',.
d640 66 6f 6e 74 73 69 7a 65 3d 32 35 2c 20 75 73 65 74 65 78 3d 54 72 75 65 2c 20 79 3d 31 29 0a 70 fontsize=25,.usetex=True,.y=1).p
d660 6c 2e 79 74 69 63 6b 73 28 28 29 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 70 l.yticks(()).pl.tight_layout().p
d680 6c 2e 73 68 6f 77 28 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 l.show()..######################
d6a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
d6c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 43 72 65 61 74 ########################.#.Creat
d6e0 65 20 73 74 72 75 63 74 75 72 65 20 6d 61 74 72 69 63 65 73 20 61 6e 64 20 61 63 72 6f 73 73 2d e.structure.matrices.and.across-
d700 66 65 61 74 75 72 65 20 64 69 73 74 61 6e 63 65 20 6d 61 74 72 69 78 0a 23 20 2d 2d 2d 2d 2d 2d feature.distance.matrix.#.------
d720 2d 2d 2d 0a 0a 23 25 25 20 53 74 72 75 63 74 75 72 65 20 6d 61 74 72 69 63 65 73 20 61 6e 64 20 ---..#%%.Structure.matrices.and.
d740 61 63 72 6f 73 73 2d 66 65 61 74 75 72 65 73 20 64 69 73 74 61 6e 63 65 20 6d 61 74 72 69 78 0a across-features.distance.matrix.
d760 43 31 20 3d 20 6f 74 2e 64 69 73 74 28 78 73 29 0a 43 32 20 3d 20 6f 74 2e 64 69 73 74 28 78 74 C1.=.ot.dist(xs).C2.=.ot.dist(xt
d780 29 0a 4d 20 3d 20 6f 74 2e 64 69 73 74 28 79 73 2c 20 79 74 29 0a 77 31 20 3d 20 6f 74 2e 75 6e ).M.=.ot.dist(ys,.yt).w1.=.ot.un
d7a0 69 66 28 43 31 2e 73 68 61 70 65 5b 30 5d 29 0a 77 32 20 3d 20 6f 74 2e 75 6e 69 66 28 43 32 2e if(C1.shape[0]).w2.=.ot.unif(C2.
d7c0 73 68 61 70 65 5b 30 5d 29 0a 47 6f 74 20 3d 20 6f 74 2e 65 6d 64 28 5b 5d 2c 20 5b 5d 2c 20 4d shape[0]).Got.=.ot.emd([],.[],.M
d7e0 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 )..#############################
d800 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
d820 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 50 6c 6f 74 20 6d 61 74 72 69 63 65 #################.#.Plot.matrice
d840 73 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 0a 63 6d 61 70 20 3d 20 27 52 65 64 73 27 s.#.---------..#%%.cmap.=.'Reds'
d860 0a 70 6c 2e 63 6c 6f 73 65 28 31 30 29 0a 70 6c 2e 66 69 67 75 72 65 28 31 30 2c 20 28 35 2c 20 .pl.close(10).pl.figure(10,.(5,.
d880 35 29 29 0a 66 73 20 3d 20 31 35 0a 6c 5f 78 20 3d 20 5b 30 2c 20 35 2c 20 31 30 2c 20 31 35 5d 5)).fs.=.15.l_x.=.[0,.5,.10,.15]
d8a0 0a 6c 5f 79 20 3d 20 5b 30 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 5d 0a 67 73 .l_y.=.[0,.5,.10,.15,.20,.25].gs
d8c0 20 3d 20 70 6c 2e 47 72 69 64 53 70 65 63 28 35 2c 20 35 29 0a 0a 61 78 31 20 3d 20 70 6c 2e 73 .=.pl.GridSpec(5,.5)..ax1.=.pl.s
d8e0 75 62 70 6c 6f 74 28 67 73 5b 33 3a 2c 20 3a 32 5d 29 0a 0a 70 6c 2e 69 6d 73 68 6f 77 28 43 31 ubplot(gs[3:,.:2])..pl.imshow(C1
d900 2c 20 63 6d 61 70 3d 63 6d 61 70 2c 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 72 ,.cmap=cmap,.interpolation='near
d920 65 73 74 27 29 0a 70 6c 2e 74 69 74 6c 65 28 22 24 43 5f 31 24 22 2c 20 66 6f 6e 74 73 69 7a 65 est').pl.title("$C_1$",.fontsize
d940 3d 66 73 29 0a 70 6c 2e 78 6c 61 62 65 6c 28 22 24 6b 24 22 2c 20 66 6f 6e 74 73 69 7a 65 3d 66 =fs).pl.xlabel("$k$",.fontsize=f
d960 73 29 0a 70 6c 2e 79 6c 61 62 65 6c 28 22 24 69 24 22 2c 20 66 6f 6e 74 73 69 7a 65 3d 66 73 29 s).pl.ylabel("$i$",.fontsize=fs)
d980 0a 70 6c 2e 78 74 69 63 6b 73 28 6c 5f 78 29 0a 70 6c 2e 79 74 69 63 6b 73 28 6c 5f 78 29 0a 0a .pl.xticks(l_x).pl.yticks(l_x)..
d9a0 61 78 32 20 3d 20 70 6c 2e 73 75 62 70 6c 6f 74 28 67 73 5b 3a 33 2c 20 32 3a 5d 29 0a 0a 70 6c ax2.=.pl.subplot(gs[:3,.2:])..pl
d9c0 2e 69 6d 73 68 6f 77 28 43 32 2c 20 63 6d 61 70 3d 63 6d 61 70 2c 20 69 6e 74 65 72 70 6f 6c 61 .imshow(C2,.cmap=cmap,.interpola
d9e0 74 69 6f 6e 3d 27 6e 65 61 72 65 73 74 27 29 0a 70 6c 2e 74 69 74 6c 65 28 22 24 43 5f 32 24 22 tion='nearest').pl.title("$C_2$"
da00 2c 20 66 6f 6e 74 73 69 7a 65 3d 66 73 29 0a 70 6c 2e 79 6c 61 62 65 6c 28 22 24 6c 24 22 2c 20 ,.fontsize=fs).pl.ylabel("$l$",.
da20 66 6f 6e 74 73 69 7a 65 3d 66 73 29 0a 23 70 6c 2e 79 6c 61 62 65 6c 28 22 24 6c 24 22 2c 66 6f fontsize=fs).#pl.ylabel("$l$",fo
da40 6e 74 73 69 7a 65 3d 66 73 29 0a 70 6c 2e 78 74 69 63 6b 73 28 28 29 29 0a 70 6c 2e 79 74 69 63 ntsize=fs).pl.xticks(()).pl.ytic
da60 6b 73 28 6c 5f 79 29 0a 61 78 32 2e 73 65 74 5f 61 73 70 65 63 74 28 27 61 75 74 6f 27 29 0a 0a ks(l_y).ax2.set_aspect('auto')..
da80 61 78 33 20 3d 20 70 6c 2e 73 75 62 70 6c 6f 74 28 67 73 5b 33 3a 2c 20 32 3a 5d 2c 20 73 68 61 ax3.=.pl.subplot(gs[3:,.2:],.sha
daa0 72 65 78 3d 61 78 32 2c 20 73 68 61 72 65 79 3d 61 78 31 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 4d rex=ax2,.sharey=ax1).pl.imshow(M
dac0 2c 20 63 6d 61 70 3d 63 6d 61 70 2c 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 72 ,.cmap=cmap,.interpolation='near
dae0 65 73 74 27 29 0a 70 6c 2e 79 74 69 63 6b 73 28 6c 5f 78 29 0a 70 6c 2e 78 74 69 63 6b 73 28 6c est').pl.yticks(l_x).pl.xticks(l
db00 5f 79 29 0a 70 6c 2e 79 6c 61 62 65 6c 28 22 24 69 24 22 2c 20 66 6f 6e 74 73 69 7a 65 3d 66 73 _y).pl.ylabel("$i$",.fontsize=fs
db20 29 0a 70 6c 2e 74 69 74 6c 65 28 22 24 4d 5f 7b 41 42 7d 24 22 2c 20 66 6f 6e 74 73 69 7a 65 3d ).pl.title("$M_{AB}$",.fontsize=
db40 66 73 29 0a 70 6c 2e 78 6c 61 62 65 6c 28 22 24 6a 24 22 2c 20 66 6f 6e 74 73 69 7a 65 3d 66 73 fs).pl.xlabel("$j$",.fontsize=fs
db60 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 61 78 33 2e 73 65 74 5f 61 73 70 65 ).pl.tight_layout().ax3.set_aspe
db80 63 74 28 27 61 75 74 6f 27 29 0a 70 6c 2e 73 68 6f 77 28 29 0a 0a 23 23 23 23 23 23 23 23 23 23 ct('auto').pl.show()..##########
dba0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
dbc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
dbe0 23 23 23 23 0a 23 20 43 6f 6d 70 75 74 65 20 46 47 57 2f 47 57 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d ####.#.Compute.FGW/GW.#.--------
dc00 2d 0a 0a 23 25 25 20 43 6f 6d 70 75 74 69 6e 67 20 46 47 57 20 61 6e 64 20 47 57 0a 61 6c 70 68 -..#%%.Computing.FGW.and.GW.alph
dc20 61 20 3d 20 31 65 2d 33 0a 0a 6f 74 2e 74 69 63 28 29 0a 47 77 67 2c 20 6c 6f 67 77 20 3d 20 66 a.=.1e-3..ot.tic().Gwg,.logw.=.f
dc40 75 73 65 64 5f 67 72 6f 6d 6f 76 5f 77 61 73 73 65 72 73 74 65 69 6e 28 4d 2c 20 43 31 2c 20 43 used_gromov_wasserstein(M,.C1,.C
dc60 32 2c 20 70 2c 20 71 2c 20 6c 6f 73 73 5f 66 75 6e 3d 27 73 71 75 61 72 65 5f 6c 6f 73 73 27 2c 2,.p,.q,.loss_fun='square_loss',
dc80 20 61 6c 70 68 61 3d 61 6c 70 68 61 2c 20 76 65 72 62 6f 73 65 3d 54 72 75 65 2c 20 6c 6f 67 3d .alpha=alpha,.verbose=True,.log=
dca0 54 72 75 65 29 0a 6f 74 2e 74 6f 63 28 29 0a 0a 23 25 72 65 6c 6f 61 64 5f 65 78 74 20 57 47 57 True).ot.toc()..#%reload_ext.WGW
dcc0 0a 47 67 2c 20 6c 6f 67 20 3d 20 67 72 6f 6d 6f 76 5f 77 61 73 73 65 72 73 74 65 69 6e 28 43 31 .Gg,.log.=.gromov_wasserstein(C1
dce0 2c 20 43 32 2c 20 70 2c 20 71 2c 20 6c 6f 73 73 5f 66 75 6e 3d 27 73 71 75 61 72 65 5f 6c 6f 73 ,.C2,.p,.q,.loss_fun='square_los
dd00 73 27 2c 20 76 65 72 62 6f 73 65 3d 54 72 75 65 2c 20 6c 6f 67 3d 54 72 75 65 29 0a 0a 23 23 23 s',.verbose=True,.log=True)..###
dd20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
dd40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
dd60 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 56 69 73 75 61 6c 69 7a 65 20 74 72 61 6e 73 70 6f 72 ###########.#.Visualize.transpor
dd80 74 20 6d 61 74 72 69 63 65 73 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 76 69 73 75 t.matrices.#.---------..#%%.visu
dda0 20 4f 54 20 6d 61 74 72 69 78 0a 63 6d 61 70 20 3d 20 27 42 6c 75 65 73 27 0a 66 73 20 3d 20 31 .OT.matrix.cmap.=.'Blues'.fs.=.1
ddc0 35 0a 70 6c 2e 66 69 67 75 72 65 28 32 2c 20 28 31 33 2c 20 35 29 29 0a 70 6c 2e 63 6c 66 28 29 5.pl.figure(2,.(13,.5)).pl.clf()
dde0 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 33 2c 20 31 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 47 .pl.subplot(1,.3,.1).pl.imshow(G
de00 6f 74 2c 20 63 6d 61 70 3d 63 6d 61 70 2c 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 ot,.cmap=cmap,.interpolation='ne
de20 61 72 65 73 74 27 29 0a 23 70 6c 2e 78 6c 61 62 65 6c 28 22 24 79 24 22 2c 66 6f 6e 74 73 69 7a arest').#pl.xlabel("$y$",fontsiz
de40 65 3d 66 73 29 0a 70 6c 2e 79 6c 61 62 65 6c 28 22 24 69 24 22 2c 20 66 6f 6e 74 73 69 7a 65 3d e=fs).pl.ylabel("$i$",.fontsize=
de60 66 73 29 0a 70 6c 2e 78 74 69 63 6b 73 28 28 29 29 0a 0a 70 6c 2e 74 69 74 6c 65 28 27 57 61 73 fs).pl.xticks(())..pl.title('Was
de80 73 65 72 73 74 65 69 6e 20 28 24 4d 24 20 6f 6e 6c 79 29 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f serstein.($M$.only)')..pl.subplo
dea0 74 28 31 2c 20 33 2c 20 32 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 47 67 2c 20 63 6d 61 70 3d 63 6d t(1,.3,.2).pl.imshow(Gg,.cmap=cm
dec0 61 70 2c 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 72 65 73 74 27 29 0a 70 6c 2e ap,.interpolation='nearest').pl.
dee0 74 69 74 6c 65 28 27 47 72 6f 6d 6f 76 20 28 24 43 5f 31 2c 43 5f 32 24 20 6f 6e 6c 79 29 27 29 title('Gromov.($C_1,C_2$.only)')
df00 0a 70 6c 2e 78 74 69 63 6b 73 28 28 29 29 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 33 2c 20 .pl.xticks(()).pl.subplot(1,.3,.
df20 33 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 47 77 67 2c 20 63 6d 61 70 3d 63 6d 61 70 2c 20 69 6e 74 3).pl.imshow(Gwg,.cmap=cmap,.int
df40 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 72 65 73 74 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 erpolation='nearest').pl.title('
df60 46 47 57 20 20 28 24 4d 2b 43 5f 31 2c 43 5f 32 24 29 27 29 0a 0a 70 6c 2e 78 6c 61 62 65 6c 28 FGW..($M+C_1,C_2$)')..pl.xlabel(
df80 22 24 6a 24 22 2c 20 66 6f 6e 74 73 69 7a 65 3d 66 73 29 0a 70 6c 2e 79 6c 61 62 65 6c 28 22 24 "$j$",.fontsize=fs).pl.ylabel("$
dfa0 69 24 22 2c 20 66 6f 6e 74 73 69 7a 65 3d 66 73 29 0a 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f i$",.fontsize=fs)..pl.tight_layo
dfc0 75 74 28 29 0a 70 6c 2e 73 68 6f 77 28 29 0a 50 4b 03 04 14 00 00 00 00 00 db 74 d9 4e ea 88 04 ut().pl.show().PK.........t.N...
dfe0 1c d5 18 00 00 d5 18 00 00 16 00 00 00 70 6c 6f 74 5f 62 61 72 79 63 65 6e 74 65 72 5f 66 67 77 .............plot_barycenter_fgw
e000 2e 70 79 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0a 22 22 22 0a 3d .py#.-*-.coding:.utf-8.-*-.""".=
e020 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================================
e040 0a 50 6c 6f 74 20 67 72 61 70 68 73 27 20 62 61 72 79 63 65 6e 74 65 72 20 75 73 69 6e 67 20 46 .Plot.graphs'.barycenter.using.F
e060 47 57 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d GW.=============================
e080 3d 3d 3d 3d 0a 0a 54 68 69 73 20 65 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61 74 65 73 20 74 ====..This.example.illustrates.t
e0a0 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 62 61 72 79 63 65 6e 74 65 72 20 6f 66 20 6c 61 62 he.computation.barycenter.of.lab
e0c0 65 6c 65 64 20 67 72 61 70 68 73 20 75 73 69 6e 67 20 46 47 57 0a 0a 52 65 71 75 69 72 65 73 20 eled.graphs.using.FGW..Requires.
e0e0 6e 65 74 77 6f 72 6b 78 20 3e 3d 32 0a 0a 2e 2e 20 5b 31 38 5d 20 56 61 79 65 72 20 54 69 74 6f networkx.>=2.....[18].Vayer.Tito
e100 75 61 6e 2c 20 43 68 61 70 65 6c 20 4c 61 65 74 69 74 69 61 2c 20 46 6c 61 6d 61 72 79 20 52 7b uan,.Chapel.Laetitia,.Flamary.R{
e120 5c 27 65 7d 6d 69 2c 20 54 61 76 65 6e 61 72 64 20 52 6f 6d 61 69 6e 0a 20 20 20 20 20 20 61 6e \'e}mi,.Tavenard.Romain.......an
e140 64 20 43 6f 75 72 74 79 20 4e 69 63 6f 6c 61 73 0a 20 20 20 20 22 4f 70 74 69 6d 61 6c 20 54 72 d.Courty.Nicolas....."Optimal.Tr
e160 61 6e 73 70 6f 72 74 20 66 6f 72 20 73 74 72 75 63 74 75 72 65 64 20 64 61 74 61 20 77 69 74 68 ansport.for.structured.data.with
e180 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 6e 20 67 72 61 70 68 73 22 0a 20 20 20 20 49 6e 74 65 .application.on.graphs".....Inte
e1a0 72 6e 61 74 69 6f 6e 61 6c 20 43 6f 6e 66 65 72 65 6e 63 65 20 6f 6e 20 4d 61 63 68 69 6e 65 20 rnational.Conference.on.Machine.
e1c0 4c 65 61 72 6e 69 6e 67 20 28 49 43 4d 4c 29 2e 20 32 30 31 39 2e 0a 0a 22 22 22 0a 0a 23 20 41 Learning.(ICML)..2019..."""..#.A
e1e0 75 74 68 6f 72 3a 20 54 69 74 6f 75 61 6e 20 56 61 79 65 72 20 3c 74 69 74 6f 75 61 6e 2e 76 61 uthor:.Titouan.Vayer.<titouan.va
e200 79 65 72 40 69 72 69 73 61 2e 66 72 3e 0a 23 0a 23 20 4c 69 63 65 6e 73 65 3a 20 4d 49 54 20 4c yer@irisa.fr>.#.#.License:.MIT.L
e220 69 63 65 6e 73 65 0a 0a 23 25 25 20 6c 6f 61 64 20 6c 69 62 72 61 72 69 65 73 0a 69 6d 70 6f 72 icense..#%%.load.libraries.impor
e240 74 20 6e 75 6d 70 79 20 61 73 20 6e 70 0a 69 6d 70 6f 72 74 20 6d 61 74 70 6c 6f 74 6c 69 62 2e t.numpy.as.np.import.matplotlib.
e260 70 79 70 6c 6f 74 20 61 73 20 70 6c 74 0a 69 6d 70 6f 72 74 20 6e 65 74 77 6f 72 6b 78 20 61 73 pyplot.as.plt.import.networkx.as
e280 20 6e 78 0a 69 6d 70 6f 72 74 20 6d 61 74 68 0a 66 72 6f 6d 20 73 63 69 70 79 2e 73 70 61 72 73 .nx.import.math.from.scipy.spars
e2a0 65 2e 63 73 67 72 61 70 68 20 69 6d 70 6f 72 74 20 73 68 6f 72 74 65 73 74 5f 70 61 74 68 0a 69 e.csgraph.import.shortest_path.i
e2c0 6d 70 6f 72 74 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 63 6f 6c 6f 72 73 20 61 73 20 6d 63 6f 6c 0a mport.matplotlib.colors.as.mcol.
e2e0 66 72 6f 6d 20 6d 61 74 70 6c 6f 74 6c 69 62 20 69 6d 70 6f 72 74 20 63 6d 0a 66 72 6f 6d 20 6f from.matplotlib.import.cm.from.o
e300 74 2e 67 72 6f 6d 6f 76 20 69 6d 70 6f 72 74 20 66 67 77 5f 62 61 72 79 63 65 6e 74 65 72 73 0a t.gromov.import.fgw_barycenters.
e320 23 25 25 20 47 72 61 70 68 20 66 75 6e 63 74 69 6f 6e 73 0a 0a 0a 64 65 66 20 66 69 6e 64 5f 74 #%%.Graph.functions...def.find_t
e340 68 72 65 73 68 28 43 2c 20 69 6e 66 3d 30 2e 35 2c 20 73 75 70 3d 33 2c 20 73 74 65 70 3d 31 30 hresh(C,.inf=0.5,.sup=3,.step=10
e360 29 3a 0a 20 20 20 20 22 22 22 20 54 72 69 63 6b 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61 64 65 ):.....""".Trick.to.find.the.ade
e380 71 75 61 74 65 20 74 68 72 65 73 68 6f 6c 64 73 20 66 72 6f 6d 20 77 68 65 72 65 20 76 61 6c 75 quate.thresholds.from.where.valu
e3a0 65 20 6f 66 20 74 68 65 20 43 20 6d 61 74 72 69 78 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 e.of.the.C.matrix.are.considered
e3c0 20 63 6c 6f 73 65 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 79 20 74 68 61 74 20 6e 6f 64 65 73 20 .close.enough.to.say.that.nodes.
e3e0 61 72 65 20 63 6f 6e 6e 65 63 74 65 64 0a 20 20 20 20 20 20 20 20 54 74 68 65 20 74 68 72 65 73 are.connected.........Tthe.thres
e400 68 6f 6c 64 20 69 73 20 66 6f 75 6e 64 20 62 79 20 61 20 6c 69 6e 65 73 65 61 72 63 68 20 62 65 hold.is.found.by.a.linesearch.be
e420 74 77 65 65 6e 20 76 61 6c 75 65 73 20 22 69 6e 66 22 20 61 6e 64 20 22 73 75 70 22 20 77 69 74 tween.values."inf".and."sup".wit
e440 68 20 22 73 74 65 70 22 20 74 68 72 65 73 68 6f 6c 64 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20 h."step".thresholds.tested......
e460 20 20 20 20 54 68 65 20 6f 70 74 69 6d 61 6c 20 74 68 72 65 73 68 6f 6c 64 20 69 73 20 74 68 65 ....The.optimal.threshold.is.the
e480 20 6f 6e 65 20 77 68 69 63 68 20 6d 69 6e 69 6d 69 7a 65 73 20 74 68 65 20 72 65 63 6f 6e 73 74 .one.which.minimizes.the.reconst
e4a0 72 75 63 74 69 6f 6e 20 65 72 72 6f 72 20 62 65 74 77 65 65 6e 20 74 68 65 20 73 68 6f 72 74 65 ruction.error.between.the.shorte
e4c0 73 74 5f 70 61 74 68 20 6d 61 74 72 69 78 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 74 st_path.matrix.coming.from.the.t
e4e0 68 72 65 73 68 6f 6c 64 65 64 20 61 64 6a 65 6e 63 79 20 6d 61 74 72 69 78 0a 20 20 20 20 20 20 hresholded.adjency.matrix.......
e500 20 20 61 6e 64 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 61 74 72 69 78 2e 0a 20 20 20 20 50 ..and.the.original.matrix......P
e520 61 72 61 6d 65 74 65 72 73 0a 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 20 20 43 20 3a arameters.....----------.....C.:
e540 20 6e 64 61 72 72 61 79 2c 20 73 68 61 70 65 20 28 6e 5f 6e 6f 64 65 73 2c 6e 5f 6e 6f 64 65 73 .ndarray,.shape.(n_nodes,n_nodes
e560 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20 6d 61 74 72 ).............The.structure.matr
e580 69 78 20 74 6f 20 74 68 72 65 73 68 6f 6c 64 0a 20 20 20 20 69 6e 66 20 3a 20 66 6c 6f 61 74 0a ix.to.threshold.....inf.:.float.
e5a0 20 20 20 20 20 20 20 20 20 20 54 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c ..........The.beginning.of.the.l
e5c0 69 6e 65 73 65 61 72 63 68 0a 20 20 20 20 73 75 70 20 3a 20 66 6c 6f 61 74 0a 20 20 20 20 20 20 inesearch.....sup.:.float.......
e5e0 20 20 20 20 54 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 6e 65 73 65 61 72 63 68 0a 20 20 ....The.end.of.the.linesearch...
e600 20 20 73 74 65 70 20 3a 20 69 6e 74 65 67 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 4e 75 6d ..step.:.integer.............Num
e620 62 65 72 20 6f 66 20 74 68 72 65 73 68 6f 6c 64 73 20 74 65 73 74 65 64 0a 20 20 20 20 22 22 22 ber.of.thresholds.tested....."""
e640 0a 20 20 20 20 64 69 73 74 20 3d 20 5b 5d 0a 20 20 20 20 73 65 61 72 63 68 20 3d 20 6e 70 2e 6c .....dist.=.[].....search.=.np.l
e660 69 6e 73 70 61 63 65 28 69 6e 66 2c 20 73 75 70 2c 20 73 74 65 70 29 0a 20 20 20 20 66 6f 72 20 inspace(inf,.sup,.step).....for.
e680 74 68 72 65 73 68 20 69 6e 20 73 65 61 72 63 68 3a 0a 20 20 20 20 20 20 20 20 43 70 72 69 6d 65 thresh.in.search:.........Cprime
e6a0 20 3d 20 73 70 5f 74 6f 5f 61 64 6a 65 6e 63 79 28 43 2c 20 30 2c 20 74 68 72 65 73 68 29 0a 20 .=.sp_to_adjency(C,.0,.thresh)..
e6c0 20 20 20 20 20 20 20 53 43 20 3d 20 73 68 6f 72 74 65 73 74 5f 70 61 74 68 28 43 70 72 69 6d 65 .......SC.=.shortest_path(Cprime
e6e0 2c 20 6d 65 74 68 6f 64 3d 27 44 27 29 0a 20 20 20 20 20 20 20 20 53 43 5b 53 43 20 3d 3d 20 66 ,.method='D').........SC[SC.==.f
e700 6c 6f 61 74 28 27 69 6e 66 27 29 5d 20 3d 20 31 30 30 0a 20 20 20 20 20 20 20 20 64 69 73 74 2e loat('inf')].=.100.........dist.
e720 61 70 70 65 6e 64 28 6e 70 2e 6c 69 6e 61 6c 67 2e 6e 6f 72 6d 28 53 43 20 2d 20 43 29 29 0a 20 append(np.linalg.norm(SC.-.C))..
e740 20 20 20 72 65 74 75 72 6e 20 73 65 61 72 63 68 5b 6e 70 2e 61 72 67 6d 69 6e 28 64 69 73 74 29 ...return.search[np.argmin(dist)
e760 5d 2c 20 64 69 73 74 0a 0a 0a 64 65 66 20 73 70 5f 74 6f 5f 61 64 6a 65 6e 63 79 28 43 2c 20 74 ],.dist...def.sp_to_adjency(C,.t
e780 68 72 65 73 68 69 6e 66 3d 30 2e 32 2c 20 74 68 72 65 73 68 73 75 70 3d 31 2e 38 29 3a 0a 20 20 hreshinf=0.2,.threshsup=1.8):...
e7a0 20 20 22 22 22 20 54 68 72 65 73 68 6f 6c 64 73 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6d ..""".Thresholds.the.structure.m
e7c0 61 74 72 69 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 75 74 65 20 61 6e 20 61 64 6a atrix.in.order.to.compute.an.adj
e7e0 65 6e 63 79 20 6d 61 74 72 69 78 2e 0a 20 20 20 20 41 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77 ency.matrix......All.values.betw
e800 65 65 6e 20 74 68 72 65 73 68 69 6e 66 20 61 6e 64 20 74 68 72 65 73 68 73 75 70 20 61 72 65 20 een.threshinf.and.threshsup.are.
e820 63 6f 6e 73 69 64 65 72 65 64 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 63 6f 6e 6e 65 63 74 65 considered.representing.connecte
e840 64 20 6e 6f 64 65 73 20 61 6e 64 20 73 65 74 20 74 6f 20 31 2e 20 45 6c 73 65 20 61 72 65 20 73 d.nodes.and.set.to.1..Else.are.s
e860 65 74 20 74 6f 20 30 0a 20 20 20 20 50 61 72 61 6d 65 74 65 72 73 0a 20 20 20 20 2d 2d 2d 2d 2d et.to.0.....Parameters.....-----
e880 2d 2d 2d 2d 2d 0a 20 20 20 20 43 20 3a 20 6e 64 61 72 72 61 79 2c 20 73 68 61 70 65 20 28 6e 5f -----.....C.:.ndarray,.shape.(n_
e8a0 6e 6f 64 65 73 2c 6e 5f 6e 6f 64 65 73 29 0a 20 20 20 20 20 20 20 20 54 68 65 20 73 74 72 75 63 nodes,n_nodes).........The.struc
e8c0 74 75 72 65 20 6d 61 74 72 69 78 20 74 6f 20 74 68 72 65 73 68 6f 6c 64 0a 20 20 20 20 74 68 72 ture.matrix.to.threshold.....thr
e8e0 65 73 68 69 6e 66 20 3a 20 66 6c 6f 61 74 0a 20 20 20 20 20 20 20 20 54 68 65 20 6d 69 6e 69 6d eshinf.:.float.........The.minim
e900 75 6d 20 76 61 6c 75 65 20 6f 66 20 64 69 73 74 61 6e 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20 um.value.of.distance.from.which.
e920 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 31 0a 20 20 20 20 74 68 the.new.value.is.set.to.1.....th
e940 72 65 73 68 73 75 70 20 3a 20 66 6c 6f 61 74 0a 20 20 20 20 20 20 20 20 54 68 65 20 6d 61 78 69 reshsup.:.float.........The.maxi
e960 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 64 69 73 74 61 6e 63 65 20 66 72 6f 6d 20 77 68 69 63 68 mum.value.of.distance.from.which
e980 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 31 0a 20 20 20 20 52 .the.new.value.is.set.to.1.....R
e9a0 65 74 75 72 6e 73 0a 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 0a 20 20 20 20 43 20 3a 20 6e 64 61 72 72 eturns.....-------.....C.:.ndarr
e9c0 61 79 2c 20 73 68 61 70 65 20 28 6e 5f 6e 6f 64 65 73 2c 6e 5f 6e 6f 64 65 73 29 0a 20 20 20 20 ay,.shape.(n_nodes,n_nodes).....
e9e0 20 20 20 20 54 68 65 20 74 68 72 65 73 68 6f 6c 64 20 6d 61 74 72 69 78 2e 20 45 61 63 68 20 65 ....The.threshold.matrix..Each.e
ea00 6c 65 6d 65 6e 74 20 69 73 20 69 6e 20 7b 30 2c 31 7d 0a 20 20 20 20 22 22 22 0a 20 20 20 20 48 lement.is.in.{0,1}.....""".....H
ea20 20 3d 20 6e 70 2e 7a 65 72 6f 73 5f 6c 69 6b 65 28 43 29 0a 20 20 20 20 6e 70 2e 66 69 6c 6c 5f .=.np.zeros_like(C).....np.fill_
ea40 64 69 61 67 6f 6e 61 6c 28 48 2c 20 6e 70 2e 64 69 61 67 6f 6e 61 6c 28 43 29 29 0a 20 20 20 20 diagonal(H,.np.diagonal(C)).....
ea60 43 20 3d 20 43 20 2d 20 48 0a 20 20 20 20 43 20 3d 20 6e 70 2e 6d 69 6e 69 6d 75 6d 28 6e 70 2e C.=.C.-.H.....C.=.np.minimum(np.
ea80 6d 61 78 69 6d 75 6d 28 43 2c 20 74 68 72 65 73 68 69 6e 66 29 2c 20 74 68 72 65 73 68 73 75 70 maximum(C,.threshinf),.threshsup
eaa0 29 0a 20 20 20 20 43 5b 43 20 3d 3d 20 74 68 72 65 73 68 73 75 70 5d 20 3d 20 30 0a 20 20 20 20 ).....C[C.==.threshsup].=.0.....
eac0 43 5b 43 20 21 3d 20 30 5d 20 3d 20 31 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 43 0a 0a 0a 64 65 C[C.!=.0].=.1......return.C...de
eae0 66 20 62 75 69 6c 64 5f 6e 6f 69 73 79 5f 63 69 72 63 75 6c 61 72 5f 67 72 61 70 68 28 4e 3d 32 f.build_noisy_circular_graph(N=2
eb00 30 2c 20 6d 75 3d 30 2c 20 73 69 67 6d 61 3d 30 2e 33 2c 20 77 69 74 68 5f 6e 6f 69 73 65 3d 46 0,.mu=0,.sigma=0.3,.with_noise=F
eb20 61 6c 73 65 2c 20 73 74 72 75 63 74 75 72 65 5f 6e 6f 69 73 65 3d 46 61 6c 73 65 2c 20 70 3d 4e alse,.structure_noise=False,.p=N
eb40 6f 6e 65 29 3a 0a 20 20 20 20 22 22 22 20 43 72 65 61 74 65 20 61 20 6e 6f 69 73 79 20 63 69 72 one):.....""".Create.a.noisy.cir
eb60 63 75 6c 61 72 20 67 72 61 70 68 0a 20 20 20 20 22 22 22 0a 20 20 20 20 67 20 3d 20 6e 78 2e 47 cular.graph.....""".....g.=.nx.G
eb80 72 61 70 68 28 29 0a 20 20 20 20 67 2e 61 64 64 5f 6e 6f 64 65 73 5f 66 72 6f 6d 28 6c 69 73 74 raph().....g.add_nodes_from(list
eba0 28 72 61 6e 67 65 28 4e 29 29 29 0a 20 20 20 20 66 6f 72 20 69 20 69 6e 20 72 61 6e 67 65 28 4e (range(N))).....for.i.in.range(N
ebc0 29 3a 0a 20 20 20 20 20 20 20 20 6e 6f 69 73 65 20 3d 20 66 6c 6f 61 74 28 6e 70 2e 72 61 6e 64 ):.........noise.=.float(np.rand
ebe0 6f 6d 2e 6e 6f 72 6d 61 6c 28 6d 75 2c 20 73 69 67 6d 61 2c 20 31 29 29 0a 20 20 20 20 20 20 20 om.normal(mu,.sigma,.1))........
ec00 20 69 66 20 77 69 74 68 5f 6e 6f 69 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 2e 61 64 .if.with_noise:.............g.ad
ec20 64 5f 6e 6f 64 65 28 69 2c 20 61 74 74 72 5f 6e 61 6d 65 3d 6d 61 74 68 2e 73 69 6e 28 28 32 20 d_node(i,.attr_name=math.sin((2.
ec40 2a 20 69 20 2a 20 6d 61 74 68 2e 70 69 20 2f 20 4e 29 29 20 2b 20 6e 6f 69 73 65 29 0a 20 20 20 *.i.*.math.pi./.N)).+.noise)....
ec60 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 2e 61 64 64 5f 6e 6f 64 .....else:.............g.add_nod
ec80 65 28 69 2c 20 61 74 74 72 5f 6e 61 6d 65 3d 6d 61 74 68 2e 73 69 6e 28 32 20 2a 20 69 20 2a 20 e(i,.attr_name=math.sin(2.*.i.*.
eca0 6d 61 74 68 2e 70 69 20 2f 20 4e 29 29 0a 20 20 20 20 20 20 20 20 67 2e 61 64 64 5f 65 64 67 65 math.pi./.N)).........g.add_edge
ecc0 28 69 2c 20 69 20 2b 20 31 29 0a 20 20 20 20 20 20 20 20 69 66 20 73 74 72 75 63 74 75 72 65 5f (i,.i.+.1).........if.structure_
ece0 6e 6f 69 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61 6e 64 6f 6d 69 6e 74 20 3d 20 6e noise:.............randomint.=.n
ed00 70 2e 72 61 6e 64 6f 6d 2e 72 61 6e 64 69 6e 74 28 30 2c 20 70 29 0a 20 20 20 20 20 20 20 20 20 p.random.randint(0,.p)..........
ed20 20 20 20 69 66 20 72 61 6e 64 6f 6d 69 6e 74 20 3d 3d 20 30 3a 0a 20 20 20 20 20 20 20 20 20 20 ...if.randomint.==.0:...........
ed40 20 20 20 20 20 20 69 66 20 69 20 3c 3d 20 4e 20 2d 20 33 3a 0a 20 20 20 20 20 20 20 20 20 20 20 ......if.i.<=.N.-.3:............
ed60 20 20 20 20 20 20 20 20 20 67 2e 61 64 64 5f 65 64 67 65 28 69 2c 20 69 20 2b 20 32 29 0a 20 20 .........g.add_edge(i,.i.+.2)...
ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 69 20 3d 3d 20 4e 20 2d 20 32 3a 0a 20 20 20 ..............if.i.==.N.-.2:....
eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 2e 61 64 64 5f 65 64 67 65 28 69 2c 20 30 .................g.add_edge(i,.0
edc0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 69 20 3d 3d 20 4e 20 2d 20 31 3a ).................if.i.==.N.-.1:
ede0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 2e 61 64 64 5f 65 64 67 65 28 .....................g.add_edge(
ee00 69 2c 20 31 29 0a 20 20 20 20 67 2e 61 64 64 5f 65 64 67 65 28 4e 2c 20 30 29 0a 20 20 20 20 6e i,.1).....g.add_edge(N,.0).....n
ee20 6f 69 73 65 20 3d 20 66 6c 6f 61 74 28 6e 70 2e 72 61 6e 64 6f 6d 2e 6e 6f 72 6d 61 6c 28 6d 75 oise.=.float(np.random.normal(mu
ee40 2c 20 73 69 67 6d 61 2c 20 31 29 29 0a 20 20 20 20 69 66 20 77 69 74 68 5f 6e 6f 69 73 65 3a 0a ,.sigma,.1)).....if.with_noise:.
ee60 20 20 20 20 20 20 20 20 67 2e 61 64 64 5f 6e 6f 64 65 28 4e 2c 20 61 74 74 72 5f 6e 61 6d 65 3d ........g.add_node(N,.attr_name=
ee80 6d 61 74 68 2e 73 69 6e 28 28 32 20 2a 20 4e 20 2a 20 6d 61 74 68 2e 70 69 20 2f 20 4e 29 29 20 math.sin((2.*.N.*.math.pi./.N)).
eea0 2b 20 6e 6f 69 73 65 29 0a 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 67 2e 61 64 64 +.noise).....else:.........g.add
eec0 5f 6e 6f 64 65 28 4e 2c 20 61 74 74 72 5f 6e 61 6d 65 3d 6d 61 74 68 2e 73 69 6e 28 32 20 2a 20 _node(N,.attr_name=math.sin(2.*.
eee0 4e 20 2a 20 6d 61 74 68 2e 70 69 20 2f 20 4e 29 29 0a 20 20 20 20 72 65 74 75 72 6e 20 67 0a 0a N.*.math.pi./.N)).....return.g..
ef00 0a 64 65 66 20 67 72 61 70 68 5f 63 6f 6c 6f 72 73 28 6e 78 5f 67 72 61 70 68 2c 20 76 6d 69 6e .def.graph_colors(nx_graph,.vmin
ef20 3d 30 2c 20 76 6d 61 78 3d 37 29 3a 0a 20 20 20 20 63 6e 6f 72 6d 20 3d 20 6d 63 6f 6c 2e 4e 6f =0,.vmax=7):.....cnorm.=.mcol.No
ef40 72 6d 61 6c 69 7a 65 28 76 6d 69 6e 3d 76 6d 69 6e 2c 20 76 6d 61 78 3d 76 6d 61 78 29 0a 20 20 rmalize(vmin=vmin,.vmax=vmax)...
ef60 20 20 63 70 69 63 6b 20 3d 20 63 6d 2e 53 63 61 6c 61 72 4d 61 70 70 61 62 6c 65 28 6e 6f 72 6d ..cpick.=.cm.ScalarMappable(norm
ef80 3d 63 6e 6f 72 6d 2c 20 63 6d 61 70 3d 27 76 69 72 69 64 69 73 27 29 0a 20 20 20 20 63 70 69 63 =cnorm,.cmap='viridis').....cpic
efa0 6b 2e 73 65 74 5f 61 72 72 61 79 28 5b 5d 29 0a 20 20 20 20 76 61 6c 5f 6d 61 70 20 3d 20 7b 7d k.set_array([]).....val_map.=.{}
efc0 0a 20 20 20 20 66 6f 72 20 6b 2c 20 76 20 69 6e 20 6e 78 2e 67 65 74 5f 6e 6f 64 65 5f 61 74 74 .....for.k,.v.in.nx.get_node_att
efe0 72 69 62 75 74 65 73 28 6e 78 5f 67 72 61 70 68 2c 20 27 61 74 74 72 5f 6e 61 6d 65 27 29 2e 69 ributes(nx_graph,.'attr_name').i
f000 74 65 6d 73 28 29 3a 0a 20 20 20 20 20 20 20 20 76 61 6c 5f 6d 61 70 5b 6b 5d 20 3d 20 63 70 69 tems():.........val_map[k].=.cpi
f020 63 6b 2e 74 6f 5f 72 67 62 61 28 76 29 0a 20 20 20 20 63 6f 6c 6f 72 73 20 3d 20 5b 5d 0a 20 20 ck.to_rgba(v).....colors.=.[]...
f040 20 20 66 6f 72 20 6e 6f 64 65 20 69 6e 20 6e 78 5f 67 72 61 70 68 2e 6e 6f 64 65 73 28 29 3a 0a ..for.node.in.nx_graph.nodes():.
f060 20 20 20 20 20 20 20 20 63 6f 6c 6f 72 73 2e 61 70 70 65 6e 64 28 76 61 6c 5f 6d 61 70 5b 6e 6f ........colors.append(val_map[no
f080 64 65 5d 29 0a 20 20 20 20 72 65 74 75 72 6e 20 63 6f 6c 6f 72 73 0a 0a 23 23 23 23 23 23 23 23 de]).....return.colors..########
f0a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
f0c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
f0e0 23 23 23 23 23 23 0a 23 20 47 65 6e 65 72 61 74 65 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d ######.#.Generate.data.#.-------
f100 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 63 69 72 63 75 6c 61 72 20 64 61 74 61 73 65 74 0a 23 20 57 ------..#%%.circular.dataset.#.W
f120 65 20 62 75 69 6c 64 20 61 20 64 61 74 61 73 65 74 20 6f 66 20 6e 6f 69 73 79 20 63 69 72 63 75 e.build.a.dataset.of.noisy.circu
f140 6c 61 72 20 67 72 61 70 68 73 2e 0a 23 20 4e 6f 69 73 65 20 69 73 20 61 64 64 65 64 20 6f 6e 20 lar.graphs..#.Noise.is.added.on.
f160 74 68 65 20 73 74 72 75 63 74 75 72 65 73 20 62 79 20 72 61 6e 64 6f 6d 20 63 6f 6e 6e 65 63 74 the.structures.by.random.connect
f180 69 6f 6e 73 20 61 6e 64 20 6f 6e 20 74 68 65 20 66 65 61 74 75 72 65 73 20 62 79 20 67 61 75 73 ions.and.on.the.features.by.gaus
f1a0 73 69 61 6e 20 6e 6f 69 73 65 2e 0a 0a 0a 6e 70 2e 72 61 6e 64 6f 6d 2e 73 65 65 64 28 33 30 29 sian.noise....np.random.seed(30)
f1c0 0a 58 30 20 3d 20 5b 5d 0a 66 6f 72 20 6b 20 69 6e 20 72 61 6e 67 65 28 39 29 3a 0a 20 20 20 20 .X0.=.[].for.k.in.range(9):.....
f1e0 58 30 2e 61 70 70 65 6e 64 28 62 75 69 6c 64 5f 6e 6f 69 73 79 5f 63 69 72 63 75 6c 61 72 5f 67 X0.append(build_noisy_circular_g
f200 72 61 70 68 28 6e 70 2e 72 61 6e 64 6f 6d 2e 72 61 6e 64 69 6e 74 28 31 35 2c 20 32 35 29 2c 20 raph(np.random.randint(15,.25),.
f220 77 69 74 68 5f 6e 6f 69 73 65 3d 54 72 75 65 2c 20 73 74 72 75 63 74 75 72 65 5f 6e 6f 69 73 65 with_noise=True,.structure_noise
f240 3d 54 72 75 65 2c 20 70 3d 33 29 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 =True,.p=3))..##################
f260 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
f280 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 50 ############################.#.P
f2a0 6c 6f 74 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 50 6c 6f 74 20 67 lot.data.#.---------..#%%.Plot.g
f2c0 72 61 70 68 73 0a 0a 70 6c 74 2e 66 69 67 75 72 65 28 66 69 67 73 69 7a 65 3d 28 38 2c 20 31 30 raphs..plt.figure(figsize=(8,.10
f2e0 29 29 0a 66 6f 72 20 69 20 69 6e 20 72 61 6e 67 65 28 6c 65 6e 28 58 30 29 29 3a 0a 20 20 20 20 )).for.i.in.range(len(X0)):.....
f300 70 6c 74 2e 73 75 62 70 6c 6f 74 28 33 2c 20 33 2c 20 69 20 2b 20 31 29 0a 20 20 20 20 67 20 3d plt.subplot(3,.3,.i.+.1).....g.=
f320 20 58 30 5b 69 5d 0a 20 20 20 20 70 6f 73 20 3d 20 6e 78 2e 6b 61 6d 61 64 61 5f 6b 61 77 61 69 .X0[i].....pos.=.nx.kamada_kawai
f340 5f 6c 61 79 6f 75 74 28 67 29 0a 20 20 20 20 6e 78 2e 64 72 61 77 28 67 2c 20 70 6f 73 3d 70 6f _layout(g).....nx.draw(g,.pos=po
f360 73 2c 20 6e 6f 64 65 5f 63 6f 6c 6f 72 3d 67 72 61 70 68 5f 63 6f 6c 6f 72 73 28 67 2c 20 76 6d s,.node_color=graph_colors(g,.vm
f380 69 6e 3d 2d 31 2c 20 76 6d 61 78 3d 31 29 2c 20 77 69 74 68 5f 6c 61 62 65 6c 73 3d 46 61 6c 73 in=-1,.vmax=1),.with_labels=Fals
f3a0 65 2c 20 6e 6f 64 65 5f 73 69 7a 65 3d 31 30 30 29 0a 70 6c 74 2e 73 75 70 74 69 74 6c 65 28 27 e,.node_size=100).plt.suptitle('
f3c0 44 61 74 61 73 65 74 20 6f 66 20 6e 6f 69 73 79 20 67 72 61 70 68 73 2e 20 43 6f 6c 6f 72 20 69 Dataset.of.noisy.graphs..Color.i
f3e0 6e 64 69 63 61 74 65 73 20 74 68 65 20 6c 61 62 65 6c 27 2c 20 66 6f 6e 74 73 69 7a 65 3d 32 30 ndicates.the.label',.fontsize=20
f400 29 0a 70 6c 74 2e 73 68 6f 77 28 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ).plt.show()..##################
f420 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
f440 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 42 ############################.#.B
f460 61 72 79 63 65 6e 74 65 72 20 63 6f 6d 70 75 74 61 74 69 6f 6e 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d arycenter.computation.#.--------
f480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 57 65 20 63 6f 6d 70 75 74 65 20 74 --------------..#%%.We.compute.t
f4a0 68 65 20 62 61 72 79 63 65 6e 74 65 72 20 75 73 69 6e 67 20 46 47 57 2e 20 53 74 72 75 63 74 75 he.barycenter.using.FGW..Structu
f4c0 72 65 20 6d 61 74 72 69 63 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 re.matrices.are.computed.using.t
f4e0 68 65 20 73 68 6f 72 74 65 73 74 5f 70 61 74 68 20 64 69 73 74 61 6e 63 65 20 69 6e 20 74 68 65 he.shortest_path.distance.in.the
f500 20 67 72 61 70 68 0a 23 20 46 65 61 74 75 72 65 73 20 64 69 73 74 61 6e 63 65 73 20 61 72 65 20 .graph.#.Features.distances.are.
f520 74 68 65 20 65 75 63 6c 69 64 65 61 6e 20 64 69 73 74 61 6e 63 65 73 0a 43 73 20 3d 20 5b 73 68 the.euclidean.distances.Cs.=.[sh
f540 6f 72 74 65 73 74 5f 70 61 74 68 28 6e 78 2e 61 64 6a 61 63 65 6e 63 79 5f 6d 61 74 72 69 78 28 ortest_path(nx.adjacency_matrix(
f560 78 29 29 20 66 6f 72 20 78 20 69 6e 20 58 30 5d 0a 70 73 20 3d 20 5b 6e 70 2e 6f 6e 65 73 28 6c x)).for.x.in.X0].ps.=.[np.ones(l
f580 65 6e 28 78 2e 6e 6f 64 65 73 28 29 29 29 20 2f 20 6c 65 6e 28 78 2e 6e 6f 64 65 73 28 29 29 20 en(x.nodes()))./.len(x.nodes()).
f5a0 66 6f 72 20 78 20 69 6e 20 58 30 5d 0a 59 73 20 3d 20 5b 6e 70 2e 61 72 72 61 79 28 5b 76 20 66 for.x.in.X0].Ys.=.[np.array([v.f
f5c0 6f 72 20 28 6b 2c 20 76 29 20 69 6e 20 6e 78 2e 67 65 74 5f 6e 6f 64 65 5f 61 74 74 72 69 62 75 or.(k,.v).in.nx.get_node_attribu
f5e0 74 65 73 28 78 2c 20 27 61 74 74 72 5f 6e 61 6d 65 27 29 2e 69 74 65 6d 73 28 29 5d 29 2e 72 65 tes(x,.'attr_name').items()]).re
f600 73 68 61 70 65 28 2d 31 2c 20 31 29 20 66 6f 72 20 78 20 69 6e 20 58 30 5d 0a 6c 61 6d 62 64 61 shape(-1,.1).for.x.in.X0].lambda
f620 73 20 3d 20 6e 70 2e 61 72 72 61 79 28 5b 6e 70 2e 6f 6e 65 73 28 6c 65 6e 28 59 73 29 29 20 2f s.=.np.array([np.ones(len(Ys))./
f640 20 6c 65 6e 28 59 73 29 5d 29 2e 72 61 76 65 6c 28 29 0a 73 69 7a 65 62 61 72 79 20 3d 20 31 35 .len(Ys)]).ravel().sizebary.=.15
f660 20 20 23 20 77 65 20 63 68 6f 6f 73 65 20 61 20 62 61 72 79 63 65 6e 74 65 72 20 77 69 74 68 20 ..#.we.choose.a.barycenter.with.
f680 31 35 20 6e 6f 64 65 73 0a 0a 41 2c 20 43 2c 20 6c 6f 67 20 3d 20 66 67 77 5f 62 61 72 79 63 65 15.nodes..A,.C,.log.=.fgw_baryce
f6a0 6e 74 65 72 73 28 73 69 7a 65 62 61 72 79 2c 20 59 73 2c 20 43 73 2c 20 70 73 2c 20 6c 61 6d 62 nters(sizebary,.Ys,.Cs,.ps,.lamb
f6c0 64 61 73 2c 20 61 6c 70 68 61 3d 30 2e 39 35 2c 20 6c 6f 67 3d 54 72 75 65 29 0a 0a 23 23 23 23 das,.alpha=0.95,.log=True)..####
f6e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
f700 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
f720 23 23 23 23 23 23 23 23 23 23 0a 23 20 50 6c 6f 74 20 42 61 72 79 63 65 6e 74 65 72 0a 23 20 2d ##########.#.Plot.Barycenter.#.-
f740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 43 72 ------------------------..#%%.Cr
f760 65 61 74 65 20 74 68 65 20 62 61 72 79 63 65 6e 74 65 72 0a 62 61 72 79 20 3d 20 6e 78 2e 66 72 eate.the.barycenter.bary.=.nx.fr
f780 6f 6d 5f 6e 75 6d 70 79 5f 6d 61 74 72 69 78 28 73 70 5f 74 6f 5f 61 64 6a 65 6e 63 79 28 43 2c om_numpy_matrix(sp_to_adjency(C,
f7a0 20 74 68 72 65 73 68 69 6e 66 3d 30 2c 20 74 68 72 65 73 68 73 75 70 3d 66 69 6e 64 5f 74 68 72 .threshinf=0,.threshsup=find_thr
f7c0 65 73 68 28 43 2c 20 73 75 70 3d 31 30 30 2c 20 73 74 65 70 3d 31 30 30 29 5b 30 5d 29 29 0a 66 esh(C,.sup=100,.step=100)[0])).f
f7e0 6f 72 20 69 2c 20 76 20 69 6e 20 65 6e 75 6d 65 72 61 74 65 28 41 2e 72 61 76 65 6c 28 29 29 3a or.i,.v.in.enumerate(A.ravel()):
f800 0a 20 20 20 20 62 61 72 79 2e 61 64 64 5f 6e 6f 64 65 28 69 2c 20 61 74 74 72 5f 6e 61 6d 65 3d .....bary.add_node(i,.attr_name=
f820 76 29 0a 0a 23 25 25 0a 70 6f 73 20 3d 20 6e 78 2e 6b 61 6d 61 64 61 5f 6b 61 77 61 69 5f 6c 61 v)..#%%.pos.=.nx.kamada_kawai_la
f840 79 6f 75 74 28 62 61 72 79 29 0a 6e 78 2e 64 72 61 77 28 62 61 72 79 2c 20 70 6f 73 3d 70 6f 73 yout(bary).nx.draw(bary,.pos=pos
f860 2c 20 6e 6f 64 65 5f 63 6f 6c 6f 72 3d 67 72 61 70 68 5f 63 6f 6c 6f 72 73 28 62 61 72 79 2c 20 ,.node_color=graph_colors(bary,.
f880 76 6d 69 6e 3d 2d 31 2c 20 76 6d 61 78 3d 31 29 2c 20 77 69 74 68 5f 6c 61 62 65 6c 73 3d 46 61 vmin=-1,.vmax=1),.with_labels=Fa
f8a0 6c 73 65 29 0a 70 6c 74 2e 73 75 70 74 69 74 6c 65 28 27 42 61 72 79 63 65 6e 74 65 72 27 2c 20 lse).plt.suptitle('Barycenter',.
f8c0 66 6f 6e 74 73 69 7a 65 3d 32 30 29 0a 70 6c 74 2e 73 68 6f 77 28 29 0a 50 4b 03 04 14 00 00 00 fontsize=20).plt.show().PK......
f8e0 00 00 db 74 d9 4e 6f 6c 58 5b 88 13 00 00 88 13 00 00 13 00 00 00 70 6c 6f 74 5f 4f 54 5f 4c 31 ...t.NolX[............plot_OT_L1
f900 5f 76 73 5f 4c 32 2e 70 79 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d _vs_L2.py#.-*-.coding:.utf-8.-*-
f920 0a 22 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d .""".===========================
f940 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 32 44 20 4f 70 74 69 6d 61 6c 20 74 72 61 6e 73 ===============.2D.Optimal.trans
f960 70 6f 72 74 20 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20 6d 65 74 72 69 63 73 0a 3d 3d 3d 3d 3d port.for.different.metrics.=====
f980 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================================
f9a0 3d 3d 3d 3d 3d 0a 0a 32 44 20 4f 54 20 6f 6e 20 65 6d 70 69 72 69 63 61 6c 20 64 69 73 74 72 69 =====..2D.OT.on.empirical.distri
f9c0 62 75 74 69 6f 20 20 77 69 74 68 20 64 69 66 66 65 72 65 6e 74 20 67 6f 75 6e 64 20 6d 65 74 72 butio..with.different.gound.metr
f9e0 69 63 2e 0a 0a 53 74 6f 6c 65 20 74 68 65 20 66 69 67 75 72 65 20 69 64 65 61 20 66 72 6f 6d 20 ic...Stole.the.figure.idea.from.
fa00 46 69 67 2e 20 31 20 61 6e 64 20 32 20 69 6e 0a 68 74 74 70 73 3a 2f 2f 61 72 78 69 76 2e 6f 72 Fig..1.and.2.in.https://arxiv.or
fa20 67 2f 70 64 66 2f 31 37 30 36 2e 30 37 36 35 30 2e 70 64 66 0a 0a 0a 22 22 22 0a 0a 23 20 41 75 g/pdf/1706.07650.pdf..."""..#.Au
fa40 74 68 6f 72 3a 20 52 65 6d 69 20 46 6c 61 6d 61 72 79 20 3c 72 65 6d 69 2e 66 6c 61 6d 61 72 79 thor:.Remi.Flamary.<remi.flamary
fa60 40 75 6e 69 63 65 2e 66 72 3e 0a 23 0a 23 20 4c 69 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 63 65 @unice.fr>.#.#.License:.MIT.Lice
fa80 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6e 75 6d 70 79 20 61 73 20 6e 70 0a 69 6d 70 6f 72 74 20 6d nse..import.numpy.as.np.import.m
faa0 61 74 70 6c 6f 74 6c 69 62 2e 70 79 6c 61 62 20 61 73 20 70 6c 0a 69 6d 70 6f 72 74 20 6f 74 0a atplotlib.pylab.as.pl.import.ot.
fac0 69 6d 70 6f 72 74 20 6f 74 2e 70 6c 6f 74 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 import.ot.plot..################
fae0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
fb00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 ##############################.#
fb20 20 44 61 74 61 73 65 74 20 31 20 3a 20 75 6e 69 66 6f 72 6d 20 73 61 6d 70 6c 69 6e 67 0a 23 20 .Dataset.1.:.uniform.sampling.#.
fb40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 6e 20 ----------------------------..n.
fb60 3d 20 32 30 20 20 23 20 6e 62 20 73 61 6d 70 6c 65 73 0a 78 73 20 3d 20 6e 70 2e 7a 65 72 6f 73 =.20..#.nb.samples.xs.=.np.zeros
fb80 28 28 6e 2c 20 32 29 29 0a 78 73 5b 3a 2c 20 30 5d 20 3d 20 6e 70 2e 61 72 61 6e 67 65 28 6e 29 ((n,.2)).xs[:,.0].=.np.arange(n)
fba0 20 2b 20 31 0a 78 73 5b 3a 2c 20 31 5d 20 3d 20 28 6e 70 2e 61 72 61 6e 67 65 28 6e 29 20 2b 20 .+.1.xs[:,.1].=.(np.arange(n).+.
fbc0 31 29 20 2a 20 2d 30 2e 30 30 31 20 20 23 20 74 6f 20 6d 61 6b 65 20 69 74 20 73 74 72 69 63 74 1).*.-0.001..#.to.make.it.strict
fbe0 6c 79 20 63 6f 6e 76 65 78 2e 2e 2e 0a 0a 78 74 20 3d 20 6e 70 2e 7a 65 72 6f 73 28 28 6e 2c 20 ly.convex.....xt.=.np.zeros((n,.
fc00 32 29 29 0a 78 74 5b 3a 2c 20 31 5d 20 3d 20 6e 70 2e 61 72 61 6e 67 65 28 6e 29 20 2b 20 31 0a 2)).xt[:,.1].=.np.arange(n).+.1.
fc20 0a 61 2c 20 62 20 3d 20 6f 74 2e 75 6e 69 66 28 6e 29 2c 20 6f 74 2e 75 6e 69 66 28 6e 29 20 20 .a,.b.=.ot.unif(n),.ot.unif(n)..
fc40 23 20 75 6e 69 66 6f 72 6d 20 64 69 73 74 72 69 62 75 74 69 6f 6e 20 6f 6e 20 73 61 6d 70 6c 65 #.uniform.distribution.on.sample
fc60 73 0a 0a 23 20 6c 6f 73 73 20 6d 61 74 72 69 78 0a 4d 31 20 3d 20 6f 74 2e 64 69 73 74 28 78 73 s..#.loss.matrix.M1.=.ot.dist(xs
fc80 2c 20 78 74 2c 20 6d 65 74 72 69 63 3d 27 65 75 63 6c 69 64 65 61 6e 27 29 0a 4d 31 20 2f 3d 20 ,.xt,.metric='euclidean').M1./=.
fca0 4d 31 2e 6d 61 78 28 29 0a 0a 23 20 6c 6f 73 73 20 6d 61 74 72 69 78 0a 4d 32 20 3d 20 6f 74 2e M1.max()..#.loss.matrix.M2.=.ot.
fcc0 64 69 73 74 28 78 73 2c 20 78 74 2c 20 6d 65 74 72 69 63 3d 27 73 71 65 75 63 6c 69 64 65 61 6e dist(xs,.xt,.metric='sqeuclidean
fce0 27 29 0a 4d 32 20 2f 3d 20 4d 32 2e 6d 61 78 28 29 0a 0a 23 20 6c 6f 73 73 20 6d 61 74 72 69 78 ').M2./=.M2.max()..#.loss.matrix
fd00 0a 4d 70 20 3d 20 6e 70 2e 73 71 72 74 28 6f 74 2e 64 69 73 74 28 78 73 2c 20 78 74 2c 20 6d 65 .Mp.=.np.sqrt(ot.dist(xs,.xt,.me
fd20 74 72 69 63 3d 27 65 75 63 6c 69 64 65 61 6e 27 29 29 0a 4d 70 20 2f 3d 20 4d 70 2e 6d 61 78 28 tric='euclidean')).Mp./=.Mp.max(
fd40 29 0a 0a 23 20 44 61 74 61 0a 70 6c 2e 66 69 67 75 72 65 28 31 2c 20 66 69 67 73 69 7a 65 3d 28 )..#.Data.pl.figure(1,.figsize=(
fd60 37 2c 20 33 29 29 0a 70 6c 2e 63 6c 66 28 29 0a 70 6c 2e 70 6c 6f 74 28 78 73 5b 3a 2c 20 30 5d 7,.3)).pl.clf().pl.plot(xs[:,.0]
fd80 2c 20 78 73 5b 3a 2c 20 31 5d 2c 20 27 2b 62 27 2c 20 6c 61 62 65 6c 3d 27 53 6f 75 72 63 65 20 ,.xs[:,.1],.'+b',.label='Source.
fda0 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 70 6c 6f 74 28 78 74 5b 3a 2c 20 30 5d 2c 20 78 74 5b 3a samples').pl.plot(xt[:,.0],.xt[:
fdc0 2c 20 31 5d 2c 20 27 78 72 27 2c 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 ,.1],.'xr',.label='Target.sample
fde0 73 27 29 0a 70 6c 2e 61 78 69 73 28 27 65 71 75 61 6c 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 53 s').pl.axis('equal').pl.title('S
fe00 6f 75 72 63 65 20 61 6e 64 20 74 61 72 67 65 74 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 27 29 ource.and.target.distributions')
fe20 0a 0a 0a 23 20 43 6f 73 74 20 6d 61 74 72 69 63 65 73 0a 70 6c 2e 66 69 67 75 72 65 28 32 2c 20 ...#.Cost.matrices.pl.figure(2,.
fe40 66 69 67 73 69 7a 65 3d 28 37 2c 20 33 29 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 33 figsize=(7,.3))..pl.subplot(1,.3
fe60 2c 20 31 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 4d 31 2c 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e ,.1).pl.imshow(M1,.interpolation
fe80 3d 27 6e 65 61 72 65 73 74 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 45 75 63 6c 69 64 65 61 6e 20 ='nearest').pl.title('Euclidean.
fea0 63 6f 73 74 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 33 2c 20 32 29 0a 70 6c 2e 69 cost')..pl.subplot(1,.3,.2).pl.i
fec0 6d 73 68 6f 77 28 4d 32 2c 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 72 65 73 74 mshow(M2,.interpolation='nearest
fee0 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 53 71 75 61 72 65 64 20 45 75 63 6c 69 64 65 61 6e 20 63 ').pl.title('Squared.Euclidean.c
ff00 6f 73 74 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 33 2c 20 33 29 0a 70 6c 2e 69 6d ost')..pl.subplot(1,.3,.3).pl.im
ff20 73 68 6f 77 28 4d 70 2c 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 72 65 73 74 27 show(Mp,.interpolation='nearest'
ff40 29 0a 70 6c 2e 74 69 74 6c 65 28 27 53 71 72 74 20 45 75 63 6c 69 64 65 61 6e 20 63 6f 73 74 27 ).pl.title('Sqrt.Euclidean.cost'
ff60 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 ).pl.tight_layout()..###########
ff80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
ffa0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
ffc0 23 23 23 0a 23 20 44 61 74 61 73 65 74 20 31 20 3a 20 50 6c 6f 74 20 4f 54 20 4d 61 74 72 69 63 ###.#.Dataset.1.:.Plot.OT.Matric
ffe0 65 73 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d es.#.---------------------------
10000 2d 0a 0a 0a 23 25 25 20 45 4d 44 0a 47 31 20 3d 20 6f 74 2e 65 6d 64 28 61 2c 20 62 2c 20 4d 31 -...#%%.EMD.G1.=.ot.emd(a,.b,.M1
10020 29 0a 47 32 20 3d 20 6f 74 2e 65 6d 64 28 61 2c 20 62 2c 20 4d 32 29 0a 47 70 20 3d 20 6f 74 2e ).G2.=.ot.emd(a,.b,.M2).Gp.=.ot.
10040 65 6d 64 28 61 2c 20 62 2c 20 4d 70 29 0a 0a 23 20 4f 54 20 6d 61 74 72 69 63 65 73 0a 70 6c 2e emd(a,.b,.Mp)..#.OT.matrices.pl.
10060 66 69 67 75 72 65 28 33 2c 20 66 69 67 73 69 7a 65 3d 28 37 2c 20 33 29 29 0a 0a 70 6c 2e 73 75 figure(3,.figsize=(7,.3))..pl.su
10080 62 70 6c 6f 74 28 31 2c 20 33 2c 20 31 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 32 44 5f 73 61 bplot(1,.3,.1).ot.plot.plot2D_sa
100a0 6d 70 6c 65 73 5f 6d 61 74 28 78 73 2c 20 78 74 2c 20 47 31 2c 20 63 3d 5b 2e 35 2c 20 2e 35 2c mples_mat(xs,.xt,.G1,.c=[.5,..5,
100c0 20 31 5d 29 0a 70 6c 2e 70 6c 6f 74 28 78 73 5b 3a 2c 20 30 5d 2c 20 78 73 5b 3a 2c 20 31 5d 2c .1]).pl.plot(xs[:,.0],.xs[:,.1],
100e0 20 27 2b 62 27 2c 20 6c 61 62 65 6c 3d 27 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a 70 .'+b',.label='Source.samples').p
10100 6c 2e 70 6c 6f 74 28 78 74 5b 3a 2c 20 30 5d 2c 20 78 74 5b 3a 2c 20 31 5d 2c 20 27 78 72 27 2c l.plot(xt[:,.0],.xt[:,.1],.'xr',
10120 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 61 78 69 73 .label='Target.samples').pl.axis
10140 28 27 65 71 75 61 6c 27 29 0a 23 20 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e ('equal').#.pl.legend(loc=0).pl.
10160 74 69 74 6c 65 28 27 4f 54 20 45 75 63 6c 69 64 65 61 6e 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f title('OT.Euclidean')..pl.subplo
10180 74 28 31 2c 20 33 2c 20 32 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 32 44 5f 73 61 6d 70 6c 65 t(1,.3,.2).ot.plot.plot2D_sample
101a0 73 5f 6d 61 74 28 78 73 2c 20 78 74 2c 20 47 32 2c 20 63 3d 5b 2e 35 2c 20 2e 35 2c 20 31 5d 29 s_mat(xs,.xt,.G2,.c=[.5,..5,.1])
101c0 0a 70 6c 2e 70 6c 6f 74 28 78 73 5b 3a 2c 20 30 5d 2c 20 78 73 5b 3a 2c 20 31 5d 2c 20 27 2b 62 .pl.plot(xs[:,.0],.xs[:,.1],.'+b
101e0 27 2c 20 6c 61 62 65 6c 3d 27 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 70 6c ',.label='Source.samples').pl.pl
10200 6f 74 28 78 74 5b 3a 2c 20 30 5d 2c 20 78 74 5b 3a 2c 20 31 5d 2c 20 27 78 72 27 2c 20 6c 61 62 ot(xt[:,.0],.xt[:,.1],.'xr',.lab
10220 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 61 78 69 73 28 27 65 71 el='Target.samples').pl.axis('eq
10240 75 61 6c 27 29 0a 23 20 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 6c ual').#.pl.legend(loc=0).pl.titl
10260 65 28 27 4f 54 20 73 71 75 61 72 65 64 20 45 75 63 6c 69 64 65 61 6e 27 29 0a 0a 70 6c 2e 73 75 e('OT.squared.Euclidean')..pl.su
10280 62 70 6c 6f 74 28 31 2c 20 33 2c 20 33 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 32 44 5f 73 61 bplot(1,.3,.3).ot.plot.plot2D_sa
102a0 6d 70 6c 65 73 5f 6d 61 74 28 78 73 2c 20 78 74 2c 20 47 70 2c 20 63 3d 5b 2e 35 2c 20 2e 35 2c mples_mat(xs,.xt,.Gp,.c=[.5,..5,
102c0 20 31 5d 29 0a 70 6c 2e 70 6c 6f 74 28 78 73 5b 3a 2c 20 30 5d 2c 20 78 73 5b 3a 2c 20 31 5d 2c .1]).pl.plot(xs[:,.0],.xs[:,.1],
102e0 20 27 2b 62 27 2c 20 6c 61 62 65 6c 3d 27 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a 70 .'+b',.label='Source.samples').p
10300 6c 2e 70 6c 6f 74 28 78 74 5b 3a 2c 20 30 5d 2c 20 78 74 5b 3a 2c 20 31 5d 2c 20 27 78 72 27 2c l.plot(xt[:,.0],.xt[:,.1],.'xr',
10320 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 61 78 69 73 .label='Target.samples').pl.axis
10340 28 27 65 71 75 61 6c 27 29 0a 23 20 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e ('equal').#.pl.legend(loc=0).pl.
10360 74 69 74 6c 65 28 27 4f 54 20 73 71 72 74 20 45 75 63 6c 69 64 65 61 6e 27 29 0a 70 6c 2e 74 69 title('OT.sqrt.Euclidean').pl.ti
10380 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 70 6c 2e 73 68 6f 77 28 29 0a 0a 0a 23 23 23 23 23 23 ght_layout()..pl.show()...######
103a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
103c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
103e0 23 23 23 23 23 23 23 23 0a 23 20 44 61 74 61 73 65 74 20 32 20 3a 20 50 61 72 74 69 61 6c 20 63 ########.#.Dataset.2.:.Partial.c
10400 69 72 63 6c 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ircle.#.------------------------
10420 2d 2d 0a 0a 6e 20 3d 20 35 30 20 20 23 20 6e 62 20 73 61 6d 70 6c 65 73 0a 78 74 6f 74 20 3d 20 --..n.=.50..#.nb.samples.xtot.=.
10440 6e 70 2e 7a 65 72 6f 73 28 28 6e 20 2b 20 31 2c 20 32 29 29 0a 78 74 6f 74 5b 3a 2c 20 30 5d 20 np.zeros((n.+.1,.2)).xtot[:,.0].
10460 3d 20 6e 70 2e 63 6f 73 28 0a 20 20 20 20 28 6e 70 2e 61 72 61 6e 67 65 28 6e 20 2b 20 31 29 20 =.np.cos(.....(np.arange(n.+.1).
10480 2b 20 31 2e 30 29 20 2a 20 30 2e 39 20 2f 20 28 6e 20 2b 20 32 29 20 2a 20 32 20 2a 20 6e 70 2e +.1.0).*.0.9./.(n.+.2).*.2.*.np.
104a0 70 69 29 0a 78 74 6f 74 5b 3a 2c 20 31 5d 20 3d 20 6e 70 2e 73 69 6e 28 0a 20 20 20 20 28 6e 70 pi).xtot[:,.1].=.np.sin(.....(np
104c0 2e 61 72 61 6e 67 65 28 6e 20 2b 20 31 29 20 2b 20 31 2e 30 29 20 2a 20 30 2e 39 20 2f 20 28 6e .arange(n.+.1).+.1.0).*.0.9./.(n
104e0 20 2b 20 32 29 20 2a 20 32 20 2a 20 6e 70 2e 70 69 29 0a 0a 78 73 20 3d 20 78 74 6f 74 5b 3a 6e .+.2).*.2.*.np.pi)..xs.=.xtot[:n
10500 2c 20 3a 5d 0a 78 74 20 3d 20 78 74 6f 74 5b 31 3a 2c 20 3a 5d 0a 0a 61 2c 20 62 20 3d 20 6f 74 ,.:].xt.=.xtot[1:,.:]..a,.b.=.ot
10520 2e 75 6e 69 66 28 6e 29 2c 20 6f 74 2e 75 6e 69 66 28 6e 29 20 20 23 20 75 6e 69 66 6f 72 6d 20 .unif(n),.ot.unif(n)..#.uniform.
10540 64 69 73 74 72 69 62 75 74 69 6f 6e 20 6f 6e 20 73 61 6d 70 6c 65 73 0a 0a 23 20 6c 6f 73 73 20 distribution.on.samples..#.loss.
10560 6d 61 74 72 69 78 0a 4d 31 20 3d 20 6f 74 2e 64 69 73 74 28 78 73 2c 20 78 74 2c 20 6d 65 74 72 matrix.M1.=.ot.dist(xs,.xt,.metr
10580 69 63 3d 27 65 75 63 6c 69 64 65 61 6e 27 29 0a 4d 31 20 2f 3d 20 4d 31 2e 6d 61 78 28 29 0a 0a ic='euclidean').M1./=.M1.max()..
105a0 23 20 6c 6f 73 73 20 6d 61 74 72 69 78 0a 4d 32 20 3d 20 6f 74 2e 64 69 73 74 28 78 73 2c 20 78 #.loss.matrix.M2.=.ot.dist(xs,.x
105c0 74 2c 20 6d 65 74 72 69 63 3d 27 73 71 65 75 63 6c 69 64 65 61 6e 27 29 0a 4d 32 20 2f 3d 20 4d t,.metric='sqeuclidean').M2./=.M
105e0 32 2e 6d 61 78 28 29 0a 0a 23 20 6c 6f 73 73 20 6d 61 74 72 69 78 0a 4d 70 20 3d 20 6e 70 2e 73 2.max()..#.loss.matrix.Mp.=.np.s
10600 71 72 74 28 6f 74 2e 64 69 73 74 28 78 73 2c 20 78 74 2c 20 6d 65 74 72 69 63 3d 27 65 75 63 6c qrt(ot.dist(xs,.xt,.metric='eucl
10620 69 64 65 61 6e 27 29 29 0a 4d 70 20 2f 3d 20 4d 70 2e 6d 61 78 28 29 0a 0a 0a 23 20 44 61 74 61 idean')).Mp./=.Mp.max()...#.Data
10640 0a 70 6c 2e 66 69 67 75 72 65 28 34 2c 20 66 69 67 73 69 7a 65 3d 28 37 2c 20 33 29 29 0a 70 6c .pl.figure(4,.figsize=(7,.3)).pl
10660 2e 63 6c 66 28 29 0a 70 6c 2e 70 6c 6f 74 28 78 73 5b 3a 2c 20 30 5d 2c 20 78 73 5b 3a 2c 20 31 .clf().pl.plot(xs[:,.0],.xs[:,.1
10680 5d 2c 20 27 2b 62 27 2c 20 6c 61 62 65 6c 3d 27 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 ],.'+b',.label='Source.samples')
106a0 0a 70 6c 2e 70 6c 6f 74 28 78 74 5b 3a 2c 20 30 5d 2c 20 78 74 5b 3a 2c 20 31 5d 2c 20 27 78 72 .pl.plot(xt[:,.0],.xt[:,.1],.'xr
106c0 27 2c 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 61 78 ',.label='Target.samples').pl.ax
106e0 69 73 28 27 65 71 75 61 6c 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 53 6f 75 72 63 65 20 61 6e 64 is('equal').pl.title('Source.and
10700 20 74 72 61 67 65 74 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 27 29 0a 0a 0a 23 20 43 6f 73 74 .traget.distributions')...#.Cost
10720 20 6d 61 74 72 69 63 65 73 0a 70 6c 2e 66 69 67 75 72 65 28 35 2c 20 66 69 67 73 69 7a 65 3d 28 .matrices.pl.figure(5,.figsize=(
10740 37 2c 20 33 29 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 33 2c 20 31 29 0a 70 6c 2e 69 7,.3))..pl.subplot(1,.3,.1).pl.i
10760 6d 73 68 6f 77 28 4d 31 2c 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 72 65 73 74 mshow(M1,.interpolation='nearest
10780 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 45 75 63 6c 69 64 65 61 6e 20 63 6f 73 74 27 29 0a 0a 70 ').pl.title('Euclidean.cost')..p
107a0 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 33 2c 20 32 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 4d 32 2c l.subplot(1,.3,.2).pl.imshow(M2,
107c0 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 72 65 73 74 27 29 0a 70 6c 2e 74 69 74 .interpolation='nearest').pl.tit
107e0 6c 65 28 27 53 71 75 61 72 65 64 20 45 75 63 6c 69 64 65 61 6e 20 63 6f 73 74 27 29 0a 0a 70 6c le('Squared.Euclidean.cost')..pl
10800 2e 73 75 62 70 6c 6f 74 28 31 2c 20 33 2c 20 33 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 4d 70 2c 20 .subplot(1,.3,.3).pl.imshow(Mp,.
10820 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 72 65 73 74 27 29 0a 70 6c 2e 74 69 74 6c interpolation='nearest').pl.titl
10840 65 28 27 53 71 72 74 20 45 75 63 6c 69 64 65 61 6e 20 63 6f 73 74 27 29 0a 70 6c 2e 74 69 67 68 e('Sqrt.Euclidean.cost').pl.tigh
10860 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 t_layout()..####################
10880 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
108a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 44 61 74 ##########################.#.Dat
108c0 61 73 65 74 20 32 20 3a 20 50 6c 6f 74 20 20 4f 54 20 4d 61 74 72 69 63 65 73 0a 23 20 2d 2d 2d aset.2.:.Plot..OT.Matrices.#.---
108e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 0a 23 25 25 --------------------------...#%%
10900 20 45 4d 44 0a 47 31 20 3d 20 6f 74 2e 65 6d 64 28 61 2c 20 62 2c 20 4d 31 29 0a 47 32 20 3d 20 .EMD.G1.=.ot.emd(a,.b,.M1).G2.=.
10920 6f 74 2e 65 6d 64 28 61 2c 20 62 2c 20 4d 32 29 0a 47 70 20 3d 20 6f 74 2e 65 6d 64 28 61 2c 20 ot.emd(a,.b,.M2).Gp.=.ot.emd(a,.
10940 62 2c 20 4d 70 29 0a 0a 23 20 4f 54 20 6d 61 74 72 69 63 65 73 0a 70 6c 2e 66 69 67 75 72 65 28 b,.Mp)..#.OT.matrices.pl.figure(
10960 36 2c 20 66 69 67 73 69 7a 65 3d 28 37 2c 20 33 29 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 6,.figsize=(7,.3))..pl.subplot(1
10980 2c 20 33 2c 20 31 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 32 44 5f 73 61 6d 70 6c 65 73 5f 6d ,.3,.1).ot.plot.plot2D_samples_m
109a0 61 74 28 78 73 2c 20 78 74 2c 20 47 31 2c 20 63 3d 5b 2e 35 2c 20 2e 35 2c 20 31 5d 29 0a 70 6c at(xs,.xt,.G1,.c=[.5,..5,.1]).pl
109c0 2e 70 6c 6f 74 28 78 73 5b 3a 2c 20 30 5d 2c 20 78 73 5b 3a 2c 20 31 5d 2c 20 27 2b 62 27 2c 20 .plot(xs[:,.0],.xs[:,.1],.'+b',.
109e0 6c 61 62 65 6c 3d 27 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 70 6c 6f 74 28 label='Source.samples').pl.plot(
10a00 78 74 5b 3a 2c 20 30 5d 2c 20 78 74 5b 3a 2c 20 31 5d 2c 20 27 78 72 27 2c 20 6c 61 62 65 6c 3d xt[:,.0],.xt[:,.1],.'xr',.label=
10a20 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 61 78 69 73 28 27 65 71 75 61 6c 'Target.samples').pl.axis('equal
10a40 27 29 0a 23 20 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 ').#.pl.legend(loc=0).pl.title('
10a60 4f 54 20 45 75 63 6c 69 64 65 61 6e 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 33 2c OT.Euclidean')..pl.subplot(1,.3,
10a80 20 32 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 32 44 5f 73 61 6d 70 6c 65 73 5f 6d 61 74 28 78 .2).ot.plot.plot2D_samples_mat(x
10aa0 73 2c 20 78 74 2c 20 47 32 2c 20 63 3d 5b 2e 35 2c 20 2e 35 2c 20 31 5d 29 0a 70 6c 2e 70 6c 6f s,.xt,.G2,.c=[.5,..5,.1]).pl.plo
10ac0 74 28 78 73 5b 3a 2c 20 30 5d 2c 20 78 73 5b 3a 2c 20 31 5d 2c 20 27 2b 62 27 2c 20 6c 61 62 65 t(xs[:,.0],.xs[:,.1],.'+b',.labe
10ae0 6c 3d 27 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 70 6c 6f 74 28 78 74 5b 3a l='Source.samples').pl.plot(xt[:
10b00 2c 20 30 5d 2c 20 78 74 5b 3a 2c 20 31 5d 2c 20 27 78 72 27 2c 20 6c 61 62 65 6c 3d 27 54 61 72 ,.0],.xt[:,.1],.'xr',.label='Tar
10b20 67 65 74 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 61 78 69 73 28 27 65 71 75 61 6c 27 29 0a 23 get.samples').pl.axis('equal').#
10b40 20 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 4f 54 20 73 .pl.legend(loc=0).pl.title('OT.s
10b60 71 75 61 72 65 64 20 45 75 63 6c 69 64 65 61 6e 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 quared.Euclidean')..pl.subplot(1
10b80 2c 20 33 2c 20 33 29 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 32 44 5f 73 61 6d 70 6c 65 73 5f 6d ,.3,.3).ot.plot.plot2D_samples_m
10ba0 61 74 28 78 73 2c 20 78 74 2c 20 47 70 2c 20 63 3d 5b 2e 35 2c 20 2e 35 2c 20 31 5d 29 0a 70 6c at(xs,.xt,.Gp,.c=[.5,..5,.1]).pl
10bc0 2e 70 6c 6f 74 28 78 73 5b 3a 2c 20 30 5d 2c 20 78 73 5b 3a 2c 20 31 5d 2c 20 27 2b 62 27 2c 20 .plot(xs[:,.0],.xs[:,.1],.'+b',.
10be0 6c 61 62 65 6c 3d 27 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 70 6c 6f 74 28 label='Source.samples').pl.plot(
10c00 78 74 5b 3a 2c 20 30 5d 2c 20 78 74 5b 3a 2c 20 31 5d 2c 20 27 78 72 27 2c 20 6c 61 62 65 6c 3d xt[:,.0],.xt[:,.1],.'xr',.label=
10c20 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 61 78 69 73 28 27 65 71 75 61 6c 'Target.samples').pl.axis('equal
10c40 27 29 0a 23 20 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 6c 65 28 27 ').#.pl.legend(loc=0).pl.title('
10c60 4f 54 20 73 71 72 74 20 45 75 63 6c 69 64 65 61 6e 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 OT.sqrt.Euclidean').pl.tight_lay
10c80 6f 75 74 28 29 0a 0a 70 6c 2e 73 68 6f 77 28 29 0a 50 4b 03 04 14 00 00 00 00 00 db 74 d9 4e a6 out()..pl.show().PK.........t.N.
10ca0 16 4e 83 2e 17 00 00 2e 17 00 00 21 00 00 00 70 6c 6f 74 5f 62 61 72 79 63 65 6e 74 65 72 5f 6c .N.........!...plot_barycenter_l
10cc0 70 5f 76 73 5f 65 6e 74 72 6f 70 69 63 2e 70 79 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 74 p_vs_entropic.py#.-*-.coding:.ut
10ce0 66 2d 38 20 2d 2a 2d 0a 22 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d f-8.-*-.""".====================
10d00 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================================
10d20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 31 44 =============================.1D
10d40 20 57 61 73 73 65 72 73 74 65 69 6e 20 62 61 72 79 63 65 6e 74 65 72 20 63 6f 6d 70 61 72 69 73 .Wasserstein.barycenter.comparis
10d60 6f 6e 20 62 65 74 77 65 65 6e 20 65 78 61 63 74 20 4c 50 20 61 6e 64 20 65 6e 74 72 6f 70 69 63 on.between.exact.LP.and.entropic
10d80 20 72 65 67 75 6c 61 72 69 7a 61 74 69 6f 6e 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d .regularization.================
10da0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================================
10dc0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================================
10de0 3d 0a 0a 54 68 69 73 20 65 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61 74 65 73 20 74 68 65 20 =..This.example.illustrates.the.
10e00 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 72 65 67 75 6c 61 72 69 7a 65 64 20 57 61 73 73 65 computation.of.regularized.Wasse
10e20 72 73 74 65 69 6e 20 42 61 72 79 63 65 6e 74 65 72 0a 61 73 20 70 72 6f 70 6f 73 65 64 20 69 6e rstein.Barycenter.as.proposed.in
10e40 20 5b 33 5d 20 61 6e 64 20 65 78 61 63 74 20 4c 50 20 62 61 72 79 63 65 6e 74 65 72 73 20 75 73 .[3].and.exact.LP.barycenters.us
10e60 69 6e 67 20 73 74 61 6e 64 61 72 64 20 4c 50 20 73 6f 6c 76 65 72 2e 0a 0a 49 74 20 72 65 70 72 ing.standard.LP.solver...It.repr
10e80 6f 64 75 63 65 73 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 46 69 67 75 72 65 20 33 2e 31 20 oduces.approximately.Figure.3.1.
10ea0 61 6e 64 20 33 2e 32 20 66 72 6f 6d 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 70 65 72 and.3.2.from.the.following.paper
10ec0 3a 0a 43 75 74 75 72 69 2c 20 4d 2e 2c 20 26 20 50 65 79 72 c3 a9 2c 20 47 2e 20 28 32 30 31 36 :.Cuturi,.M.,.&.Peyr..,.G..(2016
10ee0 29 2e 20 41 20 73 6d 6f 6f 74 68 65 64 20 64 75 61 6c 20 61 70 70 72 6f 61 63 68 20 66 6f 72 20 )..A.smoothed.dual.approach.for.
10f00 76 61 72 69 61 74 69 6f 6e 61 6c 0a 57 61 73 73 65 72 73 74 65 69 6e 20 70 72 6f 62 6c 65 6d 73 variational.Wasserstein.problems
10f20 2e 20 53 49 41 4d 20 4a 6f 75 72 6e 61 6c 20 6f 6e 20 49 6d 61 67 69 6e 67 20 53 63 69 65 6e 63 ..SIAM.Journal.on.Imaging.Scienc
10f40 65 73 2c 20 39 28 31 29 2c 20 33 32 30 2d 33 34 33 2e 0a 0a 5b 33 5d 20 42 65 6e 61 6d 6f 75 2c es,.9(1),.320-343...[3].Benamou,
10f60 20 4a 2e 20 44 2e 2c 20 43 61 72 6c 69 65 72 2c 20 47 2e 2c 20 43 75 74 75 72 69 2c 20 4d 2e 2c .J..D.,.Carlier,.G.,.Cuturi,.M.,
10f80 20 4e 65 6e 6e 61 2c 20 4c 2e 2c 20 26 20 50 65 79 72 c3 a9 2c 20 47 2e 20 28 32 30 31 35 29 2e .Nenna,.L.,.&.Peyr..,.G..(2015).
10fa0 0a 49 74 65 72 61 74 69 76 65 20 42 72 65 67 6d 61 6e 20 70 72 6f 6a 65 63 74 69 6f 6e 73 20 66 .Iterative.Bregman.projections.f
10fc0 6f 72 20 72 65 67 75 6c 61 72 69 7a 65 64 20 74 72 61 6e 73 70 6f 72 74 61 74 69 6f 6e 20 70 72 or.regularized.transportation.pr
10fe0 6f 62 6c 65 6d 73 0a 53 49 41 4d 20 4a 6f 75 72 6e 61 6c 20 6f 6e 20 53 63 69 65 6e 74 69 66 69 oblems.SIAM.Journal.on.Scientifi
11000 63 20 43 6f 6d 70 75 74 69 6e 67 2c 20 33 37 28 32 29 2c 20 41 31 31 31 31 2d 41 31 31 33 38 2e c.Computing,.37(2),.A1111-A1138.
11020 0a 0a 22 22 22 0a 0a 23 20 41 75 74 68 6f 72 3a 20 52 65 6d 69 20 46 6c 61 6d 61 72 79 20 3c 72 .."""..#.Author:.Remi.Flamary.<r
11040 65 6d 69 2e 66 6c 61 6d 61 72 79 40 75 6e 69 63 65 2e 66 72 3e 0a 23 0a 23 20 4c 69 63 65 6e 73 emi.flamary@unice.fr>.#.#.Licens
11060 65 3a 20 4d 49 54 20 4c 69 63 65 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6e 75 6d 70 79 20 61 73 20 e:.MIT.License..import.numpy.as.
11080 6e 70 0a 69 6d 70 6f 72 74 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 70 79 6c 61 62 20 61 73 20 70 6c np.import.matplotlib.pylab.as.pl
110a0 0a 69 6d 70 6f 72 74 20 6f 74 0a 23 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 33 64 20 70 6c .import.ot.#.necessary.for.3d.pl
110c0 6f 74 20 65 76 65 6e 20 69 66 20 6e 6f 74 20 75 73 65 64 0a 66 72 6f 6d 20 6d 70 6c 5f 74 6f 6f ot.even.if.not.used.from.mpl_too
110e0 6c 6b 69 74 73 2e 6d 70 6c 6f 74 33 64 20 69 6d 70 6f 72 74 20 41 78 65 73 33 44 20 20 23 20 6e lkits.mplot3d.import.Axes3D..#.n
11100 6f 71 61 0a 66 72 6f 6d 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 63 6f 6c 6c 65 63 74 69 6f 6e 73 20 oqa.from.matplotlib.collections.
11120 69 6d 70 6f 72 74 20 50 6f 6c 79 43 6f 6c 6c 65 63 74 69 6f 6e 20 20 23 20 6e 6f 71 61 0a 0a 23 import.PolyCollection..#.noqa..#
11140 69 6d 70 6f 72 74 20 6f 74 2e 6c 70 2e 63 76 78 20 61 73 20 63 76 78 0a 0a 23 23 23 23 23 23 23 import.ot.lp.cvx.as.cvx..#######
11160 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
11180 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
111a0 23 23 23 23 23 23 23 0a 23 20 47 61 75 73 73 69 61 6e 20 44 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d #######.#.Gaussian.Data.#.------
111c0 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 70 61 72 61 6d 65 74 65 72 73 0a 0a 70 72 6f 62 6c 65 6d -------..#%%.parameters..problem
111e0 73 20 3d 20 5b 5d 0a 0a 6e 20 3d 20 31 30 30 20 20 23 20 6e 62 20 62 69 6e 73 0a 0a 23 20 62 69 s.=.[]..n.=.100..#.nb.bins..#.bi
11200 6e 20 70 6f 73 69 74 69 6f 6e 73 0a 78 20 3d 20 6e 70 2e 61 72 61 6e 67 65 28 6e 2c 20 64 74 79 n.positions.x.=.np.arange(n,.dty
11220 70 65 3d 6e 70 2e 66 6c 6f 61 74 36 34 29 0a 0a 23 20 47 61 75 73 73 69 61 6e 20 64 69 73 74 72 pe=np.float64)..#.Gaussian.distr
11240 69 62 75 74 69 6f 6e 73 0a 23 20 47 61 75 73 73 69 61 6e 20 64 69 73 74 72 69 62 75 74 69 6f 6e ibutions.#.Gaussian.distribution
11260 73 0a 61 31 20 3d 20 6f 74 2e 64 61 74 61 73 65 74 73 2e 6d 61 6b 65 5f 31 44 5f 67 61 75 73 73 s.a1.=.ot.datasets.make_1D_gauss
11280 28 6e 2c 20 6d 3d 32 30 2c 20 73 3d 35 29 20 20 23 20 6d 3d 20 6d 65 61 6e 2c 20 73 3d 20 73 74 (n,.m=20,.s=5)..#.m=.mean,.s=.st
112a0 64 0a 61 32 20 3d 20 6f 74 2e 64 61 74 61 73 65 74 73 2e 6d 61 6b 65 5f 31 44 5f 67 61 75 73 73 d.a2.=.ot.datasets.make_1D_gauss
112c0 28 6e 2c 20 6d 3d 36 30 2c 20 73 3d 38 29 0a 0a 23 20 63 72 65 61 74 69 6e 67 20 6d 61 74 72 69 (n,.m=60,.s=8)..#.creating.matri
112e0 78 20 41 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 x.A.containing.all.distributions
11300 0a 41 20 3d 20 6e 70 2e 76 73 74 61 63 6b 28 28 61 31 2c 20 61 32 29 29 2e 54 0a 6e 5f 64 69 73 .A.=.np.vstack((a1,.a2)).T.n_dis
11320 74 72 69 62 75 74 69 6f 6e 73 20 3d 20 41 2e 73 68 61 70 65 5b 31 5d 0a 0a 23 20 6c 6f 73 73 20 tributions.=.A.shape[1]..#.loss.
11340 6d 61 74 72 69 78 20 2b 20 6e 6f 72 6d 61 6c 69 7a 61 74 69 6f 6e 0a 4d 20 3d 20 6f 74 2e 75 74 matrix.+.normalization.M.=.ot.ut
11360 69 6c 73 2e 64 69 73 74 30 28 6e 29 0a 4d 20 2f 3d 20 4d 2e 6d 61 78 28 29 0a 0a 0a 23 25 25 20 ils.dist0(n).M./=.M.max()...#%%.
11380 70 6c 6f 74 20 74 68 65 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0a 0a 70 6c 2e 66 69 67 75 72 plot.the.distributions..pl.figur
113a0 65 28 31 2c 20 66 69 67 73 69 7a 65 3d 28 36 2e 34 2c 20 33 29 29 0a 66 6f 72 20 69 20 69 6e 20 e(1,.figsize=(6.4,.3)).for.i.in.
113c0 72 61 6e 67 65 28 6e 5f 64 69 73 74 72 69 62 75 74 69 6f 6e 73 29 3a 0a 20 20 20 20 70 6c 2e 70 range(n_distributions):.....pl.p
113e0 6c 6f 74 28 78 2c 20 41 5b 3a 2c 20 69 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 44 69 73 74 72 69 lot(x,.A[:,.i]).pl.title('Distri
11400 62 75 74 69 6f 6e 73 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 23 25 25 butions').pl.tight_layout()..#%%
11420 20 62 61 72 79 63 65 6e 74 65 72 20 63 6f 6d 70 75 74 61 74 69 6f 6e 0a 0a 61 6c 70 68 61 20 3d .barycenter.computation..alpha.=
11440 20 30 2e 35 20 20 23 20 30 3c 3d 61 6c 70 68 61 3c 3d 31 0a 77 65 69 67 68 74 73 20 3d 20 6e 70 .0.5..#.0<=alpha<=1.weights.=.np
11460 2e 61 72 72 61 79 28 5b 31 20 2d 20 61 6c 70 68 61 2c 20 61 6c 70 68 61 5d 29 0a 0a 23 20 6c 32 .array([1.-.alpha,.alpha])..#.l2
11480 62 61 72 79 0a 62 61 72 79 5f 6c 32 20 3d 20 41 2e 64 6f 74 28 77 65 69 67 68 74 73 29 0a 0a 23 bary.bary_l2.=.A.dot(weights)..#
114a0 20 77 61 73 73 65 72 73 74 65 69 6e 0a 72 65 67 20 3d 20 31 65 2d 33 0a 6f 74 2e 74 69 63 28 29 .wasserstein.reg.=.1e-3.ot.tic()
114c0 0a 62 61 72 79 5f 77 61 73 73 20 3d 20 6f 74 2e 62 72 65 67 6d 61 6e 2e 62 61 72 79 63 65 6e 74 .bary_wass.=.ot.bregman.barycent
114e0 65 72 28 41 2c 20 4d 2c 20 72 65 67 2c 20 77 65 69 67 68 74 73 29 0a 6f 74 2e 74 6f 63 28 29 0a er(A,.M,.reg,.weights).ot.toc().
11500 0a 0a 6f 74 2e 74 69 63 28 29 0a 62 61 72 79 5f 77 61 73 73 32 20 3d 20 6f 74 2e 6c 70 2e 62 61 ..ot.tic().bary_wass2.=.ot.lp.ba
11520 72 79 63 65 6e 74 65 72 28 41 2c 20 4d 2c 20 77 65 69 67 68 74 73 2c 20 73 6f 6c 76 65 72 3d 27 rycenter(A,.M,.weights,.solver='
11540 69 6e 74 65 72 69 6f 72 2d 70 6f 69 6e 74 27 2c 20 76 65 72 62 6f 73 65 3d 54 72 75 65 29 0a 6f interior-point',.verbose=True).o
11560 74 2e 74 6f 63 28 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 32 29 0a 70 6c 2e 63 6c 66 28 29 0a 70 t.toc()..pl.figure(2).pl.clf().p
11580 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 31 2c 20 31 29 0a 66 6f 72 20 69 20 69 6e 20 72 61 6e 67 l.subplot(2,.1,.1).for.i.in.rang
115a0 65 28 6e 5f 64 69 73 74 72 69 62 75 74 69 6f 6e 73 29 3a 0a 20 20 20 20 70 6c 2e 70 6c 6f 74 28 e(n_distributions):.....pl.plot(
115c0 78 2c 20 41 5b 3a 2c 20 69 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 44 69 73 74 72 69 62 75 74 69 x,.A[:,.i]).pl.title('Distributi
115e0 6f 6e 73 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 31 2c 20 32 29 0a 70 6c 2e 70 6c ons')..pl.subplot(2,.1,.2).pl.pl
11600 6f 74 28 78 2c 20 62 61 72 79 5f 6c 32 2c 20 27 72 27 2c 20 6c 61 62 65 6c 3d 27 6c 32 27 29 0a ot(x,.bary_l2,.'r',.label='l2').
11620 70 6c 2e 70 6c 6f 74 28 78 2c 20 62 61 72 79 5f 77 61 73 73 2c 20 27 67 27 2c 20 6c 61 62 65 6c pl.plot(x,.bary_wass,.'g',.label
11640 3d 27 52 65 67 20 57 61 73 73 65 72 73 74 65 69 6e 27 29 0a 70 6c 2e 70 6c 6f 74 28 78 2c 20 62 ='Reg.Wasserstein').pl.plot(x,.b
11660 61 72 79 5f 77 61 73 73 32 2c 20 27 62 27 2c 20 6c 61 62 65 6c 3d 27 4c 50 20 57 61 73 73 65 72 ary_wass2,.'b',.label='LP.Wasser
11680 73 74 65 69 6e 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 29 0a 70 6c 2e 74 69 74 6c 65 28 27 42 61 stein').pl.legend().pl.title('Ba
116a0 72 79 63 65 6e 74 65 72 73 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 70 rycenters').pl.tight_layout()..p
116c0 72 6f 62 6c 65 6d 73 2e 61 70 70 65 6e 64 28 5b 41 2c 20 5b 62 61 72 79 5f 6c 32 2c 20 62 61 72 roblems.append([A,.[bary_l2,.bar
116e0 79 5f 77 61 73 73 2c 20 62 61 72 79 5f 77 61 73 73 32 5d 5d 29 0a 0a 23 23 23 23 23 23 23 23 23 y_wass,.bary_wass2]])..#########
11700 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
11720 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
11740 23 23 23 23 23 0a 23 20 44 69 72 61 63 20 44 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a #####.#.Dirac.Data.#.----------.
11760 0a 23 25 25 20 70 61 72 61 6d 65 74 65 72 73 0a 0a 61 31 20 3d 20 31 2e 30 20 2a 20 28 78 20 3e .#%%.parameters..a1.=.1.0.*.(x.>
11780 20 31 30 29 20 2a 20 28 78 20 3c 20 35 30 29 0a 61 32 20 3d 20 31 2e 30 20 2a 20 28 78 20 3e 20 .10).*.(x.<.50).a2.=.1.0.*.(x.>.
117a0 36 30 29 20 2a 20 28 78 20 3c 20 38 30 29 0a 0a 61 31 20 2f 3d 20 61 31 2e 73 75 6d 28 29 0a 61 60).*.(x.<.80)..a1./=.a1.sum().a
117c0 32 20 2f 3d 20 61 32 2e 73 75 6d 28 29 0a 0a 23 20 63 72 65 61 74 69 6e 67 20 6d 61 74 72 69 78 2./=.a2.sum()..#.creating.matrix
117e0 20 41 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0a .A.containing.all.distributions.
11800 41 20 3d 20 6e 70 2e 76 73 74 61 63 6b 28 28 61 31 2c 20 61 32 29 29 2e 54 0a 6e 5f 64 69 73 74 A.=.np.vstack((a1,.a2)).T.n_dist
11820 72 69 62 75 74 69 6f 6e 73 20 3d 20 41 2e 73 68 61 70 65 5b 31 5d 0a 0a 23 20 6c 6f 73 73 20 6d ributions.=.A.shape[1]..#.loss.m
11840 61 74 72 69 78 20 2b 20 6e 6f 72 6d 61 6c 69 7a 61 74 69 6f 6e 0a 4d 20 3d 20 6f 74 2e 75 74 69 atrix.+.normalization.M.=.ot.uti
11860 6c 73 2e 64 69 73 74 30 28 6e 29 0a 4d 20 2f 3d 20 4d 2e 6d 61 78 28 29 0a 0a 0a 23 25 25 20 70 ls.dist0(n).M./=.M.max()...#%%.p
11880 6c 6f 74 20 74 68 65 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0a 0a 70 6c 2e 66 69 67 75 72 65 lot.the.distributions..pl.figure
118a0 28 31 2c 20 66 69 67 73 69 7a 65 3d 28 36 2e 34 2c 20 33 29 29 0a 66 6f 72 20 69 20 69 6e 20 72 (1,.figsize=(6.4,.3)).for.i.in.r
118c0 61 6e 67 65 28 6e 5f 64 69 73 74 72 69 62 75 74 69 6f 6e 73 29 3a 0a 20 20 20 20 70 6c 2e 70 6c ange(n_distributions):.....pl.pl
118e0 6f 74 28 78 2c 20 41 5b 3a 2c 20 69 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 44 69 73 74 72 69 62 ot(x,.A[:,.i]).pl.title('Distrib
11900 75 74 69 6f 6e 73 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 0a 23 25 25 utions').pl.tight_layout()...#%%
11920 20 62 61 72 79 63 65 6e 74 65 72 20 63 6f 6d 70 75 74 61 74 69 6f 6e 0a 0a 61 6c 70 68 61 20 3d .barycenter.computation..alpha.=
11940 20 30 2e 35 20 20 23 20 30 3c 3d 61 6c 70 68 61 3c 3d 31 0a 77 65 69 67 68 74 73 20 3d 20 6e 70 .0.5..#.0<=alpha<=1.weights.=.np
11960 2e 61 72 72 61 79 28 5b 31 20 2d 20 61 6c 70 68 61 2c 20 61 6c 70 68 61 5d 29 0a 0a 23 20 6c 32 .array([1.-.alpha,.alpha])..#.l2
11980 62 61 72 79 0a 62 61 72 79 5f 6c 32 20 3d 20 41 2e 64 6f 74 28 77 65 69 67 68 74 73 29 0a 0a 23 bary.bary_l2.=.A.dot(weights)..#
119a0 20 77 61 73 73 65 72 73 74 65 69 6e 0a 72 65 67 20 3d 20 31 65 2d 33 0a 6f 74 2e 74 69 63 28 29 .wasserstein.reg.=.1e-3.ot.tic()
119c0 0a 62 61 72 79 5f 77 61 73 73 20 3d 20 6f 74 2e 62 72 65 67 6d 61 6e 2e 62 61 72 79 63 65 6e 74 .bary_wass.=.ot.bregman.barycent
119e0 65 72 28 41 2c 20 4d 2c 20 72 65 67 2c 20 77 65 69 67 68 74 73 29 0a 6f 74 2e 74 6f 63 28 29 0a er(A,.M,.reg,.weights).ot.toc().
11a00 0a 0a 6f 74 2e 74 69 63 28 29 0a 62 61 72 79 5f 77 61 73 73 32 20 3d 20 6f 74 2e 6c 70 2e 62 61 ..ot.tic().bary_wass2.=.ot.lp.ba
11a20 72 79 63 65 6e 74 65 72 28 41 2c 20 4d 2c 20 77 65 69 67 68 74 73 2c 20 73 6f 6c 76 65 72 3d 27 rycenter(A,.M,.weights,.solver='
11a40 69 6e 74 65 72 69 6f 72 2d 70 6f 69 6e 74 27 2c 20 76 65 72 62 6f 73 65 3d 54 72 75 65 29 0a 6f interior-point',.verbose=True).o
11a60 74 2e 74 6f 63 28 29 0a 0a 0a 70 72 6f 62 6c 65 6d 73 2e 61 70 70 65 6e 64 28 5b 41 2c 20 5b 62 t.toc()...problems.append([A,.[b
11a80 61 72 79 5f 6c 32 2c 20 62 61 72 79 5f 77 61 73 73 2c 20 62 61 72 79 5f 77 61 73 73 32 5d 5d 29 ary_l2,.bary_wass,.bary_wass2]])
11aa0 0a 0a 70 6c 2e 66 69 67 75 72 65 28 32 29 0a 70 6c 2e 63 6c 66 28 29 0a 70 6c 2e 73 75 62 70 6c ..pl.figure(2).pl.clf().pl.subpl
11ac0 6f 74 28 32 2c 20 31 2c 20 31 29 0a 66 6f 72 20 69 20 69 6e 20 72 61 6e 67 65 28 6e 5f 64 69 73 ot(2,.1,.1).for.i.in.range(n_dis
11ae0 74 72 69 62 75 74 69 6f 6e 73 29 3a 0a 20 20 20 20 70 6c 2e 70 6c 6f 74 28 78 2c 20 41 5b 3a 2c tributions):.....pl.plot(x,.A[:,
11b00 20 69 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 44 69 73 74 72 69 62 75 74 69 6f 6e 73 27 29 0a 0a .i]).pl.title('Distributions')..
11b20 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 31 2c 20 32 29 0a 70 6c 2e 70 6c 6f 74 28 78 2c 20 62 pl.subplot(2,.1,.2).pl.plot(x,.b
11b40 61 72 79 5f 6c 32 2c 20 27 72 27 2c 20 6c 61 62 65 6c 3d 27 6c 32 27 29 0a 70 6c 2e 70 6c 6f 74 ary_l2,.'r',.label='l2').pl.plot
11b60 28 78 2c 20 62 61 72 79 5f 77 61 73 73 2c 20 27 67 27 2c 20 6c 61 62 65 6c 3d 27 52 65 67 20 57 (x,.bary_wass,.'g',.label='Reg.W
11b80 61 73 73 65 72 73 74 65 69 6e 27 29 0a 70 6c 2e 70 6c 6f 74 28 78 2c 20 62 61 72 79 5f 77 61 73 asserstein').pl.plot(x,.bary_was
11ba0 73 32 2c 20 27 62 27 2c 20 6c 61 62 65 6c 3d 27 4c 50 20 57 61 73 73 65 72 73 74 65 69 6e 27 29 s2,.'b',.label='LP.Wasserstein')
11bc0 0a 70 6c 2e 6c 65 67 65 6e 64 28 29 0a 70 6c 2e 74 69 74 6c 65 28 27 42 61 72 79 63 65 6e 74 65 .pl.legend().pl.title('Barycente
11be0 72 73 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 23 25 25 20 70 61 72 61 rs').pl.tight_layout()..#%%.para
11c00 6d 65 74 65 72 73 0a 0a 61 31 20 3d 20 6e 70 2e 7a 65 72 6f 73 28 6e 29 0a 61 32 20 3d 20 6e 70 meters..a1.=.np.zeros(n).a2.=.np
11c20 2e 7a 65 72 6f 73 28 6e 29 0a 0a 61 31 5b 31 30 5d 20 3d 20 2e 32 35 0a 61 31 5b 32 30 5d 20 3d .zeros(n)..a1[10].=..25.a1[20].=
11c40 20 2e 35 0a 61 31 5b 33 30 5d 20 3d 20 2e 32 35 0a 61 32 5b 38 30 5d 20 3d 20 31 0a 0a 0a 61 31 ..5.a1[30].=..25.a2[80].=.1...a1
11c60 20 2f 3d 20 61 31 2e 73 75 6d 28 29 0a 61 32 20 2f 3d 20 61 32 2e 73 75 6d 28 29 0a 0a 23 20 63 ./=.a1.sum().a2./=.a2.sum()..#.c
11c80 72 65 61 74 69 6e 67 20 6d 61 74 72 69 78 20 41 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 reating.matrix.A.containing.all.
11ca0 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0a 41 20 3d 20 6e 70 2e 76 73 74 61 63 6b 28 28 61 31 2c distributions.A.=.np.vstack((a1,
11cc0 20 61 32 29 29 2e 54 0a 6e 5f 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 3d 20 41 2e 73 68 61 70 .a2)).T.n_distributions.=.A.shap
11ce0 65 5b 31 5d 0a 0a 23 20 6c 6f 73 73 20 6d 61 74 72 69 78 20 2b 20 6e 6f 72 6d 61 6c 69 7a 61 74 e[1]..#.loss.matrix.+.normalizat
11d00 69 6f 6e 0a 4d 20 3d 20 6f 74 2e 75 74 69 6c 73 2e 64 69 73 74 30 28 6e 29 0a 4d 20 2f 3d 20 4d ion.M.=.ot.utils.dist0(n).M./=.M
11d20 2e 6d 61 78 28 29 0a 0a 0a 23 25 25 20 70 6c 6f 74 20 74 68 65 20 64 69 73 74 72 69 62 75 74 69 .max()...#%%.plot.the.distributi
11d40 6f 6e 73 0a 0a 70 6c 2e 66 69 67 75 72 65 28 31 2c 20 66 69 67 73 69 7a 65 3d 28 36 2e 34 2c 20 ons..pl.figure(1,.figsize=(6.4,.
11d60 33 29 29 0a 66 6f 72 20 69 20 69 6e 20 72 61 6e 67 65 28 6e 5f 64 69 73 74 72 69 62 75 74 69 6f 3)).for.i.in.range(n_distributio
11d80 6e 73 29 3a 0a 20 20 20 20 70 6c 2e 70 6c 6f 74 28 78 2c 20 41 5b 3a 2c 20 69 5d 29 0a 70 6c 2e ns):.....pl.plot(x,.A[:,.i]).pl.
11da0 74 69 74 6c 65 28 27 44 69 73 74 72 69 62 75 74 69 6f 6e 73 27 29 0a 70 6c 2e 74 69 67 68 74 5f title('Distributions').pl.tight_
11dc0 6c 61 79 6f 75 74 28 29 0a 0a 0a 23 25 25 20 62 61 72 79 63 65 6e 74 65 72 20 63 6f 6d 70 75 74 layout()...#%%.barycenter.comput
11de0 61 74 69 6f 6e 0a 0a 61 6c 70 68 61 20 3d 20 30 2e 35 20 20 23 20 30 3c 3d 61 6c 70 68 61 3c 3d ation..alpha.=.0.5..#.0<=alpha<=
11e00 31 0a 77 65 69 67 68 74 73 20 3d 20 6e 70 2e 61 72 72 61 79 28 5b 31 20 2d 20 61 6c 70 68 61 2c 1.weights.=.np.array([1.-.alpha,
11e20 20 61 6c 70 68 61 5d 29 0a 0a 23 20 6c 32 62 61 72 79 0a 62 61 72 79 5f 6c 32 20 3d 20 41 2e 64 .alpha])..#.l2bary.bary_l2.=.A.d
11e40 6f 74 28 77 65 69 67 68 74 73 29 0a 0a 23 20 77 61 73 73 65 72 73 74 65 69 6e 0a 72 65 67 20 3d ot(weights)..#.wasserstein.reg.=
11e60 20 31 65 2d 33 0a 6f 74 2e 74 69 63 28 29 0a 62 61 72 79 5f 77 61 73 73 20 3d 20 6f 74 2e 62 72 .1e-3.ot.tic().bary_wass.=.ot.br
11e80 65 67 6d 61 6e 2e 62 61 72 79 63 65 6e 74 65 72 28 41 2c 20 4d 2c 20 72 65 67 2c 20 77 65 69 67 egman.barycenter(A,.M,.reg,.weig
11ea0 68 74 73 29 0a 6f 74 2e 74 6f 63 28 29 0a 0a 0a 6f 74 2e 74 69 63 28 29 0a 62 61 72 79 5f 77 61 hts).ot.toc()...ot.tic().bary_wa
11ec0 73 73 32 20 3d 20 6f 74 2e 6c 70 2e 62 61 72 79 63 65 6e 74 65 72 28 41 2c 20 4d 2c 20 77 65 69 ss2.=.ot.lp.barycenter(A,.M,.wei
11ee0 67 68 74 73 2c 20 73 6f 6c 76 65 72 3d 27 69 6e 74 65 72 69 6f 72 2d 70 6f 69 6e 74 27 2c 20 76 ghts,.solver='interior-point',.v
11f00 65 72 62 6f 73 65 3d 54 72 75 65 29 0a 6f 74 2e 74 6f 63 28 29 0a 0a 0a 70 72 6f 62 6c 65 6d 73 erbose=True).ot.toc()...problems
11f20 2e 61 70 70 65 6e 64 28 5b 41 2c 20 5b 62 61 72 79 5f 6c 32 2c 20 62 61 72 79 5f 77 61 73 73 2c .append([A,.[bary_l2,.bary_wass,
11f40 20 62 61 72 79 5f 77 61 73 73 32 5d 5d 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 32 29 0a 70 6c 2e .bary_wass2]])..pl.figure(2).pl.
11f60 63 6c 66 28 29 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 31 2c 20 31 29 0a 66 6f 72 20 69 20 clf().pl.subplot(2,.1,.1).for.i.
11f80 69 6e 20 72 61 6e 67 65 28 6e 5f 64 69 73 74 72 69 62 75 74 69 6f 6e 73 29 3a 0a 20 20 20 20 70 in.range(n_distributions):.....p
11fa0 6c 2e 70 6c 6f 74 28 78 2c 20 41 5b 3a 2c 20 69 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 44 69 73 l.plot(x,.A[:,.i]).pl.title('Dis
11fc0 74 72 69 62 75 74 69 6f 6e 73 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 31 2c 20 32 tributions')..pl.subplot(2,.1,.2
11fe0 29 0a 70 6c 2e 70 6c 6f 74 28 78 2c 20 62 61 72 79 5f 6c 32 2c 20 27 72 27 2c 20 6c 61 62 65 6c ).pl.plot(x,.bary_l2,.'r',.label
12000 3d 27 6c 32 27 29 0a 70 6c 2e 70 6c 6f 74 28 78 2c 20 62 61 72 79 5f 77 61 73 73 2c 20 27 67 27 ='l2').pl.plot(x,.bary_wass,.'g'
12020 2c 20 6c 61 62 65 6c 3d 27 52 65 67 20 57 61 73 73 65 72 73 74 65 69 6e 27 29 0a 70 6c 2e 70 6c ,.label='Reg.Wasserstein').pl.pl
12040 6f 74 28 78 2c 20 62 61 72 79 5f 77 61 73 73 32 2c 20 27 62 27 2c 20 6c 61 62 65 6c 3d 27 4c 50 ot(x,.bary_wass2,.'b',.label='LP
12060 20 57 61 73 73 65 72 73 74 65 69 6e 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 29 0a 70 6c 2e 74 69 .Wasserstein').pl.legend().pl.ti
12080 74 6c 65 28 27 42 61 72 79 63 65 6e 74 65 72 73 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f tle('Barycenters').pl.tight_layo
120a0 75 74 28 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ut()...#########################
120c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
120e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 46 69 6e 61 6c 20 66 69 #####################.#.Final.fi
12100 67 75 72 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 0a 23 25 25 20 70 6c 6f 74 0a gure.#.------------.#..#%%.plot.
12120 0a 6e 62 6d 20 3d 20 6c 65 6e 28 70 72 6f 62 6c 65 6d 73 29 0a 6e 62 6d 32 20 3d 20 28 6e 62 6d .nbm.=.len(problems).nbm2.=.(nbm
12140 20 2f 2f 20 32 29 0a 0a 0a 70 6c 2e 66 69 67 75 72 65 28 32 2c 20 28 32 30 2c 20 36 29 29 0a 70 .//.2)...pl.figure(2,.(20,.6)).p
12160 6c 2e 63 6c 66 28 29 0a 0a 66 6f 72 20 69 20 69 6e 20 72 61 6e 67 65 28 6e 62 6d 29 3a 0a 0a 20 l.clf()..for.i.in.range(nbm):...
12180 20 20 20 41 20 3d 20 70 72 6f 62 6c 65 6d 73 5b 69 5d 5b 30 5d 0a 20 20 20 20 62 61 72 79 5f 6c ...A.=.problems[i][0].....bary_l
121a0 32 20 3d 20 70 72 6f 62 6c 65 6d 73 5b 69 5d 5b 31 5d 5b 30 5d 0a 20 20 20 20 62 61 72 79 5f 77 2.=.problems[i][1][0].....bary_w
121c0 61 73 73 20 3d 20 70 72 6f 62 6c 65 6d 73 5b 69 5d 5b 31 5d 5b 31 5d 0a 20 20 20 20 62 61 72 79 ass.=.problems[i][1][1].....bary
121e0 5f 77 61 73 73 32 20 3d 20 70 72 6f 62 6c 65 6d 73 5b 69 5d 5b 31 5d 5b 32 5d 0a 0a 20 20 20 20 _wass2.=.problems[i][1][2]......
12200 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 6e 62 6d 2c 20 31 20 2b 20 69 29 0a 20 20 20 20 66 6f pl.subplot(2,.nbm,.1.+.i).....fo
12220 72 20 6a 20 69 6e 20 72 61 6e 67 65 28 6e 5f 64 69 73 74 72 69 62 75 74 69 6f 6e 73 29 3a 0a 20 r.j.in.range(n_distributions):..
12240 20 20 20 20 20 20 20 70 6c 2e 70 6c 6f 74 28 78 2c 20 41 5b 3a 2c 20 6a 5d 29 0a 20 20 20 20 69 .......pl.plot(x,.A[:,.j]).....i
12260 66 20 69 20 3d 3d 20 6e 62 6d 32 3a 0a 20 20 20 20 20 20 20 20 70 6c 2e 74 69 74 6c 65 28 27 44 f.i.==.nbm2:.........pl.title('D
12280 69 73 74 72 69 62 75 74 69 6f 6e 73 27 29 0a 20 20 20 20 70 6c 2e 78 74 69 63 6b 73 28 28 29 29 istributions').....pl.xticks(())
122a0 0a 20 20 20 20 70 6c 2e 79 74 69 63 6b 73 28 28 29 29 0a 0a 20 20 20 20 70 6c 2e 73 75 62 70 6c .....pl.yticks(())......pl.subpl
122c0 6f 74 28 32 2c 20 6e 62 6d 2c 20 31 20 2b 20 69 20 2b 20 6e 62 6d 29 0a 0a 20 20 20 20 70 6c 2e ot(2,.nbm,.1.+.i.+.nbm)......pl.
122e0 70 6c 6f 74 28 78 2c 20 62 61 72 79 5f 6c 32 2c 20 27 72 27 2c 20 6c 61 62 65 6c 3d 27 4c 32 20 plot(x,.bary_l2,.'r',.label='L2.
12300 28 45 75 63 6c 69 64 65 61 6e 29 27 29 0a 20 20 20 20 70 6c 2e 70 6c 6f 74 28 78 2c 20 62 61 72 (Euclidean)').....pl.plot(x,.bar
12320 79 5f 77 61 73 73 2c 20 27 67 27 2c 20 6c 61 62 65 6c 3d 27 52 65 67 20 57 61 73 73 65 72 73 74 y_wass,.'g',.label='Reg.Wasserst
12340 65 69 6e 27 29 0a 20 20 20 20 70 6c 2e 70 6c 6f 74 28 78 2c 20 62 61 72 79 5f 77 61 73 73 32 2c ein').....pl.plot(x,.bary_wass2,
12360 20 27 62 27 2c 20 6c 61 62 65 6c 3d 27 4c 50 20 57 61 73 73 65 72 73 74 65 69 6e 27 29 0a 20 20 .'b',.label='LP.Wasserstein')...
12380 20 20 69 66 20 69 20 3d 3d 20 6e 62 6d 20 2d 20 31 3a 0a 20 20 20 20 20 20 20 20 70 6c 2e 6c 65 ..if.i.==.nbm.-.1:.........pl.le
123a0 67 65 6e 64 28 29 0a 20 20 20 20 69 66 20 69 20 3d 3d 20 6e 62 6d 32 3a 0a 20 20 20 20 20 20 20 gend().....if.i.==.nbm2:........
123c0 20 70 6c 2e 74 69 74 6c 65 28 27 42 61 72 79 63 65 6e 74 65 72 73 27 29 0a 0a 20 20 20 20 70 6c .pl.title('Barycenters')......pl
123e0 2e 78 74 69 63 6b 73 28 28 29 29 0a 20 20 20 20 70 6c 2e 79 74 69 63 6b 73 28 28 29 29 0a 50 4b .xticks(()).....pl.yticks(()).PK
12400 03 04 14 00 00 00 00 00 db 74 d9 4e a7 6b f0 c3 bf 0b 00 00 bf 0b 00 00 15 00 00 00 70 6c 6f 74 .........t.N.k..............plot
12420 5f 4f 54 5f 32 44 5f 73 61 6d 70 6c 65 73 2e 70 79 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 _OT_2D_samples.py#.-*-.coding:.u
12440 74 66 2d 38 20 2d 2a 2d 0a 22 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d tf-8.-*-.""".===================
12460 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================================
12480 3d 0a 32 44 20 4f 70 74 69 6d 61 6c 20 74 72 61 6e 73 70 6f 72 74 20 62 65 74 77 65 65 6e 20 65 =.2D.Optimal.transport.between.e
124a0 6d 70 69 72 69 63 61 6c 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d mpirical.distributions.=========
124c0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================================
124e0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 49 6c 6c 75 73 74 72 61 74 69 6f 6e 20 6f 66 20 32 44 20 ===========..Illustration.of.2D.
12500 6f 70 74 69 6d 61 6c 20 74 72 61 6e 73 70 6f 72 74 20 62 65 74 77 65 65 6e 20 64 69 73 63 72 69 optimal.transport.between.discri
12520 62 75 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 77 65 69 67 68 74 65 64 0a 73 75 6d 20 6f 66 butions.that.are.weighted.sum.of
12540 20 64 69 72 61 63 73 2e 20 54 68 65 20 4f 54 20 6d 61 74 72 69 78 20 69 73 20 70 6c 6f 74 74 65 .diracs..The.OT.matrix.is.plotte
12560 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 70 6c 65 73 2e 0a 0a 22 22 22 0a 0a 23 20 41 75 74 68 d.with.the.samples..."""..#.Auth
12580 6f 72 3a 20 52 65 6d 69 20 46 6c 61 6d 61 72 79 20 3c 72 65 6d 69 2e 66 6c 61 6d 61 72 79 40 75 or:.Remi.Flamary.<remi.flamary@u
125a0 6e 69 63 65 2e 66 72 3e 0a 23 20 20 20 20 20 20 20 20 20 4b 69 6c 69 61 6e 20 46 61 74 72 61 73 nice.fr>.#.........Kilian.Fatras
125c0 20 3c 6b 69 6c 69 61 6e 2e 66 61 74 72 61 73 40 69 72 69 73 61 2e 66 72 3e 0a 23 0a 23 20 4c 69 .<kilian.fatras@irisa.fr>.#.#.Li
125e0 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 63 65 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6e 75 6d 70 79 cense:.MIT.License..import.numpy
12600 20 61 73 20 6e 70 0a 69 6d 70 6f 72 74 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 70 79 6c 61 62 20 61 .as.np.import.matplotlib.pylab.a
12620 73 20 70 6c 0a 69 6d 70 6f 72 74 20 6f 74 0a 69 6d 70 6f 72 74 20 6f 74 2e 70 6c 6f 74 0a 0a 23 s.pl.import.ot.import.ot.plot..#
12640 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
12660 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
12680 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 47 65 6e 65 72 61 74 65 20 64 61 74 61 0a 23 20 #############.#.Generate.data.#.
126a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 70 61 72 61 6d 65 74 65 72 73 20 61 6e -------------..#%%.parameters.an
126c0 64 20 64 61 74 61 20 67 65 6e 65 72 61 74 69 6f 6e 0a 0a 6e 20 3d 20 35 30 20 20 23 20 6e 62 20 d.data.generation..n.=.50..#.nb.
126e0 73 61 6d 70 6c 65 73 0a 0a 6d 75 5f 73 20 3d 20 6e 70 2e 61 72 72 61 79 28 5b 30 2c 20 30 5d 29 samples..mu_s.=.np.array([0,.0])
12700 0a 63 6f 76 5f 73 20 3d 20 6e 70 2e 61 72 72 61 79 28 5b 5b 31 2c 20 30 5d 2c 20 5b 30 2c 20 31 .cov_s.=.np.array([[1,.0],.[0,.1
12720 5d 5d 29 0a 0a 6d 75 5f 74 20 3d 20 6e 70 2e 61 72 72 61 79 28 5b 34 2c 20 34 5d 29 0a 63 6f 76 ]])..mu_t.=.np.array([4,.4]).cov
12740 5f 74 20 3d 20 6e 70 2e 61 72 72 61 79 28 5b 5b 31 2c 20 2d 2e 38 5d 2c 20 5b 2d 2e 38 2c 20 31 _t.=.np.array([[1,.-.8],.[-.8,.1
12760 5d 5d 29 0a 0a 78 73 20 3d 20 6f 74 2e 64 61 74 61 73 65 74 73 2e 6d 61 6b 65 5f 32 44 5f 73 61 ]])..xs.=.ot.datasets.make_2D_sa
12780 6d 70 6c 65 73 5f 67 61 75 73 73 28 6e 2c 20 6d 75 5f 73 2c 20 63 6f 76 5f 73 29 0a 78 74 20 3d mples_gauss(n,.mu_s,.cov_s).xt.=
127a0 20 6f 74 2e 64 61 74 61 73 65 74 73 2e 6d 61 6b 65 5f 32 44 5f 73 61 6d 70 6c 65 73 5f 67 61 75 .ot.datasets.make_2D_samples_gau
127c0 73 73 28 6e 2c 20 6d 75 5f 74 2c 20 63 6f 76 5f 74 29 0a 0a 61 2c 20 62 20 3d 20 6e 70 2e 6f 6e ss(n,.mu_t,.cov_t)..a,.b.=.np.on
127e0 65 73 28 28 6e 2c 29 29 20 2f 20 6e 2c 20 6e 70 2e 6f 6e 65 73 28 28 6e 2c 29 29 20 2f 20 6e 20 es((n,))./.n,.np.ones((n,))./.n.
12800 20 23 20 75 6e 69 66 6f 72 6d 20 64 69 73 74 72 69 62 75 74 69 6f 6e 20 6f 6e 20 73 61 6d 70 6c .#.uniform.distribution.on.sampl
12820 65 73 0a 0a 23 20 6c 6f 73 73 20 6d 61 74 72 69 78 0a 4d 20 3d 20 6f 74 2e 64 69 73 74 28 78 73 es..#.loss.matrix.M.=.ot.dist(xs
12840 2c 20 78 74 29 0a 4d 20 2f 3d 20 4d 2e 6d 61 78 28 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 ,.xt).M./=.M.max()..############
12860 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
12880 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
128a0 23 23 0a 23 20 50 6c 6f 74 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 ##.#.Plot.data.#.---------..#%%.
128c0 70 6c 6f 74 20 73 61 6d 70 6c 65 73 0a 0a 70 6c 2e 66 69 67 75 72 65 28 31 29 0a 70 6c 2e 70 6c plot.samples..pl.figure(1).pl.pl
128e0 6f 74 28 78 73 5b 3a 2c 20 30 5d 2c 20 78 73 5b 3a 2c 20 31 5d 2c 20 27 2b 62 27 2c 20 6c 61 62 ot(xs[:,.0],.xs[:,.1],.'+b',.lab
12900 65 6c 3d 27 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 70 6c 6f 74 28 78 74 5b el='Source.samples').pl.plot(xt[
12920 3a 2c 20 30 5d 2c 20 78 74 5b 3a 2c 20 31 5d 2c 20 27 78 72 27 2c 20 6c 61 62 65 6c 3d 27 54 61 :,.0],.xt[:,.1],.'xr',.label='Ta
12940 72 67 65 74 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a rget.samples').pl.legend(loc=0).
12960 70 6c 2e 74 69 74 6c 65 28 27 53 6f 75 72 63 65 20 61 6e 64 20 74 61 72 67 65 74 20 64 69 73 74 pl.title('Source.and.target.dist
12980 72 69 62 75 74 69 6f 6e 73 27 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 32 29 0a 70 6c 2e 69 6d 73 ributions')..pl.figure(2).pl.ims
129a0 68 6f 77 28 4d 2c 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 72 65 73 74 27 29 0a how(M,.interpolation='nearest').
129c0 70 6c 2e 74 69 74 6c 65 28 27 43 6f 73 74 20 6d 61 74 72 69 78 20 4d 27 29 0a 0a 23 23 23 23 23 pl.title('Cost.matrix.M')..#####
129e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
12a00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
12a20 23 23 23 23 23 23 23 23 23 0a 23 20 43 6f 6d 70 75 74 65 20 45 4d 44 0a 23 20 2d 2d 2d 2d 2d 2d #########.#.Compute.EMD.#.------
12a40 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 45 4d 44 0a 0a 47 30 20 3d 20 6f 74 2e 65 6d 64 28 61 2c 20 62 -----..#%%.EMD..G0.=.ot.emd(a,.b
12a60 2c 20 4d 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 33 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 47 30 2c ,.M)..pl.figure(3).pl.imshow(G0,
12a80 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 72 65 73 74 27 29 0a 70 6c 2e 74 69 74 .interpolation='nearest').pl.tit
12aa0 6c 65 28 27 4f 54 20 6d 61 74 72 69 78 20 47 30 27 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 34 29 le('OT.matrix.G0')..pl.figure(4)
12ac0 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 32 44 5f 73 61 6d 70 6c 65 73 5f 6d 61 74 28 78 73 2c 20 .ot.plot.plot2D_samples_mat(xs,.
12ae0 78 74 2c 20 47 30 2c 20 63 3d 5b 2e 35 2c 20 2e 35 2c 20 31 5d 29 0a 70 6c 2e 70 6c 6f 74 28 78 xt,.G0,.c=[.5,..5,.1]).pl.plot(x
12b00 73 5b 3a 2c 20 30 5d 2c 20 78 73 5b 3a 2c 20 31 5d 2c 20 27 2b 62 27 2c 20 6c 61 62 65 6c 3d 27 s[:,.0],.xs[:,.1],.'+b',.label='
12b20 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 70 6c 6f 74 28 78 74 5b 3a 2c 20 30 Source.samples').pl.plot(xt[:,.0
12b40 5d 2c 20 78 74 5b 3a 2c 20 31 5d 2c 20 27 78 72 27 2c 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 ],.xt[:,.1],.'xr',.label='Target
12b60 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 .samples').pl.legend(loc=0).pl.t
12b80 69 74 6c 65 28 27 4f 54 20 6d 61 74 72 69 78 20 77 69 74 68 20 73 61 6d 70 6c 65 73 27 29 0a 0a itle('OT.matrix.with.samples')..
12ba0 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 .###############################
12bc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
12be0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 43 6f 6d 70 75 74 65 20 53 69 6e 6b 68 6f ###############.#.Compute.Sinkho
12c00 72 6e 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 73 69 6e 6b 68 rn.#.----------------..#%%.sinkh
12c20 6f 72 6e 0a 0a 23 20 72 65 67 20 74 65 72 6d 0a 6c 61 6d 62 64 20 3d 20 31 65 2d 33 0a 0a 47 73 orn..#.reg.term.lambd.=.1e-3..Gs
12c40 20 3d 20 6f 74 2e 73 69 6e 6b 68 6f 72 6e 28 61 2c 20 62 2c 20 4d 2c 20 6c 61 6d 62 64 29 0a 0a .=.ot.sinkhorn(a,.b,.M,.lambd)..
12c60 70 6c 2e 66 69 67 75 72 65 28 35 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 47 73 2c 20 69 6e 74 65 72 pl.figure(5).pl.imshow(Gs,.inter
12c80 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 72 65 73 74 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 4f 54 polation='nearest').pl.title('OT
12ca0 20 6d 61 74 72 69 78 20 73 69 6e 6b 68 6f 72 6e 27 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 36 29 .matrix.sinkhorn')..pl.figure(6)
12cc0 0a 6f 74 2e 70 6c 6f 74 2e 70 6c 6f 74 32 44 5f 73 61 6d 70 6c 65 73 5f 6d 61 74 28 78 73 2c 20 .ot.plot.plot2D_samples_mat(xs,.
12ce0 78 74 2c 20 47 73 2c 20 63 6f 6c 6f 72 3d 5b 2e 35 2c 20 2e 35 2c 20 31 5d 29 0a 70 6c 2e 70 6c xt,.Gs,.color=[.5,..5,.1]).pl.pl
12d00 6f 74 28 78 73 5b 3a 2c 20 30 5d 2c 20 78 73 5b 3a 2c 20 31 5d 2c 20 27 2b 62 27 2c 20 6c 61 62 ot(xs[:,.0],.xs[:,.1],.'+b',.lab
12d20 65 6c 3d 27 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 70 6c 6f 74 28 78 74 5b el='Source.samples').pl.plot(xt[
12d40 3a 2c 20 30 5d 2c 20 78 74 5b 3a 2c 20 31 5d 2c 20 27 78 72 27 2c 20 6c 61 62 65 6c 3d 27 54 61 :,.0],.xt[:,.1],.'xr',.label='Ta
12d60 72 67 65 74 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a rget.samples').pl.legend(loc=0).
12d80 70 6c 2e 74 69 74 6c 65 28 27 4f 54 20 6d 61 74 72 69 78 20 53 69 6e 6b 68 6f 72 6e 20 77 69 74 pl.title('OT.matrix.Sinkhorn.wit
12da0 68 20 73 61 6d 70 6c 65 73 27 29 0a 0a 70 6c 2e 73 68 6f 77 28 29 0a 0a 0a 23 23 23 23 23 23 23 h.samples')..pl.show()...#######
12dc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
12de0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
12e00 23 23 23 23 23 23 23 0a 23 20 45 6d 70 72 69 72 69 63 61 6c 20 53 69 6e 6b 68 6f 72 6e 0a 23 20 #######.#.Emprirical.Sinkhorn.#.
12e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 73 69 6e 6b 68 6f 72 6e 0a 0a ----------------..#%%.sinkhorn..
12e40 23 20 72 65 67 20 74 65 72 6d 0a 6c 61 6d 62 64 20 3d 20 31 65 2d 33 0a 0a 47 65 73 20 3d 20 6f #.reg.term.lambd.=.1e-3..Ges.=.o
12e60 74 2e 62 72 65 67 6d 61 6e 2e 65 6d 70 69 72 69 63 61 6c 5f 73 69 6e 6b 68 6f 72 6e 28 78 73 2c t.bregman.empirical_sinkhorn(xs,
12e80 20 78 74 2c 20 6c 61 6d 62 64 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 37 29 0a 70 6c 2e 69 6d 73 .xt,.lambd)..pl.figure(7).pl.ims
12ea0 68 6f 77 28 47 65 73 2c 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 3d 27 6e 65 61 72 65 73 74 27 how(Ges,.interpolation='nearest'
12ec0 29 0a 70 6c 2e 74 69 74 6c 65 28 27 4f 54 20 6d 61 74 72 69 78 20 65 6d 70 69 72 69 63 61 6c 20 ).pl.title('OT.matrix.empirical.
12ee0 73 69 6e 6b 68 6f 72 6e 27 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 38 29 0a 6f 74 2e 70 6c 6f 74 sinkhorn')..pl.figure(8).ot.plot
12f00 2e 70 6c 6f 74 32 44 5f 73 61 6d 70 6c 65 73 5f 6d 61 74 28 78 73 2c 20 78 74 2c 20 47 65 73 2c .plot2D_samples_mat(xs,.xt,.Ges,
12f20 20 63 6f 6c 6f 72 3d 5b 2e 35 2c 20 2e 35 2c 20 31 5d 29 0a 70 6c 2e 70 6c 6f 74 28 78 73 5b 3a .color=[.5,..5,.1]).pl.plot(xs[:
12f40 2c 20 30 5d 2c 20 78 73 5b 3a 2c 20 31 5d 2c 20 27 2b 62 27 2c 20 6c 61 62 65 6c 3d 27 53 6f 75 ,.0],.xs[:,.1],.'+b',.label='Sou
12f60 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 70 6c 6f 74 28 78 74 5b 3a 2c 20 30 5d 2c 20 rce.samples').pl.plot(xt[:,.0],.
12f80 78 74 5b 3a 2c 20 31 5d 2c 20 27 78 72 27 2c 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 xt[:,.1],.'xr',.label='Target.sa
12fa0 6d 70 6c 65 73 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 6c mples').pl.legend(loc=0).pl.titl
12fc0 65 28 27 4f 54 20 6d 61 74 72 69 78 20 53 69 6e 6b 68 6f 72 6e 20 66 72 6f 6d 20 73 61 6d 70 6c e('OT.matrix.Sinkhorn.from.sampl
12fe0 65 73 27 29 0a 0a 70 6c 2e 73 68 6f 77 28 29 0a 50 4b 03 04 14 00 00 00 00 00 da 74 d9 4e 0e e0 es')..pl.show().PK.........t.N..
13000 72 82 97 0b 00 00 97 0b 00 00 1b 00 00 00 70 6c 6f 74 5f 6f 74 64 61 5f 6c 69 6e 65 61 72 5f 6d r.............plot_otda_linear_m
13020 61 70 70 69 6e 67 2e 70 79 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 70 79 74 68 6f 6e 33 0a apping.py#!/usr/bin/env.python3.
13040 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0a 22 22 22 0a 3d 3d 3d 3d #.-*-.coding:.utf-8.-*-.""".====
13060 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 4c 69 6e 65 61 72 20 ========================.Linear.
13080 4f 54 20 6d 61 70 70 69 6e 67 20 65 73 74 69 6d 61 74 69 6f 6e 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d OT.mapping.estimation.==========
130a0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 0a 22 22 22 0a 0a 23 20 41 75 74 68 ==================..."""..#.Auth
130c0 6f 72 3a 20 52 65 6d 69 20 46 6c 61 6d 61 72 79 20 3c 72 65 6d 69 2e 66 6c 61 6d 61 72 79 40 75 or:.Remi.Flamary.<remi.flamary@u
130e0 6e 69 63 65 2e 66 72 3e 0a 23 0a 23 20 4c 69 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 63 65 6e 73 nice.fr>.#.#.License:.MIT.Licens
13100 65 0a 0a 69 6d 70 6f 72 74 20 6e 75 6d 70 79 20 61 73 20 6e 70 0a 69 6d 70 6f 72 74 20 70 79 6c e..import.numpy.as.np.import.pyl
13120 61 62 20 61 73 20 70 6c 0a 69 6d 70 6f 72 74 20 6f 74 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 ab.as.pl.import.ot..############
13140 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
13160 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
13180 23 23 0a 23 20 47 65 6e 65 72 61 74 65 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ##.#.Generate.data.#.-----------
131a0 2d 2d 0a 0a 6e 20 3d 20 31 30 30 30 0a 64 20 3d 20 32 0a 73 69 67 6d 61 20 3d 20 2e 31 0a 0a 23 --..n.=.1000.d.=.2.sigma.=..1..#
131c0 20 73 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 0a 61 6e 67 6c 65 73 20 3d 20 6e 70 2e 72 61 6e 64 .source.samples.angles.=.np.rand
131e0 6f 6d 2e 72 61 6e 64 28 6e 2c 20 31 29 20 2a 20 32 20 2a 20 6e 70 2e 70 69 0a 78 73 20 3d 20 6e om.rand(n,.1).*.2.*.np.pi.xs.=.n
13200 70 2e 63 6f 6e 63 61 74 65 6e 61 74 65 28 28 6e 70 2e 73 69 6e 28 61 6e 67 6c 65 73 29 2c 20 6e p.concatenate((np.sin(angles),.n
13220 70 2e 63 6f 73 28 61 6e 67 6c 65 73 29 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p.cos(angles)),.................
13240 20 20 20 20 61 78 69 73 3d 31 29 20 2b 20 73 69 67 6d 61 20 2a 20 6e 70 2e 72 61 6e 64 6f 6d 2e ....axis=1).+.sigma.*.np.random.
13260 72 61 6e 64 6e 28 6e 2c 20 32 29 0a 78 73 5b 3a 6e 20 2f 2f 20 32 2c 20 31 5d 20 2b 3d 20 32 0a randn(n,.2).xs[:n.//.2,.1].+=.2.
13280 0a 0a 23 20 74 61 72 67 65 74 20 73 61 6d 70 6c 65 73 0a 61 6e 67 6c 65 74 20 3d 20 6e 70 2e 72 ..#.target.samples.anglet.=.np.r
132a0 61 6e 64 6f 6d 2e 72 61 6e 64 28 6e 2c 20 31 29 20 2a 20 32 20 2a 20 6e 70 2e 70 69 0a 78 74 20 andom.rand(n,.1).*.2.*.np.pi.xt.
132c0 3d 20 6e 70 2e 63 6f 6e 63 61 74 65 6e 61 74 65 28 28 6e 70 2e 73 69 6e 28 61 6e 67 6c 65 74 29 =.np.concatenate((np.sin(anglet)
132e0 2c 20 6e 70 2e 63 6f 73 28 61 6e 67 6c 65 74 29 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.np.cos(anglet)),..............
13300 20 20 20 20 20 20 20 61 78 69 73 3d 31 29 20 2b 20 73 69 67 6d 61 20 2a 20 6e 70 2e 72 61 6e 64 .......axis=1).+.sigma.*.np.rand
13320 6f 6d 2e 72 61 6e 64 6e 28 6e 2c 20 32 29 0a 78 74 5b 3a 6e 20 2f 2f 20 32 2c 20 31 5d 20 2b 3d om.randn(n,.2).xt[:n.//.2,.1].+=
13340 20 32 0a 0a 0a 41 20 3d 20 6e 70 2e 61 72 72 61 79 28 5b 5b 31 2e 35 2c 20 2e 37 5d 2c 20 5b 2e .2...A.=.np.array([[1.5,..7],.[.
13360 37 2c 20 31 2e 35 5d 5d 29 0a 62 20 3d 20 6e 70 2e 61 72 72 61 79 28 5b 5b 34 2c 20 32 5d 5d 29 7,.1.5]]).b.=.np.array([[4,.2]])
13380 0a 78 74 20 3d 20 78 74 2e 64 6f 74 28 41 29 20 2b 20 62 0a 0a 23 23 23 23 23 23 23 23 23 23 23 .xt.=.xt.dot(A).+.b..###########
133a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
133c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
133e0 23 23 23 0a 23 20 50 6c 6f 74 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 6c 2e ###.#.Plot.data.#.---------..pl.
13400 66 69 67 75 72 65 28 31 2c 20 28 35 2c 20 35 29 29 0a 70 6c 2e 70 6c 6f 74 28 78 73 5b 3a 2c 20 figure(1,.(5,.5)).pl.plot(xs[:,.
13420 30 5d 2c 20 78 73 5b 3a 2c 20 31 5d 2c 20 27 2b 27 29 0a 70 6c 2e 70 6c 6f 74 28 78 74 5b 3a 2c 0],.xs[:,.1],.'+').pl.plot(xt[:,
13440 20 30 5d 2c 20 78 74 5b 3a 2c 20 31 5d 2c 20 27 6f 27 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 .0],.xt[:,.1],.'o')...##########
13460 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
13480 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
134a0 23 23 23 23 0a 23 20 45 73 74 69 6d 61 74 65 20 6c 69 6e 65 61 72 20 6d 61 70 70 69 6e 67 20 61 ####.#.Estimate.linear.mapping.a
134c0 6e 64 20 74 72 61 6e 73 70 6f 72 74 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d nd.transport.#.-----------------
134e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 41 65 2c 20 62 65 20 3d 20 6f --------------------..Ae,.be.=.o
13500 74 2e 64 61 2e 4f 54 5f 6d 61 70 70 69 6e 67 5f 6c 69 6e 65 61 72 28 78 73 2c 20 78 74 29 0a 0a t.da.OT_mapping_linear(xs,.xt)..
13520 78 73 74 20 3d 20 78 73 2e 64 6f 74 28 41 65 29 20 2b 20 62 65 0a 0a 0a 23 23 23 23 23 23 23 23 xst.=.xs.dot(Ae).+.be...########
13540 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
13560 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
13580 23 23 23 23 23 23 0a 23 20 50 6c 6f 74 20 74 72 61 6e 73 70 6f 72 74 65 64 20 73 61 6d 70 6c 65 ######.#.Plot.transported.sample
135a0 73 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 6c s.#.------------------------..pl
135c0 2e 66 69 67 75 72 65 28 31 2c 20 28 35 2c 20 35 29 29 0a 70 6c 2e 63 6c 66 28 29 0a 70 6c 2e 70 .figure(1,.(5,.5)).pl.clf().pl.p
135e0 6c 6f 74 28 78 73 5b 3a 2c 20 30 5d 2c 20 78 73 5b 3a 2c 20 31 5d 2c 20 27 2b 27 29 0a 70 6c 2e lot(xs[:,.0],.xs[:,.1],.'+').pl.
13600 70 6c 6f 74 28 78 74 5b 3a 2c 20 30 5d 2c 20 78 74 5b 3a 2c 20 31 5d 2c 20 27 6f 27 29 0a 70 6c plot(xt[:,.0],.xt[:,.1],.'o').pl
13620 2e 70 6c 6f 74 28 78 73 74 5b 3a 2c 20 30 5d 2c 20 78 73 74 5b 3a 2c 20 31 5d 2c 20 27 2b 27 29 .plot(xst[:,.0],.xst[:,.1],.'+')
13640 0a 0a 70 6c 2e 73 68 6f 77 28 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ..pl.show()..###################
13660 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
13680 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 4c 6f ###########################.#.Lo
136a0 61 64 20 69 6d 61 67 65 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ad.image.data.#.---------------.
136c0 0a 0a 64 65 66 20 69 6d 32 6d 61 74 28 49 29 3a 0a 20 20 20 20 22 22 22 43 6f 6e 76 65 72 74 73 ..def.im2mat(I):....."""Converts
136e0 20 61 6e 64 20 69 6d 61 67 65 20 74 6f 20 6d 61 74 72 69 78 20 28 6f 6e 65 20 70 69 78 65 6c 20 .and.image.to.matrix.(one.pixel.
13700 70 65 72 20 6c 69 6e 65 29 22 22 22 0a 20 20 20 20 72 65 74 75 72 6e 20 49 2e 72 65 73 68 61 70 per.line)""".....return.I.reshap
13720 65 28 28 49 2e 73 68 61 70 65 5b 30 5d 20 2a 20 49 2e 73 68 61 70 65 5b 31 5d 2c 20 49 2e 73 68 e((I.shape[0].*.I.shape[1],.I.sh
13740 61 70 65 5b 32 5d 29 29 0a 0a 0a 64 65 66 20 6d 61 74 32 69 6d 28 58 2c 20 73 68 61 70 65 29 3a ape[2]))...def.mat2im(X,.shape):
13760 0a 20 20 20 20 22 22 22 43 6f 6e 76 65 72 74 73 20 62 61 63 6b 20 61 20 6d 61 74 72 69 78 20 74 ....."""Converts.back.a.matrix.t
13780 6f 20 61 6e 20 69 6d 61 67 65 22 22 22 0a 20 20 20 20 72 65 74 75 72 6e 20 58 2e 72 65 73 68 61 o.an.image""".....return.X.resha
137a0 70 65 28 73 68 61 70 65 29 0a 0a 0a 64 65 66 20 6d 69 6e 6d 61 78 28 49 29 3a 0a 20 20 20 20 72 pe(shape)...def.minmax(I):.....r
137c0 65 74 75 72 6e 20 6e 70 2e 63 6c 69 70 28 49 2c 20 30 2c 20 31 29 0a 0a 0a 23 20 4c 6f 61 64 69 eturn.np.clip(I,.0,.1)...#.Loadi
137e0 6e 67 20 69 6d 61 67 65 73 0a 49 31 20 3d 20 70 6c 2e 69 6d 72 65 61 64 28 27 2e 2e 2f 64 61 74 ng.images.I1.=.pl.imread('../dat
13800 61 2f 6f 63 65 61 6e 5f 64 61 79 2e 6a 70 67 27 29 2e 61 73 74 79 70 65 28 6e 70 2e 66 6c 6f 61 a/ocean_day.jpg').astype(np.floa
13820 74 36 34 29 20 2f 20 32 35 36 0a 49 32 20 3d 20 70 6c 2e 69 6d 72 65 61 64 28 27 2e 2e 2f 64 61 t64)./.256.I2.=.pl.imread('../da
13840 74 61 2f 6f 63 65 61 6e 5f 73 75 6e 73 65 74 2e 6a 70 67 27 29 2e 61 73 74 79 70 65 28 6e 70 2e ta/ocean_sunset.jpg').astype(np.
13860 66 6c 6f 61 74 36 34 29 20 2f 20 32 35 36 0a 0a 0a 58 31 20 3d 20 69 6d 32 6d 61 74 28 49 31 29 float64)./.256...X1.=.im2mat(I1)
13880 0a 58 32 20 3d 20 69 6d 32 6d 61 74 28 49 32 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 .X2.=.im2mat(I2)..##############
138a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
138c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
138e0 0a 23 20 45 73 74 69 6d 61 74 65 20 6d 61 70 70 69 6e 67 20 61 6e 64 20 61 64 61 70 74 0a 23 20 .#.Estimate.mapping.and.adapt.#.
13900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 6d 61 ----------------------------..ma
13920 70 70 69 6e 67 20 3d 20 6f 74 2e 64 61 2e 4c 69 6e 65 61 72 54 72 61 6e 73 70 6f 72 74 28 29 0a pping.=.ot.da.LinearTransport().
13940 0a 6d 61 70 70 69 6e 67 2e 66 69 74 28 58 73 3d 58 31 2c 20 58 74 3d 58 32 29 0a 0a 0a 78 73 74 .mapping.fit(Xs=X1,.Xt=X2)...xst
13960 20 3d 20 6d 61 70 70 69 6e 67 2e 74 72 61 6e 73 66 6f 72 6d 28 58 73 3d 58 31 29 0a 78 74 73 20 .=.mapping.transform(Xs=X1).xts.
13980 3d 20 6d 61 70 70 69 6e 67 2e 69 6e 76 65 72 73 65 5f 74 72 61 6e 73 66 6f 72 6d 28 58 74 3d 58 =.mapping.inverse_transform(Xt=X
139a0 32 29 0a 0a 49 31 74 20 3d 20 6d 69 6e 6d 61 78 28 6d 61 74 32 69 6d 28 78 73 74 2c 20 49 31 2e 2)..I1t.=.minmax(mat2im(xst,.I1.
139c0 73 68 61 70 65 29 29 0a 49 32 74 20 3d 20 6d 69 6e 6d 61 78 28 6d 61 74 32 69 6d 28 78 74 73 2c shape)).I2t.=.minmax(mat2im(xts,
139e0 20 49 32 2e 73 68 61 70 65 29 29 0a 0a 23 20 25 25 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 .I2.shape))..#.%%...############
13a00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
13a20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
13a40 23 23 0a 23 20 50 6c 6f 74 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6d 61 67 65 73 0a 23 20 2d ##.#.Plot.transformed.images.#.-
13a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 6c 2e 66 69 67 75 72 ----------------------..pl.figur
13a80 65 28 32 2c 20 66 69 67 73 69 7a 65 3d 28 31 30 2c 20 37 29 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f e(2,.figsize=(10,.7))..pl.subplo
13aa0 74 28 32 2c 20 32 2c 20 31 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 49 31 29 0a 70 6c 2e 61 78 69 73 t(2,.2,.1).pl.imshow(I1).pl.axis
13ac0 28 27 6f 66 66 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 49 6d 2e 20 31 27 29 0a 0a 70 6c 2e 73 75 ('off').pl.title('Im..1')..pl.su
13ae0 62 70 6c 6f 74 28 32 2c 20 32 2c 20 32 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 49 32 29 0a 70 6c 2e bplot(2,.2,.2).pl.imshow(I2).pl.
13b00 61 78 69 73 28 27 6f 66 66 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 49 6d 2e 20 32 27 29 0a 0a 70 axis('off').pl.title('Im..2')..p
13b20 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 32 2c 20 33 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 49 31 74 l.subplot(2,.2,.3).pl.imshow(I1t
13b40 29 0a 70 6c 2e 61 78 69 73 28 27 6f 66 66 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 4d 61 70 70 69 ).pl.axis('off').pl.title('Mappi
13b60 6e 67 20 49 6d 2e 20 31 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 32 2c 20 34 29 0a ng.Im..1')..pl.subplot(2,.2,.4).
13b80 70 6c 2e 69 6d 73 68 6f 77 28 49 32 74 29 0a 70 6c 2e 61 78 69 73 28 27 6f 66 66 27 29 0a 70 6c pl.imshow(I2t).pl.axis('off').pl
13ba0 2e 74 69 74 6c 65 28 27 49 6e 76 65 72 73 65 20 6d 61 70 70 69 6e 67 20 49 6d 2e 20 32 27 29 0a .title('Inverse.mapping.Im..2').
13bc0 50 4b 03 04 14 00 00 00 00 00 db 74 d9 4e cd ad d9 82 f4 0f 00 00 f4 0f 00 00 14 00 00 00 70 6c PK.........t.N................pl
13be0 6f 74 5f 6f 74 64 61 5f 6d 61 70 70 69 6e 67 2e 70 79 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 ot_otda_mapping.py#.-*-.coding:.
13c00 75 74 66 2d 38 20 2d 2a 2d 0a 22 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d utf-8.-*-.""".==================
13c20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 4f 54 20 6d 61 70 =========================.OT.map
13c40 70 69 6e 67 20 65 73 74 69 6d 61 74 69 6f 6e 20 66 6f 72 20 64 6f 6d 61 69 6e 20 61 64 61 70 74 ping.estimation.for.domain.adapt
13c60 61 74 69 6f 6e 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ation.==========================
13c80 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 54 68 69 73 20 65 78 61 6d 70 6c 65 20 =================..This.example.
13ca0 70 72 65 73 65 6e 74 73 20 68 6f 77 20 74 6f 20 75 73 65 20 4d 61 70 70 69 6e 67 54 72 61 6e 73 presents.how.to.use.MappingTrans
13cc0 70 6f 72 74 20 74 6f 20 65 73 74 69 6d 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 74 69 6d port.to.estimate.at.the.same.tim
13ce0 65 20 62 6f 74 68 20 74 68 65 20 63 6f 75 70 6c 69 6e 67 20 74 72 61 6e 73 70 6f 72 74 20 61 6e e.both.the.coupling.transport.an
13d00 64 20 61 70 70 72 6f 78 69 6d 61 74 65 20 74 68 65 20 74 72 61 6e 73 70 6f 72 74 20 6d 61 70 20 d.approximate.the.transport.map.
13d20 77 69 74 68 20 65 69 74 68 65 72 0a 61 20 6c 69 6e 65 61 72 20 6f 72 20 61 20 6b 65 72 6e 65 6c with.either.a.linear.or.a.kernel
13d40 69 7a 65 64 20 6d 61 70 70 69 6e 67 20 61 73 20 69 6e 74 72 6f 64 75 63 65 64 20 69 6e 20 5b 38 ized.mapping.as.introduced.in.[8
13d60 5d 2e 0a 0a 5b 38 5d 20 4d 2e 20 50 65 72 72 6f 74 2c 20 4e 2e 20 43 6f 75 72 74 79 2c 20 52 2e ]...[8].M..Perrot,.N..Courty,.R.
13d80 20 46 6c 61 6d 61 72 79 2c 20 41 2e 20 48 61 62 72 61 72 64 2c 0a 20 20 20 20 22 4d 61 70 70 69 .Flamary,.A..Habrard,....."Mappi
13da0 6e 67 20 65 73 74 69 6d 61 74 69 6f 6e 20 66 6f 72 20 64 69 73 63 72 65 74 65 20 6f 70 74 69 6d ng.estimation.for.discrete.optim
13dc0 61 6c 20 74 72 61 6e 73 70 6f 72 74 22 2c 0a 20 20 20 20 4e 65 75 72 61 6c 20 49 6e 66 6f 72 6d al.transport",.....Neural.Inform
13de0 61 74 69 6f 6e 20 50 72 6f 63 65 73 73 69 6e 67 20 53 79 73 74 65 6d 73 20 28 4e 49 50 53 29 2c ation.Processing.Systems.(NIPS),
13e00 20 32 30 31 36 2e 0a 22 22 22 0a 0a 23 20 41 75 74 68 6f 72 73 3a 20 52 65 6d 69 20 46 6c 61 6d .2016.."""..#.Authors:.Remi.Flam
13e20 61 72 79 20 3c 72 65 6d 69 2e 66 6c 61 6d 61 72 79 40 75 6e 69 63 65 2e 66 72 3e 0a 23 20 20 20 ary.<remi.flamary@unice.fr>.#...
13e40 20 20 20 20 20 20 20 53 74 61 6e 69 73 6c 61 73 20 43 68 61 6d 62 6f 6e 20 3c 73 74 61 6e 2e 63 .......Stanislas.Chambon.<stan.c
13e60 68 61 6d 62 6f 6e 40 67 6d 61 69 6c 2e 63 6f 6d 3e 0a 23 0a 23 20 4c 69 63 65 6e 73 65 3a 20 4d hambon@gmail.com>.#.#.License:.M
13e80 49 54 20 4c 69 63 65 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6e 75 6d 70 79 20 61 73 20 6e 70 0a 69 IT.License..import.numpy.as.np.i
13ea0 6d 70 6f 72 74 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 70 79 6c 61 62 20 61 73 20 70 6c 0a 69 6d 70 mport.matplotlib.pylab.as.pl.imp
13ec0 6f 72 74 20 6f 74 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ort.ot...#######################
13ee0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
13f00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 47 65 6e 65 72 61 #######################.#.Genera
13f20 74 65 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 6e 5f 73 6f 75 72 63 te.data.#.-------------..n_sourc
13f40 65 5f 73 61 6d 70 6c 65 73 20 3d 20 31 30 30 0a 6e 5f 74 61 72 67 65 74 5f 73 61 6d 70 6c 65 73 e_samples.=.100.n_target_samples
13f60 20 3d 20 31 30 30 0a 74 68 65 74 61 20 3d 20 32 20 2a 20 6e 70 2e 70 69 20 2f 20 32 30 0a 6e 6f .=.100.theta.=.2.*.np.pi./.20.no
13f80 69 73 65 5f 6c 65 76 65 6c 20 3d 20 30 2e 31 0a 0a 58 73 2c 20 79 73 20 3d 20 6f 74 2e 64 61 74 ise_level.=.0.1..Xs,.ys.=.ot.dat
13fa0 61 73 65 74 73 2e 6d 61 6b 65 5f 64 61 74 61 5f 63 6c 61 73 73 69 66 28 0a 20 20 20 20 27 67 61 asets.make_data_classif(.....'ga
13fc0 75 73 73 72 6f 74 27 2c 20 6e 5f 73 6f 75 72 63 65 5f 73 61 6d 70 6c 65 73 2c 20 6e 7a 3d 6e 6f ussrot',.n_source_samples,.nz=no
13fe0 69 73 65 5f 6c 65 76 65 6c 29 0a 58 73 5f 6e 65 77 2c 20 5f 20 3d 20 6f 74 2e 64 61 74 61 73 65 ise_level).Xs_new,._.=.ot.datase
14000 74 73 2e 6d 61 6b 65 5f 64 61 74 61 5f 63 6c 61 73 73 69 66 28 0a 20 20 20 20 27 67 61 75 73 73 ts.make_data_classif(.....'gauss
14020 72 6f 74 27 2c 20 6e 5f 73 6f 75 72 63 65 5f 73 61 6d 70 6c 65 73 2c 20 6e 7a 3d 6e 6f 69 73 65 rot',.n_source_samples,.nz=noise
14040 5f 6c 65 76 65 6c 29 0a 58 74 2c 20 79 74 20 3d 20 6f 74 2e 64 61 74 61 73 65 74 73 2e 6d 61 6b _level).Xt,.yt.=.ot.datasets.mak
14060 65 5f 64 61 74 61 5f 63 6c 61 73 73 69 66 28 0a 20 20 20 20 27 67 61 75 73 73 72 6f 74 27 2c 20 e_data_classif(.....'gaussrot',.
14080 6e 5f 74 61 72 67 65 74 5f 73 61 6d 70 6c 65 73 2c 20 74 68 65 74 61 3d 74 68 65 74 61 2c 20 6e n_target_samples,.theta=theta,.n
140a0 7a 3d 6e 6f 69 73 65 5f 6c 65 76 65 6c 29 0a 0a 23 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 72 z=noise_level)..#.one.of.the.tar
140c0 67 65 74 20 6d 6f 64 65 20 63 68 61 6e 67 65 73 20 69 74 73 20 76 61 72 69 61 6e 63 65 20 28 6e get.mode.changes.its.variance.(n
140e0 6f 20 6c 69 6e 65 61 72 20 6d 61 70 70 69 6e 67 29 0a 58 74 5b 79 74 20 3d 3d 20 32 5d 20 2a 3d o.linear.mapping).Xt[yt.==.2].*=
14100 20 33 0a 58 74 20 3d 20 58 74 20 2b 20 34 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 .3.Xt.=.Xt.+.4..################
14120 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
14140 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 ##############################.#
14160 20 50 6c 6f 74 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 6c 2e 66 69 67 75 72 .Plot.data.#.---------..pl.figur
14180 65 28 31 2c 20 28 31 30 2c 20 35 29 29 0a 70 6c 2e 63 6c 66 28 29 0a 70 6c 2e 73 63 61 74 74 65 e(1,.(10,.5)).pl.clf().pl.scatte
141a0 72 28 58 73 5b 3a 2c 20 30 5d 2c 20 58 73 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 20 6d 61 72 6b r(Xs[:,.0],.Xs[:,.1],.c=ys,.mark
141c0 65 72 3d 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 53 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 29 0a er='+',.label='Source.samples').
141e0 70 6c 2e 73 63 61 74 74 65 72 28 58 74 5b 3a 2c 20 30 5d 2c 20 58 74 5b 3a 2c 20 31 5d 2c 20 63 pl.scatter(Xt[:,.0],.Xt[:,.1],.c
14200 3d 79 74 2c 20 6d 61 72 6b 65 72 3d 27 6f 27 2c 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 =yt,.marker='o',.label='Target.s
14220 61 6d 70 6c 65 73 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 70 6c 2e 74 69 74 amples').pl.legend(loc=0).pl.tit
14240 6c 65 28 27 53 6f 75 72 63 65 20 61 6e 64 20 74 61 72 67 65 74 20 64 69 73 74 72 69 62 75 74 69 le('Source.and.target.distributi
14260 6f 6e 73 27 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ons')...########################
14280 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
142a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 49 6e 73 74 61 6e 74 ######################.#.Instant
142c0 69 61 74 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 74 20 74 72 61 6e 73 70 6f 72 74 20 61 6c 67 iate.the.different.transport.alg
142e0 6f 72 69 74 68 6d 73 20 61 6e 64 20 66 69 74 20 74 68 65 6d 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d orithms.and.fit.them.#.---------
14300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
14320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 20 4d 61 70 70 69 6e 67 54 72 61 ------------------..#.MappingTra
14340 6e 73 70 6f 72 74 20 77 69 74 68 20 6c 69 6e 65 61 72 20 6b 65 72 6e 65 6c 0a 6f 74 5f 6d 61 70 nsport.with.linear.kernel.ot_map
14360 70 69 6e 67 5f 6c 69 6e 65 61 72 20 3d 20 6f 74 2e 64 61 2e 4d 61 70 70 69 6e 67 54 72 61 6e 73 ping_linear.=.ot.da.MappingTrans
14380 70 6f 72 74 28 0a 20 20 20 20 6b 65 72 6e 65 6c 3d 22 6c 69 6e 65 61 72 22 2c 20 6d 75 3d 31 65 port(.....kernel="linear",.mu=1e
143a0 30 2c 20 65 74 61 3d 31 65 2d 38 2c 20 62 69 61 73 3d 54 72 75 65 2c 0a 20 20 20 20 6d 61 78 5f 0,.eta=1e-8,.bias=True,.....max_
143c0 69 74 65 72 3d 32 30 2c 20 76 65 72 62 6f 73 65 3d 54 72 75 65 29 0a 0a 6f 74 5f 6d 61 70 70 69 iter=20,.verbose=True)..ot_mappi
143e0 6e 67 5f 6c 69 6e 65 61 72 2e 66 69 74 28 58 73 3d 58 73 2c 20 58 74 3d 58 74 29 0a 0a 23 20 66 ng_linear.fit(Xs=Xs,.Xt=Xt)..#.f
14400 6f 72 20 6f 72 69 67 69 6e 61 6c 20 73 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 2c 20 74 72 61 6e or.original.source.samples,.tran
14420 73 66 6f 72 6d 20 61 70 70 6c 69 65 73 20 62 61 72 79 63 65 6e 74 72 69 63 20 6d 61 70 70 69 6e sform.applies.barycentric.mappin
14440 67 0a 74 72 61 6e 73 70 5f 58 73 5f 6c 69 6e 65 61 72 20 3d 20 6f 74 5f 6d 61 70 70 69 6e 67 5f g.transp_Xs_linear.=.ot_mapping_
14460 6c 69 6e 65 61 72 2e 74 72 61 6e 73 66 6f 72 6d 28 58 73 3d 58 73 29 0a 0a 23 20 66 6f 72 20 6f linear.transform(Xs=Xs)..#.for.o
14480 75 74 20 6f 66 20 73 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 2c 20 74 72 61 6e 73 66 6f 72 6d 20 ut.of.source.samples,.transform.
144a0 61 70 70 6c 69 65 73 20 74 68 65 20 6c 69 6e 65 61 72 20 6d 61 70 70 69 6e 67 0a 74 72 61 6e 73 applies.the.linear.mapping.trans
144c0 70 5f 58 73 5f 6c 69 6e 65 61 72 5f 6e 65 77 20 3d 20 6f 74 5f 6d 61 70 70 69 6e 67 5f 6c 69 6e p_Xs_linear_new.=.ot_mapping_lin
144e0 65 61 72 2e 74 72 61 6e 73 66 6f 72 6d 28 58 73 3d 58 73 5f 6e 65 77 29 0a 0a 0a 23 20 4d 61 70 ear.transform(Xs=Xs_new)...#.Map
14500 70 69 6e 67 54 72 61 6e 73 70 6f 72 74 20 77 69 74 68 20 67 61 75 73 73 69 61 6e 20 6b 65 72 6e pingTransport.with.gaussian.kern
14520 65 6c 0a 6f 74 5f 6d 61 70 70 69 6e 67 5f 67 61 75 73 73 69 61 6e 20 3d 20 6f 74 2e 64 61 2e 4d el.ot_mapping_gaussian.=.ot.da.M
14540 61 70 70 69 6e 67 54 72 61 6e 73 70 6f 72 74 28 0a 20 20 20 20 6b 65 72 6e 65 6c 3d 22 67 61 75 appingTransport(.....kernel="gau
14560 73 73 69 61 6e 22 2c 20 65 74 61 3d 31 65 2d 35 2c 20 6d 75 3d 31 65 2d 31 2c 20 62 69 61 73 3d ssian",.eta=1e-5,.mu=1e-1,.bias=
14580 54 72 75 65 2c 20 73 69 67 6d 61 3d 31 2c 0a 20 20 20 20 6d 61 78 5f 69 74 65 72 3d 31 30 2c 20 True,.sigma=1,.....max_iter=10,.
145a0 76 65 72 62 6f 73 65 3d 54 72 75 65 29 0a 6f 74 5f 6d 61 70 70 69 6e 67 5f 67 61 75 73 73 69 61 verbose=True).ot_mapping_gaussia
145c0 6e 2e 66 69 74 28 58 73 3d 58 73 2c 20 58 74 3d 58 74 29 0a 0a 23 20 66 6f 72 20 6f 72 69 67 69 n.fit(Xs=Xs,.Xt=Xt)..#.for.origi
145e0 6e 61 6c 20 73 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 2c 20 74 72 61 6e 73 66 6f 72 6d 20 61 70 nal.source.samples,.transform.ap
14600 70 6c 69 65 73 20 62 61 72 79 63 65 6e 74 72 69 63 20 6d 61 70 70 69 6e 67 0a 74 72 61 6e 73 70 plies.barycentric.mapping.transp
14620 5f 58 73 5f 67 61 75 73 73 69 61 6e 20 3d 20 6f 74 5f 6d 61 70 70 69 6e 67 5f 67 61 75 73 73 69 _Xs_gaussian.=.ot_mapping_gaussi
14640 61 6e 2e 74 72 61 6e 73 66 6f 72 6d 28 58 73 3d 58 73 29 0a 0a 23 20 66 6f 72 20 6f 75 74 20 6f an.transform(Xs=Xs)..#.for.out.o
14660 66 20 73 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 2c 20 74 72 61 6e 73 66 6f 72 6d 20 61 70 70 6c f.source.samples,.transform.appl
14680 69 65 73 20 74 68 65 20 67 61 75 73 73 69 61 6e 20 6d 61 70 70 69 6e 67 0a 74 72 61 6e 73 70 5f ies.the.gaussian.mapping.transp_
146a0 58 73 5f 67 61 75 73 73 69 61 6e 5f 6e 65 77 20 3d 20 6f 74 5f 6d 61 70 70 69 6e 67 5f 67 61 75 Xs_gaussian_new.=.ot_mapping_gau
146c0 73 73 69 61 6e 2e 74 72 61 6e 73 66 6f 72 6d 28 58 73 3d 58 73 5f 6e 65 77 29 0a 0a 0a 23 23 23 ssian.transform(Xs=Xs_new)...###
146e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
14700 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
14720 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 50 6c 6f 74 20 74 72 61 6e 73 70 6f 72 74 65 64 20 73 ###########.#.Plot.transported.s
14740 61 6d 70 6c 65 73 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d amples.#.-----------------------
14760 2d 0a 0a 70 6c 2e 66 69 67 75 72 65 28 32 29 0a 70 6c 2e 63 6c 66 28 29 0a 70 6c 2e 73 75 62 70 -..pl.figure(2).pl.clf().pl.subp
14780 6c 6f 74 28 32 2c 20 32 2c 20 31 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 74 5b 3a 2c 20 30 5d lot(2,.2,.1).pl.scatter(Xt[:,.0]
147a0 2c 20 58 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 74 2c 20 6d 61 72 6b 65 72 3d 27 6f 27 2c 0a 20 20 ,.Xt[:,.1],.c=yt,.marker='o',...
147c0 20 20 20 20 20 20 20 20 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 2c .........label='Target.samples',
147e0 20 61 6c 70 68 61 3d 2e 32 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 74 72 61 6e 73 70 5f 58 73 5f .alpha=.2).pl.scatter(transp_Xs_
14800 6c 69 6e 65 61 72 5b 3a 2c 20 30 5d 2c 20 74 72 61 6e 73 70 5f 58 73 5f 6c 69 6e 65 61 72 5b 3a linear[:,.0],.transp_Xs_linear[:
14820 2c 20 31 5d 2c 20 63 3d 79 73 2c 20 6d 61 72 6b 65 72 3d 27 2b 27 2c 0a 20 20 20 20 20 20 20 20 ,.1],.c=ys,.marker='+',.........
14840 20 20 20 6c 61 62 65 6c 3d 27 4d 61 70 70 65 64 20 73 6f 75 72 63 65 20 73 61 6d 70 6c 65 73 27 ...label='Mapped.source.samples'
14860 29 0a 70 6c 2e 74 69 74 6c 65 28 22 42 61 72 79 2e 20 6d 61 70 70 69 6e 67 20 28 6c 69 6e 65 61 ).pl.title("Bary..mapping.(linea
14880 72 29 22 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 6c 6f 63 3d 30 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f r)").pl.legend(loc=0)..pl.subplo
148a0 74 28 32 2c 20 32 2c 20 32 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 74 5b 3a 2c 20 30 5d 2c 20 t(2,.2,.2).pl.scatter(Xt[:,.0],.
148c0 58 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 74 2c 20 6d 61 72 6b 65 72 3d 27 6f 27 2c 0a 20 20 20 20 Xt[:,.1],.c=yt,.marker='o',.....
148e0 20 20 20 20 20 20 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 2c 20 61 .......label='Target.samples',.a
14900 6c 70 68 61 3d 2e 32 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 74 72 61 6e 73 70 5f 58 73 5f 6c 69 lpha=.2).pl.scatter(transp_Xs_li
14920 6e 65 61 72 5f 6e 65 77 5b 3a 2c 20 30 5d 2c 20 74 72 61 6e 73 70 5f 58 73 5f 6c 69 6e 65 61 72 near_new[:,.0],.transp_Xs_linear
14940 5f 6e 65 77 5b 3a 2c 20 31 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 63 3d 79 73 2c 20 6d 61 72 _new[:,.1],............c=ys,.mar
14960 6b 65 72 3d 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 4c 65 61 72 6e 65 64 20 6d 61 70 70 69 6e 67 27 ker='+',.label='Learned.mapping'
14980 29 0a 70 6c 2e 74 69 74 6c 65 28 22 45 73 74 69 6d 2e 20 6d 61 70 70 69 6e 67 20 28 6c 69 6e 65 ).pl.title("Estim..mapping.(line
149a0 61 72 29 22 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 32 2c 20 33 29 0a 70 6c 2e 73 63 ar)")..pl.subplot(2,.2,.3).pl.sc
149c0 61 74 74 65 72 28 58 74 5b 3a 2c 20 30 5d 2c 20 58 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 74 2c 20 atter(Xt[:,.0],.Xt[:,.1],.c=yt,.
149e0 6d 61 72 6b 65 72 3d 27 6f 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 61 62 65 6c 3d 27 54 61 marker='o',............label='Ta
14a00 72 67 65 74 20 73 61 6d 70 6c 65 73 27 2c 20 61 6c 70 68 61 3d 2e 32 29 0a 70 6c 2e 73 63 61 74 rget.samples',.alpha=.2).pl.scat
14a20 74 65 72 28 74 72 61 6e 73 70 5f 58 73 5f 67 61 75 73 73 69 61 6e 5b 3a 2c 20 30 5d 2c 20 74 72 ter(transp_Xs_gaussian[:,.0],.tr
14a40 61 6e 73 70 5f 58 73 5f 67 61 75 73 73 69 61 6e 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 0a 20 20 ansp_Xs_gaussian[:,.1],.c=ys,...
14a60 20 20 20 20 20 20 20 20 20 6d 61 72 6b 65 72 3d 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 62 61 72 79 .........marker='+',.label='bary
14a80 63 65 6e 74 72 69 63 20 6d 61 70 70 69 6e 67 27 29 0a 70 6c 2e 74 69 74 6c 65 28 22 42 61 72 79 centric.mapping').pl.title("Bary
14aa0 2e 20 6d 61 70 70 69 6e 67 20 28 6b 65 72 6e 65 6c 29 22 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 ..mapping.(kernel)")..pl.subplot
14ac0 28 32 2c 20 32 2c 20 34 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 74 5b 3a 2c 20 30 5d 2c 20 58 (2,.2,.4).pl.scatter(Xt[:,.0],.X
14ae0 74 5b 3a 2c 20 31 5d 2c 20 63 3d 79 74 2c 20 6d 61 72 6b 65 72 3d 27 6f 27 2c 0a 20 20 20 20 20 t[:,.1],.c=yt,.marker='o',......
14b00 20 20 20 20 20 20 6c 61 62 65 6c 3d 27 54 61 72 67 65 74 20 73 61 6d 70 6c 65 73 27 2c 20 61 6c ......label='Target.samples',.al
14b20 70 68 61 3d 2e 32 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 74 72 61 6e 73 70 5f 58 73 5f 67 61 75 pha=.2).pl.scatter(transp_Xs_gau
14b40 73 73 69 61 6e 5f 6e 65 77 5b 3a 2c 20 30 5d 2c 20 74 72 61 6e 73 70 5f 58 73 5f 67 61 75 73 73 ssian_new[:,.0],.transp_Xs_gauss
14b60 69 61 6e 5f 6e 65 77 5b 3a 2c 20 31 5d 2c 20 63 3d 79 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ian_new[:,.1],.c=ys,............
14b80 6d 61 72 6b 65 72 3d 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 4c 65 61 72 6e 65 64 20 6d 61 70 70 69 marker='+',.label='Learned.mappi
14ba0 6e 67 27 29 0a 70 6c 2e 74 69 74 6c 65 28 22 45 73 74 69 6d 2e 20 6d 61 70 70 69 6e 67 20 28 6b ng').pl.title("Estim..mapping.(k
14bc0 65 72 6e 65 6c 29 22 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 70 6c 2e 73 ernel)").pl.tight_layout()..pl.s
14be0 68 6f 77 28 29 0a 50 4b 03 04 14 00 00 00 00 00 da 74 d9 4e 7a 2e b5 2b 65 09 00 00 65 09 00 00 how().PK.........t.Nz..+e...e...
14c00 13 00 00 00 70 6c 6f 74 5f 63 6f 6d 70 75 74 65 5f 65 6d 64 2e 70 79 23 20 2d 2a 2d 20 63 6f 64 ....plot_compute_emd.py#.-*-.cod
14c20 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0a 22 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ing:.utf-8.-*-.""".=============
14c40 3d 3d 3d 3d 0a 50 6c 6f 74 20 6d 75 6c 74 69 70 6c 65 20 45 4d 44 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d ====.Plot.multiple.EMD.=========
14c60 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 53 68 6f 77 73 20 68 6f 77 20 74 6f 20 63 6f 6d 70 75 74 65 20 6d ========..Shows.how.to.compute.m
14c80 75 6c 74 69 70 6c 65 20 45 4d 44 20 61 6e 64 20 53 69 6e 6b 68 6f 72 6e 20 77 69 74 68 20 74 77 ultiple.EMD.and.Sinkhorn.with.tw
14ca0 6f 20 64 69 66 66 65 72 6e 74 0a 67 72 6f 75 6e 64 20 6d 65 74 72 69 63 73 20 61 6e 64 20 70 6c o.differnt.ground.metrics.and.pl
14cc0 6f 74 20 74 68 65 69 72 20 76 61 6c 75 65 73 20 66 6f 72 20 64 69 66 66 65 65 6e 74 20 64 69 73 ot.their.values.for.diffeent.dis
14ce0 74 72 69 62 75 74 69 6f 6e 73 2e 0a 0a 0a 22 22 22 0a 0a 23 20 41 75 74 68 6f 72 3a 20 52 65 6d tributions...."""..#.Author:.Rem
14d00 69 20 46 6c 61 6d 61 72 79 20 3c 72 65 6d 69 2e 66 6c 61 6d 61 72 79 40 75 6e 69 63 65 2e 66 72 i.Flamary.<remi.flamary@unice.fr
14d20 3e 0a 23 0a 23 20 4c 69 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 63 65 6e 73 65 0a 0a 69 6d 70 6f >.#.#.License:.MIT.License..impo
14d40 72 74 20 6e 75 6d 70 79 20 61 73 20 6e 70 0a 69 6d 70 6f 72 74 20 6d 61 74 70 6c 6f 74 6c 69 62 rt.numpy.as.np.import.matplotlib
14d60 2e 70 79 6c 61 62 20 61 73 20 70 6c 0a 69 6d 70 6f 72 74 20 6f 74 0a 66 72 6f 6d 20 6f 74 2e 64 .pylab.as.pl.import.ot.from.ot.d
14d80 61 74 61 73 65 74 73 20 69 6d 70 6f 72 74 20 6d 61 6b 65 5f 31 44 5f 67 61 75 73 73 20 61 73 20 atasets.import.make_1D_gauss.as.
14da0 67 61 75 73 73 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 gauss...########################
14dc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
14de0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 47 65 6e 65 72 61 74 ######################.#.Generat
14e00 65 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 70 61 72 61 e.data.#.-------------..#%%.para
14e20 6d 65 74 65 72 73 0a 0a 6e 20 3d 20 31 30 30 20 20 23 20 6e 62 20 62 69 6e 73 0a 6e 5f 74 61 72 meters..n.=.100..#.nb.bins.n_tar
14e40 67 65 74 20 3d 20 35 30 20 20 23 20 6e 62 20 74 61 72 67 65 74 20 64 69 73 74 72 69 62 75 74 69 get.=.50..#.nb.target.distributi
14e60 6f 6e 73 0a 0a 0a 23 20 62 69 6e 20 70 6f 73 69 74 69 6f 6e 73 0a 78 20 3d 20 6e 70 2e 61 72 61 ons...#.bin.positions.x.=.np.ara
14e80 6e 67 65 28 6e 2c 20 64 74 79 70 65 3d 6e 70 2e 66 6c 6f 61 74 36 34 29 0a 0a 6c 73 74 5f 6d 20 nge(n,.dtype=np.float64)..lst_m.
14ea0 3d 20 6e 70 2e 6c 69 6e 73 70 61 63 65 28 32 30 2c 20 39 30 2c 20 6e 5f 74 61 72 67 65 74 29 0a =.np.linspace(20,.90,.n_target).
14ec0 0a 23 20 47 61 75 73 73 69 61 6e 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0a 61 20 3d 20 67 61 .#.Gaussian.distributions.a.=.ga
14ee0 75 73 73 28 6e 2c 20 6d 3d 32 30 2c 20 73 3d 35 29 20 20 23 20 6d 3d 20 6d 65 61 6e 2c 20 73 3d uss(n,.m=20,.s=5)..#.m=.mean,.s=
14f00 20 73 74 64 0a 0a 42 20 3d 20 6e 70 2e 7a 65 72 6f 73 28 28 6e 2c 20 6e 5f 74 61 72 67 65 74 29 .std..B.=.np.zeros((n,.n_target)
14f20 29 0a 0a 66 6f 72 20 69 2c 20 6d 20 69 6e 20 65 6e 75 6d 65 72 61 74 65 28 6c 73 74 5f 6d 29 3a )..for.i,.m.in.enumerate(lst_m):
14f40 0a 20 20 20 20 42 5b 3a 2c 20 69 5d 20 3d 20 67 61 75 73 73 28 6e 2c 20 6d 3d 6d 2c 20 73 3d 35 .....B[:,.i].=.gauss(n,.m=m,.s=5
14f60 29 0a 0a 23 20 6c 6f 73 73 20 6d 61 74 72 69 78 20 61 6e 64 20 6e 6f 72 6d 61 6c 69 7a 61 74 69 )..#.loss.matrix.and.normalizati
14f80 6f 6e 0a 4d 20 3d 20 6f 74 2e 64 69 73 74 28 78 2e 72 65 73 68 61 70 65 28 28 6e 2c 20 31 29 29 on.M.=.ot.dist(x.reshape((n,.1))
14fa0 2c 20 78 2e 72 65 73 68 61 70 65 28 28 6e 2c 20 31 29 29 2c 20 27 65 75 63 6c 69 64 65 61 6e 27 ,.x.reshape((n,.1)),.'euclidean'
14fc0 29 0a 4d 20 2f 3d 20 4d 2e 6d 61 78 28 29 0a 4d 32 20 3d 20 6f 74 2e 64 69 73 74 28 78 2e 72 65 ).M./=.M.max().M2.=.ot.dist(x.re
14fe0 73 68 61 70 65 28 28 6e 2c 20 31 29 29 2c 20 78 2e 72 65 73 68 61 70 65 28 28 6e 2c 20 31 29 29 shape((n,.1)),.x.reshape((n,.1))
15000 2c 20 27 73 71 65 75 63 6c 69 64 65 61 6e 27 29 0a 4d 32 20 2f 3d 20 4d 32 2e 6d 61 78 28 29 0a ,.'sqeuclidean').M2./=.M2.max().
15020 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 .###############################
15040 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
15060 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 50 6c 6f 74 20 64 61 74 61 0a 23 20 2d 2d ###############.#.Plot.data.#.--
15080 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 70 6c 6f 74 20 74 68 65 20 64 69 73 74 72 69 62 75 74 69 -------..#%%.plot.the.distributi
150a0 6f 6e 73 0a 0a 70 6c 2e 66 69 67 75 72 65 28 31 29 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 ons..pl.figure(1).pl.subplot(2,.
150c0 31 2c 20 31 29 0a 70 6c 2e 70 6c 6f 74 28 78 2c 20 61 2c 20 27 62 27 2c 20 6c 61 62 65 6c 3d 27 1,.1).pl.plot(x,.a,.'b',.label='
150e0 53 6f 75 72 63 65 20 64 69 73 74 72 69 62 75 74 69 6f 6e 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 Source.distribution').pl.title('
15100 53 6f 75 72 63 65 20 64 69 73 74 72 69 62 75 74 69 6f 6e 27 29 0a 70 6c 2e 73 75 62 70 6c 6f 74 Source.distribution').pl.subplot
15120 28 32 2c 20 31 2c 20 32 29 0a 70 6c 2e 70 6c 6f 74 28 78 2c 20 42 2c 20 6c 61 62 65 6c 3d 27 54 (2,.1,.2).pl.plot(x,.B,.label='T
15140 61 72 67 65 74 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 arget.distributions').pl.title('
15160 54 61 72 67 65 74 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 27 29 0a 70 6c 2e 74 69 67 68 74 5f Target.distributions').pl.tight_
15180 6c 61 79 6f 75 74 28 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 layout()...#####################
151a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
151c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 43 6f 6d 70 #########################.#.Comp
151e0 75 74 65 20 45 4d 44 20 66 6f 72 20 74 68 65 20 64 69 66 66 65 72 65 6e 74 20 6c 6f 73 73 65 73 ute.EMD.for.the.different.losses
15200 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .#.-----------------------------
15220 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 70 6c 6f 74 20 64 69 -------..#%%.Compute.and.plot.di
15240 73 74 72 69 62 75 74 69 6f 6e 73 20 61 6e 64 20 6c 6f 73 73 20 6d 61 74 72 69 78 0a 0a 64 5f 65 stributions.and.loss.matrix..d_e
15260 6d 64 20 3d 20 6f 74 2e 65 6d 64 32 28 61 2c 20 42 2c 20 4d 29 20 20 23 20 64 69 72 65 63 74 20 md.=.ot.emd2(a,.B,.M)..#.direct.
15280 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 45 4d 44 0a 64 5f 65 6d 64 32 20 3d 20 6f 74 2e 65 computation.of.EMD.d_emd2.=.ot.e
152a0 6d 64 32 28 61 2c 20 42 2c 20 4d 32 29 20 20 23 20 64 69 72 65 63 74 20 63 6f 6d 70 75 74 61 74 md2(a,.B,.M2)..#.direct.computat
152c0 69 6f 6e 20 6f 66 20 45 4d 44 20 77 69 74 68 20 6c 6f 73 73 20 4d 32 0a 0a 0a 70 6c 2e 66 69 67 ion.of.EMD.with.loss.M2...pl.fig
152e0 75 72 65 28 32 29 0a 70 6c 2e 70 6c 6f 74 28 64 5f 65 6d 64 2c 20 6c 61 62 65 6c 3d 27 45 75 63 ure(2).pl.plot(d_emd,.label='Euc
15300 6c 69 64 65 61 6e 20 45 4d 44 27 29 0a 70 6c 2e 70 6c 6f 74 28 64 5f 65 6d 64 32 2c 20 6c 61 62 lidean.EMD').pl.plot(d_emd2,.lab
15320 65 6c 3d 27 53 71 75 61 72 65 64 20 45 75 63 6c 69 64 65 61 6e 20 45 4d 44 27 29 0a 70 6c 2e 74 el='Squared.Euclidean.EMD').pl.t
15340 69 74 6c 65 28 27 45 4d 44 20 64 69 73 74 61 6e 63 65 73 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 itle('EMD.distances').pl.legend(
15360 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 )..#############################
15380 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
153a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 43 6f 6d 70 75 74 65 20 53 69 6e 6b #################.#.Compute.Sink
153c0 68 6f 72 6e 20 66 6f 72 20 74 68 65 20 64 69 66 66 65 72 65 6e 74 20 6c 6f 73 73 65 73 0a 23 20 horn.for.the.different.losses.#.
153e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
15400 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 25 25 0a 72 65 67 20 3d 20 31 65 2d 32 0a 64 5f 73 69 6e 6b ---------..#%%.reg.=.1e-2.d_sink
15420 68 6f 72 6e 20 3d 20 6f 74 2e 73 69 6e 6b 68 6f 72 6e 32 28 61 2c 20 42 2c 20 4d 2c 20 72 65 67 horn.=.ot.sinkhorn2(a,.B,.M,.reg
15440 29 0a 64 5f 73 69 6e 6b 68 6f 72 6e 32 20 3d 20 6f 74 2e 73 69 6e 6b 68 6f 72 6e 32 28 61 2c 20 ).d_sinkhorn2.=.ot.sinkhorn2(a,.
15460 42 2c 20 4d 32 2c 20 72 65 67 29 0a 0a 70 6c 2e 66 69 67 75 72 65 28 32 29 0a 70 6c 2e 63 6c 66 B,.M2,.reg)..pl.figure(2).pl.clf
15480 28 29 0a 70 6c 2e 70 6c 6f 74 28 64 5f 65 6d 64 2c 20 6c 61 62 65 6c 3d 27 45 75 63 6c 69 64 65 ().pl.plot(d_emd,.label='Euclide
154a0 61 6e 20 45 4d 44 27 29 0a 70 6c 2e 70 6c 6f 74 28 64 5f 65 6d 64 32 2c 20 6c 61 62 65 6c 3d 27 an.EMD').pl.plot(d_emd2,.label='
154c0 53 71 75 61 72 65 64 20 45 75 63 6c 69 64 65 61 6e 20 45 4d 44 27 29 0a 70 6c 2e 70 6c 6f 74 28 Squared.Euclidean.EMD').pl.plot(
154e0 64 5f 73 69 6e 6b 68 6f 72 6e 2c 20 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 45 75 63 6c 69 64 65 61 d_sinkhorn,.'+',.label='Euclidea
15500 6e 20 53 69 6e 6b 68 6f 72 6e 27 29 0a 70 6c 2e 70 6c 6f 74 28 64 5f 73 69 6e 6b 68 6f 72 6e 32 n.Sinkhorn').pl.plot(d_sinkhorn2
15520 2c 20 27 2b 27 2c 20 6c 61 62 65 6c 3d 27 53 71 75 61 72 65 64 20 45 75 63 6c 69 64 65 61 6e 20 ,.'+',.label='Squared.Euclidean.
15540 53 69 6e 6b 68 6f 72 6e 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 45 4d 44 20 64 69 73 74 61 6e 63 Sinkhorn').pl.title('EMD.distanc
15560 65 73 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 29 0a 0a 70 6c 2e 73 68 6f 77 28 29 0a 50 4b 03 04 es').pl.legend()..pl.show().PK..
15580 14 00 00 00 00 00 da 74 d9 4e d1 a8 d7 2e a9 09 00 00 a9 09 00 00 20 00 00 00 70 6c 6f 74 5f 63 .......t.N................plot_c
155a0 6f 6e 76 6f 6c 75 74 69 6f 6e 61 6c 5f 62 61 72 79 63 65 6e 74 65 72 2e 70 79 0a 23 25 25 0a 23 onvolutional_barycenter.py.#%%.#
155c0 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0a 22 22 22 0a 3d 3d 3d 3d 3d .-*-.coding:.utf-8.-*-.""".=====
155e0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================================
15600 3d 3d 3d 3d 3d 3d 3d 0a 43 6f 6e 76 6f 6c 75 74 69 6f 6e 61 6c 20 57 61 73 73 65 72 73 74 65 69 =======.Convolutional.Wasserstei
15620 6e 20 42 61 72 79 63 65 6e 74 65 72 20 65 78 61 6d 70 6c 65 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d n.Barycenter.example.===========
15640 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================================
15660 3d 0a 0a 54 68 69 73 20 65 78 61 6d 70 6c 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 69 =..This.example.is.designed.to.i
15680 6c 6c 75 73 74 72 61 74 65 20 68 6f 77 20 74 68 65 20 43 6f 6e 76 6f 6c 75 74 69 6f 6e 61 6c 20 llustrate.how.the.Convolutional.
156a0 57 61 73 73 65 72 73 74 65 69 6e 20 42 61 72 79 63 65 6e 74 65 72 0a 66 75 6e 63 74 69 6f 6e 20 Wasserstein.Barycenter.function.
156c0 6f 66 20 50 4f 54 20 77 6f 72 6b 73 2e 0a 22 22 22 0a 0a 23 20 41 75 74 68 6f 72 3a 20 4e 69 63 of.POT.works.."""..#.Author:.Nic
156e0 6f 6c 61 73 20 43 6f 75 72 74 79 20 3c 6e 63 6f 75 72 74 79 40 69 72 69 73 61 2e 66 72 3e 0a 23 olas.Courty.<ncourty@irisa.fr>.#
15700 0a 23 20 4c 69 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 63 65 6e 73 65 0a 0a 0a 69 6d 70 6f 72 74 .#.License:.MIT.License...import
15720 20 6e 75 6d 70 79 20 61 73 20 6e 70 0a 69 6d 70 6f 72 74 20 70 79 6c 61 62 20 61 73 20 70 6c 0a .numpy.as.np.import.pylab.as.pl.
15740 69 6d 70 6f 72 74 20 6f 74 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 import.ot..#####################
15760 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
15780 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 44 61 74 61 #########################.#.Data
157a0 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a .preparation.#.----------------.
157c0 23 0a 23 20 54 68 65 20 66 6f 75 72 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 61 72 65 20 63 #.#.The.four.distributions.are.c
157e0 6f 6e 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 34 20 73 69 6d 70 6c 65 20 69 6d 61 67 65 73 0a onstructed.from.4.simple.images.
15800 0a 0a 66 31 20 3d 20 31 20 2d 20 70 6c 2e 69 6d 72 65 61 64 28 27 2e 2e 2f 64 61 74 61 2f 72 65 ..f1.=.1.-.pl.imread('../data/re
15820 64 63 72 6f 73 73 2e 70 6e 67 27 29 5b 3a 2c 20 3a 2c 20 32 5d 0a 66 32 20 3d 20 31 20 2d 20 70 dcross.png')[:,.:,.2].f2.=.1.-.p
15840 6c 2e 69 6d 72 65 61 64 28 27 2e 2e 2f 64 61 74 61 2f 64 75 63 6b 2e 70 6e 67 27 29 5b 3a 2c 20 l.imread('../data/duck.png')[:,.
15860 3a 2c 20 32 5d 0a 66 33 20 3d 20 31 20 2d 20 70 6c 2e 69 6d 72 65 61 64 28 27 2e 2e 2f 64 61 74 :,.2].f3.=.1.-.pl.imread('../dat
15880 61 2f 68 65 61 72 74 2e 70 6e 67 27 29 5b 3a 2c 20 3a 2c 20 32 5d 0a 66 34 20 3d 20 31 20 2d 20 a/heart.png')[:,.:,.2].f4.=.1.-.
158a0 70 6c 2e 69 6d 72 65 61 64 28 27 2e 2e 2f 64 61 74 61 2f 74 6f 6f 74 68 2e 70 6e 67 27 29 5b 3a pl.imread('../data/tooth.png')[:
158c0 2c 20 3a 2c 20 32 5d 0a 0a 41 20 3d 20 5b 5d 0a 66 31 20 3d 20 66 31 20 2f 20 6e 70 2e 73 75 6d ,.:,.2]..A.=.[].f1.=.f1./.np.sum
158e0 28 66 31 29 0a 66 32 20 3d 20 66 32 20 2f 20 6e 70 2e 73 75 6d 28 66 32 29 0a 66 33 20 3d 20 66 (f1).f2.=.f2./.np.sum(f2).f3.=.f
15900 33 20 2f 20 6e 70 2e 73 75 6d 28 66 33 29 0a 66 34 20 3d 20 66 34 20 2f 20 6e 70 2e 73 75 6d 28 3./.np.sum(f3).f4.=.f4./.np.sum(
15920 66 34 29 0a 41 2e 61 70 70 65 6e 64 28 66 31 29 0a 41 2e 61 70 70 65 6e 64 28 66 32 29 0a 41 2e f4).A.append(f1).A.append(f2).A.
15940 61 70 70 65 6e 64 28 66 33 29 0a 41 2e 61 70 70 65 6e 64 28 66 34 29 0a 41 20 3d 20 6e 70 2e 61 append(f3).A.append(f4).A.=.np.a
15960 72 72 61 79 28 41 29 0a 0a 6e 62 5f 69 6d 61 67 65 73 20 3d 20 35 0a 0a 23 20 74 68 6f 73 65 20 rray(A)..nb_images.=.5..#.those.
15980 61 72 65 20 74 68 65 20 66 6f 75 72 20 63 6f 72 6e 65 72 73 20 63 6f 6f 72 64 69 6e 61 74 65 73 are.the.four.corners.coordinates
159a0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 74 65 72 70 6f 6c 61 74 65 64 20 62 79 20 62 69 .that.will.be.interpolated.by.bi
159c0 6c 69 6e 65 61 72 0a 23 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 0a 76 31 20 3d 20 6e 70 2e 61 linear.#.interpolation.v1.=.np.a
159e0 72 72 61 79 28 28 31 2c 20 30 2c 20 30 2c 20 30 29 29 0a 76 32 20 3d 20 6e 70 2e 61 72 72 61 79 rray((1,.0,.0,.0)).v2.=.np.array
15a00 28 28 30 2c 20 31 2c 20 30 2c 20 30 29 29 0a 76 33 20 3d 20 6e 70 2e 61 72 72 61 79 28 28 30 2c ((0,.1,.0,.0)).v3.=.np.array((0,
15a20 20 30 2c 20 31 2c 20 30 29 29 0a 76 34 20 3d 20 6e 70 2e 61 72 72 61 79 28 28 30 2c 20 30 2c 20 .0,.1,.0)).v4.=.np.array((0,.0,.
15a40 30 2c 20 31 29 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0,.1))...#######################
15a60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
15a80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 42 61 72 79 63 65 #######################.#.Baryce
15aa0 6e 74 65 72 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 61 6e 64 20 76 69 73 75 61 6c 69 7a 61 74 69 nter.computation.and.visualizati
15ac0 6f 6e 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d on.#.---------------------------
15ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 0a 70 6c 2e 66 69 67 75 72 65 28 66 69 67 73 69 -------------.#..pl.figure(figsi
15b00 7a 65 3d 28 31 30 2c 20 31 30 29 29 0a 70 6c 2e 74 69 74 6c 65 28 27 43 6f 6e 76 6f 6c 75 74 69 ze=(10,.10)).pl.title('Convoluti
15b20 6f 6e 61 6c 20 57 61 73 73 65 72 73 74 65 69 6e 20 42 61 72 79 63 65 6e 74 65 72 73 20 69 6e 20 onal.Wasserstein.Barycenters.in.
15b40 50 4f 54 27 29 0a 63 6d 20 3d 20 27 42 6c 75 65 73 27 0a 23 20 72 65 67 75 6c 61 72 69 7a 61 74 POT').cm.=.'Blues'.#.regularizat
15b60 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 0a 72 65 67 20 3d 20 30 2e 30 30 34 0a 66 6f 72 20 69 20 ion.parameter.reg.=.0.004.for.i.
15b80 69 6e 20 72 61 6e 67 65 28 6e 62 5f 69 6d 61 67 65 73 29 3a 0a 20 20 20 20 66 6f 72 20 6a 20 69 in.range(nb_images):.....for.j.i
15ba0 6e 20 72 61 6e 67 65 28 6e 62 5f 69 6d 61 67 65 73 29 3a 0a 20 20 20 20 20 20 20 20 70 6c 2e 73 n.range(nb_images):.........pl.s
15bc0 75 62 70 6c 6f 74 28 6e 62 5f 69 6d 61 67 65 73 2c 20 6e 62 5f 69 6d 61 67 65 73 2c 20 69 20 2a ubplot(nb_images,.nb_images,.i.*
15be0 20 6e 62 5f 69 6d 61 67 65 73 20 2b 20 6a 20 2b 20 31 29 0a 20 20 20 20 20 20 20 20 74 78 20 3d .nb_images.+.j.+.1).........tx.=
15c00 20 66 6c 6f 61 74 28 69 29 20 2f 20 28 6e 62 5f 69 6d 61 67 65 73 20 2d 20 31 29 0a 20 20 20 20 .float(i)./.(nb_images.-.1).....
15c20 20 20 20 20 74 79 20 3d 20 66 6c 6f 61 74 28 6a 29 20 2f 20 28 6e 62 5f 69 6d 61 67 65 73 20 2d ....ty.=.float(j)./.(nb_images.-
15c40 20 31 29 0a 0a 20 20 20 20 20 20 20 20 23 20 77 65 69 67 68 74 73 20 61 72 65 20 63 6f 6e 73 74 .1)..........#.weights.are.const
15c60 72 75 63 74 65 64 20 62 79 20 62 69 6c 69 6e 65 61 72 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e ructed.by.bilinear.interpolation
15c80 0a 20 20 20 20 20 20 20 20 74 6d 70 31 20 3d 20 28 31 20 2d 20 74 78 29 20 2a 20 76 31 20 2b 20 .........tmp1.=.(1.-.tx).*.v1.+.
15ca0 74 78 20 2a 20 76 32 0a 20 20 20 20 20 20 20 20 74 6d 70 32 20 3d 20 28 31 20 2d 20 74 78 29 20 tx.*.v2.........tmp2.=.(1.-.tx).
15cc0 2a 20 76 33 20 2b 20 74 78 20 2a 20 76 34 0a 20 20 20 20 20 20 20 20 77 65 69 67 68 74 73 20 3d *.v3.+.tx.*.v4.........weights.=
15ce0 20 28 31 20 2d 20 74 79 29 20 2a 20 74 6d 70 31 20 2b 20 74 79 20 2a 20 74 6d 70 32 0a 0a 20 20 .(1.-.ty).*.tmp1.+.ty.*.tmp2....
15d00 20 20 20 20 20 20 69 66 20 69 20 3d 3d 20 30 20 61 6e 64 20 6a 20 3d 3d 20 30 3a 0a 20 20 20 20 ......if.i.==.0.and.j.==.0:.....
15d20 20 20 20 20 20 20 20 20 70 6c 2e 69 6d 73 68 6f 77 28 66 31 2c 20 63 6d 61 70 3d 63 6d 29 0a 20 ........pl.imshow(f1,.cmap=cm)..
15d40 20 20 20 20 20 20 20 20 20 20 20 70 6c 2e 61 78 69 73 28 27 6f 66 66 27 29 0a 20 20 20 20 20 20 ...........pl.axis('off').......
15d60 20 20 65 6c 69 66 20 69 20 3d 3d 20 30 20 61 6e 64 20 6a 20 3d 3d 20 28 6e 62 5f 69 6d 61 67 65 ..elif.i.==.0.and.j.==.(nb_image
15d80 73 20 2d 20 31 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 2e 69 6d 73 68 6f 77 28 66 33 s.-.1):.............pl.imshow(f3
15da0 2c 20 63 6d 61 70 3d 63 6d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 2e 61 78 69 73 28 27 ,.cmap=cm).............pl.axis('
15dc0 6f 66 66 27 29 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20 69 20 3d 3d 20 28 6e 62 5f 69 6d 61 67 off').........elif.i.==.(nb_imag
15de0 65 73 20 2d 20 31 29 20 61 6e 64 20 6a 20 3d 3d 20 30 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 es.-.1).and.j.==.0:.............
15e00 70 6c 2e 69 6d 73 68 6f 77 28 66 32 2c 20 63 6d 61 70 3d 63 6d 29 0a 20 20 20 20 20 20 20 20 20 pl.imshow(f2,.cmap=cm)..........
15e20 20 20 20 70 6c 2e 61 78 69 73 28 27 6f 66 66 27 29 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20 69 ...pl.axis('off').........elif.i
15e40 20 3d 3d 20 28 6e 62 5f 69 6d 61 67 65 73 20 2d 20 31 29 20 61 6e 64 20 6a 20 3d 3d 20 28 6e 62 .==.(nb_images.-.1).and.j.==.(nb
15e60 5f 69 6d 61 67 65 73 20 2d 20 31 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 2e 69 6d 73 _images.-.1):.............pl.ims
15e80 68 6f 77 28 66 34 2c 20 63 6d 61 70 3d 63 6d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 2e how(f4,.cmap=cm).............pl.
15ea0 61 78 69 73 28 27 6f 66 66 27 29 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 axis('off').........else:.......
15ec0 20 20 20 20 20 20 23 20 63 61 6c 6c 20 74 6f 20 62 61 72 79 63 65 6e 74 65 72 20 63 6f 6d 70 75 ......#.call.to.barycenter.compu
15ee0 74 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 2e 69 6d 73 68 6f 77 28 6f 74 2e tation.............pl.imshow(ot.
15f00 62 72 65 67 6d 61 6e 2e 63 6f 6e 76 6f 6c 75 74 69 6f 6e 61 6c 5f 62 61 72 79 63 65 6e 74 65 72 bregman.convolutional_barycenter
15f20 32 64 28 41 2c 20 72 65 67 2c 20 77 65 69 67 68 74 73 29 2c 20 63 6d 61 70 3d 63 6d 29 0a 20 20 2d(A,.reg,.weights),.cmap=cm)...
15f40 20 20 20 20 20 20 20 20 20 20 70 6c 2e 61 78 69 73 28 27 6f 66 66 27 29 0a 70 6c 2e 73 68 6f 77 ..........pl.axis('off').pl.show
15f60 28 29 0a 50 4b 03 04 14 00 00 00 00 00 db 74 d9 4e 20 57 90 f6 08 0f 00 00 08 0f 00 00 19 00 00 ().PK.........t.N.W.............
15f80 00 70 6c 6f 74 5f 55 4f 54 5f 62 61 72 79 63 65 6e 74 65 72 5f 31 44 2e 70 79 23 20 2d 2a 2d 20 .plot_UOT_barycenter_1D.py#.-*-.
15fa0 63 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0a 22 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d coding:.utf-8.-*-.""".==========
15fc0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================================
15fe0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 31 44 20 57 61 73 73 65 72 73 74 65 69 6e =================.1D.Wasserstein
16000 20 62 61 72 79 63 65 6e 74 65 72 20 64 65 6d 6f 20 66 6f 72 20 55 6e 62 61 6c 61 6e 63 65 64 20 .barycenter.demo.for.Unbalanced.
16020 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d distributions.==================
16040 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================================
16060 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 54 68 69 73 20 65 78 61 6d 70 6c 65 20 69 6c 6c 75 73 74 72 61 =========..This.example.illustra
16080 74 65 73 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 72 65 67 75 6c 61 72 69 7a tes.the.computation.of.regulariz
160a0 65 64 20 57 61 73 73 65 72 73 79 65 69 6e 20 42 61 72 79 63 65 6e 74 65 72 0a 61 73 20 70 72 6f ed.Wassersyein.Barycenter.as.pro
160c0 70 6f 73 65 64 20 69 6e 20 5b 31 30 5d 20 66 6f 72 20 55 6e 62 61 6c 61 6e 63 65 64 20 69 6e 70 posed.in.[10].for.Unbalanced.inp
160e0 75 74 73 2e 0a 0a 0a 5b 31 30 5d 20 43 68 69 7a 61 74 2c 20 4c 2e 2c 20 50 65 79 72 c3 a9 2c 20 uts....[10].Chizat,.L.,.Peyr..,.
16100 47 2e 2c 20 53 63 68 6d 69 74 7a 65 72 2c 20 42 2e 2c 20 26 20 56 69 61 6c 61 72 64 2c 20 46 2e G.,.Schmitzer,.B.,.&.Vialard,.F.
16120 20 58 2e 20 28 32 30 31 36 29 2e 20 53 63 61 6c 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d 73 20 66 .X..(2016)..Scaling.algorithms.f
16140 6f 72 20 75 6e 62 61 6c 61 6e 63 65 64 20 74 72 61 6e 73 70 6f 72 74 20 70 72 6f 62 6c 65 6d 73 or.unbalanced.transport.problems
16160 2e 20 61 72 58 69 76 20 70 72 65 70 72 69 6e 74 20 61 72 58 69 76 3a 31 36 30 37 2e 30 35 38 31 ..arXiv.preprint.arXiv:1607.0581
16180 36 2e 0a 0a 22 22 22 0a 0a 23 20 41 75 74 68 6f 72 3a 20 48 69 63 68 61 6d 20 4a 61 6e 61 74 69 6..."""..#.Author:.Hicham.Janati
161a0 20 3c 68 69 63 68 61 6d 2e 6a 61 6e 61 74 69 40 69 6e 72 69 61 2e 66 72 3e 0a 23 0a 23 20 4c 69 .<hicham.janati@inria.fr>.#.#.Li
161c0 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 63 65 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6e 75 6d 70 79 cense:.MIT.License..import.numpy
161e0 20 61 73 20 6e 70 0a 69 6d 70 6f 72 74 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 70 79 6c 61 62 20 61 .as.np.import.matplotlib.pylab.a
16200 73 20 70 6c 0a 69 6d 70 6f 72 74 20 6f 74 0a 23 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 33 s.pl.import.ot.#.necessary.for.3
16220 64 20 70 6c 6f 74 20 65 76 65 6e 20 69 66 20 6e 6f 74 20 75 73 65 64 0a 66 72 6f 6d 20 6d 70 6c d.plot.even.if.not.used.from.mpl
16240 5f 74 6f 6f 6c 6b 69 74 73 2e 6d 70 6c 6f 74 33 64 20 69 6d 70 6f 72 74 20 41 78 65 73 33 44 20 _toolkits.mplot3d.import.Axes3D.
16260 20 23 20 6e 6f 71 61 0a 66 72 6f 6d 20 6d 61 74 70 6c 6f 74 6c 69 62 2e 63 6f 6c 6c 65 63 74 69 .#.noqa.from.matplotlib.collecti
16280 6f 6e 73 20 69 6d 70 6f 72 74 20 50 6f 6c 79 43 6f 6c 6c 65 63 74 69 6f 6e 0a 0a 23 23 23 23 23 ons.import.PolyCollection..#####
162a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
162c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
162e0 23 23 23 23 23 23 23 23 23 0a 23 20 47 65 6e 65 72 61 74 65 20 64 61 74 61 0a 23 20 2d 2d 2d 2d #########.#.Generate.data.#.----
16300 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 20 70 61 72 61 6d 65 74 65 72 73 0a 0a 6e 20 3d 20 31 30 30 ---------..#.parameters..n.=.100
16320 20 20 23 20 6e 62 20 62 69 6e 73 0a 0a 23 20 62 69 6e 20 70 6f 73 69 74 69 6f 6e 73 0a 78 20 3d ..#.nb.bins..#.bin.positions.x.=
16340 20 6e 70 2e 61 72 61 6e 67 65 28 6e 2c 20 64 74 79 70 65 3d 6e 70 2e 66 6c 6f 61 74 36 34 29 0a .np.arange(n,.dtype=np.float64).
16360 0a 23 20 47 61 75 73 73 69 61 6e 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0a 61 31 20 3d 20 6f .#.Gaussian.distributions.a1.=.o
16380 74 2e 64 61 74 61 73 65 74 73 2e 6d 61 6b 65 5f 31 44 5f 67 61 75 73 73 28 6e 2c 20 6d 3d 32 30 t.datasets.make_1D_gauss(n,.m=20
163a0 2c 20 73 3d 35 29 20 20 23 20 6d 3d 20 6d 65 61 6e 2c 20 73 3d 20 73 74 64 0a 61 32 20 3d 20 6f ,.s=5)..#.m=.mean,.s=.std.a2.=.o
163c0 74 2e 64 61 74 61 73 65 74 73 2e 6d 61 6b 65 5f 31 44 5f 67 61 75 73 73 28 6e 2c 20 6d 3d 36 30 t.datasets.make_1D_gauss(n,.m=60
163e0 2c 20 73 3d 38 29 0a 0a 23 20 6d 61 6b 65 20 75 6e 62 61 6c 61 6e 63 65 64 20 64 69 73 74 73 0a ,.s=8)..#.make.unbalanced.dists.
16400 61 32 20 2a 3d 20 33 2e 0a 0a 23 20 63 72 65 61 74 69 6e 67 20 6d 61 74 72 69 78 20 41 20 63 6f a2.*=.3...#.creating.matrix.A.co
16420 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0a 41 20 3d 20 6e ntaining.all.distributions.A.=.n
16440 70 2e 76 73 74 61 63 6b 28 28 61 31 2c 20 61 32 29 29 2e 54 0a 6e 5f 64 69 73 74 72 69 62 75 74 p.vstack((a1,.a2)).T.n_distribut
16460 69 6f 6e 73 20 3d 20 41 2e 73 68 61 70 65 5b 31 5d 0a 0a 23 20 6c 6f 73 73 20 6d 61 74 72 69 78 ions.=.A.shape[1]..#.loss.matrix
16480 20 2b 20 6e 6f 72 6d 61 6c 69 7a 61 74 69 6f 6e 0a 4d 20 3d 20 6f 74 2e 75 74 69 6c 73 2e 64 69 .+.normalization.M.=.ot.utils.di
164a0 73 74 30 28 6e 29 0a 4d 20 2f 3d 20 4d 2e 6d 61 78 28 29 0a 0a 23 23 23 23 23 23 23 23 23 23 23 st0(n).M./=.M.max()..###########
164c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
164e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
16500 23 23 23 0a 23 20 50 6c 6f 74 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 20 70 ###.#.Plot.data.#.---------..#.p
16520 6c 6f 74 20 74 68 65 20 64 69 73 74 72 69 62 75 74 69 6f 6e 73 0a 0a 70 6c 2e 66 69 67 75 72 65 lot.the.distributions..pl.figure
16540 28 31 2c 20 66 69 67 73 69 7a 65 3d 28 36 2e 34 2c 20 33 29 29 0a 66 6f 72 20 69 20 69 6e 20 72 (1,.figsize=(6.4,.3)).for.i.in.r
16560 61 6e 67 65 28 6e 5f 64 69 73 74 72 69 62 75 74 69 6f 6e 73 29 3a 0a 20 20 20 20 70 6c 2e 70 6c ange(n_distributions):.....pl.pl
16580 6f 74 28 78 2c 20 41 5b 3a 2c 20 69 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 44 69 73 74 72 69 62 ot(x,.A[:,.i]).pl.title('Distrib
165a0 75 74 69 6f 6e 73 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 23 23 23 23 utions').pl.tight_layout()..####
165c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
165e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
16600 23 23 23 23 23 23 23 23 23 23 0a 23 20 42 61 72 79 63 65 6e 74 65 72 20 63 6f 6d 70 75 74 61 74 ##########.#.Barycenter.computat
16620 69 6f 6e 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 20 ion.#.----------------------..#.
16640 6e 6f 6e 20 77 65 69 67 68 74 65 64 20 62 61 72 79 63 65 6e 74 65 72 20 63 6f 6d 70 75 74 61 74 non.weighted.barycenter.computat
16660 69 6f 6e 0a 0a 77 65 69 67 68 74 20 3d 20 30 2e 35 20 20 23 20 30 3c 3d 77 65 69 67 68 74 3c 3d ion..weight.=.0.5..#.0<=weight<=
16680 31 0a 77 65 69 67 68 74 73 20 3d 20 6e 70 2e 61 72 72 61 79 28 5b 31 20 2d 20 77 65 69 67 68 74 1.weights.=.np.array([1.-.weight
166a0 2c 20 77 65 69 67 68 74 5d 29 0a 0a 23 20 6c 32 62 61 72 79 0a 62 61 72 79 5f 6c 32 20 3d 20 41 ,.weight])..#.l2bary.bary_l2.=.A
166c0 2e 64 6f 74 28 77 65 69 67 68 74 73 29 0a 0a 23 20 77 61 73 73 65 72 73 74 65 69 6e 0a 72 65 67 .dot(weights)..#.wasserstein.reg
166e0 20 3d 20 31 65 2d 33 0a 61 6c 70 68 61 20 3d 20 31 2e 0a 0a 62 61 72 79 5f 77 61 73 73 20 3d 20 .=.1e-3.alpha.=.1...bary_wass.=.
16700 6f 74 2e 75 6e 62 61 6c 61 6e 63 65 64 2e 62 61 72 79 63 65 6e 74 65 72 5f 75 6e 62 61 6c 61 6e ot.unbalanced.barycenter_unbalan
16720 63 65 64 28 41 2c 20 4d 2c 20 72 65 67 2c 20 61 6c 70 68 61 2c 20 77 65 69 67 68 74 73 29 0a 0a ced(A,.M,.reg,.alpha,.weights)..
16740 70 6c 2e 66 69 67 75 72 65 28 32 29 0a 70 6c 2e 63 6c 66 28 29 0a 70 6c 2e 73 75 62 70 6c 6f 74 pl.figure(2).pl.clf().pl.subplot
16760 28 32 2c 20 31 2c 20 31 29 0a 66 6f 72 20 69 20 69 6e 20 72 61 6e 67 65 28 6e 5f 64 69 73 74 72 (2,.1,.1).for.i.in.range(n_distr
16780 69 62 75 74 69 6f 6e 73 29 3a 0a 20 20 20 20 70 6c 2e 70 6c 6f 74 28 78 2c 20 41 5b 3a 2c 20 69 ibutions):.....pl.plot(x,.A[:,.i
167a0 5d 29 0a 70 6c 2e 74 69 74 6c 65 28 27 44 69 73 74 72 69 62 75 74 69 6f 6e 73 27 29 0a 0a 70 6c ]).pl.title('Distributions')..pl
167c0 2e 73 75 62 70 6c 6f 74 28 32 2c 20 31 2c 20 32 29 0a 70 6c 2e 70 6c 6f 74 28 78 2c 20 62 61 72 .subplot(2,.1,.2).pl.plot(x,.bar
167e0 79 5f 6c 32 2c 20 27 72 27 2c 20 6c 61 62 65 6c 3d 27 6c 32 27 29 0a 70 6c 2e 70 6c 6f 74 28 78 y_l2,.'r',.label='l2').pl.plot(x
16800 2c 20 62 61 72 79 5f 77 61 73 73 2c 20 27 67 27 2c 20 6c 61 62 65 6c 3d 27 57 61 73 73 65 72 73 ,.bary_wass,.'g',.label='Wassers
16820 74 65 69 6e 27 29 0a 70 6c 2e 6c 65 67 65 6e 64 28 29 0a 70 6c 2e 74 69 74 6c 65 28 27 42 61 72 tein').pl.legend().pl.title('Bar
16840 79 63 65 6e 74 65 72 73 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 23 23 ycenters').pl.tight_layout()..##
16860 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
16880 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
168a0 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 42 61 72 79 63 65 6e 74 72 69 63 20 69 6e 74 65 72 ############.#.Barycentric.inter
168c0 70 6f 6c 61 74 69 6f 6e 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d polation.#.---------------------
168e0 2d 2d 2d 2d 0a 0a 23 20 62 61 72 79 63 65 6e 74 65 72 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e ----..#.barycenter.interpolation
16900 0a 0a 6e 5f 77 65 69 67 68 74 20 3d 20 31 31 0a 77 65 69 67 68 74 5f 6c 69 73 74 20 3d 20 6e 70 ..n_weight.=.11.weight_list.=.np
16920 2e 6c 69 6e 73 70 61 63 65 28 30 2c 20 31 2c 20 6e 5f 77 65 69 67 68 74 29 0a 0a 0a 42 5f 6c 32 .linspace(0,.1,.n_weight)...B_l2
16940 20 3d 20 6e 70 2e 7a 65 72 6f 73 28 28 6e 2c 20 6e 5f 77 65 69 67 68 74 29 29 0a 0a 42 5f 77 61 .=.np.zeros((n,.n_weight))..B_wa
16960 73 73 20 3d 20 6e 70 2e 63 6f 70 79 28 42 5f 6c 32 29 0a 0a 66 6f 72 20 69 20 69 6e 20 72 61 6e ss.=.np.copy(B_l2)..for.i.in.ran
16980 67 65 28 30 2c 20 6e 5f 77 65 69 67 68 74 29 3a 0a 20 20 20 20 77 65 69 67 68 74 20 3d 20 77 65 ge(0,.n_weight):.....weight.=.we
169a0 69 67 68 74 5f 6c 69 73 74 5b 69 5d 0a 20 20 20 20 77 65 69 67 68 74 73 20 3d 20 6e 70 2e 61 72 ight_list[i].....weights.=.np.ar
169c0 72 61 79 28 5b 31 20 2d 20 77 65 69 67 68 74 2c 20 77 65 69 67 68 74 5d 29 0a 20 20 20 20 42 5f ray([1.-.weight,.weight]).....B_
169e0 6c 32 5b 3a 2c 20 69 5d 20 3d 20 41 2e 64 6f 74 28 77 65 69 67 68 74 73 29 0a 20 20 20 20 42 5f l2[:,.i].=.A.dot(weights).....B_
16a00 77 61 73 73 5b 3a 2c 20 69 5d 20 3d 20 6f 74 2e 75 6e 62 61 6c 61 6e 63 65 64 2e 62 61 72 79 63 wass[:,.i].=.ot.unbalanced.baryc
16a20 65 6e 74 65 72 5f 75 6e 62 61 6c 61 6e 63 65 64 28 41 2c 20 4d 2c 20 72 65 67 2c 20 61 6c 70 68 enter_unbalanced(A,.M,.reg,.alph
16a40 61 2c 20 77 65 69 67 68 74 73 29 0a 0a 0a 23 20 70 6c 6f 74 20 69 6e 74 65 72 70 6f 6c 61 74 69 a,.weights)...#.plot.interpolati
16a60 6f 6e 0a 0a 70 6c 2e 66 69 67 75 72 65 28 33 29 0a 0a 63 6d 61 70 20 3d 20 70 6c 2e 63 6d 2e 67 on..pl.figure(3)..cmap.=.pl.cm.g
16a80 65 74 5f 63 6d 61 70 28 27 76 69 72 69 64 69 73 27 29 0a 76 65 72 74 73 20 3d 20 5b 5d 0a 7a 73 et_cmap('viridis').verts.=.[].zs
16aa0 20 3d 20 77 65 69 67 68 74 5f 6c 69 73 74 0a 66 6f 72 20 69 2c 20 7a 20 69 6e 20 65 6e 75 6d 65 .=.weight_list.for.i,.z.in.enume
16ac0 72 61 74 65 28 7a 73 29 3a 0a 20 20 20 20 79 73 20 3d 20 42 5f 6c 32 5b 3a 2c 20 69 5d 0a 20 20 rate(zs):.....ys.=.B_l2[:,.i]...
16ae0 20 20 76 65 72 74 73 2e 61 70 70 65 6e 64 28 6c 69 73 74 28 7a 69 70 28 78 2c 20 79 73 29 29 29 ..verts.append(list(zip(x,.ys)))
16b00 0a 0a 61 78 20 3d 20 70 6c 2e 67 63 66 28 29 2e 67 63 61 28 70 72 6f 6a 65 63 74 69 6f 6e 3d 27 ..ax.=.pl.gcf().gca(projection='
16b20 33 64 27 29 0a 0a 70 6f 6c 79 20 3d 20 50 6f 6c 79 43 6f 6c 6c 65 63 74 69 6f 6e 28 76 65 72 74 3d')..poly.=.PolyCollection(vert
16b40 73 2c 20 66 61 63 65 63 6f 6c 6f 72 73 3d 5b 63 6d 61 70 28 61 29 20 66 6f 72 20 61 20 69 6e 20 s,.facecolors=[cmap(a).for.a.in.
16b60 77 65 69 67 68 74 5f 6c 69 73 74 5d 29 0a 70 6f 6c 79 2e 73 65 74 5f 61 6c 70 68 61 28 30 2e 37 weight_list]).poly.set_alpha(0.7
16b80 29 0a 61 78 2e 61 64 64 5f 63 6f 6c 6c 65 63 74 69 6f 6e 33 64 28 70 6f 6c 79 2c 20 7a 73 3d 7a ).ax.add_collection3d(poly,.zs=z
16ba0 73 2c 20 7a 64 69 72 3d 27 79 27 29 0a 61 78 2e 73 65 74 5f 78 6c 61 62 65 6c 28 27 78 27 29 0a s,.zdir='y').ax.set_xlabel('x').
16bc0 61 78 2e 73 65 74 5f 78 6c 69 6d 33 64 28 30 2c 20 6e 29 0a 61 78 2e 73 65 74 5f 79 6c 61 62 65 ax.set_xlim3d(0,.n).ax.set_ylabe
16be0 6c 28 72 27 24 5c 61 6c 70 68 61 24 27 29 0a 61 78 2e 73 65 74 5f 79 6c 69 6d 33 64 28 30 2c 20 l(r'$\alpha$').ax.set_ylim3d(0,.
16c00 31 29 0a 61 78 2e 73 65 74 5f 7a 6c 61 62 65 6c 28 27 27 29 0a 61 78 2e 73 65 74 5f 7a 6c 69 6d 1).ax.set_zlabel('').ax.set_zlim
16c20 33 64 28 30 2c 20 42 5f 6c 32 2e 6d 61 78 28 29 20 2a 20 31 2e 30 31 29 0a 70 6c 2e 74 69 74 6c 3d(0,.B_l2.max().*.1.01).pl.titl
16c40 65 28 27 42 61 72 79 63 65 6e 74 65 72 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 20 77 69 74 68 e('Barycenter.interpolation.with
16c60 20 6c 32 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 70 6c 2e 66 69 67 75 .l2').pl.tight_layout()..pl.figu
16c80 72 65 28 34 29 0a 63 6d 61 70 20 3d 20 70 6c 2e 63 6d 2e 67 65 74 5f 63 6d 61 70 28 27 76 69 72 re(4).cmap.=.pl.cm.get_cmap('vir
16ca0 69 64 69 73 27 29 0a 76 65 72 74 73 20 3d 20 5b 5d 0a 7a 73 20 3d 20 77 65 69 67 68 74 5f 6c 69 idis').verts.=.[].zs.=.weight_li
16cc0 73 74 0a 66 6f 72 20 69 2c 20 7a 20 69 6e 20 65 6e 75 6d 65 72 61 74 65 28 7a 73 29 3a 0a 20 20 st.for.i,.z.in.enumerate(zs):...
16ce0 20 20 79 73 20 3d 20 42 5f 77 61 73 73 5b 3a 2c 20 69 5d 0a 20 20 20 20 76 65 72 74 73 2e 61 70 ..ys.=.B_wass[:,.i].....verts.ap
16d00 70 65 6e 64 28 6c 69 73 74 28 7a 69 70 28 78 2c 20 79 73 29 29 29 0a 0a 61 78 20 3d 20 70 6c 2e pend(list(zip(x,.ys)))..ax.=.pl.
16d20 67 63 66 28 29 2e 67 63 61 28 70 72 6f 6a 65 63 74 69 6f 6e 3d 27 33 64 27 29 0a 0a 70 6f 6c 79 gcf().gca(projection='3d')..poly
16d40 20 3d 20 50 6f 6c 79 43 6f 6c 6c 65 63 74 69 6f 6e 28 76 65 72 74 73 2c 20 66 61 63 65 63 6f 6c .=.PolyCollection(verts,.facecol
16d60 6f 72 73 3d 5b 63 6d 61 70 28 61 29 20 66 6f 72 20 61 20 69 6e 20 77 65 69 67 68 74 5f 6c 69 73 ors=[cmap(a).for.a.in.weight_lis
16d80 74 5d 29 0a 70 6f 6c 79 2e 73 65 74 5f 61 6c 70 68 61 28 30 2e 37 29 0a 61 78 2e 61 64 64 5f 63 t]).poly.set_alpha(0.7).ax.add_c
16da0 6f 6c 6c 65 63 74 69 6f 6e 33 64 28 70 6f 6c 79 2c 20 7a 73 3d 7a 73 2c 20 7a 64 69 72 3d 27 79 ollection3d(poly,.zs=zs,.zdir='y
16dc0 27 29 0a 61 78 2e 73 65 74 5f 78 6c 61 62 65 6c 28 27 78 27 29 0a 61 78 2e 73 65 74 5f 78 6c 69 ').ax.set_xlabel('x').ax.set_xli
16de0 6d 33 64 28 30 2c 20 6e 29 0a 61 78 2e 73 65 74 5f 79 6c 61 62 65 6c 28 72 27 24 5c 61 6c 70 68 m3d(0,.n).ax.set_ylabel(r'$\alph
16e00 61 24 27 29 0a 61 78 2e 73 65 74 5f 79 6c 69 6d 33 64 28 30 2c 20 31 29 0a 61 78 2e 73 65 74 5f a$').ax.set_ylim3d(0,.1).ax.set_
16e20 7a 6c 61 62 65 6c 28 27 27 29 0a 61 78 2e 73 65 74 5f 7a 6c 69 6d 33 64 28 30 2c 20 42 5f 6c 32 zlabel('').ax.set_zlim3d(0,.B_l2
16e40 2e 6d 61 78 28 29 20 2a 20 31 2e 30 31 29 0a 70 6c 2e 74 69 74 6c 65 28 27 42 61 72 79 63 65 6e .max().*.1.01).pl.title('Barycen
16e60 74 65 72 20 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e 20 77 69 74 68 20 57 61 73 73 65 72 73 74 65 ter.interpolation.with.Wasserste
16e80 69 6e 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f 75 74 28 29 0a 0a 70 6c 2e 73 68 6f 77 28 in').pl.tight_layout()..pl.show(
16ea0 29 0a 50 4b 03 04 14 00 00 00 00 00 db 74 d9 4e f4 37 b2 97 17 0e 00 00 17 0e 00 00 19 00 00 00 ).PK.........t.N.7..............
16ec0 70 6c 6f 74 5f 6f 74 64 61 5f 63 6f 6c 6f 72 5f 69 6d 61 67 65 73 2e 70 79 23 20 2d 2a 2d 20 63 plot_otda_color_images.py#.-*-.c
16ee0 6f 64 69 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0a 22 22 22 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d oding:.utf-8.-*-.""".===========
16f00 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 4f 54 20 66 6f 72 20 69 6d 61 67 65 20 ==================.OT.for.image.
16f20 63 6f 6c 6f 72 20 61 64 61 70 74 61 74 69 6f 6e 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d color.adaptation.===============
16f40 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 54 68 69 73 20 65 78 61 6d 70 6c 65 20 70 72 65 ==============..This.example.pre
16f60 73 65 6e 74 73 20 61 20 77 61 79 20 6f 66 20 74 72 61 6e 73 66 65 72 72 69 6e 67 20 63 6f 6c 6f sents.a.way.of.transferring.colo
16f80 72 73 20 62 65 74 77 65 65 6e 20 74 77 6f 20 69 6d 61 67 65 73 0a 77 69 74 68 20 4f 70 74 69 6d rs.between.two.images.with.Optim
16fa0 61 6c 20 54 72 61 6e 73 70 6f 72 74 20 61 73 20 69 6e 74 72 6f 64 75 63 65 64 20 69 6e 20 5b 36 al.Transport.as.introduced.in.[6
16fc0 5d 0a 0a 5b 36 5d 20 46 65 72 72 61 64 61 6e 73 2c 20 53 2e 2c 20 50 61 70 61 64 61 6b 69 73 2c ]..[6].Ferradans,.S.,.Papadakis,
16fe0 20 4e 2e 2c 20 50 65 79 72 65 2c 20 47 2e 2c 20 26 20 41 75 6a 6f 6c 2c 20 4a 2e 20 46 2e 20 28 .N.,.Peyre,.G.,.&.Aujol,.J..F..(
17000 32 30 31 34 29 2e 0a 52 65 67 75 6c 61 72 69 7a 65 64 20 64 69 73 63 72 65 74 65 20 6f 70 74 69 2014)..Regularized.discrete.opti
17020 6d 61 6c 20 74 72 61 6e 73 70 6f 72 74 2e 0a 53 49 41 4d 20 4a 6f 75 72 6e 61 6c 20 6f 6e 20 49 mal.transport..SIAM.Journal.on.I
17040 6d 61 67 69 6e 67 20 53 63 69 65 6e 63 65 73 2c 20 37 28 33 29 2c 20 31 38 35 33 2d 31 38 38 32 maging.Sciences,.7(3),.1853-1882
17060 2e 0a 22 22 22 0a 0a 23 20 41 75 74 68 6f 72 73 3a 20 52 65 6d 69 20 46 6c 61 6d 61 72 79 20 3c .."""..#.Authors:.Remi.Flamary.<
17080 72 65 6d 69 2e 66 6c 61 6d 61 72 79 40 75 6e 69 63 65 2e 66 72 3e 0a 23 20 20 20 20 20 20 20 20 remi.flamary@unice.fr>.#........
170a0 20 20 53 74 61 6e 69 73 6c 61 73 20 43 68 61 6d 62 6f 6e 20 3c 73 74 61 6e 2e 63 68 61 6d 62 6f ..Stanislas.Chambon.<stan.chambo
170c0 6e 40 67 6d 61 69 6c 2e 63 6f 6d 3e 0a 23 0a 23 20 4c 69 63 65 6e 73 65 3a 20 4d 49 54 20 4c 69 n@gmail.com>.#.#.License:.MIT.Li
170e0 63 65 6e 73 65 0a 0a 69 6d 70 6f 72 74 20 6e 75 6d 70 79 20 61 73 20 6e 70 0a 66 72 6f 6d 20 73 cense..import.numpy.as.np.from.s
17100 63 69 70 79 20 69 6d 70 6f 72 74 20 6e 64 69 6d 61 67 65 0a 69 6d 70 6f 72 74 20 6d 61 74 70 6c cipy.import.ndimage.import.matpl
17120 6f 74 6c 69 62 2e 70 79 6c 61 62 20 61 73 20 70 6c 0a 69 6d 70 6f 72 74 20 6f 74 0a 0a 0a 72 20 otlib.pylab.as.pl.import.ot...r.
17140 3d 20 6e 70 2e 72 61 6e 64 6f 6d 2e 52 61 6e 64 6f 6d 53 74 61 74 65 28 34 32 29 0a 0a 0a 64 65 =.np.random.RandomState(42)...de
17160 66 20 69 6d 32 6d 61 74 28 49 29 3a 0a 20 20 20 20 22 22 22 43 6f 6e 76 65 72 74 73 20 61 6e 20 f.im2mat(I):....."""Converts.an.
17180 69 6d 61 67 65 20 74 6f 20 6d 61 74 72 69 78 20 28 6f 6e 65 20 70 69 78 65 6c 20 70 65 72 20 6c image.to.matrix.(one.pixel.per.l
171a0 69 6e 65 29 22 22 22 0a 20 20 20 20 72 65 74 75 72 6e 20 49 2e 72 65 73 68 61 70 65 28 28 49 2e ine)""".....return.I.reshape((I.
171c0 73 68 61 70 65 5b 30 5d 20 2a 20 49 2e 73 68 61 70 65 5b 31 5d 2c 20 49 2e 73 68 61 70 65 5b 32 shape[0].*.I.shape[1],.I.shape[2
171e0 5d 29 29 0a 0a 0a 64 65 66 20 6d 61 74 32 69 6d 28 58 2c 20 73 68 61 70 65 29 3a 0a 20 20 20 20 ]))...def.mat2im(X,.shape):.....
17200 22 22 22 43 6f 6e 76 65 72 74 73 20 62 61 63 6b 20 61 20 6d 61 74 72 69 78 20 74 6f 20 61 6e 20 """Converts.back.a.matrix.to.an.
17220 69 6d 61 67 65 22 22 22 0a 20 20 20 20 72 65 74 75 72 6e 20 58 2e 72 65 73 68 61 70 65 28 73 68 image""".....return.X.reshape(sh
17240 61 70 65 29 0a 0a 0a 64 65 66 20 6d 69 6e 6d 61 78 28 49 29 3a 0a 20 20 20 20 72 65 74 75 72 6e ape)...def.minmax(I):.....return
17260 20 6e 70 2e 63 6c 69 70 28 49 2c 20 30 2c 20 31 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 .np.clip(I,.0,.1)...############
17280 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
172a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
172c0 23 23 0a 23 20 47 65 6e 65 72 61 74 65 20 64 61 74 61 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ##.#.Generate.data.#.-----------
172e0 2d 2d 0a 0a 23 20 4c 6f 61 64 69 6e 67 20 69 6d 61 67 65 73 0a 49 31 20 3d 20 6e 64 69 6d 61 67 --..#.Loading.images.I1.=.ndimag
17300 65 2e 69 6d 72 65 61 64 28 27 2e 2e 2f 64 61 74 61 2f 6f 63 65 61 6e 5f 64 61 79 2e 6a 70 67 27 e.imread('../data/ocean_day.jpg'
17320 29 2e 61 73 74 79 70 65 28 6e 70 2e 66 6c 6f 61 74 36 34 29 20 2f 20 32 35 36 0a 49 32 20 3d 20 ).astype(np.float64)./.256.I2.=.
17340 6e 64 69 6d 61 67 65 2e 69 6d 72 65 61 64 28 27 2e 2e 2f 64 61 74 61 2f 6f 63 65 61 6e 5f 73 75 ndimage.imread('../data/ocean_su
17360 6e 73 65 74 2e 6a 70 67 27 29 2e 61 73 74 79 70 65 28 6e 70 2e 66 6c 6f 61 74 36 34 29 20 2f 20 nset.jpg').astype(np.float64)./.
17380 32 35 36 0a 0a 58 31 20 3d 20 69 6d 32 6d 61 74 28 49 31 29 0a 58 32 20 3d 20 69 6d 32 6d 61 74 256..X1.=.im2mat(I1).X2.=.im2mat
173a0 28 49 32 29 0a 0a 23 20 74 72 61 69 6e 69 6e 67 20 73 61 6d 70 6c 65 73 0a 6e 62 20 3d 20 31 30 (I2)..#.training.samples.nb.=.10
173c0 30 30 0a 69 64 78 31 20 3d 20 72 2e 72 61 6e 64 69 6e 74 28 58 31 2e 73 68 61 70 65 5b 30 5d 2c 00.idx1.=.r.randint(X1.shape[0],
173e0 20 73 69 7a 65 3d 28 6e 62 2c 29 29 0a 69 64 78 32 20 3d 20 72 2e 72 61 6e 64 69 6e 74 28 58 32 .size=(nb,)).idx2.=.r.randint(X2
17400 2e 73 68 61 70 65 5b 30 5d 2c 20 73 69 7a 65 3d 28 6e 62 2c 29 29 0a 0a 58 73 20 3d 20 58 31 5b .shape[0],.size=(nb,))..Xs.=.X1[
17420 69 64 78 31 2c 20 3a 5d 0a 58 74 20 3d 20 58 32 5b 69 64 78 32 2c 20 3a 5d 0a 0a 0a 23 23 23 23 idx1,.:].Xt.=.X2[idx2,.:]...####
17440 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
17460 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
17480 23 23 23 23 23 23 23 23 23 23 0a 23 20 50 6c 6f 74 20 6f 72 69 67 69 6e 61 6c 20 69 6d 61 67 65 ##########.#.Plot.original.image
174a0 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 6c 2e 66 69 67 75 72 .#.-------------------..pl.figur
174c0 65 28 31 2c 20 66 69 67 73 69 7a 65 3d 28 36 2e 34 2c 20 33 29 29 0a 0a 70 6c 2e 73 75 62 70 6c e(1,.figsize=(6.4,.3))..pl.subpl
174e0 6f 74 28 31 2c 20 32 2c 20 31 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 49 31 29 0a 70 6c 2e 61 78 69 ot(1,.2,.1).pl.imshow(I1).pl.axi
17500 73 28 27 6f 66 66 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 49 6d 61 67 65 20 31 27 29 0a 0a 70 6c s('off').pl.title('Image.1')..pl
17520 2e 73 75 62 70 6c 6f 74 28 31 2c 20 32 2c 20 32 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 49 32 29 0a .subplot(1,.2,.2).pl.imshow(I2).
17540 70 6c 2e 61 78 69 73 28 27 6f 66 66 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 49 6d 61 67 65 20 32 pl.axis('off').pl.title('Image.2
17560 27 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ')...###########################
17580 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
175a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 53 63 61 74 74 65 72 20 70 6c ###################.#.Scatter.pl
175c0 6f 74 20 6f 66 20 63 6f 6c 6f 72 73 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ot.of.colors.#.-----------------
175e0 2d 2d 2d 2d 2d 0a 0a 70 6c 2e 66 69 67 75 72 65 28 32 2c 20 66 69 67 73 69 7a 65 3d 28 36 2e 34 -----..pl.figure(2,.figsize=(6.4
17600 2c 20 33 29 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 32 2c 20 31 29 0a 70 6c 2e 73 63 ,.3))..pl.subplot(1,.2,.1).pl.sc
17620 61 74 74 65 72 28 58 73 5b 3a 2c 20 30 5d 2c 20 58 73 5b 3a 2c 20 32 5d 2c 20 63 3d 58 73 29 0a atter(Xs[:,.0],.Xs[:,.2],.c=Xs).
17640 70 6c 2e 61 78 69 73 28 5b 30 2c 20 31 2c 20 30 2c 20 31 5d 29 0a 70 6c 2e 78 6c 61 62 65 6c 28 pl.axis([0,.1,.0,.1]).pl.xlabel(
17660 27 52 65 64 27 29 0a 70 6c 2e 79 6c 61 62 65 6c 28 27 42 6c 75 65 27 29 0a 70 6c 2e 74 69 74 6c 'Red').pl.ylabel('Blue').pl.titl
17680 65 28 27 49 6d 61 67 65 20 31 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 31 2c 20 32 2c 20 32 e('Image.1')..pl.subplot(1,.2,.2
176a0 29 0a 70 6c 2e 73 63 61 74 74 65 72 28 58 74 5b 3a 2c 20 30 5d 2c 20 58 74 5b 3a 2c 20 32 5d 2c ).pl.scatter(Xt[:,.0],.Xt[:,.2],
176c0 20 63 3d 58 74 29 0a 70 6c 2e 61 78 69 73 28 5b 30 2c 20 31 2c 20 30 2c 20 31 5d 29 0a 70 6c 2e .c=Xt).pl.axis([0,.1,.0,.1]).pl.
176e0 78 6c 61 62 65 6c 28 27 52 65 64 27 29 0a 70 6c 2e 79 6c 61 62 65 6c 28 27 42 6c 75 65 27 29 0a xlabel('Red').pl.ylabel('Blue').
17700 70 6c 2e 74 69 74 6c 65 28 27 49 6d 61 67 65 20 32 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 pl.title('Image.2').pl.tight_lay
17720 6f 75 74 28 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 out()...########################
17740 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
17760 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 49 6e 73 74 61 6e 74 ######################.#.Instant
17780 69 61 74 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 74 20 74 72 61 6e 73 70 6f 72 74 20 61 6c 67 iate.the.different.transport.alg
177a0 6f 72 69 74 68 6d 73 20 61 6e 64 20 66 69 74 20 74 68 65 6d 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d orithms.and.fit.them.#.---------
177c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------------------------
177e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 23 20 45 4d 44 54 72 61 6e 73 70 6f ------------------..#.EMDTranspo
17800 72 74 0a 6f 74 5f 65 6d 64 20 3d 20 6f 74 2e 64 61 2e 45 4d 44 54 72 61 6e 73 70 6f 72 74 28 29 rt.ot_emd.=.ot.da.EMDTransport()
17820 0a 6f 74 5f 65 6d 64 2e 66 69 74 28 58 73 3d 58 73 2c 20 58 74 3d 58 74 29 0a 0a 23 20 53 69 6e .ot_emd.fit(Xs=Xs,.Xt=Xt)..#.Sin
17840 6b 68 6f 72 6e 54 72 61 6e 73 70 6f 72 74 0a 6f 74 5f 73 69 6e 6b 68 6f 72 6e 20 3d 20 6f 74 2e khornTransport.ot_sinkhorn.=.ot.
17860 64 61 2e 53 69 6e 6b 68 6f 72 6e 54 72 61 6e 73 70 6f 72 74 28 72 65 67 5f 65 3d 31 65 2d 31 29 da.SinkhornTransport(reg_e=1e-1)
17880 0a 6f 74 5f 73 69 6e 6b 68 6f 72 6e 2e 66 69 74 28 58 73 3d 58 73 2c 20 58 74 3d 58 74 29 0a 0a .ot_sinkhorn.fit(Xs=Xs,.Xt=Xt)..
178a0 23 20 70 72 65 64 69 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 69 6d 61 67 65 73 20 28 75 73 69 #.prediction.between.images.(usi
178c0 6e 67 20 6f 75 74 20 6f 66 20 73 61 6d 70 6c 65 20 70 72 65 64 69 63 74 69 6f 6e 20 61 73 20 69 ng.out.of.sample.prediction.as.i
178e0 6e 20 5b 36 5d 29 0a 74 72 61 6e 73 70 5f 58 73 5f 65 6d 64 20 3d 20 6f 74 5f 65 6d 64 2e 74 72 n.[6]).transp_Xs_emd.=.ot_emd.tr
17900 61 6e 73 66 6f 72 6d 28 58 73 3d 58 31 29 0a 74 72 61 6e 73 70 5f 58 74 5f 65 6d 64 20 3d 20 6f ansform(Xs=X1).transp_Xt_emd.=.o
17920 74 5f 65 6d 64 2e 69 6e 76 65 72 73 65 5f 74 72 61 6e 73 66 6f 72 6d 28 58 74 3d 58 32 29 0a 0a t_emd.inverse_transform(Xt=X2)..
17940 74 72 61 6e 73 70 5f 58 73 5f 73 69 6e 6b 68 6f 72 6e 20 3d 20 6f 74 5f 73 69 6e 6b 68 6f 72 6e transp_Xs_sinkhorn.=.ot_sinkhorn
17960 2e 74 72 61 6e 73 66 6f 72 6d 28 58 73 3d 58 31 29 0a 74 72 61 6e 73 70 5f 58 74 5f 73 69 6e 6b .transform(Xs=X1).transp_Xt_sink
17980 68 6f 72 6e 20 3d 20 6f 74 5f 73 69 6e 6b 68 6f 72 6e 2e 69 6e 76 65 72 73 65 5f 74 72 61 6e 73 horn.=.ot_sinkhorn.inverse_trans
179a0 66 6f 72 6d 28 58 74 3d 58 32 29 0a 0a 49 31 74 20 3d 20 6d 69 6e 6d 61 78 28 6d 61 74 32 69 6d form(Xt=X2)..I1t.=.minmax(mat2im
179c0 28 74 72 61 6e 73 70 5f 58 73 5f 65 6d 64 2c 20 49 31 2e 73 68 61 70 65 29 29 0a 49 32 74 20 3d (transp_Xs_emd,.I1.shape)).I2t.=
179e0 20 6d 69 6e 6d 61 78 28 6d 61 74 32 69 6d 28 74 72 61 6e 73 70 5f 58 74 5f 65 6d 64 2c 20 49 32 .minmax(mat2im(transp_Xt_emd,.I2
17a00 2e 73 68 61 70 65 29 29 0a 0a 49 31 74 65 20 3d 20 6d 69 6e 6d 61 78 28 6d 61 74 32 69 6d 28 74 .shape))..I1te.=.minmax(mat2im(t
17a20 72 61 6e 73 70 5f 58 73 5f 73 69 6e 6b 68 6f 72 6e 2c 20 49 31 2e 73 68 61 70 65 29 29 0a 49 32 ransp_Xs_sinkhorn,.I1.shape)).I2
17a40 74 65 20 3d 20 6d 69 6e 6d 61 78 28 6d 61 74 32 69 6d 28 74 72 61 6e 73 70 5f 58 74 5f 73 69 6e te.=.minmax(mat2im(transp_Xt_sin
17a60 6b 68 6f 72 6e 2c 20 49 32 2e 73 68 61 70 65 29 29 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 khorn,.I2.shape))...############
17a80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
17aa0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################################
17ac0 23 23 0a 23 20 50 6c 6f 74 20 6e 65 77 20 69 6d 61 67 65 73 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d ##.#.Plot.new.images.#.---------
17ae0 2d 2d 2d 2d 2d 2d 0a 0a 70 6c 2e 66 69 67 75 72 65 28 33 2c 20 66 69 67 73 69 7a 65 3d 28 38 2c ------..pl.figure(3,.figsize=(8,
17b00 20 34 29 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 33 2c 20 31 29 0a 70 6c 2e 69 6d 73 .4))..pl.subplot(2,.3,.1).pl.ims
17b20 68 6f 77 28 49 31 29 0a 70 6c 2e 61 78 69 73 28 27 6f 66 66 27 29 0a 70 6c 2e 74 69 74 6c 65 28 how(I1).pl.axis('off').pl.title(
17b40 27 49 6d 61 67 65 20 31 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 33 2c 20 32 29 0a 'Image.1')..pl.subplot(2,.3,.2).
17b60 70 6c 2e 69 6d 73 68 6f 77 28 49 31 74 29 0a 70 6c 2e 61 78 69 73 28 27 6f 66 66 27 29 0a 70 6c pl.imshow(I1t).pl.axis('off').pl
17b80 2e 74 69 74 6c 65 28 27 49 6d 61 67 65 20 31 20 41 64 61 70 74 27 29 0a 0a 70 6c 2e 73 75 62 70 .title('Image.1.Adapt')..pl.subp
17ba0 6c 6f 74 28 32 2c 20 33 2c 20 33 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 49 31 74 65 29 0a 70 6c 2e lot(2,.3,.3).pl.imshow(I1te).pl.
17bc0 61 78 69 73 28 27 6f 66 66 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 49 6d 61 67 65 20 31 20 41 64 axis('off').pl.title('Image.1.Ad
17be0 61 70 74 20 28 72 65 67 29 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 33 2c 20 34 29 apt.(reg)')..pl.subplot(2,.3,.4)
17c00 0a 70 6c 2e 69 6d 73 68 6f 77 28 49 32 29 0a 70 6c 2e 61 78 69 73 28 27 6f 66 66 27 29 0a 70 6c .pl.imshow(I2).pl.axis('off').pl
17c20 2e 74 69 74 6c 65 28 27 49 6d 61 67 65 20 32 27 29 0a 0a 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c .title('Image.2')..pl.subplot(2,
17c40 20 33 2c 20 35 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 49 32 74 29 0a 70 6c 2e 61 78 69 73 28 27 6f .3,.5).pl.imshow(I2t).pl.axis('o
17c60 66 66 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 49 6d 61 67 65 20 32 20 41 64 61 70 74 27 29 0a 0a ff').pl.title('Image.2.Adapt')..
17c80 70 6c 2e 73 75 62 70 6c 6f 74 28 32 2c 20 33 2c 20 36 29 0a 70 6c 2e 69 6d 73 68 6f 77 28 49 32 pl.subplot(2,.3,.6).pl.imshow(I2
17ca0 74 65 29 0a 70 6c 2e 61 78 69 73 28 27 6f 66 66 27 29 0a 70 6c 2e 74 69 74 6c 65 28 27 49 6d 61 te).pl.axis('off').pl.title('Ima
17cc0 67 65 20 32 20 41 64 61 70 74 20 28 72 65 67 29 27 29 0a 70 6c 2e 74 69 67 68 74 5f 6c 61 79 6f ge.2.Adapt.(reg)').pl.tight_layo
17ce0 75 74 28 29 0a 0a 70 6c 2e 73 68 6f 77 28 29 0a 50 4b 01 02 14 03 14 00 00 00 00 00 da 74 d9 4e ut()..pl.show().PK...........t.N
17d00 0a ba a4 e6 91 06 00 00 91 06 00 00 0e 00 00 00 00 00 00 00 00 00 00 00 b4 81 00 00 00 00 70 6c ..............................pl
17d20 6f 74 5f 55 4f 54 5f 31 44 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 da 74 d9 4e c6 3b 52 da ot_UOT_1D.pyPK...........t.N.;R.
17d40 f3 0a 00 00 f3 0a 00 00 0e 00 00 00 00 00 00 00 00 00 00 00 b4 81 bd 06 00 00 70 6c 6f 74 5f 67 ..........................plot_g
17d60 72 6f 6d 6f 76 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 da 74 d9 4e a4 4f 47 3f 0c 0c 00 00 romov.pyPK...........t.N.OG?....
17d80 0c 0c 00 00 0b 00 00 00 00 00 00 00 00 00 00 00 b4 81 dc 11 00 00 70 6c 6f 74 5f 57 44 41 2e 70 ......................plot_WDA.p
17da0 79 50 4b 01 02 14 03 14 00 00 00 00 00 dc 74 d9 4e e5 d4 47 7d 9d 1c 00 00 9d 1c 00 00 19 00 00 yPK...........t.N..G}...........
17dc0 00 00 00 00 00 00 00 00 00 b4 81 11 1e 00 00 70 6c 6f 74 5f 67 72 6f 6d 6f 76 5f 62 61 72 79 63 ...............plot_gromov_baryc
17de0 65 6e 74 65 72 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 da 74 d9 4e b8 cd f6 1b 7e 0b 00 00 enter.pyPK...........t.N....~...
17e00 7e 0b 00 00 13 00 00 00 00 00 00 00 00 00 00 00 b4 81 e5 3a 00 00 70 6c 6f 74 5f 6f 70 74 69 6d ~..................:..plot_optim
17e20 5f 4f 54 72 65 67 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 db 74 d9 4e 39 06 7c 60 0c 15 00 _OTreg.pyPK...........t.N9.|`...
17e40 00 0c 15 00 00 0f 00 00 00 00 00 00 00 00 00 00 00 b4 81 94 46 00 00 70 6c 6f 74 5f 6f 74 64 61 ....................F..plot_otda
17e60 5f 64 32 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 db 74 d9 4e 71 12 0d cb 23 12 00 00 23 12 _d2.pyPK...........t.Nq...#...#.
17e80 00 00 1c 00 00 00 00 00 00 00 00 00 00 00 b4 81 cd 5b 00 00 70 6c 6f 74 5f 6f 74 64 61 5f 73 65 .................[..plot_otda_se
17ea0 6d 69 5f 73 75 70 65 72 76 69 73 65 64 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 da 74 d9 4e mi_supervised.pyPK...........t.N
17ec0 0b 5c 2a af a2 06 00 00 a2 06 00 00 0d 00 00 00 00 00 00 00 00 00 00 00 b4 81 2a 6e 00 00 70 6c .\*.......................*n..pl
17ee0 6f 74 5f 4f 54 5f 31 44 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 db 74 d9 4e 6d 8a 53 18 e2 ot_OT_1D.pyPK...........t.Nm.S..
17f00 17 00 00 e2 17 00 00 12 00 00 00 00 00 00 00 00 00 00 00 b4 81 f7 74 00 00 70 6c 6f 74 5f 73 74 ......................t..plot_st
17f20 6f 63 68 61 73 74 69 63 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 db 74 d9 4e f2 7c 7e 9e 5c ochastic.pyPK...........t.N.|~.\
17f40 0e 00 00 5c 0e 00 00 15 00 00 00 00 00 00 00 00 00 00 00 b4 81 09 8d 00 00 70 6c 6f 74 5f 62 61 ...\.....................plot_ba
17f60 72 79 63 65 6e 74 65 72 5f 31 44 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 db 74 d9 4e b0 31 rycenter_1D.pyPK...........t.N.1
17f80 70 de ee 10 00 00 ee 10 00 00 14 00 00 00 00 00 00 00 00 00 00 00 b4 81 98 9b 00 00 70 6c 6f 74 p...........................plot
17fa0 5f 6f 74 64 61 5f 63 6c 61 73 73 65 73 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 da 74 d9 4e _otda_classes.pyPK...........t.N
17fc0 ff 09 e8 78 dd 08 00 00 dd 08 00 00 14 00 00 00 00 00 00 00 00 00 00 00 b4 81 b8 ac 00 00 70 6c ...x..........................pl
17fe0 6f 74 5f 4f 54 5f 31 44 5f 73 6d 6f 6f 74 68 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 db 74 ot_OT_1D_smooth.pyPK...........t
18000 d9 4e b0 ed ff 28 54 10 00 00 54 10 00 00 22 00 00 00 00 00 00 00 00 00 00 00 b4 81 c7 b5 00 00 .N...(T...T...".................
18020 70 6c 6f 74 5f 6f 74 64 61 5f 6d 61 70 70 69 6e 67 5f 63 6f 6c 6f 72 73 5f 69 6d 61 67 65 73 2e plot_otda_mapping_colors_images.
18040 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 da 74 d9 4e 90 0c 61 ee fa 07 00 00 fa 07 00 00 1f 00 pyPK...........t.N..a...........
18060 00 00 00 00 00 00 00 00 00 00 b4 81 5b c6 00 00 70 6c 6f 74 5f 66 72 65 65 5f 73 75 70 70 6f 72 ............[...plot_free_suppor
18080 74 5f 62 61 72 79 63 65 6e 74 65 72 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 db 74 d9 4e e5 t_barycenter.pyPK...........t.N.
180a0 5f 4e 9c 14 11 00 00 14 11 00 00 0b 00 00 00 00 00 00 00 00 00 00 00 b4 81 92 ce 00 00 70 6c 6f _N...........................plo
180c0 74 5f 66 67 77 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 db 74 d9 4e ea 88 04 1c d5 18 00 00 t_fgw.pyPK...........t.N........
180e0 d5 18 00 00 16 00 00 00 00 00 00 00 00 00 00 00 b4 81 cf df 00 00 70 6c 6f 74 5f 62 61 72 79 63 ......................plot_baryc
18100 65 6e 74 65 72 5f 66 67 77 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 db 74 d9 4e 6f 6c 58 5b enter_fgw.pyPK...........t.NolX[
18120 88 13 00 00 88 13 00 00 13 00 00 00 00 00 00 00 00 00 00 00 b4 81 d8 f8 00 00 70 6c 6f 74 5f 4f ..........................plot_O
18140 54 5f 4c 31 5f 76 73 5f 4c 32 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 db 74 d9 4e a6 16 4e T_L1_vs_L2.pyPK...........t.N..N
18160 83 2e 17 00 00 2e 17 00 00 21 00 00 00 00 00 00 00 00 00 00 00 b4 81 91 0c 01 00 70 6c 6f 74 5f .........!.................plot_
18180 62 61 72 79 63 65 6e 74 65 72 5f 6c 70 5f 76 73 5f 65 6e 74 72 6f 70 69 63 2e 70 79 50 4b 01 02 barycenter_lp_vs_entropic.pyPK..
181a0 14 03 14 00 00 00 00 00 db 74 d9 4e a7 6b f0 c3 bf 0b 00 00 bf 0b 00 00 15 00 00 00 00 00 00 00 .........t.N.k..................
181c0 00 00 00 00 b4 81 fe 23 01 00 70 6c 6f 74 5f 4f 54 5f 32 44 5f 73 61 6d 70 6c 65 73 2e 70 79 50 .......#..plot_OT_2D_samples.pyP
181e0 4b 01 02 14 03 14 00 00 00 00 00 da 74 d9 4e 0e e0 72 82 97 0b 00 00 97 0b 00 00 1b 00 00 00 00 K...........t.N..r..............
18200 00 00 00 00 00 00 00 b4 81 f0 2f 01 00 70 6c 6f 74 5f 6f 74 64 61 5f 6c 69 6e 65 61 72 5f 6d 61 ........../..plot_otda_linear_ma
18220 70 70 69 6e 67 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 db 74 d9 4e cd ad d9 82 f4 0f 00 00 pping.pyPK...........t.N........
18240 f4 0f 00 00 14 00 00 00 00 00 00 00 00 00 00 00 b4 81 c0 3b 01 00 70 6c 6f 74 5f 6f 74 64 61 5f ...................;..plot_otda_
18260 6d 61 70 70 69 6e 67 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 da 74 d9 4e 7a 2e b5 2b 65 09 mapping.pyPK...........t.Nz..+e.
18280 00 00 65 09 00 00 13 00 00 00 00 00 00 00 00 00 00 00 b4 81 e6 4b 01 00 70 6c 6f 74 5f 63 6f 6d ..e..................K..plot_com
182a0 70 75 74 65 5f 65 6d 64 2e 70 79 50 4b 01 02 14 03 14 00 00 00 00 00 da 74 d9 4e d1 a8 d7 2e a9 pute_emd.pyPK...........t.N.....
182c0 09 00 00 a9 09 00 00 20 00 00 00 00 00 00 00 00 00 00 00 b4 81 7c 55 01 00 70 6c 6f 74 5f 63 6f .....................|U..plot_co
182e0 6e 76 6f 6c 75 74 69 6f 6e 61 6c 5f 62 61 72 79 63 65 6e 74 65 72 2e 70 79 50 4b 01 02 14 03 14 nvolutional_barycenter.pyPK.....
18300 00 00 00 00 00 db 74 d9 4e 20 57 90 f6 08 0f 00 00 08 0f 00 00 19 00 00 00 00 00 00 00 00 00 00 ......t.N.W.....................
18320 00 b4 81 63 5f 01 00 70 6c 6f 74 5f 55 4f 54 5f 62 61 72 79 63 65 6e 74 65 72 5f 31 44 2e 70 79 ...c_..plot_UOT_barycenter_1D.py
18340 50 4b 01 02 14 03 14 00 00 00 00 00 db 74 d9 4e f4 37 b2 97 17 0e 00 00 17 0e 00 00 19 00 00 00 PK...........t.N.7..............
18360 00 00 00 00 00 00 00 00 b4 81 a2 6e 01 00 70 6c 6f 74 5f 6f 74 64 61 5f 63 6f 6c 6f 72 5f 69 6d ...........n..plot_otda_color_im
18380 61 67 65 73 2e 70 79 50 4b 05 06 00 00 00 00 19 00 19 00 97 06 00 00 f0 7c 01 00 00 00 ages.pyPK...............|....