From f9995cf190b908933d6ababa2eb2bbf46431f997 Mon Sep 17 00:00:00 2001 From: aboisbunon Date: Mon, 22 Oct 2018 14:40:51 +0200 Subject: Corrected the Sinkhorn prediction images The prediction images for Sinkhorn used the ot_emd object instead of ot_sinkhorn --- examples/plot_otda_color_images.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/plot_otda_color_images.py b/examples/plot_otda_color_images.py index e77aec0..62383a2 100644 --- a/examples/plot_otda_color_images.py +++ b/examples/plot_otda_color_images.py @@ -4,7 +4,7 @@ OT for image color adaptation ============================= -This example presents a way of transferring colors between two image +This example presents a way of transferring colors between two images with Optimal Transport as introduced in [6] [6] Ferradans, S., Papadakis, N., Peyre, G., & Aujol, J. F. (2014). @@ -27,7 +27,7 @@ r = np.random.RandomState(42) def im2mat(I): - """Converts and image to matrix (one pixel per line)""" + """Converts an image to matrix (one pixel per line)""" return I.reshape((I.shape[0] * I.shape[1], I.shape[2])) @@ -115,8 +115,8 @@ ot_sinkhorn.fit(Xs=Xs, Xt=Xt) transp_Xs_emd = ot_emd.transform(Xs=X1) transp_Xt_emd = ot_emd.inverse_transform(Xt=X2) -transp_Xs_sinkhorn = ot_emd.transform(Xs=X1) -transp_Xt_sinkhorn = ot_emd.inverse_transform(Xt=X2) +transp_Xs_sinkhorn = ot_sinkhorn.transform(Xs=X1) +transp_Xt_sinkhorn = ot_sinkhorn.inverse_transform(Xt=X2) I1t = minmax(mat2im(transp_Xs_emd, I1.shape)) I2t = minmax(mat2im(transp_Xt_emd, I2.shape)) -- cgit v1.2.3 From 93db239e1156ad1db8edbb13c1ecde973ce009c0 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 19 Nov 2018 11:17:07 +0100 Subject: remove W605 errors --- ot/bregman.py | 18 +++++++++--------- ot/externals/funcsigs.py | 46 +++++++++++++++++++++++----------------------- ot/gpu/bregman.py | 6 +++--- ot/stochastic.py | 20 ++++++++++---------- setup.cfg | 2 +- 5 files changed, 46 insertions(+), 46 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index d1057ff..43340f7 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -370,9 +370,9 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, v = np.divide(b, KtransposeU) u = 1. / np.dot(Kp, v) - if (np.any(KtransposeU == 0) or - np.any(np.isnan(u)) or np.any(np.isnan(v)) or - np.any(np.isinf(u)) or np.any(np.isinf(v))): + if (np.any(KtransposeU == 0) + or np.any(np.isnan(u)) or np.any(np.isnan(v)) + or np.any(np.isinf(u)) or np.any(np.isinf(v))): # we have reached the machine precision # come back to previous solution and quit loop print('Warning: numerical errors at iteration', cpt) @@ -683,13 +683,13 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, def get_K(alpha, beta): """log space computation""" - return np.exp(-(M - alpha.reshape((na, 1)) - - beta.reshape((1, nb))) / reg) + return np.exp(-(M - alpha.reshape((na, 1)) + - beta.reshape((1, nb))) / reg) def get_Gamma(alpha, beta, u, v): """log space gamma computation""" - return np.exp(-(M - alpha.reshape((na, 1)) - beta.reshape((1, nb))) / - reg + np.log(u.reshape((na, 1))) + np.log(v.reshape((1, nb)))) + return np.exp(-(M - alpha.reshape((na, 1)) - beta.reshape((1, nb))) + / reg + np.log(u.reshape((na, 1))) + np.log(v.reshape((1, nb)))) # print(np.min(K)) @@ -899,8 +899,8 @@ def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, numInne def get_K(alpha, beta): """log space computation""" - return np.exp(-(M - alpha.reshape((na, 1)) - - beta.reshape((1, nb))) / reg) + return np.exp(-(M - alpha.reshape((na, 1)) + - beta.reshape((1, nb))) / reg) # print(np.min(K)) def get_reg(n): # exponential decreasing diff --git a/ot/externals/funcsigs.py b/ot/externals/funcsigs.py index c73fdc9..106bde7 100644 --- a/ot/externals/funcsigs.py +++ b/ot/externals/funcsigs.py @@ -126,8 +126,8 @@ def signature(obj): new_params[arg_name] = param.replace(default=arg_value, _partial_kwarg=True) - elif (param.kind not in (_VAR_KEYWORD, _VAR_POSITIONAL) and - not param._partial_kwarg): + elif (param.kind not in (_VAR_KEYWORD, _VAR_POSITIONAL) + and not param._partial_kwarg): new_params.pop(arg_name) return sig.replace(parameters=new_params.values()) @@ -333,11 +333,11 @@ class Parameter(object): raise TypeError(msg) def __eq__(self, other): - return (issubclass(other.__class__, Parameter) and - self._name == other._name and - self._kind == other._kind and - self._default == other._default and - self._annotation == other._annotation) + return (issubclass(other.__class__, Parameter) + and self._name == other._name + and self._kind == other._kind + and self._default == other._default + and self._annotation == other._annotation) def __ne__(self, other): return not self.__eq__(other) @@ -372,8 +372,8 @@ class BoundArguments(object): def args(self): args = [] for param_name, param in self._signature.parameters.items(): - if (param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY) or - param._partial_kwarg): + if (param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY) + or param._partial_kwarg): # Keyword arguments mapped by 'functools.partial' # (Parameter._partial_kwarg is True) are mapped # in 'BoundArguments.kwargs', along with VAR_KEYWORD & @@ -402,8 +402,8 @@ class BoundArguments(object): kwargs_started = False for param_name, param in self._signature.parameters.items(): if not kwargs_started: - if (param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY) or - param._partial_kwarg): + if (param.kind in (_VAR_KEYWORD, _KEYWORD_ONLY) + or param._partial_kwarg): kwargs_started = True else: if param_name not in self.arguments: @@ -432,9 +432,9 @@ class BoundArguments(object): raise TypeError(msg) def __eq__(self, other): - return (issubclass(other.__class__, BoundArguments) and - self.signature == other.signature and - self.arguments == other.arguments) + return (issubclass(other.__class__, BoundArguments) + and self.signature == other.signature + and self.arguments == other.arguments) def __ne__(self, other): return not self.__eq__(other) @@ -612,9 +612,9 @@ class Signature(object): raise TypeError(msg) def __eq__(self, other): - if (not issubclass(type(other), Signature) or - self.return_annotation != other.return_annotation or - len(self.parameters) != len(other.parameters)): + if (not issubclass(type(other), Signature) + or self.return_annotation != other.return_annotation + or len(self.parameters) != len(other.parameters)): return False other_positions = dict((param, idx) @@ -635,8 +635,8 @@ class Signature(object): except KeyError: return False else: - if (idx != other_idx or - param != other.parameters[param_name]): + if (idx != other_idx + or param != other.parameters[param_name]): return False return True @@ -688,8 +688,8 @@ class Signature(object): raise TypeError(msg) parameters_ex = (param,) break - elif (param.kind == _VAR_KEYWORD or - param.default is not _empty): + elif (param.kind == _VAR_KEYWORD + or param.default is not _empty): # That's fine too - we have a default value for this # parameter. So, lets start parsing `kwargs`, starting # with the current parameter @@ -755,8 +755,8 @@ class Signature(object): # if it has a default value, or it is an '*args'-like # parameter, left alone by the processing of positional # arguments. - if (not partial and param.kind != _VAR_POSITIONAL and - param.default is _empty): + if (not partial and param.kind != _VAR_POSITIONAL + and param.default is _empty): raise TypeError('{arg!r} parameter lacking default value'. format(arg=param_name)) diff --git a/ot/gpu/bregman.py b/ot/gpu/bregman.py index 978b307..3031ed9 100644 --- a/ot/gpu/bregman.py +++ b/ot/gpu/bregman.py @@ -146,9 +146,9 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, stopThr=1e-9, v = np.divide(b, KtransposeU) u = 1. / np.dot(Kp, v) - if (np.any(KtransposeU == 0) or - np.any(np.isnan(u)) or np.any(np.isnan(v)) or - np.any(np.isinf(u)) or np.any(np.isinf(v))): + if (np.any(KtransposeU == 0) + or np.any(np.isnan(u)) or np.any(np.isnan(v)) + or np.any(np.isinf(u)) or np.any(np.isinf(v))): # we have reached the machine precision # come back to previous solution and quit loop print('Warning: numerical errors at iteration', cpt) diff --git a/ot/stochastic.py b/ot/stochastic.py index ec53015..1376884 100644 --- a/ot/stochastic.py +++ b/ot/stochastic.py @@ -418,8 +418,8 @@ def solve_semi_dual_entropic(a, b, M, reg, method, numItermax=10000, lr=None, return None opt_alpha = c_transform_entropic(b, M, reg, opt_beta) - pi = (np.exp((opt_alpha[:, None] + opt_beta[None, :] - M[:, :]) / reg) * - a[:, None] * b[None, :]) + pi = (np.exp((opt_alpha[:, None] + opt_beta[None, :] - M[:, :]) / reg) + * a[:, None] * b[None, :]) if log: log = {} @@ -520,15 +520,15 @@ def batch_grad_dual(a, b, M, reg, alpha, beta, batch_size, batch_alpha, arXiv preprint arxiv:1711.02283. ''' - G = - (np.exp((alpha[batch_alpha, None] + beta[None, batch_beta] - - M[batch_alpha, :][:, batch_beta]) / reg) * + G = - (np.exp((alpha[batch_alpha, None] + beta[None, batch_beta] + - M[batch_alpha, :][:, batch_beta]) / reg) * a[batch_alpha, None] * b[None, batch_beta]) grad_beta = np.zeros(np.shape(M)[1]) grad_alpha = np.zeros(np.shape(M)[0]) - grad_beta[batch_beta] = (b[batch_beta] * len(batch_alpha) / np.shape(M)[0] + - G.sum(0)) - grad_alpha[batch_alpha] = (a[batch_alpha] * len(batch_beta) / - np.shape(M)[1] + G.sum(1)) + grad_beta[batch_beta] = (b[batch_beta] * len(batch_alpha) / np.shape(M)[0] + + G.sum(0)) + grad_alpha[batch_alpha] = (a[batch_alpha] * len(batch_beta) + / np.shape(M)[1] + G.sum(1)) return grad_alpha, grad_beta @@ -702,8 +702,8 @@ def solve_dual_entropic(a, b, M, reg, batch_size, numItermax=10000, lr=1, opt_alpha, opt_beta = sgd_entropic_regularization(a, b, M, reg, batch_size, numItermax, lr) - pi = (np.exp((opt_alpha[:, None] + opt_beta[None, :] - M[:, :]) / reg) * - a[:, None] * b[None, :]) + pi = (np.exp((opt_alpha[:, None] + opt_beta[None, :] - M[:, :]) / reg) + * a[:, None] * b[None, :]) if log: log = {} log['alpha'] = opt_alpha diff --git a/setup.cfg b/setup.cfg index b2a2415..24512d2 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,4 +3,4 @@ description-file = README.md [flake8] exclude = __init__.py -ignore = E265,E501 +ignore = E265,E501,W605 -- cgit v1.2.3 From de04afc0f9f01fc09a3a8138865eacc0b6f4415d Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 19 Nov 2018 11:18:29 +0100 Subject: update flake8 parameters --- ot/gpu/bregman.py | 6 +++--- ot/stochastic.py | 12 ++++++------ setup.cfg | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ot/gpu/bregman.py b/ot/gpu/bregman.py index 3031ed9..978b307 100644 --- a/ot/gpu/bregman.py +++ b/ot/gpu/bregman.py @@ -146,9 +146,9 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, stopThr=1e-9, v = np.divide(b, KtransposeU) u = 1. / np.dot(Kp, v) - if (np.any(KtransposeU == 0) - or np.any(np.isnan(u)) or np.any(np.isnan(v)) - or np.any(np.isinf(u)) or np.any(np.isinf(v))): + if (np.any(KtransposeU == 0) or + np.any(np.isnan(u)) or np.any(np.isnan(v)) or + np.any(np.isinf(u)) or np.any(np.isinf(v))): # we have reached the machine precision # come back to previous solution and quit loop print('Warning: numerical errors at iteration', cpt) diff --git a/ot/stochastic.py b/ot/stochastic.py index 1376884..959c6fa 100644 --- a/ot/stochastic.py +++ b/ot/stochastic.py @@ -418,8 +418,8 @@ def solve_semi_dual_entropic(a, b, M, reg, method, numItermax=10000, lr=None, return None opt_alpha = c_transform_entropic(b, M, reg, opt_beta) - pi = (np.exp((opt_alpha[:, None] + opt_beta[None, :] - M[:, :]) / reg) - * a[:, None] * b[None, :]) + pi = (np.exp((opt_alpha[:, None] + opt_beta[None, :] - M[:, :]) / reg) * + a[:, None] * b[None, :]) if log: log = {} @@ -520,8 +520,8 @@ def batch_grad_dual(a, b, M, reg, alpha, beta, batch_size, batch_alpha, arXiv preprint arxiv:1711.02283. ''' - G = - (np.exp((alpha[batch_alpha, None] + beta[None, batch_beta] - - M[batch_alpha, :][:, batch_beta]) / reg) * + G = - (np.exp((alpha[batch_alpha, None] + beta[None, batch_beta] - + M[batch_alpha, :][:, batch_beta]) / reg) * a[batch_alpha, None] * b[None, batch_beta]) grad_beta = np.zeros(np.shape(M)[1]) grad_alpha = np.zeros(np.shape(M)[0]) @@ -702,8 +702,8 @@ def solve_dual_entropic(a, b, M, reg, batch_size, numItermax=10000, lr=1, opt_alpha, opt_beta = sgd_entropic_regularization(a, b, M, reg, batch_size, numItermax, lr) - pi = (np.exp((opt_alpha[:, None] + opt_beta[None, :] - M[:, :]) / reg) - * a[:, None] * b[None, :]) + pi = (np.exp((opt_alpha[:, None] + opt_beta[None, :] - M[:, :]) / reg) * + a[:, None] * b[None, :]) if log: log = {} log['alpha'] = opt_alpha diff --git a/setup.cfg b/setup.cfg index 24512d2..aa0ff62 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,4 +3,4 @@ description-file = README.md [flake8] exclude = __init__.py -ignore = E265,E501,W605 +ignore = E265,E501,W605,W503,W504 -- cgit v1.2.3 From 42a501c5d839c010bbfa3a4440b43cb4f9775fc7 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 11 Mar 2019 10:39:03 +0100 Subject: add test sinkhorn+log --- ot/bregman.py | 14 +++++++++++++- test/test_bregman.py | 25 +++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/ot/bregman.py b/ot/bregman.py index 43340f7..013bc33 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -120,7 +120,8 @@ def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, print('Warning : unknown method using classic Sinkhorn Knopp') def sink(): - return sinkhorn_knopp(a, b, M, reg, **kwargs) + return sinkhorn_knopp(a, b, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, log=log, **kwargs) return sink() @@ -499,6 +500,15 @@ def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log= """ + a = np.asarray(a, dtype=np.float64) + b = np.asarray(b, dtype=np.float64) + M = np.asarray(M, dtype=np.float64) + + if len(a) == 0: + a = np.ones((M.shape[0],), dtype=np.float64) / M.shape[0] + if len(b) == 0: + b = np.ones((M.shape[1],), dtype=np.float64) / M.shape[1] + n = a.shape[0] m = b.shape[0] @@ -514,7 +524,9 @@ def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log= viol = G.sum(1) - a viol_2 = G.sum(0) - b stopThr_val = 1 + if log: + log = dict() log['u'] = u log['v'] = v diff --git a/test/test_bregman.py b/test/test_bregman.py index 14edaf5..90eaf27 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -81,6 +81,31 @@ def test_sinkhorn_variants(): print(G0, G_green) +def test_sinkhorn_variants_log(): + # test sinkhorn + n = 100 + rng = np.random.RandomState(0) + + x = rng.randn(n, 2) + u = ot.utils.unif(n) + + M = ot.dist(x, x) + + G0, log0 = ot.sinkhorn(u, u, M, 1, method='sinkhorn', stopThr=1e-10, log=True) + Gs, logs = ot.sinkhorn(u, u, M, 1, method='sinkhorn_stabilized', stopThr=1e-10, log=True) + Ges, loges = ot.sinkhorn( + u, u, M, 1, method='sinkhorn_epsilon_scaling', stopThr=1e-10, log=True) + Gerr, logerr = ot.sinkhorn(u, u, M, 1, method='do_not_exists', stopThr=1e-10, log=True) + G_green, loggreen = ot.sinkhorn(u, u, M, 1, method='greenkhorn', stopThr=1e-10, log=True) + + # check values + np.testing.assert_allclose(G0, Gs, atol=1e-05) + np.testing.assert_allclose(G0, Ges, atol=1e-05) + np.testing.assert_allclose(G0, Gerr) + np.testing.assert_allclose(G0, G_green, atol=1e-5) + print(G0, G_green) + + def test_bary(): n_bins = 100 # nb bins -- cgit v1.2.3 From fea0c38c4260788c0359547f7caf75a3d92a2b42 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 11 Mar 2019 10:51:10 +0100 Subject: pytest-cov workaronud --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 90a0ff4..50ff22c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,7 +26,7 @@ before_script: # configure a headless display to test plot generation # command to install dependencies install: - pip install -r requirements.txt - - pip install flake8 pytest pytest-cov + - pip install flake8 pytest "pytest-cov<2.6" - pip install . # command to run tests + check syntax style script: -- cgit v1.2.3 From 950efdc2644880fff9119e18f66e9825678fefcb Mon Sep 17 00:00:00 2001 From: vfdev-5 Date: Tue, 12 Mar 2019 15:26:17 +0100 Subject: Minor typo fix in examples. Fixes #77 --- examples/plot_otda_mapping_colors_images.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/plot_otda_mapping_colors_images.py b/examples/plot_otda_mapping_colors_images.py index 5f1e844..a20eca8 100644 --- a/examples/plot_otda_mapping_colors_images.py +++ b/examples/plot_otda_mapping_colors_images.py @@ -77,7 +77,7 @@ Image_emd = minmax(mat2im(transp_Xs_emd, I1.shape)) # SinkhornTransport ot_sinkhorn = ot.da.SinkhornTransport(reg_e=1e-1) ot_sinkhorn.fit(Xs=Xs, Xt=Xt) -transp_Xs_sinkhorn = ot_emd.transform(Xs=X1) +transp_Xs_sinkhorn = ot_sinkhorn.transform(Xs=X1) Image_sinkhorn = minmax(mat2im(transp_Xs_sinkhorn, I1.shape)) ot_mapping_linear = ot.da.MappingTransport( -- cgit v1.2.3 From 9cd97796797b9b2853c6458a7f4e9347bb212978 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 15 Mar 2019 11:56:10 +0100 Subject: update notebooks and documentation --- docs/cache_nbrun | 2 +- .../source/auto_examples/auto_examples_jupyter.zip | Bin 123577 -> 122957 bytes docs/source/auto_examples/auto_examples_python.zip | Bin 81978 -> 81905 bytes .../images/sphx_glr_plot_otda_color_images_001.png | Bin 144957 -> 145014 bytes .../images/sphx_glr_plot_otda_color_images_003.png | Bin 50401 -> 50472 bytes .../images/sphx_glr_plot_otda_color_images_005.png | Bin 234564 -> 326766 bytes ...phx_glr_plot_otda_mapping_colors_images_001.png | Bin 165592 -> 165658 bytes ...phx_glr_plot_otda_mapping_colors_images_003.png | Bin 80722 -> 80796 bytes ...phx_glr_plot_otda_mapping_colors_images_004.png | Bin 541314 -> 512309 bytes .../images/sphx_glr_plot_stochastic_005.png | Bin 10677 -> 10677 bytes .../images/sphx_glr_plot_stochastic_007.png | Bin 9563 -> 9483 bytes .../sphx_glr_plot_otda_color_images_thumb.png | Bin 51085 -> 49131 bytes ...x_glr_plot_otda_mapping_colors_images_thumb.png | Bin 58315 -> 56216 bytes docs/source/auto_examples/index.rst | 2 +- .../auto_examples/plot_otda_color_images.ipynb | 194 ++++++++++----------- .../source/auto_examples/plot_otda_color_images.py | 8 +- .../auto_examples/plot_otda_color_images.rst | 21 ++- .../plot_otda_mapping_colors_images.ipynb | 192 ++++++++++---------- .../plot_otda_mapping_colors_images.py | 2 +- .../plot_otda_mapping_colors_images.rst | 77 ++++---- docs/source/auto_examples/plot_stochastic.ipynb | 44 +---- docs/source/auto_examples/plot_stochastic.py | 11 +- docs/source/auto_examples/plot_stochastic.rst | 97 ++++------- 23 files changed, 298 insertions(+), 352 deletions(-) diff --git a/docs/cache_nbrun b/docs/cache_nbrun index 575adc8..6f10375 100644 --- a/docs/cache_nbrun +++ b/docs/cache_nbrun @@ -1 +1 @@ -{"plot_otda_mapping_colors_images.ipynb": "4f0587a00a3c082799a75a0ed36e9ce1", "plot_optim_OTreg.ipynb": "481801bb0d133ef350a65179cf8f739a", "plot_barycenter_1D.ipynb": "5f6fb8aebd8e2e91ebc77c923cb112b3", "plot_stochastic.ipynb": "e2c520150378ae4635f74509f687fa01", "plot_WDA.ipynb": "27f8de4c6d7db46497076523673eedfb", "plot_otda_linear_mapping.ipynb": "a472c767abe82020e0a58125a528785c", "plot_OT_1D_smooth.ipynb": "3a059103652225a0c78ea53895cf79e5", "plot_OT_L1_vs_L2.ipynb": "5d565b8aaf03be4309eba731127851dc", "plot_otda_color_images.ipynb": "d047d635f4987c81072383241590e21f", "plot_otda_classes.ipynb": "39087b6e98217851575f2271c22853a4", "plot_otda_d2.ipynb": "e6feae588103f2a8fab942e5f4eff483", "plot_otda_mapping.ipynb": "2f1ebbdc0f855d9e2b7adf9edec24d25", "plot_gromov.ipynb": "24f2aea489714d34779521f46d5e2c47", "plot_compute_emd.ipynb": "f5cd71cad882ec157dc8222721e9820c", "plot_OT_1D.ipynb": "b5348bdc561c07ec168a1622e5af4b93", "plot_gromov_barycenter.ipynb": "953e5047b886ec69ec621ec52f5e21d1", "plot_free_support_barycenter.ipynb": "246dd2feff4b233a4f1a553c5a202fdc", "plot_convolutional_barycenter.ipynb": "a72bb3716a1baaffd81ae267a673f9b6", "plot_otda_semi_supervised.ipynb": "f6dfb02ba2bbd939408ffcd22a3b007c", "plot_OT_2D_samples.ipynb": "07dbc14859fa019a966caa79fa0825bd", "plot_barycenter_lp_vs_entropic.ipynb": "51833e8c76aaedeba9599ac7a30eb357"} \ No newline at end of file +{"plot_otda_mapping_colors_images.ipynb": "cc8bf9a857f52e4a159fe71dfda19018", "plot_optim_OTreg.ipynb": "481801bb0d133ef350a65179cf8f739a", "plot_otda_color_images.ipynb": "f804d5806c7ac1a0901e4542b1eaa77b", "plot_stochastic.ipynb": "e18253354c8c1d72567a4259eb1094f7", "plot_WDA.ipynb": "27f8de4c6d7db46497076523673eedfb", "plot_otda_linear_mapping.ipynb": "a472c767abe82020e0a58125a528785c", "plot_OT_1D_smooth.ipynb": "3a059103652225a0c78ea53895cf79e5", "plot_OT_L1_vs_L2.ipynb": "5d565b8aaf03be4309eba731127851dc", "plot_barycenter_1D.ipynb": "5f6fb8aebd8e2e91ebc77c923cb112b3", "plot_otda_classes.ipynb": "39087b6e98217851575f2271c22853a4", "plot_otda_d2.ipynb": "e6feae588103f2a8fab942e5f4eff483", "plot_otda_mapping.ipynb": "2f1ebbdc0f855d9e2b7adf9edec24d25", "plot_gromov.ipynb": "24f2aea489714d34779521f46d5e2c47", "plot_compute_emd.ipynb": "f5cd71cad882ec157dc8222721e9820c", "plot_OT_1D.ipynb": "b5348bdc561c07ec168a1622e5af4b93", "plot_gromov_barycenter.ipynb": "953e5047b886ec69ec621ec52f5e21d1", "plot_free_support_barycenter.ipynb": "246dd2feff4b233a4f1a553c5a202fdc", "plot_convolutional_barycenter.ipynb": "a72bb3716a1baaffd81ae267a673f9b6", "plot_otda_semi_supervised.ipynb": "f6dfb02ba2bbd939408ffcd22a3b007c", "plot_OT_2D_samples.ipynb": "07dbc14859fa019a966caa79fa0825bd", "plot_barycenter_lp_vs_entropic.ipynb": "51833e8c76aaedeba9599ac7a30eb357"} \ No newline at end of file diff --git a/docs/source/auto_examples/auto_examples_jupyter.zip b/docs/source/auto_examples/auto_examples_jupyter.zip index 304bb06..88e1e9b 100644 Binary files a/docs/source/auto_examples/auto_examples_jupyter.zip and b/docs/source/auto_examples/auto_examples_jupyter.zip differ diff --git a/docs/source/auto_examples/auto_examples_python.zip b/docs/source/auto_examples/auto_examples_python.zip index 3be8a76..120a586 100644 Binary files a/docs/source/auto_examples/auto_examples_python.zip and b/docs/source/auto_examples/auto_examples_python.zip differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_otda_color_images_001.png b/docs/source/auto_examples/images/sphx_glr_plot_otda_color_images_001.png index 95f882a..7de991a 100644 Binary files a/docs/source/auto_examples/images/sphx_glr_plot_otda_color_images_001.png and b/docs/source/auto_examples/images/sphx_glr_plot_otda_color_images_001.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_otda_color_images_003.png b/docs/source/auto_examples/images/sphx_glr_plot_otda_color_images_003.png index aa1a5d3..aac929b 100644 Binary files a/docs/source/auto_examples/images/sphx_glr_plot_otda_color_images_003.png and b/docs/source/auto_examples/images/sphx_glr_plot_otda_color_images_003.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_otda_color_images_005.png b/docs/source/auto_examples/images/sphx_glr_plot_otda_color_images_005.png index d219bb3..5b8101b 100644 Binary files a/docs/source/auto_examples/images/sphx_glr_plot_otda_color_images_005.png and b/docs/source/auto_examples/images/sphx_glr_plot_otda_color_images_005.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_otda_mapping_colors_images_001.png b/docs/source/auto_examples/images/sphx_glr_plot_otda_mapping_colors_images_001.png index 33134fc..d77e68a 100644 Binary files a/docs/source/auto_examples/images/sphx_glr_plot_otda_mapping_colors_images_001.png and b/docs/source/auto_examples/images/sphx_glr_plot_otda_mapping_colors_images_001.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_otda_mapping_colors_images_003.png b/docs/source/auto_examples/images/sphx_glr_plot_otda_mapping_colors_images_003.png index 42197e3..1199903 100644 Binary files a/docs/source/auto_examples/images/sphx_glr_plot_otda_mapping_colors_images_003.png and b/docs/source/auto_examples/images/sphx_glr_plot_otda_mapping_colors_images_003.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_otda_mapping_colors_images_004.png b/docs/source/auto_examples/images/sphx_glr_plot_otda_mapping_colors_images_004.png index d9101da..1c73e43 100644 Binary files a/docs/source/auto_examples/images/sphx_glr_plot_otda_mapping_colors_images_004.png and b/docs/source/auto_examples/images/sphx_glr_plot_otda_mapping_colors_images_004.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_stochastic_005.png b/docs/source/auto_examples/images/sphx_glr_plot_stochastic_005.png index 3d1e239..42e5007 100644 Binary files a/docs/source/auto_examples/images/sphx_glr_plot_stochastic_005.png and b/docs/source/auto_examples/images/sphx_glr_plot_stochastic_005.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_stochastic_007.png b/docs/source/auto_examples/images/sphx_glr_plot_stochastic_007.png index 986aa96..cda643b 100644 Binary files a/docs/source/auto_examples/images/sphx_glr_plot_stochastic_007.png and b/docs/source/auto_examples/images/sphx_glr_plot_stochastic_007.png differ diff --git a/docs/source/auto_examples/images/thumb/sphx_glr_plot_otda_color_images_thumb.png b/docs/source/auto_examples/images/thumb/sphx_glr_plot_otda_color_images_thumb.png index a919055..4d90437 100644 Binary files a/docs/source/auto_examples/images/thumb/sphx_glr_plot_otda_color_images_thumb.png and b/docs/source/auto_examples/images/thumb/sphx_glr_plot_otda_color_images_thumb.png differ diff --git a/docs/source/auto_examples/images/thumb/sphx_glr_plot_otda_mapping_colors_images_thumb.png b/docs/source/auto_examples/images/thumb/sphx_glr_plot_otda_mapping_colors_images_thumb.png index f7fd217..61a5137 100644 Binary files a/docs/source/auto_examples/images/thumb/sphx_glr_plot_otda_mapping_colors_images_thumb.png and b/docs/source/auto_examples/images/thumb/sphx_glr_plot_otda_mapping_colors_images_thumb.png differ diff --git a/docs/source/auto_examples/index.rst b/docs/source/auto_examples/index.rst index 259fca1..17a9710 100644 --- a/docs/source/auto_examples/index.rst +++ b/docs/source/auto_examples/index.rst @@ -229,7 +229,7 @@ This is a gallery of all the POT example files. .. raw:: html -
+
.. only:: html diff --git a/docs/source/auto_examples/plot_otda_color_images.ipynb b/docs/source/auto_examples/plot_otda_color_images.ipynb index 2daf406..103bdec 100644 --- a/docs/source/auto_examples/plot_otda_color_images.ipynb +++ b/docs/source/auto_examples/plot_otda_color_images.ipynb @@ -1,144 +1,144 @@ { - "nbformat_minor": 0, - "nbformat": 4, "cells": [ { - "execution_count": null, - "cell_type": "code", - "source": [ - "%matplotlib inline" - ], - "outputs": [], + "cell_type": "code", + "execution_count": null, "metadata": { "collapsed": false - } - }, - { + }, + "outputs": [], "source": [ - "\n# OT for image color adaptation\n\n\nThis example presents a way of transferring colors between two image\nwith Optimal Transport as introduced in [6]\n\n[6] Ferradans, S., Papadakis, N., Peyre, G., & Aujol, J. F. (2014).\nRegularized discrete optimal transport.\nSIAM Journal on Imaging Sciences, 7(3), 1853-1882.\n\n" - ], - "cell_type": "markdown", - "metadata": {} - }, + "%matplotlib inline" + ] + }, { - "execution_count": null, - "cell_type": "code", + "cell_type": "markdown", + "metadata": {}, "source": [ - "# Authors: Remi Flamary \n# Stanislas Chambon \n#\n# License: MIT License\n\nimport numpy as np\nfrom scipy import ndimage\nimport matplotlib.pylab as pl\nimport ot\n\n\nr = np.random.RandomState(42)\n\n\ndef im2mat(I):\n \"\"\"Converts and image to matrix (one pixel per line)\"\"\"\n return I.reshape((I.shape[0] * I.shape[1], I.shape[2]))\n\n\ndef mat2im(X, shape):\n \"\"\"Converts back a matrix to an image\"\"\"\n return X.reshape(shape)\n\n\ndef minmax(I):\n return np.clip(I, 0, 1)" - ], - "outputs": [], + "\n# OT for image color adaptation\n\n\nThis example presents a way of transferring colors between two images\nwith Optimal Transport as introduced in [6]\n\n[6] Ferradans, S., Papadakis, N., Peyre, G., & Aujol, J. F. (2014).\nRegularized discrete optimal transport.\nSIAM Journal on Imaging Sciences, 7(3), 1853-1882.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, "metadata": { "collapsed": false - } - }, + }, + "outputs": [], + "source": [ + "# Authors: Remi Flamary \n# Stanislas Chambon \n#\n# License: MIT License\n\nimport numpy as np\nfrom scipy import ndimage\nimport matplotlib.pylab as pl\nimport ot\n\n\nr = np.random.RandomState(42)\n\n\ndef im2mat(I):\n \"\"\"Converts an image to matrix (one pixel per line)\"\"\"\n return I.reshape((I.shape[0] * I.shape[1], I.shape[2]))\n\n\ndef mat2im(X, shape):\n \"\"\"Converts back a matrix to an image\"\"\"\n return X.reshape(shape)\n\n\ndef minmax(I):\n return np.clip(I, 0, 1)" + ] + }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "Generate data\n-------------\n\n" - ], - "cell_type": "markdown", - "metadata": {} - }, + ] + }, { - "execution_count": null, - "cell_type": "code", - "source": [ - "# Loading images\nI1 = ndimage.imread('../data/ocean_day.jpg').astype(np.float64) / 256\nI2 = ndimage.imread('../data/ocean_sunset.jpg').astype(np.float64) / 256\n\nX1 = im2mat(I1)\nX2 = im2mat(I2)\n\n# training samples\nnb = 1000\nidx1 = r.randint(X1.shape[0], size=(nb,))\nidx2 = r.randint(X2.shape[0], size=(nb,))\n\nXs = X1[idx1, :]\nXt = X2[idx2, :]" - ], - "outputs": [], + "cell_type": "code", + "execution_count": null, "metadata": { "collapsed": false - } - }, + }, + "outputs": [], + "source": [ + "# Loading images\nI1 = ndimage.imread('../data/ocean_day.jpg').astype(np.float64) / 256\nI2 = ndimage.imread('../data/ocean_sunset.jpg').astype(np.float64) / 256\n\nX1 = im2mat(I1)\nX2 = im2mat(I2)\n\n# training samples\nnb = 1000\nidx1 = r.randint(X1.shape[0], size=(nb,))\nidx2 = r.randint(X2.shape[0], size=(nb,))\n\nXs = X1[idx1, :]\nXt = X2[idx2, :]" + ] + }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "Plot original image\n-------------------\n\n" - ], - "cell_type": "markdown", - "metadata": {} - }, + ] + }, { - "execution_count": null, - "cell_type": "code", - "source": [ - "pl.figure(1, figsize=(6.4, 3))\n\npl.subplot(1, 2, 1)\npl.imshow(I1)\npl.axis('off')\npl.title('Image 1')\n\npl.subplot(1, 2, 2)\npl.imshow(I2)\npl.axis('off')\npl.title('Image 2')" - ], - "outputs": [], + "cell_type": "code", + "execution_count": null, "metadata": { "collapsed": false - } - }, + }, + "outputs": [], + "source": [ + "pl.figure(1, figsize=(6.4, 3))\n\npl.subplot(1, 2, 1)\npl.imshow(I1)\npl.axis('off')\npl.title('Image 1')\n\npl.subplot(1, 2, 2)\npl.imshow(I2)\npl.axis('off')\npl.title('Image 2')" + ] + }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "Scatter plot of colors\n----------------------\n\n" - ], - "cell_type": "markdown", - "metadata": {} - }, + ] + }, { - "execution_count": null, - "cell_type": "code", - "source": [ - "pl.figure(2, figsize=(6.4, 3))\n\npl.subplot(1, 2, 1)\npl.scatter(Xs[:, 0], Xs[:, 2], c=Xs)\npl.axis([0, 1, 0, 1])\npl.xlabel('Red')\npl.ylabel('Blue')\npl.title('Image 1')\n\npl.subplot(1, 2, 2)\npl.scatter(Xt[:, 0], Xt[:, 2], c=Xt)\npl.axis([0, 1, 0, 1])\npl.xlabel('Red')\npl.ylabel('Blue')\npl.title('Image 2')\npl.tight_layout()" - ], - "outputs": [], + "cell_type": "code", + "execution_count": null, "metadata": { "collapsed": false - } - }, + }, + "outputs": [], + "source": [ + "pl.figure(2, figsize=(6.4, 3))\n\npl.subplot(1, 2, 1)\npl.scatter(Xs[:, 0], Xs[:, 2], c=Xs)\npl.axis([0, 1, 0, 1])\npl.xlabel('Red')\npl.ylabel('Blue')\npl.title('Image 1')\n\npl.subplot(1, 2, 2)\npl.scatter(Xt[:, 0], Xt[:, 2], c=Xt)\npl.axis([0, 1, 0, 1])\npl.xlabel('Red')\npl.ylabel('Blue')\npl.title('Image 2')\npl.tight_layout()" + ] + }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "Instantiate the different transport algorithms and fit them\n-----------------------------------------------------------\n\n" - ], - "cell_type": "markdown", - "metadata": {} - }, + ] + }, { - "execution_count": null, - "cell_type": "code", - "source": [ - "# EMDTransport\not_emd = ot.da.EMDTransport()\not_emd.fit(Xs=Xs, Xt=Xt)\n\n# SinkhornTransport\not_sinkhorn = ot.da.SinkhornTransport(reg_e=1e-1)\not_sinkhorn.fit(Xs=Xs, Xt=Xt)\n\n# prediction between images (using out of sample prediction as in [6])\ntransp_Xs_emd = ot_emd.transform(Xs=X1)\ntransp_Xt_emd = ot_emd.inverse_transform(Xt=X2)\n\ntransp_Xs_sinkhorn = ot_emd.transform(Xs=X1)\ntransp_Xt_sinkhorn = ot_emd.inverse_transform(Xt=X2)\n\nI1t = minmax(mat2im(transp_Xs_emd, I1.shape))\nI2t = minmax(mat2im(transp_Xt_emd, I2.shape))\n\nI1te = minmax(mat2im(transp_Xs_sinkhorn, I1.shape))\nI2te = minmax(mat2im(transp_Xt_sinkhorn, I2.shape))" - ], - "outputs": [], + "cell_type": "code", + "execution_count": null, "metadata": { "collapsed": false - } - }, + }, + "outputs": [], + "source": [ + "# EMDTransport\not_emd = ot.da.EMDTransport()\not_emd.fit(Xs=Xs, Xt=Xt)\n\n# SinkhornTransport\not_sinkhorn = ot.da.SinkhornTransport(reg_e=1e-1)\not_sinkhorn.fit(Xs=Xs, Xt=Xt)\n\n# prediction between images (using out of sample prediction as in [6])\ntransp_Xs_emd = ot_emd.transform(Xs=X1)\ntransp_Xt_emd = ot_emd.inverse_transform(Xt=X2)\n\ntransp_Xs_sinkhorn = ot_sinkhorn.transform(Xs=X1)\ntransp_Xt_sinkhorn = ot_sinkhorn.inverse_transform(Xt=X2)\n\nI1t = minmax(mat2im(transp_Xs_emd, I1.shape))\nI2t = minmax(mat2im(transp_Xt_emd, I2.shape))\n\nI1te = minmax(mat2im(transp_Xs_sinkhorn, I1.shape))\nI2te = minmax(mat2im(transp_Xt_sinkhorn, I2.shape))" + ] + }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "Plot new images\n---------------\n\n" - ], - "cell_type": "markdown", - "metadata": {} - }, + ] + }, { - "execution_count": null, - "cell_type": "code", - "source": [ - "pl.figure(3, figsize=(8, 4))\n\npl.subplot(2, 3, 1)\npl.imshow(I1)\npl.axis('off')\npl.title('Image 1')\n\npl.subplot(2, 3, 2)\npl.imshow(I1t)\npl.axis('off')\npl.title('Image 1 Adapt')\n\npl.subplot(2, 3, 3)\npl.imshow(I1te)\npl.axis('off')\npl.title('Image 1 Adapt (reg)')\n\npl.subplot(2, 3, 4)\npl.imshow(I2)\npl.axis('off')\npl.title('Image 2')\n\npl.subplot(2, 3, 5)\npl.imshow(I2t)\npl.axis('off')\npl.title('Image 2 Adapt')\n\npl.subplot(2, 3, 6)\npl.imshow(I2te)\npl.axis('off')\npl.title('Image 2 Adapt (reg)')\npl.tight_layout()\n\npl.show()" - ], - "outputs": [], + "cell_type": "code", + "execution_count": null, "metadata": { "collapsed": false - } + }, + "outputs": [], + "source": [ + "pl.figure(3, figsize=(8, 4))\n\npl.subplot(2, 3, 1)\npl.imshow(I1)\npl.axis('off')\npl.title('Image 1')\n\npl.subplot(2, 3, 2)\npl.imshow(I1t)\npl.axis('off')\npl.title('Image 1 Adapt')\n\npl.subplot(2, 3, 3)\npl.imshow(I1te)\npl.axis('off')\npl.title('Image 1 Adapt (reg)')\n\npl.subplot(2, 3, 4)\npl.imshow(I2)\npl.axis('off')\npl.title('Image 2')\n\npl.subplot(2, 3, 5)\npl.imshow(I2t)\npl.axis('off')\npl.title('Image 2 Adapt')\n\npl.subplot(2, 3, 6)\npl.imshow(I2te)\npl.axis('off')\npl.title('Image 2 Adapt (reg)')\npl.tight_layout()\n\npl.show()" + ] } - ], + ], "metadata": { "kernelspec": { - "display_name": "Python 2", - "name": "python2", - "language": "python" - }, + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, "language_info": { - "mimetype": "text/x-python", - "nbconvert_exporter": "python", - "name": "python", - "file_extension": ".py", - "version": "2.7.12", - "pygments_lexer": "ipython2", "codemirror_mode": { - "version": 2, - "name": "ipython" - } + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" } - } + }, + "nbformat": 4, + "nbformat_minor": 0 } \ No newline at end of file diff --git a/docs/source/auto_examples/plot_otda_color_images.py b/docs/source/auto_examples/plot_otda_color_images.py index e77aec0..62383a2 100644 --- a/docs/source/auto_examples/plot_otda_color_images.py +++ b/docs/source/auto_examples/plot_otda_color_images.py @@ -4,7 +4,7 @@ OT for image color adaptation ============================= -This example presents a way of transferring colors between two image +This example presents a way of transferring colors between two images with Optimal Transport as introduced in [6] [6] Ferradans, S., Papadakis, N., Peyre, G., & Aujol, J. F. (2014). @@ -27,7 +27,7 @@ r = np.random.RandomState(42) def im2mat(I): - """Converts and image to matrix (one pixel per line)""" + """Converts an image to matrix (one pixel per line)""" return I.reshape((I.shape[0] * I.shape[1], I.shape[2])) @@ -115,8 +115,8 @@ ot_sinkhorn.fit(Xs=Xs, Xt=Xt) transp_Xs_emd = ot_emd.transform(Xs=X1) transp_Xt_emd = ot_emd.inverse_transform(Xt=X2) -transp_Xs_sinkhorn = ot_emd.transform(Xs=X1) -transp_Xt_sinkhorn = ot_emd.inverse_transform(Xt=X2) +transp_Xs_sinkhorn = ot_sinkhorn.transform(Xs=X1) +transp_Xt_sinkhorn = ot_sinkhorn.inverse_transform(Xt=X2) I1t = minmax(mat2im(transp_Xs_emd, I1.shape)) I2t = minmax(mat2im(transp_Xt_emd, I2.shape)) diff --git a/docs/source/auto_examples/plot_otda_color_images.rst b/docs/source/auto_examples/plot_otda_color_images.rst index 9c31ba7..ab0406e 100644 --- a/docs/source/auto_examples/plot_otda_color_images.rst +++ b/docs/source/auto_examples/plot_otda_color_images.rst @@ -7,7 +7,7 @@ OT for image color adaptation ============================= -This example presents a way of transferring colors between two image +This example presents a way of transferring colors between two images with Optimal Transport as introduced in [6] [6] Ferradans, S., Papadakis, N., Peyre, G., & Aujol, J. F. (2014). @@ -34,7 +34,7 @@ SIAM Journal on Imaging Sciences, 7(3), 1853-1882. def im2mat(I): - """Converts and image to matrix (one pixel per line)""" + """Converts an image to matrix (one pixel per line)""" return I.reshape((I.shape[0] * I.shape[1], I.shape[2])) @@ -168,8 +168,8 @@ Instantiate the different transport algorithms and fit them transp_Xs_emd = ot_emd.transform(Xs=X1) transp_Xt_emd = ot_emd.inverse_transform(Xt=X2) - transp_Xs_sinkhorn = ot_emd.transform(Xs=X1) - transp_Xt_sinkhorn = ot_emd.inverse_transform(Xt=X2) + transp_Xs_sinkhorn = ot_sinkhorn.transform(Xs=X1) + transp_Xt_sinkhorn = ot_sinkhorn.inverse_transform(Xt=X2) I1t = minmax(mat2im(transp_Xs_emd, I1.shape)) I2t = minmax(mat2im(transp_Xt_emd, I2.shape)) @@ -235,11 +235,13 @@ Plot new images -**Total running time of the script:** ( 3 minutes 16.469 seconds) +**Total running time of the script:** ( 3 minutes 55.541 seconds) -.. container:: sphx-glr-footer +.. only :: html + + .. container:: sphx-glr-footer .. container:: sphx-glr-download @@ -252,6 +254,9 @@ Plot new images :download:`Download Jupyter notebook: plot_otda_color_images.ipynb ` -.. rst-class:: sphx-glr-signature - `Generated by Sphinx-Gallery `_ +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/auto_examples/plot_otda_mapping_colors_images.ipynb b/docs/source/auto_examples/plot_otda_mapping_colors_images.ipynb index 56caa8a..baffef4 100644 --- a/docs/source/auto_examples/plot_otda_mapping_colors_images.ipynb +++ b/docs/source/auto_examples/plot_otda_mapping_colors_images.ipynb @@ -1,144 +1,144 @@ { - "nbformat_minor": 0, - "nbformat": 4, "cells": [ { - "execution_count": null, - "cell_type": "code", - "source": [ - "%matplotlib inline" - ], - "outputs": [], + "cell_type": "code", + "execution_count": null, "metadata": { "collapsed": false - } - }, + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "\n# OT for image color adaptation with mapping estimation\n\n\nOT for domain adaptation with image color adaptation [6] with mapping\nestimation [8].\n\n[6] Ferradans, S., Papadakis, N., Peyre, G., & Aujol, J. F. (2014). Regularized\n discrete optimal transport. SIAM Journal on Imaging Sciences, 7(3),\n 1853-1882.\n[8] M. Perrot, N. Courty, R. Flamary, A. Habrard, \"Mapping estimation for\n discrete optimal transport\", Neural Information Processing Systems (NIPS),\n 2016.\n\n\n" - ], - "cell_type": "markdown", - "metadata": {} - }, + ] + }, { - "execution_count": null, - "cell_type": "code", - "source": [ - "# Authors: Remi Flamary \n# Stanislas Chambon \n#\n# License: MIT License\n\nimport numpy as np\nfrom scipy import ndimage\nimport matplotlib.pylab as pl\nimport ot\n\nr = np.random.RandomState(42)\n\n\ndef im2mat(I):\n \"\"\"Converts and image to matrix (one pixel per line)\"\"\"\n return I.reshape((I.shape[0] * I.shape[1], I.shape[2]))\n\n\ndef mat2im(X, shape):\n \"\"\"Converts back a matrix to an image\"\"\"\n return X.reshape(shape)\n\n\ndef minmax(I):\n return np.clip(I, 0, 1)" - ], - "outputs": [], + "cell_type": "code", + "execution_count": null, "metadata": { "collapsed": false - } - }, + }, + "outputs": [], + "source": [ + "# Authors: Remi Flamary \n# Stanislas Chambon \n#\n# License: MIT License\n\nimport numpy as np\nfrom scipy import ndimage\nimport matplotlib.pylab as pl\nimport ot\n\nr = np.random.RandomState(42)\n\n\ndef im2mat(I):\n \"\"\"Converts and image to matrix (one pixel per line)\"\"\"\n return I.reshape((I.shape[0] * I.shape[1], I.shape[2]))\n\n\ndef mat2im(X, shape):\n \"\"\"Converts back a matrix to an image\"\"\"\n return X.reshape(shape)\n\n\ndef minmax(I):\n return np.clip(I, 0, 1)" + ] + }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "Generate data\n-------------\n\n" - ], - "cell_type": "markdown", - "metadata": {} - }, + ] + }, { - "execution_count": null, - "cell_type": "code", - "source": [ - "# Loading images\nI1 = ndimage.imread('../data/ocean_day.jpg').astype(np.float64) / 256\nI2 = ndimage.imread('../data/ocean_sunset.jpg').astype(np.float64) / 256\n\n\nX1 = im2mat(I1)\nX2 = im2mat(I2)\n\n# training samples\nnb = 1000\nidx1 = r.randint(X1.shape[0], size=(nb,))\nidx2 = r.randint(X2.shape[0], size=(nb,))\n\nXs = X1[idx1, :]\nXt = X2[idx2, :]" - ], - "outputs": [], + "cell_type": "code", + "execution_count": null, "metadata": { "collapsed": false - } - }, + }, + "outputs": [], + "source": [ + "# Loading images\nI1 = ndimage.imread('../data/ocean_day.jpg').astype(np.float64) / 256\nI2 = ndimage.imread('../data/ocean_sunset.jpg').astype(np.float64) / 256\n\n\nX1 = im2mat(I1)\nX2 = im2mat(I2)\n\n# training samples\nnb = 1000\nidx1 = r.randint(X1.shape[0], size=(nb,))\nidx2 = r.randint(X2.shape[0], size=(nb,))\n\nXs = X1[idx1, :]\nXt = X2[idx2, :]" + ] + }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "Domain adaptation for pixel distribution transfer\n-------------------------------------------------\n\n" - ], - "cell_type": "markdown", - "metadata": {} - }, + ] + }, { - "execution_count": null, - "cell_type": "code", - "source": [ - "# EMDTransport\not_emd = ot.da.EMDTransport()\not_emd.fit(Xs=Xs, Xt=Xt)\ntransp_Xs_emd = ot_emd.transform(Xs=X1)\nImage_emd = minmax(mat2im(transp_Xs_emd, I1.shape))\n\n# SinkhornTransport\not_sinkhorn = ot.da.SinkhornTransport(reg_e=1e-1)\not_sinkhorn.fit(Xs=Xs, Xt=Xt)\ntransp_Xs_sinkhorn = ot_emd.transform(Xs=X1)\nImage_sinkhorn = minmax(mat2im(transp_Xs_sinkhorn, I1.shape))\n\not_mapping_linear = ot.da.MappingTransport(\n mu=1e0, eta=1e-8, bias=True, max_iter=20, verbose=True)\not_mapping_linear.fit(Xs=Xs, Xt=Xt)\n\nX1tl = ot_mapping_linear.transform(Xs=X1)\nImage_mapping_linear = minmax(mat2im(X1tl, I1.shape))\n\not_mapping_gaussian = ot.da.MappingTransport(\n mu=1e0, eta=1e-2, sigma=1, bias=False, max_iter=10, verbose=True)\not_mapping_gaussian.fit(Xs=Xs, Xt=Xt)\n\nX1tn = ot_mapping_gaussian.transform(Xs=X1) # use the estimated mapping\nImage_mapping_gaussian = minmax(mat2im(X1tn, I1.shape))" - ], - "outputs": [], + "cell_type": "code", + "execution_count": null, "metadata": { "collapsed": false - } - }, + }, + "outputs": [], + "source": [ + "# EMDTransport\not_emd = ot.da.EMDTransport()\not_emd.fit(Xs=Xs, Xt=Xt)\ntransp_Xs_emd = ot_emd.transform(Xs=X1)\nImage_emd = minmax(mat2im(transp_Xs_emd, I1.shape))\n\n# SinkhornTransport\not_sinkhorn = ot.da.SinkhornTransport(reg_e=1e-1)\not_sinkhorn.fit(Xs=Xs, Xt=Xt)\ntransp_Xs_sinkhorn = ot_sinkhorn.transform(Xs=X1)\nImage_sinkhorn = minmax(mat2im(transp_Xs_sinkhorn, I1.shape))\n\not_mapping_linear = ot.da.MappingTransport(\n mu=1e0, eta=1e-8, bias=True, max_iter=20, verbose=True)\not_mapping_linear.fit(Xs=Xs, Xt=Xt)\n\nX1tl = ot_mapping_linear.transform(Xs=X1)\nImage_mapping_linear = minmax(mat2im(X1tl, I1.shape))\n\not_mapping_gaussian = ot.da.MappingTransport(\n mu=1e0, eta=1e-2, sigma=1, bias=False, max_iter=10, verbose=True)\not_mapping_gaussian.fit(Xs=Xs, Xt=Xt)\n\nX1tn = ot_mapping_gaussian.transform(Xs=X1) # use the estimated mapping\nImage_mapping_gaussian = minmax(mat2im(X1tn, I1.shape))" + ] + }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "Plot original images\n--------------------\n\n" - ], - "cell_type": "markdown", - "metadata": {} - }, + ] + }, { - "execution_count": null, - "cell_type": "code", - "source": [ - "pl.figure(1, figsize=(6.4, 3))\npl.subplot(1, 2, 1)\npl.imshow(I1)\npl.axis('off')\npl.title('Image 1')\n\npl.subplot(1, 2, 2)\npl.imshow(I2)\npl.axis('off')\npl.title('Image 2')\npl.tight_layout()" - ], - "outputs": [], + "cell_type": "code", + "execution_count": null, "metadata": { "collapsed": false - } - }, + }, + "outputs": [], + "source": [ + "pl.figure(1, figsize=(6.4, 3))\npl.subplot(1, 2, 1)\npl.imshow(I1)\npl.axis('off')\npl.title('Image 1')\n\npl.subplot(1, 2, 2)\npl.imshow(I2)\npl.axis('off')\npl.title('Image 2')\npl.tight_layout()" + ] + }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "Plot pixel values distribution\n------------------------------\n\n" - ], - "cell_type": "markdown", - "metadata": {} - }, + ] + }, { - "execution_count": null, - "cell_type": "code", - "source": [ - "pl.figure(2, figsize=(6.4, 5))\n\npl.subplot(1, 2, 1)\npl.scatter(Xs[:, 0], Xs[:, 2], c=Xs)\npl.axis([0, 1, 0, 1])\npl.xlabel('Red')\npl.ylabel('Blue')\npl.title('Image 1')\n\npl.subplot(1, 2, 2)\npl.scatter(Xt[:, 0], Xt[:, 2], c=Xt)\npl.axis([0, 1, 0, 1])\npl.xlabel('Red')\npl.ylabel('Blue')\npl.title('Image 2')\npl.tight_layout()" - ], - "outputs": [], + "cell_type": "code", + "execution_count": null, "metadata": { "collapsed": false - } - }, + }, + "outputs": [], + "source": [ + "pl.figure(2, figsize=(6.4, 5))\n\npl.subplot(1, 2, 1)\npl.scatter(Xs[:, 0], Xs[:, 2], c=Xs)\npl.axis([0, 1, 0, 1])\npl.xlabel('Red')\npl.ylabel('Blue')\npl.title('Image 1')\n\npl.subplot(1, 2, 2)\npl.scatter(Xt[:, 0], Xt[:, 2], c=Xt)\npl.axis([0, 1, 0, 1])\npl.xlabel('Red')\npl.ylabel('Blue')\npl.title('Image 2')\npl.tight_layout()" + ] + }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "Plot transformed images\n-----------------------\n\n" - ], - "cell_type": "markdown", - "metadata": {} - }, + ] + }, { - "execution_count": null, - "cell_type": "code", - "source": [ - "pl.figure(2, figsize=(10, 5))\n\npl.subplot(2, 3, 1)\npl.imshow(I1)\npl.axis('off')\npl.title('Im. 1')\n\npl.subplot(2, 3, 4)\npl.imshow(I2)\npl.axis('off')\npl.title('Im. 2')\n\npl.subplot(2, 3, 2)\npl.imshow(Image_emd)\npl.axis('off')\npl.title('EmdTransport')\n\npl.subplot(2, 3, 5)\npl.imshow(Image_sinkhorn)\npl.axis('off')\npl.title('SinkhornTransport')\n\npl.subplot(2, 3, 3)\npl.imshow(Image_mapping_linear)\npl.axis('off')\npl.title('MappingTransport (linear)')\n\npl.subplot(2, 3, 6)\npl.imshow(Image_mapping_gaussian)\npl.axis('off')\npl.title('MappingTransport (gaussian)')\npl.tight_layout()\n\npl.show()" - ], - "outputs": [], + "cell_type": "code", + "execution_count": null, "metadata": { "collapsed": false - } + }, + "outputs": [], + "source": [ + "pl.figure(2, figsize=(10, 5))\n\npl.subplot(2, 3, 1)\npl.imshow(I1)\npl.axis('off')\npl.title('Im. 1')\n\npl.subplot(2, 3, 4)\npl.imshow(I2)\npl.axis('off')\npl.title('Im. 2')\n\npl.subplot(2, 3, 2)\npl.imshow(Image_emd)\npl.axis('off')\npl.title('EmdTransport')\n\npl.subplot(2, 3, 5)\npl.imshow(Image_sinkhorn)\npl.axis('off')\npl.title('SinkhornTransport')\n\npl.subplot(2, 3, 3)\npl.imshow(Image_mapping_linear)\npl.axis('off')\npl.title('MappingTransport (linear)')\n\npl.subplot(2, 3, 6)\npl.imshow(Image_mapping_gaussian)\npl.axis('off')\npl.title('MappingTransport (gaussian)')\npl.tight_layout()\n\npl.show()" + ] } - ], + ], "metadata": { "kernelspec": { - "display_name": "Python 2", - "name": "python2", - "language": "python" - }, + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, "language_info": { - "mimetype": "text/x-python", - "nbconvert_exporter": "python", - "name": "python", - "file_extension": ".py", - "version": "2.7.12", - "pygments_lexer": "ipython2", "codemirror_mode": { - "version": 2, - "name": "ipython" - } + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" } - } + }, + "nbformat": 4, + "nbformat_minor": 0 } \ No newline at end of file diff --git a/docs/source/auto_examples/plot_otda_mapping_colors_images.py b/docs/source/auto_examples/plot_otda_mapping_colors_images.py index 5f1e844..a20eca8 100644 --- a/docs/source/auto_examples/plot_otda_mapping_colors_images.py +++ b/docs/source/auto_examples/plot_otda_mapping_colors_images.py @@ -77,7 +77,7 @@ Image_emd = minmax(mat2im(transp_Xs_emd, I1.shape)) # SinkhornTransport ot_sinkhorn = ot.da.SinkhornTransport(reg_e=1e-1) ot_sinkhorn.fit(Xs=Xs, Xt=Xt) -transp_Xs_sinkhorn = ot_emd.transform(Xs=X1) +transp_Xs_sinkhorn = ot_sinkhorn.transform(Xs=X1) Image_sinkhorn = minmax(mat2im(transp_Xs_sinkhorn, I1.shape)) ot_mapping_linear = ot.da.MappingTransport( diff --git a/docs/source/auto_examples/plot_otda_mapping_colors_images.rst b/docs/source/auto_examples/plot_otda_mapping_colors_images.rst index 8394fb0..2afdc8a 100644 --- a/docs/source/auto_examples/plot_otda_mapping_colors_images.rst +++ b/docs/source/auto_examples/plot_otda_mapping_colors_images.rst @@ -104,7 +104,7 @@ Domain adaptation for pixel distribution transfer # SinkhornTransport ot_sinkhorn = ot.da.SinkhornTransport(reg_e=1e-1) ot_sinkhorn.fit(Xs=Xs, Xt=Xt) - transp_Xs_sinkhorn = ot_emd.transform(Xs=X1) + transp_Xs_sinkhorn = ot_sinkhorn.transform(Xs=X1) Image_sinkhorn = minmax(mat2im(transp_Xs_sinkhorn, I1.shape)) ot_mapping_linear = ot.da.MappingTransport( @@ -132,39 +132,39 @@ Domain adaptation for pixel distribution transfer It. |Loss |Delta loss -------------------------------- - 0|3.680518e+02|0.000000e+00 - 1|3.592439e+02|-2.393116e-02 - 2|3.590632e+02|-5.030248e-04 - 3|3.589698e+02|-2.601358e-04 - 4|3.589118e+02|-1.614977e-04 - 5|3.588724e+02|-1.097608e-04 - 6|3.588436e+02|-8.035205e-05 - 7|3.588215e+02|-6.141923e-05 - 8|3.588042e+02|-4.832627e-05 - 9|3.587902e+02|-3.909574e-05 - 10|3.587786e+02|-3.225418e-05 - 11|3.587688e+02|-2.712592e-05 - 12|3.587605e+02|-2.314041e-05 - 13|3.587534e+02|-1.991287e-05 - 14|3.587471e+02|-1.744348e-05 - 15|3.587416e+02|-1.544523e-05 - 16|3.587367e+02|-1.364654e-05 - 17|3.587323e+02|-1.230435e-05 - 18|3.587284e+02|-1.093370e-05 - 19|3.587276e+02|-2.052728e-06 + 0|3.680534e+02|0.000000e+00 + 1|3.592501e+02|-2.391854e-02 + 2|3.590682e+02|-5.061555e-04 + 3|3.589745e+02|-2.610227e-04 + 4|3.589167e+02|-1.611644e-04 + 5|3.588768e+02|-1.109242e-04 + 6|3.588482e+02|-7.972733e-05 + 7|3.588261e+02|-6.166174e-05 + 8|3.588086e+02|-4.871697e-05 + 9|3.587946e+02|-3.919056e-05 + 10|3.587830e+02|-3.228124e-05 + 11|3.587731e+02|-2.744744e-05 + 12|3.587648e+02|-2.334451e-05 + 13|3.587576e+02|-1.995629e-05 + 14|3.587513e+02|-1.761058e-05 + 15|3.587457e+02|-1.542568e-05 + 16|3.587408e+02|-1.366315e-05 + 17|3.587365e+02|-1.221732e-05 + 18|3.587325e+02|-1.102488e-05 + 19|3.587303e+02|-6.062107e-06 It. |Loss |Delta loss -------------------------------- - 0|3.784758e+02|0.000000e+00 - 1|3.646352e+02|-3.656911e-02 - 2|3.642861e+02|-9.574714e-04 - 3|3.641523e+02|-3.672061e-04 - 4|3.640788e+02|-2.020990e-04 - 5|3.640321e+02|-1.282701e-04 - 6|3.640002e+02|-8.751240e-05 - 7|3.639765e+02|-6.521203e-05 - 8|3.639582e+02|-5.007767e-05 - 9|3.639439e+02|-3.938917e-05 - 10|3.639323e+02|-3.187865e-05 + 0|3.784871e+02|0.000000e+00 + 1|3.646491e+02|-3.656142e-02 + 2|3.642975e+02|-9.642655e-04 + 3|3.641626e+02|-3.702413e-04 + 4|3.640888e+02|-2.026301e-04 + 5|3.640419e+02|-1.289607e-04 + 6|3.640097e+02|-8.831646e-05 + 7|3.639861e+02|-6.487612e-05 + 8|3.639679e+02|-4.994063e-05 + 9|3.639536e+02|-3.941436e-05 + 10|3.639419e+02|-3.209753e-05 Plot original images @@ -283,11 +283,13 @@ Plot transformed images -**Total running time of the script:** ( 2 minutes 52.212 seconds) +**Total running time of the script:** ( 3 minutes 14.206 seconds) -.. container:: sphx-glr-footer +.. only :: html + + .. container:: sphx-glr-footer .. container:: sphx-glr-download @@ -300,6 +302,9 @@ Plot transformed images :download:`Download Jupyter notebook: plot_otda_mapping_colors_images.ipynb ` -.. rst-class:: sphx-glr-signature - `Generated by Sphinx-Gallery `_ +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/auto_examples/plot_stochastic.ipynb b/docs/source/auto_examples/plot_stochastic.ipynb index c6f0013..7f6ff3d 100644 --- a/docs/source/auto_examples/plot_stochastic.ipynb +++ b/docs/source/auto_examples/plot_stochastic.ipynb @@ -33,25 +33,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "COMPUTE TRANSPORTATION MATRIX FOR SEMI-DUAL PROBLEM\n############################################################################\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "print(\"------------SEMI-DUAL PROBLEM------------\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "DISCRETE CASE\nSample two discrete measures for the discrete case\n---------------------------------------------\n\nDefine 2 discrete measures a and b, the points where are defined the source\nand the target measures and finally the cost matrix c.\n\n" + "COMPUTE TRANSPORTATION MATRIX FOR SEMI-DUAL PROBLEM\n############################################################################\n############################################################################\n DISCRETE CASE:\n\n Sample two discrete measures for the discrete case\n ---------------------------------------------\n\n Define 2 discrete measures a and b, the points where are defined the source\n and the target measures and finally the cost matrix c.\n\n" ] }, { @@ -87,7 +69,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "SEMICONTINOUS CASE\nSample one general measure a, one discrete measures b for the semicontinous\ncase\n---------------------------------------------\n\nDefine one general measure a, one discrete measures b, the points where\nare defined the source and the target measures and finally the cost matrix c.\n\n" + "SEMICONTINOUS CASE:\n\nSample one general measure a, one discrete measures b for the semicontinous\ncase\n---------------------------------------------\n\nDefine one general measure a, one discrete measures b, the points where\nare defined the source and the target measures and finally the cost matrix c.\n\n" ] }, { @@ -202,25 +184,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "COMPUTE TRANSPORTATION MATRIX FOR DUAL PROBLEM\n############################################################################\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "print(\"------------DUAL PROBLEM------------\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "SEMICONTINOUS CASE\nSample one general measure a, one discrete measures b for the semicontinous\ncase\n---------------------------------------------\n\nDefine one general measure a, one discrete measures b, the points where\nare defined the source and the target measures and finally the cost matrix c.\n\n" + "COMPUTE TRANSPORTATION MATRIX FOR DUAL PROBLEM\n############################################################################\n############################################################################\n SEMICONTINOUS CASE:\n\n Sample one general measure a, one discrete measures b for the semicontinous\n case\n ---------------------------------------------\n\n Define one general measure a, one discrete measures b, the points where\n are defined the source and the target measures and finally the cost matrix c.\n\n" ] }, { @@ -323,7 +287,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.5" + "version": "3.6.7" } }, "nbformat": 4, diff --git a/docs/source/auto_examples/plot_stochastic.py b/docs/source/auto_examples/plot_stochastic.py index b9375d4..742f8d9 100644 --- a/docs/source/auto_examples/plot_stochastic.py +++ b/docs/source/auto_examples/plot_stochastic.py @@ -21,9 +21,9 @@ import ot.plot ############################################################################# # COMPUTE TRANSPORTATION MATRIX FOR SEMI-DUAL PROBLEM ############################################################################# -print("------------SEMI-DUAL PROBLEM------------") ############################################################################# -# DISCRETE CASE +# DISCRETE CASE: +# # Sample two discrete measures for the discrete case # --------------------------------------------- # @@ -57,7 +57,8 @@ sag_pi = ot.stochastic.solve_semi_dual_entropic(a, b, M, reg, method, print(sag_pi) ############################################################################# -# SEMICONTINOUS CASE +# SEMICONTINOUS CASE: +# # Sample one general measure a, one discrete measures b for the semicontinous # case # --------------------------------------------- @@ -139,9 +140,9 @@ pl.show() ############################################################################# # COMPUTE TRANSPORTATION MATRIX FOR DUAL PROBLEM ############################################################################# -print("------------DUAL PROBLEM------------") ############################################################################# -# SEMICONTINOUS CASE +# SEMICONTINOUS CASE: +# # Sample one general measure a, one discrete measures b for the semicontinous # case # --------------------------------------------- diff --git a/docs/source/auto_examples/plot_stochastic.rst b/docs/source/auto_examples/plot_stochastic.rst index a49bc05..d531045 100644 --- a/docs/source/auto_examples/plot_stochastic.rst +++ b/docs/source/auto_examples/plot_stochastic.rst @@ -34,29 +34,14 @@ algorithms for descrete and semicontinous measures from the POT library. COMPUTE TRANSPORTATION MATRIX FOR SEMI-DUAL PROBLEM ############################################################################ +############################################################################ + DISCRETE CASE: + Sample two discrete measures for the discrete case + --------------------------------------------- - -.. code-block:: python - - print("------------SEMI-DUAL PROBLEM------------") - - - - -.. rst-class:: sphx-glr-script-out - - Out:: - - ------------SEMI-DUAL PROBLEM------------ - - -DISCRETE CASE -Sample two discrete measures for the discrete case ---------------------------------------------- - -Define 2 discrete measures a and b, the points where are defined the source -and the target measures and finally the cost matrix c. + Define 2 discrete measures a and b, the points where are defined the source + and the target measures and finally the cost matrix c. @@ -115,7 +100,8 @@ results. [4.15462212e-02 2.65987989e-02 7.23177216e-02 2.39440107e-03]] -SEMICONTINOUS CASE +SEMICONTINOUS CASE: + Sample one general measure a, one discrete measures b for the semicontinous case --------------------------------------------- @@ -174,15 +160,15 @@ results. Out:: - [3.9018759 7.63059124 3.93260224 2.67274989 1.43888443 3.26904884 - 2.78748299] [-2.48511647 -2.43621119 -0.93585194 5.8571796 ] - [[2.56614773e-02 9.96758169e-02 1.75151781e-02 4.67049862e-06] - [1.21201047e-01 1.24433535e-02 1.28173754e-03 7.93100436e-03] - [3.58778167e-03 7.64232233e-02 6.28459924e-02 1.45441936e-07] - [2.63551754e-02 3.35577920e-02 8.25011211e-02 4.43054320e-04] - [9.24518246e-03 7.03074064e-04 1.00325744e-02 1.22876312e-01] - [2.03656325e-02 8.45420425e-04 1.73604569e-03 1.19910044e-01] - [4.17781688e-02 2.66463708e-02 7.18353075e-02 2.59729583e-03]] + [3.98220325 7.76235856 3.97645524 2.72051681 1.23219313 3.07696856 + 2.84476972] [-2.65544161 -2.50838395 -0.9397765 6.10360206] + [[2.34528761e-02 1.00491956e-01 1.89058354e-02 6.47543413e-06] + [1.16616747e-01 1.32074516e-02 1.45653361e-03 1.15764107e-02] + [3.16154850e-03 7.42892944e-02 6.54061055e-02 1.94426150e-07] + [2.33152216e-02 3.27486992e-02 8.61986263e-02 5.94595747e-04] + [6.34131496e-03 5.31975896e-04 8.12724003e-03 1.27856612e-01] + [1.41744829e-02 6.49096245e-04 1.42704389e-03 1.26606520e-01] + [3.73127657e-02 2.62526499e-02 7.57727161e-02 3.51901117e-03]] Compare the results with the Sinkhorn algorithm @@ -288,30 +274,15 @@ Plot Sinkhorn results COMPUTE TRANSPORTATION MATRIX FOR DUAL PROBLEM ############################################################################ +############################################################################ + SEMICONTINOUS CASE: + Sample one general measure a, one discrete measures b for the semicontinous + case + --------------------------------------------- - -.. code-block:: python - - print("------------DUAL PROBLEM------------") - - - - -.. rst-class:: sphx-glr-script-out - - Out:: - - ------------DUAL PROBLEM------------ - - -SEMICONTINOUS CASE -Sample one general measure a, one discrete measures b for the semicontinous -case ---------------------------------------------- - -Define one general measure a, one discrete measures b, the points where -are defined the source and the target measures and finally the cost matrix c. + Define one general measure a, one discrete measures b, the points where + are defined the source and the target measures and finally the cost matrix c. @@ -365,15 +336,15 @@ Call ot.solve_dual_entropic and plot the results. Out:: - [ 1.29325617 5.0435082 1.30996326 0.05538236 -1.08113283 0.73711558 - 0.18086364] [0.08840343 0.17710082 1.68604226 8.37377551] - [[2.47763879e-02 1.00144623e-01 1.77492330e-02 4.25988443e-06] - [1.19568278e-01 1.27740478e-02 1.32714202e-03 7.39121816e-03] - [3.41581121e-03 7.57137404e-02 6.27992039e-02 1.30808430e-07] - [2.52245323e-02 3.34219732e-02 8.28754229e-02 4.00582912e-04] - [9.75329554e-03 7.71824343e-04 1.11085400e-02 1.22456628e-01] - [2.12304276e-02 9.17096580e-04 1.89946234e-03 1.18084973e-01] - [4.04179693e-02 2.68253041e-02 7.29410047e-02 2.37369404e-03]] + [0.92449986 2.75486107 1.07923806 0.02741145 0.61355413 1.81961594 + 0.12072562] [0.33831611 0.46806842 1.5640451 4.96947652] + [[2.20001105e-02 9.26497883e-02 1.08654588e-02 9.78995555e-08] + [1.55669974e-02 1.73279561e-03 1.19120878e-04 2.49058251e-05] + [3.48198483e-03 8.04151063e-02 4.41335396e-02 3.45115752e-09] + [3.14927954e-02 4.34760520e-02 7.13338154e-02 1.29442395e-05] + [6.81836550e-02 5.62182457e-03 5.35386584e-02 2.21568095e-02] + [8.04671052e-02 3.62163462e-03 4.96331605e-03 1.15837801e-02] + [4.88644009e-02 3.37903481e-02 6.07955004e-02 7.42743505e-05]] Compare the results with the Sinkhorn algorithm @@ -448,7 +419,7 @@ Plot Sinkhorn results -**Total running time of the script:** ( 0 minutes 22.857 seconds) +**Total running time of the script:** ( 0 minutes 20.889 seconds) -- cgit v1.2.3 From 325f02ccdb2718d84283076bebb7c6a2f1e99e52 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 15 Mar 2019 11:56:42 +0100 Subject: update notebooks --- notebooks/plot_otda_color_images.ipynb | 20 ++-- notebooks/plot_otda_mapping_colors_images.ipynb | 14 +-- notebooks/plot_stochastic.ipynb | 149 ++++++++---------------- 3 files changed, 68 insertions(+), 115 deletions(-) diff --git a/notebooks/plot_otda_color_images.ipynb b/notebooks/plot_otda_color_images.ipynb index 6499daf..e2bd92b 100644 --- a/notebooks/plot_otda_color_images.ipynb +++ b/notebooks/plot_otda_color_images.ipynb @@ -19,7 +19,7 @@ "# OT for image color adaptation\n", "\n", "\n", - "This example presents a way of transferring colors between two image\n", + "This example presents a way of transferring colors between two images\n", "with Optimal Transport as introduced in [6]\n", "\n", "[6] Ferradans, S., Papadakis, N., Peyre, G., & Aujol, J. F. (2014).\n", @@ -51,7 +51,7 @@ "\n", "\n", "def im2mat(I):\n", - " \"\"\"Converts and image to matrix (one pixel per line)\"\"\"\n", + " \"\"\"Converts an image to matrix (one pixel per line)\"\"\"\n", " return I.reshape((I.shape[0] * I.shape[1], I.shape[2]))\n", "\n", "\n", @@ -238,8 +238,8 @@ "transp_Xs_emd = ot_emd.transform(Xs=X1)\n", "transp_Xt_emd = ot_emd.inverse_transform(Xt=X2)\n", "\n", - "transp_Xs_sinkhorn = ot_emd.transform(Xs=X1)\n", - "transp_Xt_sinkhorn = ot_emd.inverse_transform(Xt=X2)\n", + "transp_Xs_sinkhorn = ot_sinkhorn.transform(Xs=X1)\n", + "transp_Xt_sinkhorn = ot_sinkhorn.inverse_transform(Xt=X2)\n", "\n", "I1t = minmax(mat2im(transp_Xs_emd, I1.shape))\n", "I2t = minmax(mat2im(transp_Xt_emd, I2.shape))\n", @@ -266,7 +266,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -315,21 +315,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" + "pygments_lexer": "ipython3", + "version": "3.6.7" } }, "nbformat": 4, diff --git a/notebooks/plot_otda_mapping_colors_images.ipynb b/notebooks/plot_otda_mapping_colors_images.ipynb index 4b19e0c..b66640b 100644 --- a/notebooks/plot_otda_mapping_colors_images.ipynb +++ b/notebooks/plot_otda_mapping_colors_images.ipynb @@ -184,7 +184,7 @@ "# SinkhornTransport\n", "ot_sinkhorn = ot.da.SinkhornTransport(reg_e=1e-1)\n", "ot_sinkhorn.fit(Xs=Xs, Xt=Xt)\n", - "transp_Xs_sinkhorn = ot_emd.transform(Xs=X1)\n", + "transp_Xs_sinkhorn = ot_sinkhorn.transform(Xs=X1)\n", "Image_sinkhorn = minmax(mat2im(transp_Xs_sinkhorn, I1.shape))\n", "\n", "ot_mapping_linear = ot.da.MappingTransport(\n", @@ -307,7 +307,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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eqy9cQrhYwirKxGGdNAmjF3u4D4oJQ0cTTMVYi7KjNHFsRF0Kdw8DXtNC00aZkZvOdSKCA8YV3MWz3pZV1DNYbpJ6pTDnWELUsF7AAAEYElEQVTGKOlod0kd9dB0HRfJPOMuhc4G1plCWLtzb8YTQtvbHlcxQivFhNadMuCqjg0YqlRRNgeLoEmWpxwcHBwcHBz8/eAnNSCf6ZjCFIOTKRbBswzuRbmStaIbZNxRCJPCPZ9jvPaAelUsClcZXCU3lPI57F0MUFaZ+TgyL/mud1YNbiGfC+yANM6VUtB9k1mLsuzVspCVtcWCVwLnpTNLRbSAO+8xvA9WHbvbPq/wBcfc8HCGOKsGdyGcxkTXjhVjDmj0/WslN5MI06iIjIy8AzTAVBmeua0ie6McwsSeB6zGNJy1OKtmYsDjOPG05eD4l3TGRdAQRGpuTMk2o0CpsfFScvA81ZLaaQZaJlpb0Rh4EVwqPZwJp0XHUZZSiFIwC141pe1b+RBnVNii00VZJbv8XDLTFOCyDj6GczcpUwiEsxhIMa4tM/yqGd0yV3GMbG/zvZPacOoeGbMSu7seRA2PvAcIcTbJ8hUINqu4KHOHTQfGRO/OJw+a1T3X2OlDGFqYdqPgGE7xHPgfZMrvXzIm7HPwOcCiP6mP2sHBwcHBwcF/hJ/UW/uGUYjc0o3Mko2iTJIRUreeNcceg00yB/OjCKEBUTK2bJdCjHLeu9YBgiEZS2TiZFhURh2sKOzpBeFGYRACoZl2kCERwQhj84z+mq0wiWORWaY/tEGPC2ETCxkJ1nBsb4FTKVRJqYJLDr8umQn6TgOKQwjnmHgQ4cRg+Nj9fE5zZ0jHx4whBDfuw5gQ6gQ3V563lrnEAZtszKa0HgwdbAyqF0Sg2Ia40arx2AP3wYNkAQBS8QCPCUpmGL+Viji8aSnP6AOIQaFSUIp0lhqYw71NGCsh0PyC+glnZBSbZy1z6XsFqFdUnaUUNnzPQ81ot7UXPmSsMm0EWzHKKFiAqbPoIHxQJQ9NqwAMeu9YCE8Yl+iYGcsurGhSaN6ynKJLxuOhWXPrwiZp5HMXmiqNNGqGZrA5mk0/D8DqxkMJrvvQ7xaUcGJkMskswUDYCKoqJsG1/+HafQ4ODg4ODg7+dvlJxbwdHBwcHBwcHBwc/F3z8+m/PTg4ODg4ODg4OPgDcAzIBwcHBwcHBwcHB19wDMgHBwcHBwcHBwcHX3AMyAcHBwcHBwcHBwdfcAzIBwcHBwcHBwcHB19wDMgHBwcHBwcHBwcHX3AMyAcHBwcHBwcHBwdfcAzIBwcHBwcHBwcHB19wDMgHBwcHBwcHBwcHX3AMyAcHBwcHBwcHBwdfcAzIBwcHBwcHBwcHB19wDMgHBwcHBwcHBwcHX3AMyAcHBwcHBwcHBwdfcAzIBwcHBwcHBwcHB19wDMgHBwcHBwcHBwcHX3AMyAcHBwcHBwcHBwdfcAzIBwcHBwcHBwcHB19wDMgHBwcHBwcHBwcHX3AMyAcHBwcHBwcHBwdfcAzIBwcHBwcHBwcHB19wDMgHBwcHBwcHBwcHX3AMyAcHBwcHBwcHBwdfcAzIBwcHBwcHBwcHB1/w/wKnYqHSYbGQNgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] @@ -356,21 +356,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" + "pygments_lexer": "ipython3", + "version": "3.6.7" } }, "nbformat": 4, diff --git a/notebooks/plot_stochastic.ipynb b/notebooks/plot_stochastic.ipynb index e784e11..0911c28 100644 --- a/notebooks/plot_stochastic.ipynb +++ b/notebooks/plot_stochastic.ipynb @@ -49,44 +49,20 @@ "source": [ "COMPUTE TRANSPORTATION MATRIX FOR SEMI-DUAL PROBLEM\n", "############################################################################\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "------------SEMI-DUAL PROBLEM------------\n" - ] - } - ], - "source": [ - "print(\"------------SEMI-DUAL PROBLEM------------\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "DISCRETE CASE\n", - "Sample two discrete measures for the discrete case\n", - "---------------------------------------------\n", + "############################################################################\n", + " DISCRETE CASE:\n", + "\n", + " Sample two discrete measures for the discrete case\n", + " ---------------------------------------------\n", "\n", - "Define 2 discrete measures a and b, the points where are defined the source\n", - "and the target measures and finally the cost matrix c.\n", + " Define 2 discrete measures a and b, the points where are defined the source\n", + " and the target measures and finally the cost matrix c.\n", "\n" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": { "collapsed": false }, @@ -120,7 +96,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": { "collapsed": false }, @@ -150,7 +126,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "SEMICONTINOUS CASE\n", + "SEMICONTINOUS CASE:\n", + "\n", "Sample one general measure a, one discrete measures b for the semicontinous\n", "case\n", "---------------------------------------------\n", @@ -162,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": { "collapsed": false }, @@ -198,7 +175,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": { "collapsed": false }, @@ -207,15 +184,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "[3.75309361 7.63288278 3.76418767 2.53747778 1.70389504 3.53981297\n", - " 2.67663944] [-2.49164966 -2.25281897 -0.77666675 5.52113539]\n", - "[[2.19699465e-02 1.03185982e-01 1.76983379e-02 2.87611188e-06]\n", - " [1.20688044e-01 1.49823131e-02 1.50635578e-03 5.68043045e-03]\n", - " [3.01194583e-03 7.75764779e-02 6.22686313e-02 8.78225379e-08]\n", - " [2.28707628e-02 3.52120795e-02 8.44977549e-02 2.76545693e-04]\n", - " [1.19721129e-02 1.10087991e-03 1.53333937e-02 1.14450756e-01]\n", - " [2.65247890e-02 1.33140544e-03 2.66861405e-03 1.12332334e-01]\n", - " [3.71512413e-02 2.86513804e-02 7.53932500e-02 1.66127118e-03]]\n" + "[3.88833283 7.64041833 3.93000933 2.68489048 1.42837354 3.25840738\n", + " 2.80033951] [-2.50038759 -2.4083026 -0.96389053 5.87258072]\n", + "[[2.49326139e-02 1.01118047e-01 1.68018025e-02 4.67918477e-06]\n", + " [1.20543018e-01 1.29218840e-02 1.25860644e-03 8.13363473e-03]\n", + " [3.52425849e-03 7.83826265e-02 6.09501106e-02 1.47316769e-07]\n", + " [2.62727985e-02 3.49290291e-02 8.11998888e-02 4.55426386e-04]\n", + " [9.00986942e-03 7.15412954e-04 9.65318348e-03 1.23478677e-01]\n", + " [1.98446848e-02 8.60145164e-04 1.67017745e-03 1.20482135e-01]\n", + " [4.16774129e-02 2.77550575e-02 7.07529364e-02 2.67173611e-03]]\n" ] } ], @@ -240,7 +217,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": { "collapsed": false }, @@ -284,7 +261,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": { "collapsed": false }, @@ -317,14 +294,14 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -350,7 +327,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": { "collapsed": false }, @@ -378,45 +355,21 @@ "source": [ "COMPUTE TRANSPORTATION MATRIX FOR DUAL PROBLEM\n", "############################################################################\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "------------DUAL PROBLEM------------\n" - ] - } - ], - "source": [ - "print(\"------------DUAL PROBLEM------------\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "SEMICONTINOUS CASE\n", - "Sample one general measure a, one discrete measures b for the semicontinous\n", - "case\n", - "---------------------------------------------\n", + "############################################################################\n", + " SEMICONTINOUS CASE:\n", "\n", - "Define one general measure a, one discrete measures b, the points where\n", - "are defined the source and the target measures and finally the cost matrix c.\n", + " Sample one general measure a, one discrete measures b for the semicontinous\n", + " case\n", + " ---------------------------------------------\n", + "\n", + " Define one general measure a, one discrete measures b, the points where\n", + " are defined the source and the target measures and finally the cost matrix c.\n", "\n" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "metadata": { "collapsed": false }, @@ -453,7 +406,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "metadata": { "collapsed": false }, @@ -462,15 +415,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ 1.67648902 5.3770004 1.70385554 0.4276547 -0.77206786 1.0474898\n", - " 0.54202203] [-0.23723788 -0.20259434 1.30855788 8.06179985]\n", - "[[2.62451875e-02 1.00499531e-01 1.78515577e-02 4.57450829e-06]\n", - " [1.20510690e-01 1.21972758e-02 1.27002374e-03 7.55197481e-03]\n", - " [3.65708350e-03 7.67963231e-02 6.38381061e-02 1.41974930e-07]\n", - " [2.64286344e-02 3.31748063e-02 8.24445965e-02 4.25479786e-04]\n", - " [9.59295422e-03 7.19190875e-04 1.03739180e-02 1.22100712e-01]\n", - " [2.09087627e-02 8.55676046e-04 1.77617241e-03 1.17896019e-01]\n", - " [4.18792948e-02 2.63326297e-02 7.17598381e-02 2.49335733e-03]]\n" + "[0.92524245 2.75994495 1.08144666 0.02747421 0.60913832 1.8156535\n", + " 0.11738177] [0.33905828 0.46705197 1.56941919 4.96075241]\n", + "[[2.20327995e-02 9.26244184e-02 1.09321230e-02 9.71212784e-08]\n", + " [1.56579562e-02 1.73985799e-03 1.20373178e-04 2.48153271e-05]\n", + " [3.49227454e-03 8.05110304e-02 4.44694627e-02 3.42874458e-09]\n", + " [3.15181548e-02 4.34346087e-02 7.17227024e-02 1.28326090e-05]\n", + " [6.79336320e-02 5.59136813e-03 5.35899879e-02 2.18675752e-02]\n", + " [8.02083959e-02 3.60364770e-03 4.97032746e-03 1.14377502e-02]\n", + " [4.87374362e-02 3.36433325e-02 6.09190548e-02 7.33833971e-05]]\n" ] } ], @@ -495,7 +448,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "metadata": { "collapsed": false }, @@ -530,14 +483,14 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWAAAAFgCAYAAACFYaNMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAEgBJREFUeJzt3X2QXQV9xvHnaQhFAWHarBaT0KUjg0U6BLtiLKII1QFx1No3rdBibTMWqTB16mg7Ktp2OjojpvW1KSK2oIiiHccqBSGMhSK4gYDyphZfEhKbjZSaIAoJT/+4J51tTHZPNufe3+6938/MTvbec+49v7OZfPfk3DcnEQBg8H6megAAGFUEGACKEGAAKEKAAaAIAQaAIgQYAIoQYCxoti+1/dcd3M+47dg+oIu5FiLbr7Z9TfUco4QAAx1wz5/b/qbtR2x/z/bf2v7ZZvkXbW9vvh6z/ei0yx/u82ytfrkkuTzJi+a4jZfZXm/7h7a32r7e9lHTlh9t+wrbU80637T9PtvLmuWn2H582s9ko+0rbT9rLvMsFAQY6MbfS1ol6fclHSrpDEmnSbpSkpKckeSQJIdIulzSu3ddTvK6qqF32Z8jf9tPk/RPkt4o6TBJR0n6gKSd05bfImmTpBOSPEnSSZL+U9Jzp93Vpubnc6iklZLulfTvtk+b62zzHQHGgmL7BNu32d5m+5OSDpq27BzbN+62fpoAyPaZtm9vjsA22L6wo5mOlnSupFcnuTnJjiR3SfpNSafbPnUO93mO7Ztsv9f2Q7bvt/1rzfUbbG+x/QfT1p9p377c/PlQc3T5nN3u/weSLpz+82u2tdX28uby8bb/2/bT9zDuCknfTnJderYluSrJ95rlF0q6KcmfJdkoSUm2JFmd5Ird76y5j41J3ibpYknv2tef30JBgLFg2D5Q0r9I+mdJPyfpU+pFrq2H1TtCPVzSmZL+xPbLW277g7Y/uJfFp0namOTW6Vcm2SDpK5JeuA8zTvdsSXdK+nlJH5d0haRnSXqapLMkvd/2Ic26M+3b85o/D2+OuG+edv/3S3qKpL/Zbfb/kPQPkj5m+wmSLpP01iT37mHO2yQ9vYn5C6bNtMuvS7pqn/e+5zOSnmn74Dnefl4jwFhIVkpaLGl1kseSfFrSV9veOMkNSb6W5PEkd0r6hKTnt7ztuUnO3cviJZI272XZ5mb5XHw7yUeT7JT0SUnLJb0zyU+SXCPpUfViPNd925Tkfc0R+yN7WH6heqcUbpX0gHqnFX5KkvslnSJpqXqnXLY2D47uCvESSd/ftb7t85qj+u22/3G2GSVZvV8sQ4cAYyF5qqQH8v/fQeq7bW9s+9m21zYPBP2PpNdp7nGcbqukI/ay7Ihm+Vz817TvH5GkJLtfd4g0533bMNPCJI9JulTScZLes9vPffd1v5Lkd5KMSTpZvaPuv2wW/0DTfj5J3p/kcEmr1fuFOpOlkiLpoVnWW5AIMBaSzZKW2va0646c9v3Dkp6464LtX9jt9h+X9DlJy5McJunD6h1d7a/rJS23feL0K5vzpyslXdfBNmYz077tLZwzvhWi7aWS3i7po5Les+sZHbNJ8lX1Th0c11x1naRXtLntHvyGpNuSPDzH289rBBgLyc2Sdkh6g+3Ftl8haXr07pD0DNsrbB+k3n+hpztU0oNJftzE8ve6GCrJN9QL3uW2V9peZPsZ6p33/FKSL3WxnVnMtG9Tkh6X9Ett76z5JXeppI9Ieq16v/z+ai/rPtf2H9t+cnP56ZJeqt75b6n393Cy7YuaqMv2Ekm/vLdt215q++2S/kjSX7Sde6EhwFgwkjyq3pHUOZIelPS76h1p7Vr+DUnvlPQlSd+UdONud3GupHfa3ibpbWqeItaG7Q975ufrnqfeI/aXSdou6WpJN2jfHiTcH3vdtyQ/Uu9Btpuac68rW9zfGyQ9Wb0H3iLpNZJeY/vkPaz7kHrB/ZrtXfv+WUnvbrb/DfUe8Fsm6Y5mxpvUO7/71mn389Tm9tvVO7f/K5JOac53DyXzhuwAUIMjYAAoQoABoAgBBoAiBBgAiozsW++hZ8mSJRkfH68eAxgq69at29q8KGVGBHjEjY+Pa3JysnoMYKjYbvUKTU5BAEARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAEQIMAEUIMAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAEQIMAEUIMAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAEQIMAEUIMAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFDqgeAMXuu0865ZTqKTDKVqyQVq+unqIER8AAUIQj4FF3zDHSDTdUTwGMJI6AAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAijhJ9QwoZHubpPuq5+jYEklbq4foA/Zr4TgmyaGzrXTAICbBvHZfkonqIbpke3LY9klivxYS25Nt1uMUBAAUIcAAUIQAY031AH0wjPsksV8LSat94kE4ACjCETAAFCHAAFCEAI8o26fbvs/2t2y/uXqeLti+xPYW21+vnqUrtpfbXmv7btt32T6/eqYu2D7I9q2272j26x3VM3XF9iLbt9v+/GzrEuARZHuRpA9IOkPSsZJeZfvY2qk6camk06uH6NgOSW9McqyklZJePyR/Vz+RdGqS4yWtkHS67ZXFM3XlfEn3tFmRAI+mEyV9K8n9SR6VdIWklxXPtN+SfFnSg9VzdCnJ5iS3Nd9vU+8f9tLaqfZferY3Fxc3Xwv+GQG2l0k6U9LFbdYnwKNpqaQN0y5v1BD8ox52tsclnSDpltpJutH8V329pC2Srk0yDPu1WtKbJD3eZmUCDCwAtg+RdJWkC5L8sHqeLiTZmWSFpGWSTrR9XPVM+8P2SyRtSbKu7W0I8Gh6QNLyaZeXNddhHrK9WL34Xp7kM9XzdC3JQ5LWauGfvz9J0kttf0e903qn2r5sphsQ4NH0VUlH2z7K9oGSXinpc8UzYQ9sW9JHJN2T5KLqebpie8z24c33T5D0Qkn31k61f5K8JcmyJOPq/Zu6PslZM92GAI+gJDsknSfp39R7UOfKJHfVTrX/bH9C0s2SjrG90fZrq2fqwEmSzlbvaGp98/Xi6qE6cISktbbvVO+A4Noksz5ta9jwUmQAKMIRMAAU6csbsi9ZsiTj4+P9uGt0bN26dVuTjFXPsb+ef8a75vRfuRe/Z23Xo8zourMH/1qD3D7Ys0vXPv4pD3SDC1hfAjw+Pq7JyVZvCI9itr9bPQMwqjgFAQBFCDAAFCHAAFCEAANAEQIMAEUIMAAUIcAAUIQAA0ARAgwARVoFeBg/wBEAqs0a4CH+AEcAKNXmCHgoP8BxX1xwQe8LALrU5s149vQBjs/efSXbqyStkqQjjzyyk+Hmi/XrqycAMIw6exAuyZokE0kmxsYW/LsbAkDftQkwH+AIAH3QJsB8gCMA9MGs54CT7LC96wMcF0m6ZBg+wBEAqrX6RIwkX5D0hT7PAgAjhVfCAUARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCk1QsxgPnu6ks+NKfbveLk3+54kpnlO/cOdHuStIg3x5q3OAIGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAiswaYNuX2N5i++uDGAgARkWbI+BLJZ3e5zkAYOTMGuAkX5b04ABmAYCRwjlgACjSWYBtr7I9aXtyamqqq7sFgKHVWYCTrEkykWRijPcfBYBZcQoCAIq0eRraJyTdLOkY2xttv7b/YwHA8Jv1I4mSvGoQgwDAqOEUBAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFJn1lXDAQvDyo58/p9ttuOzgjieZ2Y82TQx0e5J09Hm3DHybaIcjYAAoQoABoAgBBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaBIm09FXm57re27bd9l+/xBDAYAw67Ne0HskPTGJLfZPlTSOtvXJrm7z7MBwFCb9Qg4yeYktzXfb5N0j6Sl/R4MAIbdPp0Dtj0u6QRJP/X2SrZX2Z60PTk1NdXNdAAwxFoH2PYhkq6SdEGSH+6+PMmaJBNJJsbGxrqcEQCGUqsA216sXnwvT/KZ/o4EAKOhzbMgLOkjku5JclH/RwKA0dDmCPgkSWdLOtX2+ubrxX2eCwCG3qxPQ0tyoyQPYBYAGCm8Eg4AihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIm3eDxiY93588rFzut1hVwz2n8Bhf7hloNvD/MYRMAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCkzaciH2T7Vtt32L7L9jsGMRgADLs2L4T/iaRTk2y3vVjSjba/mOQrfZ4NAIZam09FjqTtzcXFzVf6ORQAjIJW54BtL7K9XtIWSdcmuWUP66yyPWl7cmpqqus5AWDotApwkp1JVkhaJulE28ftYZ01SSaSTIyNjXU9JwAMnX16FkSShyStlXR6f8YBgNHR5lkQY7YPb75/gqQXSrq334MBwLBr8yyIIyR9zPYi9YJ9ZZLP93csABh+bZ4FcaekEwYwCwCMFF4JBwBFCDAAFCHAAFCEAANAEQIMAEUIMAAUIcAAUIQAA0CRNq+EA+a9J961eU63O/CBTR1PMrMDbl460O1J0r9uWj/wbaIdjoABoAgBBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIq0DbHuR7dtt84GcANCBfTkCPl/SPf0aBABGTasA214m6UxJF/d3HAAYHW2PgFdLepOkx/e2gu1VtidtT05NTXUyHAAMs1kDbPslkrYkWTfTeknWJJlIMjE2NtbZgAAwrNocAZ8k6aW2vyPpCkmn2r6sr1MBwAiYNcBJ3pJkWZJxSa+UdH2Ss/o+GQAMOZ4HDABF9ukjiZLcIOmGvkwCACOGI2AAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAiuzTCzGA+eqx5UvmdDs/sKnjSWa2c/P3B7o9Sdq68+GBbu/JA93awsYRMAAUIcAAUIQAA0ARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCk1UuRm4+k3yZpp6QdSSb6ORQAjIJ9eS+IFyTZ2rdJAGDEcAoCAIq0DXAkXWN7ne1Ve1rB9irbk7Ynp6amupsQAIZU2wA/N8kzJZ0h6fW2n7f7CknWJJlIMjE2NtbpkAAwjFoFOMkDzZ9bJH1W0on9HAoARsGsAbZ9sO1Dd30v6UWSvt7vwQBg2LV5FsRTJH3W9q71P57k6r5OBQAjYNYAJ7lf0vEDmAUARgpPQwOAIgQYAIoQYAAoQoABoAgBBoAiBBgAihBgAChCgAGgCAEGgCL78obswLy19fgnzul2hz3pVzueZGbfO3vnQLcnSWc9bdFAt3fNIwPd3ILGETAAFCHAAFCEAANAEQIMAEUIMAAUIcAAUIQAA0ARAgwARQgwABRpFWDbh9v+tO17bd9j+zn9HgwAhl3blyL/naSrk/yW7QMlze11nwCA/zNrgG0fJul5ks6RpCSPSnq0v2MBwPBrcwriKElTkj5q+3bbF9s+uM9zAcDQaxPgAyQ9U9KHkpwg6WFJb959JdurbE/anpyamup4zForVvS+AKBLbc4Bb5S0McktzeVPaw8BTrJG0hpJmpiYSGcTzgOrV1dPAGAYzXoEnOT7kjbYPqa56jRJd/d1KgAYAW2fBfGnki5vngFxv6TX9G8kABgNrQKcZL2kiT7PAgAjhVfCAUARAgwARQgwABQhwABQhAADQBECDABFCDAAFCHAAFCEAANAESfdv2+O7SlJ3+38jtEPv5hkrHoIYBT1JcAAgNlxCgIAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAoQoABoAgBBoAiBBgAihBgAChCgAGgCAEGgCIEGACKEGAAKEKAAaAIAQaAIgQYAIoQYAAo8r9wCGj9yW4UbQAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -563,7 +516,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "metadata": { "collapsed": false }, @@ -602,7 +555,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.5" + "version": "3.6.7" } }, "nbformat": 4, -- cgit v1.2.3 From b7df4fbbb54eba6a797c6b8f0d57bda7db8e4177 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 15 Mar 2019 11:57:05 +0100 Subject: correction doc in gromov.py --- ot/gromov.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ot/gromov.py b/ot/gromov.py index 0278e99..7974546 100644 --- a/ot/gromov.py +++ b/ot/gromov.py @@ -39,7 +39,7 @@ def init_matrix(C1, C2, T, p, q, loss_fun='square_loss'): * h1(a)=a * h2(b)=b - The kl-loss function L(a,b)=(1/2)*|a-b|^2 is read as : + The kl-loss function L(a,b)=a*log(a/b)-a+b is read as : L(a,b) = f1(a)+f2(b)-h1(a)*h2(b) with : * f1(a)=a*log(a)-a * f2(b)=b -- cgit v1.2.3 From a2545b5a503c95c9bf07948929b77e9c3f4f28d3 Mon Sep 17 00:00:00 2001 From: Kilian Fatras Date: Fri, 29 Mar 2019 12:41:43 +0100 Subject: add empirical sinkhorn and sikhorn divergence functions --- README.md | 2 + examples/plot_OT_2D_samples.py | 26 ++++ ot/bregman.py | 269 +++++++++++++++++++++++++++++++++++++++++ test/test_bregman.py | 57 +++++++++ 4 files changed, 354 insertions(+) diff --git a/README.md b/README.md index b068131..dbd93fc 100644 --- a/README.md +++ b/README.md @@ -230,3 +230,5 @@ You can also post bug reports and feature requests in Github issues. Make sure t [21] Solomon, J., De Goes, F., Peyré, G., Cuturi, M., Butscher, A., Nguyen, A. & Guibas, L. (2015). [Convolutional wasserstein distances: Efficient optimal transportation on geometric domains](https://dl.acm.org/citation.cfm?id=2766963). ACM Transactions on Graphics (TOG), 34(4), 66. [22] J. Altschuler, J.Weed, P. Rigollet, (2017) [Near-linear time approximation algorithms for optimal transport via Sinkhorn iteration](https://papers.nips.cc/paper/6792-near-linear-time-approximation-algorithms-for-optimal-transport-via-sinkhorn-iteration.pdf), Advances in Neural Information Processing Systems (NIPS) 31 + +[23] Aude, G., Peyré, G., Cuturi, M., [Learning Generative Models with Sinkhorn Divergences](https://arxiv.org/abs/1706.00292), Proceedings of the Twenty-First International Conference on Artficial Intelligence and Statistics, (AISTATS) 21, 2018 diff --git a/examples/plot_OT_2D_samples.py b/examples/plot_OT_2D_samples.py index bb952a0..63126ba 100644 --- a/examples/plot_OT_2D_samples.py +++ b/examples/plot_OT_2D_samples.py @@ -10,6 +10,7 @@ sum of diracs. The OT matrix is plotted with the samples. """ # Author: Remi Flamary +# Kilian Fatras # # License: MIT License @@ -100,3 +101,28 @@ pl.legend(loc=0) pl.title('OT matrix Sinkhorn with samples') pl.show() + + +############################################################################## +# Emprirical Sinkhorn +# ---------------- + +#%% sinkhorn + +# reg term +lambd = 1e-3 + +Ges = ot.bregman.empirical_sinkhorn(xs, xt, lambd) + +pl.figure(7) +pl.imshow(Ges, interpolation='nearest') +pl.title('OT matrix empirical sinkhorn') + +pl.figure(8) +ot.plot.plot2D_samples_mat(xs, xt, Ges, color=[.5, .5, 1]) +pl.plot(xs[:, 0], xs[:, 1], '+b', label='Source samples') +pl.plot(xt[:, 0], xt[:, 1], 'xr', label='Target samples') +pl.legend(loc=0) +pl.title('OT matrix Sinkhorn from samples') + +pl.show() diff --git a/ot/bregman.py b/ot/bregman.py index 013bc33..f1b18f8 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -5,6 +5,7 @@ Bregman projections for regularized OT # Author: Remi Flamary # Nicolas Courty +# Kilian Fatras # # License: MIT License @@ -1296,3 +1297,271 @@ def unmix(a, D, M, M0, h0, reg, reg0, alpha, numItermax=1000, return np.sum(K0, axis=1), log else: return np.sum(K0, axis=1) + + +def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numIterMax=10000, stopThr=1e-9, verbose=False, log=False, **kwargs): + ''' + Solve the entropic regularization optimal transport problem and return the + OT matrix from empirical data + + The function solves the following optimization problem: + + .. math:: + \gamma = arg\min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + + s.t. \gamma 1 = a + + \gamma^T 1= b + + \gamma\geq 0 + where : + + - M is the (ns,nt) metric cost matrix + - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` + - a and b are source and target weights (sum to 1) + + + Parameters + ---------- + X_s : np.ndarray (ns, d) + samples in the source domain + X_t : np.ndarray (nt, d) + samples in the target domain + reg : float + Regularization term >0 + a : np.ndarray (ns,) + samples weights in the source domain + b : np.ndarray (nt,) + samples weights in the target domain + numItermax : int, optional + Max number of iterations + stopThr : float, optional + Stop threshol on error (>0) + verbose : bool, optional + Print information along iterations + log : bool, optional + record log if True + + + Returns + ------- + gamma : (ns x nt) ndarray + Regularized optimal transportation matrix for the given parameters + log : dict + log dictionary return only if log==True in parameters + + Examples + -------- + + >>> n_s = 2 + >>> n_t = 2 + >>> reg = 0.1 + >>> X_s = np.reshape(np.arange(n_s), (n_s, 1)) + >>> X_t = np.reshape(np.arange(0, n_t), (n_t, 1)) + >>> emp_sinkhorn = empirical_sinkhorn(X_s, X_t, reg, verbose=False) + >>> print(emp_sinkhorn) + >>> [[4.99977301e-01 2.26989344e-05] + [2.26989344e-05 4.99977301e-01]] + + + References + ---------- + + .. [2] M. Cuturi, Sinkhorn Distances : Lightspeed Computation of Optimal Transport, Advances in Neural Information Processing Systems (NIPS) 26, 2013 + + .. [9] Schmitzer, B. (2016). Stabilized Sparse Scaling Algorithms for Entropy Regularized Transport Problems. arXiv preprint arXiv:1610.06519. + + .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + ''' + + if a is None: + a = ot.unif(np.shape(X_s)[0]) + if b is None: + b = ot.unif(np.shape(X_t)[0]) + M = ot.dist(X_s, X_t, metric=metric) + if log == False: + pi = ot.sinkhorn(a, b, M, reg, numItermax=numIterMax, stopThr=stopThr, verbose=verbose, log=False, **kwargs) + return pi + + if log == True: + pi, log = ot.sinkhorn(a, b, M, reg, numItermax=numIterMax, stopThr=stopThr, verbose=verbose, log=True, **kwargs) + return pi, log + + +def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numIterMax=10000, stopThr=1e-9, verbose=False, log=False, **kwargs): + ''' + Solve the entropic regularization optimal transport problem from empirical + data and return the OT loss + + + The function solves the following optimization problem: + + .. math:: + W = \min_\gamma_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + + s.t. \gamma 1 = a + + \gamma^T 1= b + + \gamma\geq 0 + where : + + - M is the (ns,nt) metric cost matrix + - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` + - a and b are source and target weights (sum to 1) + + + Parameters + ---------- + X_s : np.ndarray (ns, d) + samples in the source domain + X_t : np.ndarray (nt, d) + samples in the target domain + reg : float + Regularization term >0 + a : np.ndarray (ns,) + samples weights in the source domain + b : np.ndarray (nt,) + samples weights in the target domain + numItermax : int, optional + Max number of iterations + stopThr : float, optional + Stop threshol on error (>0) + verbose : bool, optional + Print information along iterations + log : bool, optional + record log if True + + + Returns + ------- + gamma : (ns x nt) ndarray + Regularized optimal transportation matrix for the given parameters + log : dict + log dictionary return only if log==True in parameters + + Examples + -------- + + >>> n_s = 2 + >>> n_t = 2 + >>> reg = 0.1 + >>> X_s = np.reshape(np.arange(n_s), (n_s, 1)) + >>> X_t = np.reshape(np.arange(0, n_t), (n_t, 1)) + >>> loss_sinkhorn = empirical_sinkhorn2(X_s, X_t, reg, verbose=False) + >>> print(loss_sinkhorn) + >>> [4.53978687e-05] + + + References + ---------- + + .. [2] M. Cuturi, Sinkhorn Distances : Lightspeed Computation of Optimal Transport, Advances in Neural Information Processing Systems (NIPS) 26, 2013 + + .. [9] Schmitzer, B. (2016). Stabilized Sparse Scaling Algorithms for Entropy Regularized Transport Problems. arXiv preprint arXiv:1610.06519. + + .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + ''' + + if a is None: + a = ot.unif(np.shape(X_s)[0]) + if b is None: + b = ot.unif(np.shape(X_t)[0]) + + M = ot.dist(X_s, X_t, metric=metric) + if log == False: + sinkhorn_loss = ot.sinkhorn2(a, b, M, reg, numItermax=numIterMax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) + return sinkhorn_loss + + if log == True: + sinkhorn_loss, log = ot.sinkhorn2(a, b, M, reg, numItermax=numIterMax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) + return sinkhorn_loss, log + + +def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numIterMax=10000, stopThr=1e-9, verbose=False, log=False, **kwargs): + ''' + Compute the sinkhorn divergence loss from empirical data + + The function solves the following optimization problem: + + .. math:: + S = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) - + \min_\gamma_a <\gamma_a,M_a>_F + reg\cdot\Omega(\gamma_a) - + \min_\gamma_b <\gamma_b,M_b>_F + reg\cdot\Omega(\gamma_b) + + s.t. \gamma 1 = a + + \gamma^T 1= b + + \gamma\geq 0 + + \gamma_a 1 = a + + \gamma_a^T 1= a + + \gamma_a\geq 0 + + \gamma_b 1 = b + + \gamma_b^T 1= b + + \gamma_b\geq 0 + where : + + - M (resp. :math:`M_a, M_b) is the (ns,nt) metric cost matrix (resp (ns, ns) and (nt, nt)) + - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` + - a and b are source and target weights (sum to 1) + + + Parameters + ---------- + X_s : np.ndarray (ns, d) + samples in the source domain + X_t : np.ndarray (nt, d) + samples in the target domain + reg : float + Regularization term >0 + a : np.ndarray (ns,) + samples weights in the source domain + b : np.ndarray (nt,) + samples weights in the target domain + numItermax : int, optional + Max number of iterations + stopThr : float, optional + Stop threshol on error (>0) + verbose : bool, optional + Print information along iterations + log : bool, optional + record log if True + + + Returns + ------- + gamma : (ns x nt) ndarray + Regularized optimal transportation matrix for the given parameters + log : dict + log dictionary return only if log==True in parameters + + Examples + -------- + + >>> n_s = 2 + >>> n_t = 4 + >>> reg = 0.1 + >>> X_s = np.reshape(np.arange(n_s), (n_s, 1)) + >>> X_t = np.reshape(np.arange(0, n_t), (n_t, 1)) + >>> emp_sinkhorn_div = empirical_sinkhorn_divergence(X_s, X_t, reg) + >>> print(emp_sinkhorn_div) + >>> [2.99977435] + + + References + ---------- + + .. [23] Aude Genevay, Gabriel Peyré, Marco Cuturi, Learning Generative Models with Sinkhorn Divergences, Proceedings of the Twenty-First International Conference on Artficial Intelligence and Statistics, (AISTATS) 21, 2018 + ''' + + sinkhorn_div = (2 * empirical_sinkhorn2(X_s, X_t, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs) - + empirical_sinkhorn2(X_s, X_s, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs) - + empirical_sinkhorn2(X_t, X_t, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs)) + return max(0, sinkhorn_div) diff --git a/test/test_bregman.py b/test/test_bregman.py index 90eaf27..b890df1 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -1,6 +1,7 @@ """Tests for module bregman on OT with bregman projections """ # Author: Remi Flamary +# Kilian Fatras # # License: MIT License @@ -187,3 +188,59 @@ def test_unmix(): ot.bregman.unmix(a, D, M, M0, h0, reg, 1, alpha=0.01, log=True, verbose=True) + + +def test_empirical_sinkhorn(): + # test sinkhorn + n = 100 + a = ot.unif(n) + b = ot.unif(n) + M = ot.dist(X_s, X_t) + M_e = ot.dist(X_s, X_t, metric='euclidean') + + rng = np.random.RandomState(0) + + X_s = np.reshape(np.arange(n), (n, 1)) + X_t = np.reshape(np.arange(0, n), (n, 1)) + + G_sqe = ot.bregman.empirical_sinkhorn(X_s, X_t, 1) + sinkhorn_sqe = ot.sinkhorn(a, b, M, 1) + + G_e = ot.bregman.empirical_sinkhorn(X_s, X_t, 1) + sinkhorn_e = ot.sinkhorn(a, b, M_e, 1) + + loss_emp_sinkhorn = ot.bregman.empirical_sinkhorn2(X_s, X_t, 1) + loss_sinkhorn = ot.sinkhorn2(a, b, M, 1) + + # check constratints + np.testing.assert_allclose( + sinkhorn_sqe.sum(1), G_sqe.sum(1), atol=1e-05) # metric sqeuclidian + np.testing.assert_allclose( + sinkhorn_sqe.sum(0), G_sqe.sum(0), atol=1e-05) # metric sqeuclidian + np.testing.assert_allclose( + sinkhorn_e.sum(1), G_e.sum(1), atol=1e-05) # metric euclidian + np.testing.assert_allclose( + sinkhorn_e.sum(0), G_e.sum(0), atol=1e-05) # metric euclidian + np.testing.assert_allclose(loss_emp_sinkhorn, loss_sinkhorn, atol=1e-05) + + +def test_empirical_sinkhorn_divergence(): + #Test sinkhorn divergence + n = 10 + a = ot.unif(n) + b = ot.unif(n) + X_s = np.reshape(np.arange(n), (n, 1)) + X_t = np.reshape(np.arange(0, n * 2, 2), (n, 1)) + M = ot.dist(X_s, X_t) + M_s = ot.dist(X_s, X_s) + M_t = ot.dist(X_t, X_t) + + emp_sinkhorn_div = empirical_sinkhorn_divergence(X_s, X_t, 1) + sinkhorn_div = (2 * ot.sinkhorn2(a, b, M, 1) - ot.sinkhorn2(a, a, M_s, 1) - + ot.sinkhorn2(b, b, M_t, 1)) + + # check constratints + np.testing.assert_allclose( + emp_sinkhorn_div, sinkhorn_div, atol=1e-05) # cf conv emp sinkhorn + np.testing.assert_allclose( + emp_sinkhorn_div, sinkhorn_div, atol=1e-05) # cf conv emp sinkhorn -- cgit v1.2.3 From 9569f893defa8e712a4f3199770a0df745d4cfff Mon Sep 17 00:00:00 2001 From: Kilian Fatras Date: Fri, 29 Mar 2019 13:06:01 +0100 Subject: fix pep8 --- ot/bregman.py | 29 +++++++++++++++-------------- test/test_bregman.py | 6 ++---- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index f1b18f8..f6aa339 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1375,17 +1375,18 @@ def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numI ''' if a is None: - a = ot.unif(np.shape(X_s)[0]) + a = utils.unif(np.shape(X_s)[0]) if b is None: - b = ot.unif(np.shape(X_t)[0]) + b = utils.unif(np.shape(X_t)[0]) + M = ot.dist(X_s, X_t, metric=metric) - if log == False: - pi = ot.sinkhorn(a, b, M, reg, numItermax=numIterMax, stopThr=stopThr, verbose=verbose, log=False, **kwargs) - return pi - if log == True: - pi, log = ot.sinkhorn(a, b, M, reg, numItermax=numIterMax, stopThr=stopThr, verbose=verbose, log=True, **kwargs) + if log: + pi, log = sinkhorn(a, b, M, reg, numItermax=numIterMax, stopThr=stopThr, verbose=verbose, log=True, **kwargs) return pi, log + else: + pi = sinkhorn(a, b, M, reg, numItermax=numIterMax, stopThr=stopThr, verbose=verbose, log=False, **kwargs) + return pi def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numIterMax=10000, stopThr=1e-9, verbose=False, log=False, **kwargs): @@ -1464,18 +1465,18 @@ def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', num ''' if a is None: - a = ot.unif(np.shape(X_s)[0]) + a = utils.unif(np.shape(X_s)[0]) if b is None: - b = ot.unif(np.shape(X_t)[0]) + b = utils.unif(np.shape(X_t)[0]) M = ot.dist(X_s, X_t, metric=metric) - if log == False: - sinkhorn_loss = ot.sinkhorn2(a, b, M, reg, numItermax=numIterMax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) - return sinkhorn_loss - if log == True: - sinkhorn_loss, log = ot.sinkhorn2(a, b, M, reg, numItermax=numIterMax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) + if log: + sinkhorn_loss, log = sinkhorn2(a, b, M, reg, numItermax=numIterMax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) return sinkhorn_loss, log + else: + sinkhorn_loss = sinkhorn2(a, b, M, reg, numItermax=numIterMax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) + return sinkhorn_loss def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numIterMax=10000, stopThr=1e-9, verbose=False, log=False, **kwargs): diff --git a/test/test_bregman.py b/test/test_bregman.py index b890df1..8b001a7 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -195,13 +195,11 @@ def test_empirical_sinkhorn(): n = 100 a = ot.unif(n) b = ot.unif(n) - M = ot.dist(X_s, X_t) - M_e = ot.dist(X_s, X_t, metric='euclidean') - - rng = np.random.RandomState(0) X_s = np.reshape(np.arange(n), (n, 1)) X_t = np.reshape(np.arange(0, n), (n, 1)) + M = ot.dist(X_s, X_t) + M_e = ot.dist(X_s, X_t, metric='euclidean') G_sqe = ot.bregman.empirical_sinkhorn(X_s, X_t, 1) sinkhorn_sqe = ot.sinkhorn(a, b, M, 1) -- cgit v1.2.3 From d754a645f9b4ef88d7e0aba1188fa83d7d58af1f Mon Sep 17 00:00:00 2001 From: Kilian Fatras Date: Fri, 29 Mar 2019 13:24:54 +0100 Subject: typos PEP8 --- test/test_bregman.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_bregman.py b/test/test_bregman.py index 8b001a7..4aae6cb 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -233,7 +233,7 @@ def test_empirical_sinkhorn_divergence(): M_s = ot.dist(X_s, X_s) M_t = ot.dist(X_t, X_t) - emp_sinkhorn_div = empirical_sinkhorn_divergence(X_s, X_t, 1) + emp_sinkhorn_div = ot.bregman.empirical_sinkhorn_divergence(X_s, X_t, 1) sinkhorn_div = (2 * ot.sinkhorn2(a, b, M, 1) - ot.sinkhorn2(a, a, M_s, 1) - ot.sinkhorn2(b, b, M_t, 1)) -- cgit v1.2.3 From f63712f4df213bbfe0a2665390d51974305de705 Mon Sep 17 00:00:00 2001 From: Kilian Fatras Date: Fri, 29 Mar 2019 13:44:07 +0100 Subject: call ot.unif and ot.dist --- ot/bregman.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index f6aa339..9e9989f 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1375,9 +1375,9 @@ def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numI ''' if a is None: - a = utils.unif(np.shape(X_s)[0]) + a = ot.unif(np.shape(X_s)[0]) if b is None: - b = utils.unif(np.shape(X_t)[0]) + b = ot.unif(np.shape(X_t)[0]) M = ot.dist(X_s, X_t, metric=metric) @@ -1465,9 +1465,9 @@ def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', num ''' if a is None: - a = utils.unif(np.shape(X_s)[0]) + a = ot.unif(np.shape(X_s)[0]) if b is None: - b = utils.unif(np.shape(X_t)[0]) + b = ot.unif(np.shape(X_t)[0]) M = ot.dist(X_s, X_t, metric=metric) -- cgit v1.2.3 From 24b268c5d4ee3a03e5a1742168236755cfba9ed5 Mon Sep 17 00:00:00 2001 From: Kilian Fatras Date: Fri, 29 Mar 2019 13:59:25 +0100 Subject: import unif and dist in bregman file --- ot/bregman.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index 9e9989f..f873a85 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -10,6 +10,7 @@ Bregman projections for regularized OT # License: MIT License import numpy as np +from .utils import unif, dist def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, @@ -1375,11 +1376,11 @@ def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numI ''' if a is None: - a = ot.unif(np.shape(X_s)[0]) + a = unif(np.shape(X_s)[0]) if b is None: - b = ot.unif(np.shape(X_t)[0]) + b = unif(np.shape(X_t)[0]) - M = ot.dist(X_s, X_t, metric=metric) + M = dist(X_s, X_t, metric=metric) if log: pi, log = sinkhorn(a, b, M, reg, numItermax=numIterMax, stopThr=stopThr, verbose=verbose, log=True, **kwargs) @@ -1465,11 +1466,11 @@ def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', num ''' if a is None: - a = ot.unif(np.shape(X_s)[0]) + a = unif(np.shape(X_s)[0]) if b is None: - b = ot.unif(np.shape(X_t)[0]) + b = unif(np.shape(X_t)[0]) - M = ot.dist(X_s, X_t, metric=metric) + M = dist(X_s, X_t, metric=metric) if log: sinkhorn_loss, log = sinkhorn2(a, b, M, reg, numItermax=numIterMax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) -- cgit v1.2.3 From 1ceb1a9cc96aad54e525c2021851b8639e2f3449 Mon Sep 17 00:00:00 2001 From: Kilian Fatras Date: Sun, 31 Mar 2019 12:14:54 +0200 Subject: fix metric test --- test/test_bregman.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/test_bregman.py b/test/test_bregman.py index 4aae6cb..0ebd546 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -199,13 +199,13 @@ def test_empirical_sinkhorn(): X_s = np.reshape(np.arange(n), (n, 1)) X_t = np.reshape(np.arange(0, n), (n, 1)) M = ot.dist(X_s, X_t) - M_e = ot.dist(X_s, X_t, metric='euclidean') + M_m = ot.dist(X_s, X_t, metric='minkowski') G_sqe = ot.bregman.empirical_sinkhorn(X_s, X_t, 1) sinkhorn_sqe = ot.sinkhorn(a, b, M, 1) - G_e = ot.bregman.empirical_sinkhorn(X_s, X_t, 1) - sinkhorn_e = ot.sinkhorn(a, b, M_e, 1) + G_m = ot.bregman.empirical_sinkhorn(X_s, X_t, 1, metric='minkowski') + sinkhorn_m = ot.sinkhorn(a, b, M_m, 1) loss_emp_sinkhorn = ot.bregman.empirical_sinkhorn2(X_s, X_t, 1) loss_sinkhorn = ot.sinkhorn2(a, b, M, 1) @@ -216,9 +216,9 @@ def test_empirical_sinkhorn(): np.testing.assert_allclose( sinkhorn_sqe.sum(0), G_sqe.sum(0), atol=1e-05) # metric sqeuclidian np.testing.assert_allclose( - sinkhorn_e.sum(1), G_e.sum(1), atol=1e-05) # metric euclidian + sinkhorn_m.sum(1), G_m.sum(1), atol=1e-05) # metric euclidian np.testing.assert_allclose( - sinkhorn_e.sum(0), G_e.sum(0), atol=1e-05) # metric euclidian + sinkhorn_m.sum(0), G_m.sum(0), atol=1e-05) # metric euclidian np.testing.assert_allclose(loss_emp_sinkhorn, loss_sinkhorn, atol=1e-05) -- cgit v1.2.3 From 9cfcbc4a0f84c1fe302a1a89a4488866935977aa Mon Sep 17 00:00:00 2001 From: Kilian Fatras Date: Wed, 3 Apr 2019 18:18:02 +0200 Subject: fix typos and add solver in readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dbd93fc..dd34a97 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,8 @@ This open source Python library provide several solvers for optimization problem It provides the following solvers: * OT Network Flow solver for the linear program/ Earth Movers Distance [1]. -* Entropic regularization OT solver with Sinkhorn Knopp Algorithm [2] and stabilized version [9][10] and greedy SInkhorn [22] with optional GPU implementation (requires cupy). +* Entropic regularization OT solver with Sinkhorn Knopp Algorithm [2], stabilized version [9][10] and greedy Sinkhorn [22] with optional GPU implementation (requires cupy). +* Sinkhorn divergence [23] and entropic regularization OT from empirical data. * Smooth optimal transport solvers (dual and semi-dual) for KL and squared L2 regularizations [17]. * Non regularized Wasserstein barycenters [16] with LP solver (only small scale). * Bregman projections for Wasserstein barycenter [3], convolutional barycenter [21] and unmixing [4]. -- cgit v1.2.3 From 7c02007919596dedf9d4555737900e717c3d31a8 Mon Sep 17 00:00:00 2001 From: Kilian Fatras Date: Thu, 4 Apr 2019 11:46:49 +0200 Subject: fix doc --- ot/bregman.py | 29 ++++++++++++++++++----------- ot/stochastic.py | 3 +++ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index f873a85..47554fb 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1317,9 +1317,9 @@ def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numI \gamma\geq 0 where : - - M is the (ns,nt) metric cost matrix + - :math:`M` is the (ns,nt) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - - a and b are source and target weights (sum to 1) + - :math:`a` and :math:`b` are source and target weights (sum to 1) Parameters @@ -1399,7 +1399,7 @@ def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', num The function solves the following optimization problem: .. math:: - W = \min_\gamma_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) s.t. \gamma 1 = a @@ -1408,9 +1408,9 @@ def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', num \gamma\geq 0 where : - - M is the (ns,nt) metric cost matrix + - :math:`M` is the (ns,nt) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - - a and b are source and target weights (sum to 1) + - :math:`a` and :math:`b` are source and target weights (sum to 1) Parameters @@ -1484,13 +1484,20 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli ''' Compute the sinkhorn divergence loss from empirical data - The function solves the following optimization problem: + The function solves the following optimization problems and return the + sinkhorn divergence :math:`S`: .. math:: - S = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) - - \min_\gamma_a <\gamma_a,M_a>_F + reg\cdot\Omega(\gamma_a) - - \min_\gamma_b <\gamma_b,M_b>_F + reg\cdot\Omega(\gamma_b) + W &= \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + + W_a &= \min_{\gamma_a} <\gamma_a,M_a>_F + reg\cdot\Omega(\gamma_a) + + W_b &= \min_{\gamma_b} <\gamma_b,M_b>_F + reg\cdot\Omega(\gamma_b) + + S &= W - 1/2 * (W_a + W_b) + + .. math:: s.t. \gamma 1 = a \gamma^T 1= b @@ -1510,9 +1517,9 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli \gamma_b\geq 0 where : - - M (resp. :math:`M_a, M_b) is the (ns,nt) metric cost matrix (resp (ns, ns) and (nt, nt)) + - :math:`M` (resp. :math:`M_a, M_b`) is the (ns,nt) metric cost matrix (resp (ns, ns) and (nt, nt)) - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - - a and b are source and target weights (sum to 1) + - :math:`a` and :math:`b` are source and target weights (sum to 1) Parameters diff --git a/ot/stochastic.py b/ot/stochastic.py index 0db39c8..85c4230 100644 --- a/ot/stochastic.py +++ b/ot/stochastic.py @@ -348,8 +348,11 @@ def solve_semi_dual_entropic(a, b, M, reg, method, numItermax=10000, lr=None, .. math:: \gamma = arg\min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + s.t. \gamma 1 = a + \gamma^T 1= b + \gamma \geq 0 Where : -- cgit v1.2.3 From 780bdfee3c622698dc9b18a02fa06381314aa56d Mon Sep 17 00:00:00 2001 From: Kilian Fatras Date: Thu, 4 Apr 2019 13:45:33 +0200 Subject: fix log in sinkhorn div and add log tests --- ot/bregman.py | 26 ++++++++++++++++++++++---- test/test_bregman.py | 12 +++++++++++- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index 47554fb..7acfcf1 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1569,8 +1569,26 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli .. [23] Aude Genevay, Gabriel Peyré, Marco Cuturi, Learning Generative Models with Sinkhorn Divergences, Proceedings of the Twenty-First International Conference on Artficial Intelligence and Statistics, (AISTATS) 21, 2018 ''' + if log: + sinkhorn_loss_ab, log_ab = empirical_sinkhorn2(X_s, X_t, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs) + + sinkhorn_loss_a, log_a = empirical_sinkhorn2(X_s, X_s, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs) + + sinkhorn_loss_b, log_b = empirical_sinkhorn2(X_t, X_t, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs) - sinkhorn_div = (2 * empirical_sinkhorn2(X_s, X_t, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs) - - empirical_sinkhorn2(X_s, X_s, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs) - - empirical_sinkhorn2(X_t, X_t, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs)) - return max(0, sinkhorn_div) + sinkhorn_div = sinkhorn_loss_ab - 1 / 2 * (sinkhorn_loss_a + sinkhorn_loss_b) + + log = {} + log['sinkhorn_loss_ab'] = sinkhorn_loss_ab + log['sinkhorn_loss_a'] = sinkhorn_loss_a + log['sinkhorn_loss_b'] = sinkhorn_loss_b + log['log_sinkhorn_ab'] = log_ab + log['log_sinkhorn_a'] = log_a + log['log_sinkhorn_b'] = log_b + + return max(0, sinkhorn_div), log + else: + sinkhorn_div = (empirical_sinkhorn2(X_s, X_t, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs) - + 1 / 2 * empirical_sinkhorn2(X_s, X_s, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs) - + 1 / 2 * empirical_sinkhorn2(X_t, X_t, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs)) + return max(0, sinkhorn_div) diff --git a/test/test_bregman.py b/test/test_bregman.py index 0ebd546..68d3595 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -204,6 +204,9 @@ def test_empirical_sinkhorn(): G_sqe = ot.bregman.empirical_sinkhorn(X_s, X_t, 1) sinkhorn_sqe = ot.sinkhorn(a, b, M, 1) + G_log, log_es = ot.bregman.empirical_sinkhorn(X_s, X_t, 0.1, log=True) + sinkhorn_log, log_s = ot.sinkhorn(a, b, M, 0.1, log=True) + G_m = ot.bregman.empirical_sinkhorn(X_s, X_t, 1, metric='minkowski') sinkhorn_m = ot.sinkhorn(a, b, M_m, 1) @@ -215,6 +218,10 @@ def test_empirical_sinkhorn(): sinkhorn_sqe.sum(1), G_sqe.sum(1), atol=1e-05) # metric sqeuclidian np.testing.assert_allclose( sinkhorn_sqe.sum(0), G_sqe.sum(0), atol=1e-05) # metric sqeuclidian + np.testing.assert_allclose( + sinkhorn_log.sum(1), G_log.sum(1), atol=1e-05) # log + np.testing.assert_allclose( + sinkhorn_log.sum(0), G_log.sum(0), atol=1e-05) # log np.testing.assert_allclose( sinkhorn_m.sum(1), G_m.sum(1), atol=1e-05) # metric euclidian np.testing.assert_allclose( @@ -237,8 +244,11 @@ def test_empirical_sinkhorn_divergence(): sinkhorn_div = (2 * ot.sinkhorn2(a, b, M, 1) - ot.sinkhorn2(a, a, M_s, 1) - ot.sinkhorn2(b, b, M_t, 1)) + emp_sinkhorn_div_log, log_es = ot.bregman.empirical_sinkhorn_divergence(X_s, X_t, 0.1, log=True) + sinkhorn_div_log, log_s = ot.sinkhorn(a, b, M, 0.1, log=True) + # check constratints np.testing.assert_allclose( emp_sinkhorn_div, sinkhorn_div, atol=1e-05) # cf conv emp sinkhorn np.testing.assert_allclose( - emp_sinkhorn_div, sinkhorn_div, atol=1e-05) # cf conv emp sinkhorn + emp_sinkhorn_div_log, sinkhorn_div_log, atol=1e-05) # cf conv emp sinkhorn -- cgit v1.2.3 From 69186a6f4259d32fecac370f59efe16e2e460d04 Mon Sep 17 00:00:00 2001 From: Kilian Fatras Date: Thu, 4 Apr 2019 13:58:50 +0200 Subject: fix test sinkhorn div --- ot/bregman.py | 11 ++++++++--- test/test_bregman.py | 8 +++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index 7acfcf1..dc43834 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1587,8 +1587,13 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli log['log_sinkhorn_b'] = log_b return max(0, sinkhorn_div), log + else: - sinkhorn_div = (empirical_sinkhorn2(X_s, X_t, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs) - - 1 / 2 * empirical_sinkhorn2(X_s, X_s, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs) - - 1 / 2 * empirical_sinkhorn2(X_t, X_t, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs)) + sinkhorn_loss_ab = empirical_sinkhorn2(X_s, X_t, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs) + + sinkhorn_loss_a = empirical_sinkhorn2(X_s, X_s, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs) + + sinkhorn_loss_b = empirical_sinkhorn2(X_t, X_t, reg, a, b, metric=metric, numIterMax=numIterMax, stopThr=1e-9, verbose=verbose, log=log, **kwargs) + + sinkhorn_div = sinkhorn_loss_ab - 1 / 2 * (sinkhorn_loss_a + sinkhorn_loss_b) return max(0, sinkhorn_div) diff --git a/test/test_bregman.py b/test/test_bregman.py index 68d3595..58700e2 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -241,11 +241,13 @@ def test_empirical_sinkhorn_divergence(): M_t = ot.dist(X_t, X_t) emp_sinkhorn_div = ot.bregman.empirical_sinkhorn_divergence(X_s, X_t, 1) - sinkhorn_div = (2 * ot.sinkhorn2(a, b, M, 1) - ot.sinkhorn2(a, a, M_s, 1) - - ot.sinkhorn2(b, b, M_t, 1)) + sinkhorn_div = (ot.sinkhorn2(a, b, M, 1) - 1 / 2 * ot.sinkhorn2(a, a, M_s, 1) - 1 / 2 * ot.sinkhorn2(b, b, M_t, 1)) emp_sinkhorn_div_log, log_es = ot.bregman.empirical_sinkhorn_divergence(X_s, X_t, 0.1, log=True) - sinkhorn_div_log, log_s = ot.sinkhorn(a, b, M, 0.1, log=True) + sink_div_log, log_s = ot.sinkhorn2(a, b, M, 1) + sink_div_log_a, log_s_a = ot.sinkhorn2(a, a, M_s, 1) + sink_div_log_b, log_s_b = ot.sinkhorn2(b, b, M_t, 1) + sink_div_log = sink_div_log - 1 / 2 * (sink_div_log_a + sink_div_log_b) # check constratints np.testing.assert_allclose( -- cgit v1.2.3 From 782d9b1ae9d8c0b01e32c2af925ac9b7efa42a70 Mon Sep 17 00:00:00 2001 From: Kilian Fatras Date: Thu, 4 Apr 2019 14:11:36 +0200 Subject: fix test sinkhorn div --- test/test_bregman.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/test_bregman.py b/test/test_bregman.py index 58700e2..d5482f7 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -243,11 +243,11 @@ def test_empirical_sinkhorn_divergence(): emp_sinkhorn_div = ot.bregman.empirical_sinkhorn_divergence(X_s, X_t, 1) sinkhorn_div = (ot.sinkhorn2(a, b, M, 1) - 1 / 2 * ot.sinkhorn2(a, a, M_s, 1) - 1 / 2 * ot.sinkhorn2(b, b, M_t, 1)) - emp_sinkhorn_div_log, log_es = ot.bregman.empirical_sinkhorn_divergence(X_s, X_t, 0.1, log=True) - sink_div_log, log_s = ot.sinkhorn2(a, b, M, 1) - sink_div_log_a, log_s_a = ot.sinkhorn2(a, a, M_s, 1) - sink_div_log_b, log_s_b = ot.sinkhorn2(b, b, M_t, 1) - sink_div_log = sink_div_log - 1 / 2 * (sink_div_log_a + sink_div_log_b) + emp_sinkhorn_div_log, log_es = ot.bregman.empirical_sinkhorn_divergence(X_s, X_t, 1, log=True) + sink_div_log_ab, log_s_ab = ot.sinkhorn2(a, b, M, 1, log=True) + sink_div_log_a, log_s_a = ot.sinkhorn2(a, a, M_s, 1, log=True) + sink_div_log_b, log_s_b = ot.sinkhorn2(b, b, M_t, 1, log=True) + sink_div_log = sink_div_log_ab - 1 / 2 * (sink_div_log_a + sink_div_log_b) # check constratints np.testing.assert_allclose( -- cgit v1.2.3 From 17fa4f9a8cf7ffd1a58853b4091cee0238a1100b Mon Sep 17 00:00:00 2001 From: Kilian Fatras Date: Thu, 4 Apr 2019 14:16:52 +0200 Subject: fix test sinkhorn div --- test/test_bregman.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_bregman.py b/test/test_bregman.py index d5482f7..7f4972c 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -253,4 +253,4 @@ def test_empirical_sinkhorn_divergence(): np.testing.assert_allclose( emp_sinkhorn_div, sinkhorn_div, atol=1e-05) # cf conv emp sinkhorn np.testing.assert_allclose( - emp_sinkhorn_div_log, sinkhorn_div_log, atol=1e-05) # cf conv emp sinkhorn + emp_sinkhorn_div_log, sink_div_log, atol=1e-05) # cf conv emp sinkhorn -- cgit v1.2.3 From b9e69fb29043540079f277d2df0fc9005773f86d Mon Sep 17 00:00:00 2001 From: ngayraud Date: Fri, 10 May 2019 12:56:39 -0400 Subject: Fixed multiple docstring issues --- ot/da.py | 122 +++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 64 insertions(+), 58 deletions(-) diff --git a/ot/da.py b/ot/da.py index bc09e3c..9a67724 100644 --- a/ot/da.py +++ b/ot/da.py @@ -473,22 +473,24 @@ def joint_OT_mapping_kernel(xs, xt, mu=1, eta=0.001, kerneltype='gaussian', Weight for the linear OT loss (>0) eta : float, optional Regularization term for the linear mapping L (>0) - bias : bool,optional - Estimate linear mapping with constant bias kerneltype : str,optional kernel used by calling function ot.utils.kernel (gaussian by default) sigma : float, optional Gaussian kernel bandwidth. + bias : bool,optional + Estimate linear mapping with constant bias + verbose : bool, optional + Print information along iterations + verbose2 : bool, optional + Print information along iterations numItermax : int, optional Max number of BCD iterations - stopThr : float, optional - Stop threshold on relative loss decrease (>0) numInnerItermax : int, optional Max number of iterations (inner CG solver) stopInnerThr : float, optional Stop threshold on error (inner CG solver) (>0) - verbose : bool, optional - Print information along iterations + stopThr : float, optional + Stop threshold on relative loss decrease (>0) log : bool, optional record log if True @@ -1184,26 +1186,26 @@ class SinkhornTransport(BaseTransport): algorithm if no it has not converged tol : float, optional (default=10e-9) The precision required to stop the optimization algorithm. - mapping : string, optional (default="barycentric") - The kind of mapping to apply to transport samples from a domain into - another one. - if "barycentric" only the samples used to estimate the coupling can - be transported from a domain to another one. + verbose : bool, optional (default=False) + Controls the verbosity of the optimization algorithm + log : int, optional (default=False) + Controls the logs of the optimization algorithm metric : string, optional (default="sqeuclidean") The ground metric for the Wasserstein problem norm : string, optional (default=None) If given, normalize the ground metric to avoid numerical errors that can occur with large metric values. - distribution : string, optional (default="uniform") + distribution_estimation : callable, optional (defaults to the uniform) The kind of distribution estimation to employ - verbose : int, optional (default=0) - Controls the verbosity of the optimization algorithm - log : int, optional (default=0) - Controls the logs of the optimization algorithm + out_of_sample_map : string, optional (default="ferradans") + The kind of out of sample mapping to apply to transport samples + from a domain into another one. Currently the only possible option is + "ferradans" which uses the method proposed in [6]. limit_max: float, optional (defaul=np.infty) Controls the semi supervised mode. Transport between labeled source - and target samples of different classes will exhibit an infinite cost - + and target samples of different classes will exhibit an cost defined + by this variable + Attributes ---------- coupling_ : array-like, shape (n_source_samples, n_target_samples) @@ -1287,22 +1289,19 @@ class EMDTransport(BaseTransport): Parameters ---------- - mapping : string, optional (default="barycentric") - The kind of mapping to apply to transport samples from a domain into - another one. - if "barycentric" only the samples used to estimate the coupling can - be transported from a domain to another one. metric : string, optional (default="sqeuclidean") The ground metric for the Wasserstein problem norm : string, optional (default=None) If given, normalize the ground metric to avoid numerical errors that can occur with large metric values. - distribution : string, optional (default="uniform") - The kind of distribution estimation to employ - verbose : int, optional (default=0) - Controls the verbosity of the optimization algorithm - log : int, optional (default=0) + log : int, optional (default=False) Controls the logs of the optimization algorithm + distribution_estimation : callable, optional (defaults to the uniform) + The kind of distribution estimation to employ + out_of_sample_map : string, optional (default="ferradans") + The kind of out of sample mapping to apply to transport samples + from a domain into another one. Currently the only possible option is + "ferradans" which uses the method proposed in [6]. limit_max: float, optional (default=10) Controls the semi supervised mode. Transport between labeled source and target samples of different classes will exhibit an infinite cost @@ -1387,28 +1386,32 @@ class SinkhornLpl1Transport(BaseTransport): Entropic regularization parameter reg_cl : float, optional (default=0.1) Class regularization parameter - mapping : string, optional (default="barycentric") - The kind of mapping to apply to transport samples from a domain into - another one. - if "barycentric" only the samples used to estimate the coupling can - be transported from a domain to another one. - metric : string, optional (default="sqeuclidean") - The ground metric for the Wasserstein problem - norm : string, optional (default=None) - If given, normalize the ground metric to avoid numerical errors that - can occur with large metric values. - distribution : string, optional (default="uniform") - The kind of distribution estimation to employ max_iter : int, float, optional (default=10) The minimum number of iteration before stopping the optimization algorithm if no it has not converged max_inner_iter : int, float, optional (default=200) The number of iteration in the inner loop - verbose : int, optional (default=0) + log : bool, optional (default=False) + Controls the logs of the optimization algorithm + tol : float, optional (default=10e-9) + Stop threshold on error (inner sinkhorn solver) (>0) + verbose : bool, optional (default=False) Controls the verbosity of the optimization algorithm + metric : string, optional (default="sqeuclidean") + The ground metric for the Wasserstein problem + norm : string, optional (default=None) + If given, normalize the ground metric to avoid numerical errors that + can occur with large metric values. + distribution_estimation : callable, optional (defaults to the uniform) + The kind of distribution estimation to employ + out_of_sample_map : string, optional (default="ferradans") + The kind of out of sample mapping to apply to transport samples + from a domain into another one. Currently the only possible option is + "ferradans" which uses the method proposed in [6]. limit_max: float, optional (defaul=np.infty) Controls the semi supervised mode. Transport between labeled source - and target samples of different classes will exhibit an infinite cost + and target samples of different classes will exhibit a cost defined by + limit_max. Attributes ---------- @@ -1504,27 +1507,28 @@ class SinkhornL1l2Transport(BaseTransport): Entropic regularization parameter reg_cl : float, optional (default=0.1) Class regularization parameter - mapping : string, optional (default="barycentric") - The kind of mapping to apply to transport samples from a domain into - another one. - if "barycentric" only the samples used to estimate the coupling can - be transported from a domain to another one. - metric : string, optional (default="sqeuclidean") - The ground metric for the Wasserstein problem - norm : string, optional (default=None) - If given, normalize the ground metric to avoid numerical errors that - can occur with large metric values. - distribution : string, optional (default="uniform") - The kind of distribution estimation to employ max_iter : int, float, optional (default=10) The minimum number of iteration before stopping the optimization algorithm if no it has not converged max_inner_iter : int, float, optional (default=200) The number of iteration in the inner loop - verbose : int, optional (default=0) + tol : float, optional (default=10e-9) + Stop threshold on error (inner sinkhorn solver) (>0) + verbose : bool, optional (default=False) Controls the verbosity of the optimization algorithm - log : int, optional (default=0) + log : bool, optional (default=False) Controls the logs of the optimization algorithm + metric : string, optional (default="sqeuclidean") + The ground metric for the Wasserstein problem + norm : string, optional (default=None) + If given, normalize the ground metric to avoid numerical errors that + can occur with large metric values. + distribution_estimation : callable, optional (defaults to the uniform) + The kind of distribution estimation to employ + out_of_sample_map : string, optional (default="ferradans") + The kind of out of sample mapping to apply to transport samples + from a domain into another one. Currently the only possible option is + "ferradans" which uses the method proposed in [6]. limit_max: float, optional (default=10) Controls the semi supervised mode. Transport between labeled source and target samples of different classes will exhibit an infinite cost @@ -1646,10 +1650,12 @@ class MappingTransport(BaseEstimator): Max number of iterations (inner CG solver) inner_tol : float, optional (default=1e-6) Stop threshold on error (inner CG solver) (>0) - verbose : bool, optional (default=False) - Print information along iterations log : bool, optional (default=False) record log if True + verbose : bool, optional (default=False) + Print information along iterations + verbose2 : bool, optional (default=False) + Print information along iterations Attributes ---------- -- cgit v1.2.3 From f67f8fdbcf5064cff0fa0455c750681fcd54fe7f Mon Sep 17 00:00:00 2001 From: ngayraud Date: Tue, 14 May 2019 18:16:39 +0200 Subject: Fixed pep8 related issue --- ot/da.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/ot/da.py b/ot/da.py index 9a67724..479e698 100644 --- a/ot/da.py +++ b/ot/da.py @@ -645,7 +645,8 @@ def OT_mapping_linear(xs, xt, reg=1e-6, ws=None, The function estimates the optimal linear operator that aligns the two empirical distributions. This is equivalent to estimating the closed form mapping between two Gaussian distributions :math:`N(\mu_s,\Sigma_s)` - and :math:`N(\mu_t,\Sigma_t)` as proposed in [14] and discussed in remark 2.29 in [15]. + and :math:`N(\mu_t,\Sigma_t)` as proposed in [14] and discussed in remark + 2.29 in [15]. The linear operator from source to target :math:`M` @@ -1198,14 +1199,14 @@ class SinkhornTransport(BaseTransport): distribution_estimation : callable, optional (defaults to the uniform) The kind of distribution estimation to employ out_of_sample_map : string, optional (default="ferradans") - The kind of out of sample mapping to apply to transport samples - from a domain into another one. Currently the only possible option is + The kind of out of sample mapping to apply to transport samples + from a domain into another one. Currently the only possible option is "ferradans" which uses the method proposed in [6]. limit_max: float, optional (defaul=np.infty) Controls the semi supervised mode. Transport between labeled source - and target samples of different classes will exhibit an cost defined + and target samples of different classes will exhibit an cost defined by this variable - + Attributes ---------- coupling_ : array-like, shape (n_source_samples, n_target_samples) @@ -1299,8 +1300,8 @@ class EMDTransport(BaseTransport): distribution_estimation : callable, optional (defaults to the uniform) The kind of distribution estimation to employ out_of_sample_map : string, optional (default="ferradans") - The kind of out of sample mapping to apply to transport samples - from a domain into another one. Currently the only possible option is + The kind of out of sample mapping to apply to transport samples + from a domain into another one. Currently the only possible option is "ferradans" which uses the method proposed in [6]. limit_max: float, optional (default=10) Controls the semi supervised mode. Transport between labeled source @@ -1405,8 +1406,8 @@ class SinkhornLpl1Transport(BaseTransport): distribution_estimation : callable, optional (defaults to the uniform) The kind of distribution estimation to employ out_of_sample_map : string, optional (default="ferradans") - The kind of out of sample mapping to apply to transport samples - from a domain into another one. Currently the only possible option is + The kind of out of sample mapping to apply to transport samples + from a domain into another one. Currently the only possible option is "ferradans" which uses the method proposed in [6]. limit_max: float, optional (defaul=np.infty) Controls the semi supervised mode. Transport between labeled source @@ -1526,8 +1527,8 @@ class SinkhornL1l2Transport(BaseTransport): distribution_estimation : callable, optional (defaults to the uniform) The kind of distribution estimation to employ out_of_sample_map : string, optional (default="ferradans") - The kind of out of sample mapping to apply to transport samples - from a domain into another one. Currently the only possible option is + The kind of out of sample mapping to apply to transport samples + from a domain into another one. Currently the only possible option is "ferradans" which uses the method proposed in [6]. limit_max: float, optional (default=10) Controls the semi supervised mode. Transport between labeled source -- cgit v1.2.3 From 549b95b5736b42f3fe74daf9805303a08b1ae01d Mon Sep 17 00:00:00 2001 From: tvayer Date: Tue, 28 May 2019 16:08:41 +0200 Subject: FGW+gromov changes --- README.md | 2 + examples/plot_fgw.py | 152 +++++++++++++++++++++++++ ot/bregman.py | 2 +- ot/gromov.py | 310 ++++++++++++++++++++++++++++++++++++++++++++++++--- ot/optim.py | 102 ++++++++++++++++- 5 files changed, 546 insertions(+), 22 deletions(-) create mode 100644 examples/plot_fgw.py diff --git a/README.md b/README.md index a22306d..be88f65 100644 --- a/README.md +++ b/README.md @@ -219,3 +219,5 @@ You can also post bug reports and feature requests in Github issues. Make sure t [16] Agueh, M., & Carlier, G. (2011). [Barycenters in the Wasserstein space](https://hal.archives-ouvertes.fr/hal-00637399/document). SIAM Journal on Mathematical Analysis, 43(2), 904-924. [17] Blondel, M., Seguy, V., & Rolet, A. (2018). [Smooth and Sparse Optimal Transport](https://arxiv.org/abs/1710.06276). Proceedings of the Twenty-First International Conference on Artificial Intelligence and Statistics (AISTATS). + +[18] Vayer, T., Chapel, L., Flamary, R., Tavenard, R. and Courty, N. (2019). [Optimal Transport for structured data with application on graphs](http://proceedings.mlr.press/v97/titouan19a.html) Proceedings of the 36th International Conference on Machine Learning (ICML). diff --git a/examples/plot_fgw.py b/examples/plot_fgw.py new file mode 100644 index 0000000..5c2d0e1 --- /dev/null +++ b/examples/plot_fgw.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +============================== +Plot Fused-gromov-Wasserstein +============================== + +This example illustrates the computation of FGW for 1D measures[18]. + +.. [18] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain + and Courty Nicolas + "Optimal Transport for structured data with application on graphs" + International Conference on Machine Learning (ICML). 2019. + +""" + +# Author: Titouan Vayer +# +# License: MIT License + +import matplotlib.pyplot as pl +import numpy as np +import ot +from ot.gromov import gromov_wasserstein,fused_gromov_wasserstein + +#%% parameters +# We create two 1D random measures +n=20 +n2=30 +sig=1 +sig2=0.1 + +np.random.seed(0) + +phi=np.arange(n)[:,None] +xs=phi+sig*np.random.randn(n,1) +ys=np.vstack((np.ones((n//2,1)),0*np.ones((n//2,1))))+sig2*np.random.randn(n,1) + +phi2=np.arange(n2)[:,None] +xt=phi2+sig*np.random.randn(n2,1) +yt=np.vstack((np.ones((n2//2,1)),0*np.ones((n2//2,1))))+sig2*np.random.randn(n2,1) +yt= yt[::-1,:] + +p=ot.unif(n) +q=ot.unif(n2) + +#%% plot the distributions + +pl.close(10) +pl.figure(10,(7,7)) + +pl.subplot(2,1,1) + +pl.scatter(ys,xs,c=phi,s=70) +pl.ylabel('Feature value a',fontsize=20) +pl.title('$\mu=\sum_i \delta_{x_i,a_i}$',fontsize=25, usetex=True, y=1) +pl.xticks(()) +pl.yticks(()) +pl.subplot(2,1,2) +pl.scatter(yt,xt,c=phi2,s=70) +pl.xlabel('coordinates x/y',fontsize=25) +pl.ylabel('Feature value b',fontsize=20) +pl.title('$\\nu=\sum_j \delta_{y_j,b_j}$',fontsize=25, usetex=True, y=1) +pl.yticks(()) +pl.tight_layout() +pl.show() + + +#%% Structure matrices and across-features distance matrix +C1=ot.dist(xs) +C2=ot.dist(xt).T +M=ot.dist(ys,yt) +w1=ot.unif(C1.shape[0]) +w2=ot.unif(C2.shape[0]) +Got=ot.emd([],[],M) + +#%% +cmap='Reds' +pl.close(10) +pl.figure(10,(5,5)) +fs=15 +l_x=[0,5,10,15] +l_y=[0,5,10,15,20,25] +gs = pl.GridSpec(5, 5) + +ax1=pl.subplot(gs[3:,:2]) + +pl.imshow(C1,cmap=cmap,interpolation='nearest') +pl.title("$C_1$",fontsize=fs) +pl.xlabel("$k$",fontsize=fs) +pl.ylabel("$i$",fontsize=fs) +pl.xticks(l_x) +pl.yticks(l_x) + +ax2=pl.subplot(gs[:3,2:]) + +pl.imshow(C2,cmap=cmap,interpolation='nearest') +pl.title("$C_2$",fontsize=fs) +pl.ylabel("$l$",fontsize=fs) +#pl.ylabel("$l$",fontsize=fs) +pl.xticks(()) +pl.yticks(l_y) +ax2.set_aspect('auto') + +ax3=pl.subplot(gs[3:,2:],sharex=ax2,sharey=ax1) +pl.imshow(M,cmap=cmap,interpolation='nearest') +pl.yticks(l_x) +pl.xticks(l_y) +pl.ylabel("$i$",fontsize=fs) +pl.title("$M_{AB}$",fontsize=fs) +pl.xlabel("$j$",fontsize=fs) +pl.tight_layout() +ax3.set_aspect('auto') +pl.show() + + +#%% Computing FGW and GW +alpha=1e-3 + +ot.tic() +Gwg,logw=fused_gromov_wasserstein(M,C1,C2,p,q,loss_fun='square_loss',alpha=alpha,verbose=True,log=True) +ot.toc() + +#%reload_ext WGW +Gg,log=gromov_wasserstein(C1,C2,p,q,loss_fun='square_loss',verbose=True,log=True) + +#%% visu OT matrix +cmap='Blues' +fs=15 +pl.figure(2,(13,5)) +pl.clf() +pl.subplot(1,3,1) +pl.imshow(Got,cmap=cmap,interpolation='nearest') +#pl.xlabel("$y$",fontsize=fs) +pl.ylabel("$i$",fontsize=fs) +pl.xticks(()) + +pl.title('Wasserstein ($M$ only)') + +pl.subplot(1,3,2) +pl.imshow(Gg,cmap=cmap,interpolation='nearest') +pl.title('Gromov ($C_1,C_2$ only)') +pl.xticks(()) +pl.subplot(1,3,3) +pl.imshow(Gwg,cmap=cmap,interpolation='nearest') +pl.title('FGW ($M+C_1,C_2$)') + +pl.xlabel("$j$",fontsize=fs) +pl.ylabel("$i$",fontsize=fs) + +pl.tight_layout() +pl.show() \ No newline at end of file diff --git a/ot/bregman.py b/ot/bregman.py index b017c1a..9040429 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -5,7 +5,7 @@ Bregman projections for regularized OT # Author: Remi Flamary # Nicolas Courty -# +# Titouan Vayer # License: MIT License import numpy as np diff --git a/ot/gromov.py b/ot/gromov.py index 0278e99..7491664 100644 --- a/ot/gromov.py +++ b/ot/gromov.py @@ -9,17 +9,18 @@ Gromov-Wasserstein transport method # Author: Erwan Vautier # Nicolas Courty # Rémi Flamary -# +# Titouan Vayer # License: MIT License import numpy as np + from .bregman import sinkhorn from .utils import dist from .optim import cg -def init_matrix(C1, C2, T, p, q, loss_fun='square_loss'): +def init_matrix(C1, C2, p, q, loss_fun='square_loss'): """ Return loss matrices and tensors for Gromov-Wasserstein fast computation Returns the value of \mathcal{L}(C1,C2) \otimes T with the selected loss @@ -77,16 +78,16 @@ def init_matrix(C1, C2, T, p, q, loss_fun='square_loss'): if loss_fun == 'square_loss': def f1(a): - return (a**2) / 2 + return (a**2) def f2(b): - return (b**2) / 2 + return (b**2) def h1(a): return a def h2(b): - return b + return 2*b elif loss_fun == 'kl_loss': def f1(a): return a * np.log(a + 1e-15) - a @@ -268,7 +269,7 @@ def update_kl_loss(p, lambdas, T, Cs): return np.exp(np.divide(tmpsum, ppt)) -def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, **kwargs): +def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False,amijo=False, **kwargs): """ Returns the gromov-wasserstein transport between (C1,p) and (C2,q) @@ -306,6 +307,9 @@ def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, **kwargs): Print information along iterations log : bool, optional record log if True + amijo : bool, optional + If True the steps of the line-search is found via an amijo research. Else closed form is used. + If there is convergence issues use False. **kwargs : dict parameters can be directly pased to the ot.optim.cg solver @@ -329,9 +333,7 @@ def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, **kwargs): """ - T = np.eye(len(p), len(q)) - - constC, hC1, hC2 = init_matrix(C1, C2, T, p, q, loss_fun) + constC, hC1, hC2 = init_matrix(C1, C2, p, q, loss_fun) G0 = p[:, None] * q[None, :] @@ -342,14 +344,79 @@ def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, **kwargs): return gwggrad(constC, hC1, hC2, G) if log: - res, log = cg(p, q, 0, 1, f, df, G0, log=True, **kwargs) + res, log = cg(p, q, 0, 1, f, df, G0,log=True,amijo=amijo,C1=C1,C2=C2,constC=constC, **kwargs) log['gw_dist'] = gwloss(constC, hC1, hC2, res) return res, log else: - return cg(p, q, 0, 1, f, df, G0, **kwargs) + return cg(p, q, 0, 1, f, df, G0,amijo=amijo, **kwargs) + +def fused_gromov_wasserstein(M,C1,C2,p,q,loss_fun='square_loss',alpha=0.5,amijo=False,**kwargs): + """ + Computes the FGW distance between two graphs see [3] + .. math:: + \gamma = arg\min_\gamma (1-\alpha)*<\gamma,M>_F + alpha* \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} + s.t. \gamma 1 = p + \gamma^T 1= q + \gamma\geq 0 + where : + - M is the (ns,nt) metric cost matrix + - :math:`f` is the regularization term ( and df is its gradient) + - a and b are source and target weights (sum to 1) + The algorithm used for solving the problem is conditional gradient as discussed in [1]_ + Parameters + ---------- + M : ndarray, shape (ns, nt) + Metric cost matrix between features across domains + C1 : ndarray, shape (ns, ns) + Metric cost matrix respresentative of the structure in the source space + C2 : ndarray, shape (nt, nt) + Metric cost matrix espresentative of the structure in the target space + p : ndarray, shape (ns,) + distribution in the source space + q : ndarray, shape (nt,) + distribution in the target space + loss_fun : string,optionnal + loss function used for the solver + max_iter : int, optional + Max number of iterations + tol : float, optional + Stop threshold on error (>0) + verbose : bool, optional + Print information along iterations + log : bool, optional + record log if True + amijo : bool, optional + If True the steps of the line-search is found via an amijo research. Else closed form is used. + If there is convergence issues use False. + **kwargs : dict + parameters can be directly pased to the ot.optim.cg solver + Returns + ------- + gamma : (ns x nt) ndarray + Optimal transportation matrix for the given parameters + log : dict + log dictionary return only if log==True in parameters + References + ---------- + .. [18] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain + and Courty Nicolas + "Optimal Transport for structured data with application on graphs" + International Conference on Machine Learning (ICML). 2019. + """ + + constC,hC1,hC2=init_matrix(C1,C2,p,q,loss_fun) + + G0=p[:,None]*q[None,:] + + def f(G): + return gwloss(constC,hC1,hC2,G) + def df(G): + return gwggrad(constC,hC1,hC2,G) + + return cg(p,q,M,alpha,f,df,G0,amijo=amijo,C1=C1,C2=C2,constC=constC,**kwargs) -def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False, **kwargs): +def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False,amijo=False, **kwargs): """ Returns the gromov-wasserstein discrepancy between (C1,p) and (C2,q) @@ -387,7 +454,9 @@ def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False, **kwargs): Print information along iterations log : bool, optional record log if True - + amijo : bool, optional + If True the steps of the line-search is found via an amijo research. Else closed form is used. + If there is convergence issues use False. Returns ------- gw_dist : float @@ -407,9 +476,7 @@ def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False, **kwargs): """ - T = np.eye(len(p), len(q)) - - constC, hC1, hC2 = init_matrix(C1, C2, T, p, q, loss_fun) + constC, hC1, hC2 = init_matrix(C1, C2, p, q, loss_fun) G0 = p[:, None] * q[None, :] @@ -418,7 +485,7 @@ def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False, **kwargs): def df(G): return gwggrad(constC, hC1, hC2, G) - res, log = cg(p, q, 0, 1, f, df, G0, log=True, **kwargs) + res, log = cg(p, q, 0, 1, f, df, G0, log=True,amijo=amijo,C1=C1,C2=C2,constC=constC, **kwargs) log['gw_dist'] = gwloss(constC, hC1, hC2, res) log['T'] = res if log: @@ -495,7 +562,7 @@ def entropic_gromov_wasserstein(C1, C2, p, q, loss_fun, epsilon, T = np.outer(p, q) # Initialization - constC, hC1, hC2 = init_matrix(C1, C2, T, p, q, loss_fun) + constC, hC1, hC2 = init_matrix(C1, C2, p, q, loss_fun) cpt = 0 err = 1 @@ -815,3 +882,210 @@ def gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, cpt += 1 return C + +def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_features=False,p=None,loss_fun='square_loss', + max_iter=100, tol=1e-9,verbose=False,log=True,init_C=None,init_X=None): + + """ + Compute the fgw barycenter as presented eq (5) in [3]. + ---------- + N : integer + Desired number of samples of the target barycenter + Ys: list of ndarray, each element has shape (ns,d) + Features of all samples + Cs : list of ndarray, each element has shape (ns,ns) + Structure matrices of all samples + ps : list of ndarray, each element has shape (ns,) + masses of all samples + lambdas : list of float + list of the S spaces' weights + alpha : float + Alpha parameter for the fgw distance + fixed_structure : bool + Wether to fix the structure of the barycenter during the updates + fixed_features : bool + Wether to fix the feature of the barycenter during the updates + init_C : ndarray, shape (N,N), optional + initialization for the barycenters' structure matrix. If not set random init + init_X : ndarray, shape (N,d), optional + initialization for the barycenters' features. If not set random init + Returns + ---------- + X : ndarray, shape (N,d) + Barycenters' features + C : ndarray, shape (N,N) + Barycenters' structure matrix + log_: + T : list of (N,ns) transport matrices + Ms : all distance matrices between the feature of the barycenter and the other features dist(X,Ys) shape (N,ns) + References + ---------- + .. [18] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain + and Courty Nicolas + "Optimal Transport for structured data with application on graphs" + International Conference on Machine Learning (ICML). 2019. + """ + S = len(Cs) + d = Ys[0].shape[1] #dimension on the node features + if p is None: + p = np.ones(N)/N + + Cs = [np.asarray(Cs[s], dtype=np.float64) for s in range(S)] + Ys = [np.asarray(Ys[s], dtype=np.float64) for s in range(S)] + + lambdas = np.asarray(lambdas, dtype=np.float64) + + if fixed_structure: + if init_C is None: + C=Cs[0] + else: + C=init_C + else: + if init_C is None: + xalea = np.random.randn(N, 2) + C = dist(xalea, xalea) + else: + C = init_C + + if fixed_features: + if init_X is None: + X=Ys[0] + else : + X= init_X + else: + if init_X is None: + X=np.zeros((N,d)) + else: + X = init_X + + T=[np.outer(p,q) for q in ps] + + # X is N,d + # Ys is ns,d + Ms = [np.asarray(dist(X,Ys[s]), dtype=np.float64) for s in range(len(Ys))] + # Ms is N,ns + + cpt = 0 + err_feature = 1 + err_structure = 1 + + if log: + log_={} + log_['err_feature']=[] + log_['err_structure']=[] + log_['Ts_iter']=[] + + while((err_feature > tol or err_structure > tol) and cpt < max_iter): + Cprev = C + Xprev = X + + if not fixed_features: + Ys_temp=[y.T for y in Ys] + X=update_feature_matrix(lambdas,Ys_temp,T,p) + + # X must be N,d + # Ys must be ns,d + Ms=[np.asarray(dist(X,Ys[s]), dtype=np.float64) for s in range(len(Ys))] + + if not fixed_structure: + if loss_fun == 'square_loss': + # T must be ns,N + # Cs must be ns,ns + # p must be N,1 + T_temp=[t.T for t in T] + C = update_sructure_matrix(p, lambdas, T_temp, Cs) + + # Ys must be d,ns + # Ts must be N,ns + # p must be N,1 + # Ms is N,ns + # C is N,N + # Cs is ns,ns + # p is N,1 + # ps is ns,1 + + T = [fused_gromov_wasserstein((1-alpha)*Ms[s],C,Cs[s],p,ps[s],loss_fun,alpha,numItermax=max_iter, stopThr=1e-5, verbose=verbose) for s in range(S)] + + # T is N,ns + + log_['Ts_iter'].append(T) + err_feature = np.linalg.norm(X - Xprev.reshape(d,N)) + err_structure = np.linalg.norm(C - Cprev) + + if log: + log_['err_feature'].append(err_feature) + log_['err_structure'].append(err_structure) + + if verbose: + if cpt % 200 == 0: + print('{:5s}|{:12s}'.format( + 'It.', 'Err') + '\n' + '-' * 19) + print('{:5d}|{:8e}|'.format(cpt, err_structure)) + print('{:5d}|{:8e}|'.format(cpt, err_feature)) + + cpt += 1 + log_['T']=T # ce sont les matrices du barycentre de la target vers les Ys + log_['p']=p + log_['Ms']=Ms #Ms sont de tailles N,ns + + return X.T,C,log_ + + +def update_sructure_matrix(p, lambdas, T, Cs): + """ + Updates C according to the L2 Loss kernel with the S Ts couplings + calculated at each iteration + Parameters + ---------- + p : ndarray, shape (N,) + masses in the targeted barycenter + lambdas : list of float + list of the S spaces' weights + T : list of S np.ndarray(ns,N) + the S Ts couplings calculated at each iteration + Cs : list of S ndarray, shape(ns,ns) + Metric cost matrices + Returns + ---------- + C : ndarray, shape (nt,nt) + updated C matrix + """ + tmpsum = sum([lambdas[s] * np.dot(T[s].T, Cs[s]).dot(T[s]) for s in range(len(T))]) + ppt = np.outer(p, p) + + return np.divide(tmpsum, ppt) + +def update_feature_matrix(lambdas,Ys,Ts,p): + + """ + Updates the feature with respect to the S Ts couplings. See "Solving the barycenter problem with Block Coordinate Descent (BCD)" in [3] + calculated at each iteration + Parameters + ---------- + p : ndarray, shape (N,) + masses in the targeted barycenter + lambdas : list of float + list of the S spaces' weights + Ts : list of S np.ndarray(ns,N) + the S Ts couplings calculated at each iteration + Ys : list of S ndarray, shape(d,ns) + The features + Returns + ---------- + X : ndarray, shape (d,N) + + References + ---------- + .. [18] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain + and Courty Nicolas + "Optimal Transport for structured data with application on graphs" + International Conference on Machine Learning (ICML). 2019. + """ + + p=np.diag(np.array(1/p).reshape(-1,)) + + tmpsum = sum([lambdas[s] * np.dot(Ys[s],Ts[s].T).dot(p) for s in range(len(Ts))]) + + return tmpsum + + diff --git a/ot/optim.py b/ot/optim.py index f31fae2..a774865 100644 --- a/ot/optim.py +++ b/ot/optim.py @@ -4,7 +4,7 @@ Optimization algorithms for OT """ # Author: Remi Flamary -# +# Titouan Vayer # License: MIT License import numpy as np @@ -71,9 +71,70 @@ def line_search_armijo(f, xk, pk, gfk, old_fval, return alpha, fc[0], phi1 +def do_linesearch(cost,G,deltaG,Mi,f_val, + amijo=False,C1=None,C2=None,reg=None,Gc=None,constC=None,M=None): + """ + Solve the linesearch in the FW iterations + Parameters + ---------- + cost : method + The FGW cost + G : ndarray, shape(ns,nt) + The transport map at a given iteration of the FW + deltaG : ndarray (ns,nt) + Difference between the optimal map found by linearization in the FW algorithm and the value at a given iteration + Mi : ndarray (ns,nt) + Cost matrix of the linearized transport problem. Corresponds to the gradient of the cost + f_val : float + Value of the cost at G + amijo : bool, optionnal + If True the steps of the line-search is found via an amijo research. Else closed form is used. + If there is convergence issues use False. + C1 : ndarray (ns,ns), optionnal + Structure matrix in the source domain. Only used when amijo=False + C2 : ndarray (nt,nt), optionnal + Structure matrix in the target domain. Only used when amijo=False + reg : float, optionnal + Regularization parameter. Corresponds to the alpha parameter of FGW. Only used when amijo=False + Gc : ndarray (ns,nt) + Optimal map found by linearization in the FW algorithm. Only used when amijo=False + constC : ndarray (ns,nt) + Constant for the gromov cost. See [3]. Only used when amijo=False + M : ndarray (ns,nt), optionnal + Cost matrix between the features. Only used when amijo=False + Returns + ------- + alpha : float + The optimal step size of the FW + fc : int + nb of function call. Useless here + f_val : float + The value of the cost for the next iteration + References + ---------- + .. [18] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain + and Courty Nicolas + "Optimal Transport for structured data with application on graphs" + International Conference on Machine Learning (ICML). 2019. + """ + if amijo: + alpha, fc, f_val = line_search_armijo(cost, G, deltaG, Mi, f_val) + else: # requires symetric matrices + dot1=np.dot(C1,deltaG) + dot12=dot1.dot(C2) + a=-2*reg*np.sum(dot12*deltaG) + b=np.sum((M+reg*constC)*deltaG)-2*reg*(np.sum(dot12*G)+np.sum(np.dot(C1,G).dot(C2)*deltaG)) + c=cost(G) + + alpha=solve_1d_linesearch_quad_funct(a,b,c) + fc=None + f_val=cost(G+alpha*deltaG) + + return alpha,fc,f_val + def cg(a, b, M, reg, f, df, G0=None, numItermax=200, - stopThr=1e-9, verbose=False, log=False): + stopThr=1e-9, verbose=False, log=False,**kwargs): """ Solve the general regularized OT problem with conditional gradient @@ -116,6 +177,8 @@ def cg(a, b, M, reg, f, df, G0=None, numItermax=200, Print information along iterations log : bool, optional record log if True + kwargs : dict + Parameters for linesearch Returns ------- @@ -177,7 +240,7 @@ def cg(a, b, M, reg, f, df, G0=None, numItermax=200, deltaG = Gc - G # line search - alpha, fc, f_val = line_search_armijo(cost, G, deltaG, Mi, f_val) + alpha, fc, f_val = do_linesearch(cost, G, deltaG, Mi, f_val, reg=reg, M=M, Gc=Gc,**kwargs) G = G + alpha * deltaG @@ -339,3 +402,36 @@ def gcg(a, b, M, reg1, reg2, f, df, G0=None, numItermax=10, return G, log else: return G + +def solve_1d_linesearch_quad_funct(a,b,c): + """ + Solve on 0,1 the following problem: + .. math:: + \min f(x)=a*x^{2}+b*x+c + + Parameters + ---------- + a,b,c : float + The coefficients of the quadratic function + + Returns + ------- + x : float + The optimal value which leads to the minimal cost + + """ + f0=c + df0=b + f1=a+f0+df0 + + if a>0: # convex + minimum=min(1,max(0,-b/(2*a))) + #print('entrelesdeux') + return minimum + else: # non convexe donc sur les coins + if f0>f1: + #print('sur1 f(1)={}'.format(f(1))) + return 1 + else: + #print('sur0 f(0)={}'.format(f(0))) + return 0 -- cgit v1.2.3 From b1b514f5d9de009e63bd407dfd9c0a0cf6128876 Mon Sep 17 00:00:00 2001 From: tvayer Date: Tue, 28 May 2019 16:50:00 +0200 Subject: bary fgw --- examples/plot_barycenter_fgw.py | 172 ++++++++++++++++++++++++++++++++++++++++ examples/plot_fgw.py | 1 - ot/gromov.py | 15 ++-- 3 files changed, 180 insertions(+), 8 deletions(-) create mode 100644 examples/plot_barycenter_fgw.py diff --git a/examples/plot_barycenter_fgw.py b/examples/plot_barycenter_fgw.py new file mode 100644 index 0000000..f416629 --- /dev/null +++ b/examples/plot_barycenter_fgw.py @@ -0,0 +1,172 @@ +# -*- coding: utf-8 -*- +""" +================================= +Plot graphs' barycenter using FGW +================================= + +This example illustrates the computation barycenter of labeled graphs using FGW + +Requires networkx >=2 + +.. [18] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain + and Courty Nicolas + "Optimal Transport for structured data with application on graphs" + International Conference on Machine Learning (ICML). 2019. + +""" + +# Author: Titouan Vayer +# +# License: MIT License + +#%% load libraries +import numpy as np +import matplotlib.pyplot as plt +import networkx as nx +import math +from scipy.sparse.csgraph import shortest_path +import matplotlib.colors as mcol +from matplotlib import cm +from ot.gromov import fgw_barycenters +#%% Graph functions + +def find_thresh(C,inf=0.5,sup=3,step=10): + """ Trick to find the adequate thresholds from where value of the C matrix are considered close enough to say that nodes are connected + Tthe threshold is found by a linesearch between values "inf" and "sup" with "step" thresholds tested. + The optimal threshold is the one which minimizes the reconstruction error between the shortest_path matrix coming from the thresholded adjency matrix + and the original matrix. + Parameters + ---------- + C : ndarray, shape (n_nodes,n_nodes) + The structure matrix to threshold + inf : float + The beginning of the linesearch + sup : float + The end of the linesearch + step : integer + Number of thresholds tested + """ + dist=[] + search=np.linspace(inf,sup,step) + for thresh in search: + Cprime=sp_to_adjency(C,0,thresh) + SC=shortest_path(Cprime,method='D') + SC[SC==float('inf')]=100 + dist.append(np.linalg.norm(SC-C)) + return search[np.argmin(dist)],dist + +def sp_to_adjency(C,threshinf=0.2,threshsup=1.8): + """ Thresholds the structure matrix in order to compute an adjency matrix. + All values between threshinf and threshsup are considered representing connected nodes and set to 1. Else are set to 0 + Parameters + ---------- + C : ndarray, shape (n_nodes,n_nodes) + The structure matrix to threshold + threshinf : float + The minimum value of distance from which the new value is set to 1 + threshsup : float + The maximum value of distance from which the new value is set to 1 + Returns + ------- + C : ndarray, shape (n_nodes,n_nodes) + The threshold matrix. Each element is in {0,1} + """ + H=np.zeros_like(C) + np.fill_diagonal(H,np.diagonal(C)) + C=C-H + C=np.minimum(np.maximum(C,threshinf),threshsup) + C[C==threshsup]=0 + C[C!=0]=1 + + return C + +def build_noisy_circular_graph(N=20,mu=0,sigma=0.3,with_noise=False,structure_noise=False,p=None): + """ Create a noisy circular graph + """ + g=nx.Graph() + g.add_nodes_from(list(range(N))) + for i in range(N): + noise=float(np.random.normal(mu,sigma,1)) + if with_noise: + g.add_node(i,attr_name=math.sin((2*i*math.pi/N))+noise) + else: + g.add_node(i,attr_name=math.sin(2*i*math.pi/N)) + g.add_edge(i,i+1) + if structure_noise: + randomint=np.random.randint(0,p) + if randomint==0: + if i<=N-3: + g.add_edge(i,i+2) + if i==N-2: + g.add_edge(i,0) + if i==N-1: + g.add_edge(i,1) + g.add_edge(N,0) + noise=float(np.random.normal(mu,sigma,1)) + if with_noise: + g.add_node(N,attr_name=math.sin((2*N*math.pi/N))+noise) + else: + g.add_node(N,attr_name=math.sin(2*N*math.pi/N)) + return g + +def graph_colors(nx_graph,vmin=0,vmax=7): + cnorm = mcol.Normalize(vmin=vmin,vmax=vmax) + cpick = cm.ScalarMappable(norm=cnorm,cmap='viridis') + cpick.set_array([]) + val_map = {} + for k,v in nx.get_node_attributes(nx_graph,'attr_name').items(): + val_map[k]=cpick.to_rgba(v) + colors=[] + for node in nx_graph.nodes(): + colors.append(val_map[node]) + return colors + +#%% create dataset +# We build a dataset of noisy circular graphs. +# Noise is added on the structures by random connections and on the features by gaussian noise. + +np.random.seed(30) +X0=[] +for k in range(9): + X0.append(build_noisy_circular_graph(np.random.randint(15,25),with_noise=True,structure_noise=True,p=3)) + +#%% Plot dataset + +plt.figure(figsize=(8,10)) +for i in range(len(X0)): + plt.subplot(3,3,i+1) + g=X0[i] + pos=nx.kamada_kawai_layout(g) + nx.draw(g,pos=pos,node_color = graph_colors(g,vmin=-1,vmax=1),with_labels=False,node_size=100) +plt.suptitle('Dataset of noisy graphs. Color indicates the label',fontsize=20) +plt.show() + + + +#%% +# We compute the barycenter using FGW. Structure matrices are computed using the shortest_path distance in the graph +# Features distances are the euclidean distances +Cs=[shortest_path(nx.adjacency_matrix(x)) for x in X0] +ps=[np.ones(len(x.nodes()))/len(x.nodes()) for x in X0] +Ys=[np.array([v for (k,v) in nx.get_node_attributes(x,'attr_name').items()]).reshape(-1,1) for x in X0] +lambdas=np.array([np.ones(len(Ys))/len(Ys)]).ravel() +sizebary=15 # we choose a barycenter with 15 nodes + +#%% + +A,C,log=fgw_barycenters(sizebary,Ys,Cs,ps,lambdas,alpha=0.95) + +#%% +bary=nx.from_numpy_matrix(sp_to_adjency(C,threshinf=0,threshsup=find_thresh(C,sup=100,step=100)[0])) +for i in range(len(A.ravel())): + bary.add_node(i,attr_name=float(A.ravel()[i])) + +#%% +pos = nx.kamada_kawai_layout(bary) +nx.draw(bary,pos=pos,node_color = graph_colors(bary,vmin=-1,vmax=1),with_labels=False) +plt.suptitle('Barycenter',fontsize=20) +plt.show() + + + + diff --git a/examples/plot_fgw.py b/examples/plot_fgw.py index 5c2d0e1..bfa7fb4 100644 --- a/examples/plot_fgw.py +++ b/examples/plot_fgw.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ============================== diff --git a/ot/gromov.py b/ot/gromov.py index 7491664..31bd657 100644 --- a/ot/gromov.py +++ b/ot/gromov.py @@ -883,8 +883,9 @@ def gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, return C -def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_features=False,p=None,loss_fun='square_loss', - max_iter=100, tol=1e-9,verbose=False,log=True,init_C=None,init_X=None): +def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_features=False, + p=None,loss_fun='square_loss',max_iter=100, tol=1e-9, + verbose=False,log=True,init_C=None,init_X=None): """ Compute the fgw barycenter as presented eq (5) in [3]. @@ -957,7 +958,7 @@ def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_feature X=np.zeros((N,d)) else: X = init_X - + T=[np.outer(p,q) for q in ps] # X is N,d @@ -981,7 +982,7 @@ def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_feature if not fixed_features: Ys_temp=[y.T for y in Ys] - X=update_feature_matrix(lambdas,Ys_temp,T,p) + X=update_feature_matrix(lambdas,Ys_temp,T,p).T # X must be N,d # Ys must be ns,d @@ -1024,11 +1025,11 @@ def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_feature print('{:5d}|{:8e}|'.format(cpt, err_feature)) cpt += 1 - log_['T']=T # ce sont les matrices du barycentre de la target vers les Ys + log_['T']=T # from target to Ys log_['p']=p - log_['Ms']=Ms #Ms sont de tailles N,ns + log_['Ms']=Ms #Ms are N,ns - return X.T,C,log_ + return X,C,log_ def update_sructure_matrix(p, lambdas, T, Cs): -- cgit v1.2.3 From cd4b98c34f885176f33db3fab16530622f29ab42 Mon Sep 17 00:00:00 2001 From: tvayer Date: Tue, 28 May 2019 17:13:21 +0200 Subject: solve conlict --- README.md | 15 ++++++++++++++- ot/bregman.py | 1 + ot/gromov.py | 6 +++--- ot/optim.py | 2 +- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index be88f65..13e1013 100644 --- a/README.md +++ b/README.md @@ -220,4 +220,17 @@ You can also post bug reports and feature requests in Github issues. Make sure t [17] Blondel, M., Seguy, V., & Rolet, A. (2018). [Smooth and Sparse Optimal Transport](https://arxiv.org/abs/1710.06276). Proceedings of the Twenty-First International Conference on Artificial Intelligence and Statistics (AISTATS). -[18] Vayer, T., Chapel, L., Flamary, R., Tavenard, R. and Courty, N. (2019). [Optimal Transport for structured data with application on graphs](http://proceedings.mlr.press/v97/titouan19a.html) Proceedings of the 36th International Conference on Machine Learning (ICML). +[18] Genevay, A., Cuturi, M., Peyré, G. & Bach, F. (2016) [Stochastic Optimization for Large-scale Optimal Transport](https://arxiv.org/abs/1605.08527). Advances in Neural Information Processing Systems (2016). + +[19] Seguy, V., Bhushan Damodaran, B., Flamary, R., Courty, N., Rolet, A.& Blondel, M. [Large-scale Optimal Transport and Mapping Estimation](https://arxiv.org/pdf/1711.02283.pdf). International Conference on Learning Representation (2018) + +[20] Cuturi, M. and Doucet, A. (2014) [Fast Computation of Wasserstein Barycenters](http://proceedings.mlr.press/v32/cuturi14.html). International Conference in Machine Learning + +[21] Solomon, J., De Goes, F., Peyré, G., Cuturi, M., Butscher, A., Nguyen, A. & Guibas, L. (2015). [Convolutional wasserstein distances: Efficient optimal transportation on geometric domains](https://dl.acm.org/citation.cfm?id=2766963). ACM Transactions on Graphics (TOG), 34(4), 66. + +[22] J. Altschuler, J.Weed, P. Rigollet, (2017) [Near-linear time approximation algorithms for optimal transport via Sinkhorn iteration](https://papers.nips.cc/paper/6792-near-linear-time-approximation-algorithms-for-optimal-transport-via-sinkhorn-iteration.pdf), Advances in Neural Information Processing Systems (NIPS) 31 + +[23] Aude, G., Peyré, G., Cuturi, M., [Learning Generative Models with Sinkhorn Divergences](https://arxiv.org/abs/1706.00292), Proceedings of the Twenty-First International Conference on Artficial Intelligence and Statistics, (AISTATS) 21, 2018 + +[24] Vayer, T., Chapel, L., Flamary, R., Tavenard, R. and Courty, N. (2019). [Optimal Transport for structured data with application on graphs](http://proceedings.mlr.press/v97/titouan19a.html) Proceedings of the 36th International Conference on Machine Learning (ICML). + diff --git a/ot/bregman.py b/ot/bregman.py index 9040429..7be67b8 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -5,6 +5,7 @@ Bregman projections for regularized OT # Author: Remi Flamary # Nicolas Courty +# Kilian Fatras # Titouan Vayer # License: MIT License diff --git a/ot/gromov.py b/ot/gromov.py index 31bd657..ad68a1c 100644 --- a/ot/gromov.py +++ b/ot/gromov.py @@ -398,7 +398,7 @@ def fused_gromov_wasserstein(M,C1,C2,p,q,loss_fun='square_loss',alpha=0.5,amijo= log dictionary return only if log==True in parameters References ---------- - .. [18] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain + .. [24] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain and Courty Nicolas "Optimal Transport for structured data with application on graphs" International Conference on Machine Learning (ICML). 2019. @@ -921,7 +921,7 @@ def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_feature Ms : all distance matrices between the feature of the barycenter and the other features dist(X,Ys) shape (N,ns) References ---------- - .. [18] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain + .. [24] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain and Courty Nicolas "Optimal Transport for structured data with application on graphs" International Conference on Machine Learning (ICML). 2019. @@ -1077,7 +1077,7 @@ def update_feature_matrix(lambdas,Ys,Ts,p): References ---------- - .. [18] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain + .. [24] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain and Courty Nicolas "Optimal Transport for structured data with application on graphs" International Conference on Machine Learning (ICML). 2019. diff --git a/ot/optim.py b/ot/optim.py index a774865..9fce21e 100644 --- a/ot/optim.py +++ b/ot/optim.py @@ -112,7 +112,7 @@ def do_linesearch(cost,G,deltaG,Mi,f_val, The value of the cost for the next iteration References ---------- - .. [18] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain + .. [24] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain and Courty Nicolas "Optimal Transport for structured data with application on graphs" International Conference on Machine Learning (ICML). 2019. -- cgit v1.2.3 From 11c2c26ff897e5763e714546e7021cffa8d673a7 Mon Sep 17 00:00:00 2001 From: tvayer Date: Tue, 28 May 2019 17:19:40 +0200 Subject: solve 2 --- README.md | 20 +++++++++++--------- ot/bregman.py | 1 + 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 13e1013..9951773 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ [![Anaconda Cloud](https://anaconda.org/conda-forge/pot/badges/version.svg)](https://anaconda.org/conda-forge/pot) [![Build Status](https://travis-ci.org/rflamary/POT.svg?branch=master)](https://travis-ci.org/rflamary/POT) [![Documentation Status](https://readthedocs.org/projects/pot/badge/?version=latest)](http://pot.readthedocs.io/en/latest/?badge=latest) +[![Downloads](https://pepy.tech/badge/pot)](https://pepy.tech/project/pot) [![Anaconda downloads](https://anaconda.org/conda-forge/pot/badges/downloads.svg)](https://anaconda.org/conda-forge/pot) [![License](https://anaconda.org/conda-forge/pot/badges/license.svg)](https://github.com/rflamary/POT/blob/master/LICENSE) @@ -14,15 +15,18 @@ This open source Python library provide several solvers for optimization problem It provides the following solvers: * OT Network Flow solver for the linear program/ Earth Movers Distance [1]. -* Entropic regularization OT solver with Sinkhorn Knopp Algorithm [2] and stabilized version [9][10] with optional GPU implementation (requires cudamat). +* Entropic regularization OT solver with Sinkhorn Knopp Algorithm [2], stabilized version [9][10] and greedy Sinkhorn [22] with optional GPU implementation (requires cupy). +* Sinkhorn divergence [23] and entropic regularization OT from empirical data. * Smooth optimal transport solvers (dual and semi-dual) for KL and squared L2 regularizations [17]. * Non regularized Wasserstein barycenters [16] with LP solver (only small scale). -* Bregman projections for Wasserstein barycenter [3] and unmixing [4]. +* Bregman projections for Wasserstein barycenter [3], convolutional barycenter [21] and unmixing [4]. * Optimal transport for domain adaptation with group lasso regularization [5] * Conditional gradient [6] and Generalized conditional gradient for regularized OT [7]. * Linear OT [14] and Joint OT matrix and mapping estimation [8]. * Wasserstein Discriminant Analysis [11] (requires autograd + pymanopt). * Gromov-Wasserstein distances and barycenters ([13] and regularized [12]) +* Stochastic Optimization for Large-scale Optimal Transport (semi-dual problem [18] and dual problem [19]) +* Non regularized free support Wasserstein barycenters [20]. Some demonstrations (both in Python and Jupyter Notebook format) are available in the examples folder. @@ -77,16 +81,12 @@ Note that for easier access the module is name ot instead of pot. Some sub-modules require additional dependences which are discussed below -* **ot.dr** (Wasserstein dimensionality rediuction) depends on autograd and pymanopt that can be installed with: +* **ot.dr** (Wasserstein dimensionality reduction) depends on autograd and pymanopt that can be installed with: ``` pip install pymanopt autograd ``` -* **ot.gpu** (GPU accelerated OT) depends on cudamat that have to be installed with: -``` -git clone https://github.com/cudamat/cudamat.git -cd cudamat -python setup.py install --user # for user install (no root) -``` +* **ot.gpu** (GPU accelerated OT) depends on cupy that have to be installed following instructions on [this page](https://docs-cupy.chainer.org/en/stable/install.html). + obviously you need CUDA installed and a compatible GPU. @@ -162,6 +162,8 @@ The contributors to this library are: * [Stanislas Chambon](https://slasnista.github.io/) * [Antoine Rolet](https://arolet.github.io/) * Erwan Vautier (Gromov-Wasserstein) +* [Kilian Fatras](https://kilianfatras.github.io/) +* [Alain Rakotomamonjy](https://sites.google.com/site/alainrakotomamonjy/home) This toolbox benefit a lot from open source research and we would like to thank the following persons for providing some code (in various languages): diff --git a/ot/bregman.py b/ot/bregman.py index 7be67b8..ffa6202 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -7,6 +7,7 @@ Bregman projections for regularized OT # Nicolas Courty # Kilian Fatras # Titouan Vayer +# # License: MIT License import numpy as np -- cgit v1.2.3 From 6484c9ea301fc15ae53b4afe134941909f581ffe Mon Sep 17 00:00:00 2001 From: tvayer Date: Wed, 29 May 2019 14:11:48 +0200 Subject: Tests + contributions --- README.md | 1 + ot/gromov.py | 12 ++++++--- test/test_gromov.py | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++ test/test_optim.py | 5 ++++ 4 files changed, 89 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9951773..9692344 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,7 @@ The contributors to this library are: * Erwan Vautier (Gromov-Wasserstein) * [Kilian Fatras](https://kilianfatras.github.io/) * [Alain Rakotomamonjy](https://sites.google.com/site/alainrakotomamonjy/home) +* [Vayer Titouan](https://tvayer.github.io/) This toolbox benefit a lot from open source research and we would like to thank the following persons for providing some code (in various languages): diff --git a/ot/gromov.py b/ot/gromov.py index ad68a1c..297b194 100644 --- a/ot/gromov.py +++ b/ot/gromov.py @@ -926,6 +926,10 @@ def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_feature "Optimal Transport for structured data with application on graphs" International Conference on Machine Learning (ICML). 2019. """ + + class UndefinedParameter(Exception): + pass + S = len(Cs) d = Ys[0].shape[1] #dimension on the node features if p is None: @@ -938,7 +942,7 @@ def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_feature if fixed_structure: if init_C is None: - C=Cs[0] + raise UndefinedParameter('If C is fixed it must be initialized') else: C=init_C else: @@ -950,7 +954,7 @@ def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_feature if fixed_features: if init_X is None: - X=Ys[0] + raise UndefinedParameter('If X is fixed it must be initialized') else : X= init_X else: @@ -1004,13 +1008,13 @@ def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_feature # Cs is ns,ns # p is N,1 # ps is ns,1 - + T = [fused_gromov_wasserstein((1-alpha)*Ms[s],C,Cs[s],p,ps[s],loss_fun,alpha,numItermax=max_iter, stopThr=1e-5, verbose=verbose) for s in range(S)] # T is N,ns log_['Ts_iter'].append(T) - err_feature = np.linalg.norm(X - Xprev.reshape(d,N)) + err_feature = np.linalg.norm(X - Xprev.reshape(N,d)) err_structure = np.linalg.norm(C - Cprev) if log: diff --git a/test/test_gromov.py b/test/test_gromov.py index fb86274..07cd874 100644 --- a/test/test_gromov.py +++ b/test/test_gromov.py @@ -143,3 +143,78 @@ def test_gromov_entropic_barycenter(): 'kl_loss', 2e-3, max_iter=100, tol=1e-3) np.testing.assert_allclose(Cb2.shape, (n_samples, n_samples)) + +def test_fgw(): + n_samples = 50 # nb samples + + mu_s = np.array([0, 0]) + cov_s = np.array([[1, 0], [0, 1]]) + + xs = ot.datasets.make_2D_samples_gauss(n_samples, mu_s, cov_s) + + xt = xs[::-1].copy() + + ys = np.random.randn(xs.shape[0],2) + yt= ys[::-1].copy() + + p = ot.unif(n_samples) + q = ot.unif(n_samples) + + C1 = ot.dist(xs, xs) + C2 = ot.dist(xt, xt) + + C1 /= C1.max() + C2 /= C2.max() + + M=ot.dist(ys,yt) + M/=M.max() + + G = ot.gromov.fused_gromov_wasserstein(M,C1, C2, p, q, 'square_loss',alpha=0.5) + + # check constratints + np.testing.assert_allclose( + p, G.sum(1), atol=1e-04) # cf convergence fgw + np.testing.assert_allclose( + q, G.sum(0), atol=1e-04) # cf convergence fgw + + +def test_fgw_barycenter(): + + ns = 50 + nt = 60 + + Xs, ys = ot.datasets.make_data_classif('3gauss', ns) + Xt, yt = ot.datasets.make_data_classif('3gauss2', nt) + + ys = np.random.randn(Xs.shape[0],2) + yt= np.random.randn(Xt.shape[0],2) + + C1 = ot.dist(Xs) + C2 = ot.dist(Xt) + + n_samples = 3 + X,C,log = ot.gromov.fgw_barycenters(n_samples,[ys,yt] ,[C1, C2],[ot.unif(ns), ot.unif(nt)],[.5, .5],0.5, + fixed_structure=False,fixed_features=False, + p=ot.unif(n_samples),loss_fun='square_loss', + max_iter=100, tol=1e-3) + np.testing.assert_allclose(C.shape, (n_samples, n_samples)) + np.testing.assert_allclose(X.shape, (n_samples, ys.shape[1])) + + xalea = np.random.randn(n_samples, 2) + init_C = ot.dist(xalea, xalea) + + X,C,log = ot.gromov.fgw_barycenters(n_samples,[ys,yt] ,[C1, C2],ps=[ot.unif(ns), ot.unif(nt)],lambdas=[.5, .5],alpha=0.5, + fixed_structure=True,init_C=init_C,fixed_features=False, + p=ot.unif(n_samples),loss_fun='square_loss', + max_iter=100, tol=1e-3) + np.testing.assert_allclose(C.shape, (n_samples, n_samples)) + np.testing.assert_allclose(X.shape, (n_samples, ys.shape[1])) + + init_X=np.random.randn(n_samples,ys.shape[1]) + + X,C,log = ot.gromov.fgw_barycenters(n_samples,[ys,yt] ,[C1, C2],[ot.unif(ns), ot.unif(nt)],[.5, .5],0.5, + fixed_structure=False,fixed_features=True, init_X=init_X, + p=ot.unif(n_samples),loss_fun='square_loss', + max_iter=100, tol=1e-3) + np.testing.assert_allclose(C.shape, (n_samples, n_samples)) + np.testing.assert_allclose(X.shape, (n_samples, ys.shape[1])) diff --git a/test/test_optim.py b/test/test_optim.py index dfefe59..1188ef6 100644 --- a/test/test_optim.py +++ b/test/test_optim.py @@ -65,3 +65,8 @@ def test_generalized_conditional_gradient(): np.testing.assert_allclose(a, G.sum(1), atol=1e-05) np.testing.assert_allclose(b, G.sum(0), atol=1e-05) + +def test_solve_1d_linesearch_quad_funct(): + np.testing.assert_allclose(ot.optim.solve_1d_linesearch_quad_funct(1,-1,0),0.5) + np.testing.assert_allclose(ot.optim.solve_1d_linesearch_quad_funct(-1,5,0),0) + np.testing.assert_allclose(ot.optim.solve_1d_linesearch_quad_funct(-1,0.5,0),1) -- cgit v1.2.3 From f70aabfcc11f92181e0dc987b341bad8ec030d75 Mon Sep 17 00:00:00 2001 From: tvayer Date: Wed, 29 May 2019 14:16:23 +0200 Subject: pep8 --- ot/gromov.py | 124 +++++++++++++++++++++++++++++------------------------------ ot/optim.py | 59 ++++++++++++++-------------- 2 files changed, 91 insertions(+), 92 deletions(-) diff --git a/ot/gromov.py b/ot/gromov.py index 297b194..fe4fc15 100644 --- a/ot/gromov.py +++ b/ot/gromov.py @@ -78,16 +78,16 @@ def init_matrix(C1, C2, p, q, loss_fun='square_loss'): if loss_fun == 'square_loss': def f1(a): - return (a**2) + return (a**2) def f2(b): - return (b**2) + return (b**2) def h1(a): return a def h2(b): - return 2*b + return 2 * b elif loss_fun == 'kl_loss': def f1(a): return a * np.log(a + 1e-15) - a @@ -269,7 +269,7 @@ def update_kl_loss(p, lambdas, T, Cs): return np.exp(np.divide(tmpsum, ppt)) -def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False,amijo=False, **kwargs): +def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, amijo=False, **kwargs): """ Returns the gromov-wasserstein transport between (C1,p) and (C2,q) @@ -344,13 +344,14 @@ def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False,amijo=False, **kwargs): return gwggrad(constC, hC1, hC2, G) if log: - res, log = cg(p, q, 0, 1, f, df, G0,log=True,amijo=amijo,C1=C1,C2=C2,constC=constC, **kwargs) + res, log = cg(p, q, 0, 1, f, df, G0, log=True, amijo=amijo, C1=C1, C2=C2, constC=constC, **kwargs) log['gw_dist'] = gwloss(constC, hC1, hC2, res) return res, log else: - return cg(p, q, 0, 1, f, df, G0,amijo=amijo, **kwargs) + return cg(p, q, 0, 1, f, df, G0, amijo=amijo, **kwargs) -def fused_gromov_wasserstein(M,C1,C2,p,q,loss_fun='square_loss',alpha=0.5,amijo=False,**kwargs): + +def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, amijo=False, **kwargs): """ Computes the FGW distance between two graphs see [3] .. math:: @@ -376,7 +377,7 @@ def fused_gromov_wasserstein(M,C1,C2,p,q,loss_fun='square_loss',alpha=0.5,amijo= q : ndarray, shape (nt,) distribution in the target space loss_fun : string,optionnal - loss function used for the solver + loss function used for the solver max_iter : int, optional Max number of iterations tol : float, optional @@ -404,19 +405,20 @@ def fused_gromov_wasserstein(M,C1,C2,p,q,loss_fun='square_loss',alpha=0.5,amijo= International Conference on Machine Learning (ICML). 2019. """ - constC,hC1,hC2=init_matrix(C1,C2,p,q,loss_fun) - - G0=p[:,None]*q[None,:] - + constC, hC1, hC2 = init_matrix(C1, C2, p, q, loss_fun) + + G0 = p[:, None] * q[None, :] + def f(G): - return gwloss(constC,hC1,hC2,G) + return gwloss(constC, hC1, hC2, G) + def df(G): - return gwggrad(constC,hC1,hC2,G) - - return cg(p,q,M,alpha,f,df,G0,amijo=amijo,C1=C1,C2=C2,constC=constC,**kwargs) + return gwggrad(constC, hC1, hC2, G) + + return cg(p, q, M, alpha, f, df, G0, amijo=amijo, C1=C1, C2=C2, constC=constC, **kwargs) -def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False,amijo=False, **kwargs): +def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False, amijo=False, **kwargs): """ Returns the gromov-wasserstein discrepancy between (C1,p) and (C2,q) @@ -485,7 +487,7 @@ def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False,amijo=False, **kwargs) def df(G): return gwggrad(constC, hC1, hC2, G) - res, log = cg(p, q, 0, 1, f, df, G0, log=True,amijo=amijo,C1=C1,C2=C2,constC=constC, **kwargs) + res, log = cg(p, q, 0, 1, f, df, G0, log=True, amijo=amijo, C1=C1, C2=C2, constC=constC, **kwargs) log['gw_dist'] = gwloss(constC, hC1, hC2, res) log['T'] = res if log: @@ -883,14 +885,14 @@ def gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, return C -def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_features=False, - p=None,loss_fun='square_loss',max_iter=100, tol=1e-9, - verbose=False,log=True,init_C=None,init_X=None): - + +def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_features=False, + p=None, loss_fun='square_loss', max_iter=100, tol=1e-9, + verbose=False, log=True, init_C=None, init_X=None): """ Compute the fgw barycenter as presented eq (5) in [3]. ---------- - N : integer + N : integer Desired number of samples of the target barycenter Ys: list of ndarray, each element has shape (ns,d) Features of all samples @@ -906,9 +908,9 @@ def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_feature Wether to fix the structure of the barycenter during the updates fixed_features : bool Wether to fix the feature of the barycenter during the updates - init_C : ndarray, shape (N,N), optional + init_C : ndarray, shape (N,N), optional initialization for the barycenters' structure matrix. If not set random init - init_X : ndarray, shape (N,d), optional + init_X : ndarray, shape (N,d), optional initialization for the barycenters' features. If not set random init Returns ---------- @@ -926,14 +928,14 @@ def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_feature "Optimal Transport for structured data with application on graphs" International Conference on Machine Learning (ICML). 2019. """ - + class UndefinedParameter(Exception): pass - + S = len(Cs) - d = Ys[0].shape[1] #dimension on the node features + d = Ys[0].shape[1] # dimension on the node features if p is None: - p = np.ones(N)/N + p = np.ones(N) / N Cs = [np.asarray(Cs[s], dtype=np.float64) for s in range(S)] Ys = [np.asarray(Ys[s], dtype=np.float64) for s in range(S)] @@ -944,7 +946,7 @@ def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_feature if init_C is None: raise UndefinedParameter('If C is fixed it must be initialized') else: - C=init_C + C = init_C else: if init_C is None: xalea = np.random.randn(N, 2) @@ -954,20 +956,20 @@ def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_feature if fixed_features: if init_X is None: - raise UndefinedParameter('If X is fixed it must be initialized') - else : - X= init_X + raise UndefinedParameter('If X is fixed it must be initialized') + else: + X = init_X else: - if init_X is None: - X=np.zeros((N,d)) + if init_X is None: + X = np.zeros((N, d)) else: X = init_X - - T=[np.outer(p,q) for q in ps] + + T = [np.outer(p, q) for q in ps] # X is N,d # Ys is ns,d - Ms = [np.asarray(dist(X,Ys[s]), dtype=np.float64) for s in range(len(Ys))] + Ms = [np.asarray(dist(X, Ys[s]), dtype=np.float64) for s in range(len(Ys))] # Ms is N,ns cpt = 0 @@ -975,46 +977,46 @@ def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_feature err_structure = 1 if log: - log_={} - log_['err_feature']=[] - log_['err_structure']=[] - log_['Ts_iter']=[] + log_ = {} + log_['err_feature'] = [] + log_['err_structure'] = [] + log_['Ts_iter'] = [] while((err_feature > tol or err_structure > tol) and cpt < max_iter): Cprev = C Xprev = X if not fixed_features: - Ys_temp=[y.T for y in Ys] - X=update_feature_matrix(lambdas,Ys_temp,T,p).T + Ys_temp = [y.T for y in Ys] + X = update_feature_matrix(lambdas, Ys_temp, T, p).T # X must be N,d # Ys must be ns,d - Ms=[np.asarray(dist(X,Ys[s]), dtype=np.float64) for s in range(len(Ys))] + Ms = [np.asarray(dist(X, Ys[s]), dtype=np.float64) for s in range(len(Ys))] if not fixed_structure: if loss_fun == 'square_loss': # T must be ns,N # Cs must be ns,ns # p must be N,1 - T_temp=[t.T for t in T] + T_temp = [t.T for t in T] C = update_sructure_matrix(p, lambdas, T_temp, Cs) # Ys must be d,ns # Ts must be N,ns # p must be N,1 # Ms is N,ns - # C is N,N + # C is N,N # Cs is ns,ns # p is N,1 # ps is ns,1 - - T = [fused_gromov_wasserstein((1-alpha)*Ms[s],C,Cs[s],p,ps[s],loss_fun,alpha,numItermax=max_iter, stopThr=1e-5, verbose=verbose) for s in range(S)] - # T is N,ns + T = [fused_gromov_wasserstein((1 - alpha) * Ms[s], C, Cs[s], p, ps[s], loss_fun, alpha, numItermax=max_iter, stopThr=1e-5, verbose=verbose) for s in range(S)] + + # T is N,ns log_['Ts_iter'].append(T) - err_feature = np.linalg.norm(X - Xprev.reshape(N,d)) + err_feature = np.linalg.norm(X - Xprev.reshape(N, d)) err_structure = np.linalg.norm(C - Cprev) if log: @@ -1029,11 +1031,11 @@ def fgw_barycenters(N,Ys,Cs,ps,lambdas,alpha,fixed_structure=False,fixed_feature print('{:5d}|{:8e}|'.format(cpt, err_feature)) cpt += 1 - log_['T']=T # from target to Ys - log_['p']=p - log_['Ms']=Ms #Ms are N,ns + log_['T'] = T # from target to Ys + log_['p'] = p + log_['Ms'] = Ms # Ms are N,ns - return X,C,log_ + return X, C, log_ def update_sructure_matrix(p, lambdas, T, Cs): @@ -1060,8 +1062,8 @@ def update_sructure_matrix(p, lambdas, T, Cs): return np.divide(tmpsum, ppt) -def update_feature_matrix(lambdas,Ys,Ts,p): - + +def update_feature_matrix(lambdas, Ys, Ts, p): """ Updates the feature with respect to the S Ts couplings. See "Solving the barycenter problem with Block Coordinate Descent (BCD)" in [3] calculated at each iteration @@ -1078,7 +1080,7 @@ def update_feature_matrix(lambdas,Ys,Ts,p): Returns ---------- X : ndarray, shape (d,N) - + References ---------- .. [24] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain @@ -1087,10 +1089,8 @@ def update_feature_matrix(lambdas,Ys,Ts,p): International Conference on Machine Learning (ICML). 2019. """ - p=np.diag(np.array(1/p).reshape(-1,)) + p = np.diag(np.array(1 / p).reshape(-1,)) - tmpsum = sum([lambdas[s] * np.dot(Ys[s],Ts[s].T).dot(p) for s in range(len(Ts))]) + tmpsum = sum([lambdas[s] * np.dot(Ys[s], Ts[s].T).dot(p) for s in range(len(Ts))]) return tmpsum - - diff --git a/ot/optim.py b/ot/optim.py index 9fce21e..cbfb187 100644 --- a/ot/optim.py +++ b/ot/optim.py @@ -71,8 +71,9 @@ def line_search_armijo(f, xk, pk, gfk, old_fval, return alpha, fc[0], phi1 -def do_linesearch(cost,G,deltaG,Mi,f_val, - amijo=False,C1=None,C2=None,reg=None,Gc=None,constC=None,M=None): + +def do_linesearch(cost, G, deltaG, Mi, f_val, + amijo=False, C1=None, C2=None, reg=None, Gc=None, constC=None, M=None): """ Solve the linesearch in the FW iterations Parameters @@ -119,22 +120,22 @@ def do_linesearch(cost,G,deltaG,Mi,f_val, """ if amijo: alpha, fc, f_val = line_search_armijo(cost, G, deltaG, Mi, f_val) - else: # requires symetric matrices - dot1=np.dot(C1,deltaG) - dot12=dot1.dot(C2) - a=-2*reg*np.sum(dot12*deltaG) - b=np.sum((M+reg*constC)*deltaG)-2*reg*(np.sum(dot12*G)+np.sum(np.dot(C1,G).dot(C2)*deltaG)) - c=cost(G) + else: # requires symetric matrices + dot1 = np.dot(C1, deltaG) + dot12 = dot1.dot(C2) + a = -2 * reg * np.sum(dot12 * deltaG) + b = np.sum((M + reg * constC) * deltaG) - 2 * reg * (np.sum(dot12 * G) + np.sum(np.dot(C1, G).dot(C2) * deltaG)) + c = cost(G) + + alpha = solve_1d_linesearch_quad_funct(a, b, c) + fc = None + f_val = cost(G + alpha * deltaG) - alpha=solve_1d_linesearch_quad_funct(a,b,c) - fc=None - f_val=cost(G+alpha*deltaG) - - return alpha,fc,f_val + return alpha, fc, f_val def cg(a, b, M, reg, f, df, G0=None, numItermax=200, - stopThr=1e-9, verbose=False, log=False,**kwargs): + stopThr=1e-9, verbose=False, log=False, **kwargs): """ Solve the general regularized OT problem with conditional gradient @@ -240,7 +241,7 @@ def cg(a, b, M, reg, f, df, G0=None, numItermax=200, deltaG = Gc - G # line search - alpha, fc, f_val = do_linesearch(cost, G, deltaG, Mi, f_val, reg=reg, M=M, Gc=Gc,**kwargs) + alpha, fc, f_val = do_linesearch(cost, G, deltaG, Mi, f_val, reg=reg, M=M, Gc=Gc, **kwargs) G = G + alpha * deltaG @@ -403,11 +404,12 @@ def gcg(a, b, M, reg1, reg2, f, df, G0=None, numItermax=10, else: return G -def solve_1d_linesearch_quad_funct(a,b,c): + +def solve_1d_linesearch_quad_funct(a, b, c): """ - Solve on 0,1 the following problem: + Solve on 0,1 the following problem: .. math:: - \min f(x)=a*x^{2}+b*x+c + \min f(x)=a*x^{2}+b*x+c Parameters ---------- @@ -416,22 +418,19 @@ def solve_1d_linesearch_quad_funct(a,b,c): Returns ------- - x : float + x : float The optimal value which leads to the minimal cost - + """ - f0=c - df0=b - f1=a+f0+df0 + f0 = c + df0 = b + f1 = a + f0 + df0 - if a>0: # convex - minimum=min(1,max(0,-b/(2*a))) - #print('entrelesdeux') + if a > 0: # convex + minimum = min(1, max(0, -b / (2 * a))) return minimum - else: # non convexe donc sur les coins - if f0>f1: - #print('sur1 f(1)={}'.format(f(1))) + else: # non convex + if f0 > f1: return 1 else: - #print('sur0 f(0)={}'.format(f(0))) return 0 -- cgit v1.2.3 From fa989062c17f87bd96aa58ad764fd3791ea11e22 Mon Sep 17 00:00:00 2001 From: tvayer Date: Wed, 29 May 2019 15:00:50 +0200 Subject: Reame +pep8 --- README.md | 14 ++++ examples/plot_barycenter_fgw.py | 150 ++++++++++++++++++++-------------------- examples/plot_fgw.py | 138 ++++++++++++++++++------------------ test/test_gromov.py | 53 +++++++------- test/test_optim.py | 9 +-- 5 files changed, 190 insertions(+), 174 deletions(-) diff --git a/README.md b/README.md index fd27f9d..b6b215c 100644 --- a/README.md +++ b/README.md @@ -222,3 +222,17 @@ You can also post bug reports and feature requests in Github issues. Make sure t [16] Agueh, M., & Carlier, G. (2011). [Barycenters in the Wasserstein space](https://hal.archives-ouvertes.fr/hal-00637399/document). SIAM Journal on Mathematical Analysis, 43(2), 904-924. [17] Blondel, M., Seguy, V., & Rolet, A. (2018). [Smooth and Sparse Optimal Transport](https://arxiv.org/abs/1710.06276). Proceedings of the Twenty-First International Conference on Artificial Intelligence and Statistics (AISTATS). + +[18] Genevay, A., Cuturi, M., Peyré, G. & Bach, F. (2016) [Stochastic Optimization for Large-scale Optimal Transport](https://arxiv.org/abs/1605.08527). Advances in Neural Information Processing Systems (2016). + +[19] Seguy, V., Bhushan Damodaran, B., Flamary, R., Courty, N., Rolet, A.& Blondel, M. [Large-scale Optimal Transport and Mapping Estimation](https://arxiv.org/pdf/1711.02283.pdf). International Conference on Learning Representation (2018) + +[20] Cuturi, M. and Doucet, A. (2014) [Fast Computation of Wasserstein Barycenters](http://proceedings.mlr.press/v32/cuturi14.html). International Conference in Machine Learning + +[21] Solomon, J., De Goes, F., Peyré, G., Cuturi, M., Butscher, A., Nguyen, A. & Guibas, L. (2015). [Convolutional wasserstein distances: Efficient optimal transportation on geometric domains](https://dl.acm.org/citation.cfm?id=2766963). ACM Transactions on Graphics (TOG), 34(4), 66. + +[22] J. Altschuler, J.Weed, P. Rigollet, (2017) [Near-linear time approximation algorithms for optimal transport via Sinkhorn iteration](https://papers.nips.cc/paper/6792-near-linear-time-approximation-algorithms-for-optimal-transport-via-sinkhorn-iteration.pdf), Advances in Neural Information Processing Systems (NIPS) 31 + +[23] Aude, G., Peyré, G., Cuturi, M., [Learning Generative Models with Sinkhorn Divergences](https://arxiv.org/abs/1706.00292), Proceedings of the Twenty-First International Conference on Artficial Intelligence and Statistics, (AISTATS) 21, 2018 + +[24] Vayer, T., Chapel, L., Flamary, R., Tavenard, R. and Courty, N. (2019). [Optimal Transport for structured data with application on graphs](http://proceedings.mlr.press/v97/titouan19a.html) Proceedings of the 36th International Conference on Machine Learning (ICML). diff --git a/examples/plot_barycenter_fgw.py b/examples/plot_barycenter_fgw.py index f416629..9eea036 100644 --- a/examples/plot_barycenter_fgw.py +++ b/examples/plot_barycenter_fgw.py @@ -30,10 +30,11 @@ from matplotlib import cm from ot.gromov import fgw_barycenters #%% Graph functions -def find_thresh(C,inf=0.5,sup=3,step=10): + +def find_thresh(C, inf=0.5, sup=3, step=10): """ Trick to find the adequate thresholds from where value of the C matrix are considered close enough to say that nodes are connected - Tthe threshold is found by a linesearch between values "inf" and "sup" with "step" thresholds tested. - The optimal threshold is the one which minimizes the reconstruction error between the shortest_path matrix coming from the thresholded adjency matrix + Tthe threshold is found by a linesearch between values "inf" and "sup" with "step" thresholds tested. + The optimal threshold is the one which minimizes the reconstruction error between the shortest_path matrix coming from the thresholded adjency matrix and the original matrix. Parameters ---------- @@ -43,21 +44,22 @@ def find_thresh(C,inf=0.5,sup=3,step=10): The beginning of the linesearch sup : float The end of the linesearch - step : integer - Number of thresholds tested + step : integer + Number of thresholds tested """ - dist=[] - search=np.linspace(inf,sup,step) + dist = [] + search = np.linspace(inf, sup, step) for thresh in search: - Cprime=sp_to_adjency(C,0,thresh) - SC=shortest_path(Cprime,method='D') - SC[SC==float('inf')]=100 - dist.append(np.linalg.norm(SC-C)) - return search[np.argmin(dist)],dist - -def sp_to_adjency(C,threshinf=0.2,threshsup=1.8): - """ Thresholds the structure matrix in order to compute an adjency matrix. - All values between threshinf and threshsup are considered representing connected nodes and set to 1. Else are set to 0 + Cprime = sp_to_adjency(C, 0, thresh) + SC = shortest_path(Cprime, method='D') + SC[SC == float('inf')] = 100 + dist.append(np.linalg.norm(SC - C)) + return search[np.argmin(dist)], dist + + +def sp_to_adjency(C, threshinf=0.2, threshsup=1.8): + """ Thresholds the structure matrix in order to compute an adjency matrix. + All values between threshinf and threshsup are considered representing connected nodes and set to 1. Else are set to 0 Parameters ---------- C : ndarray, shape (n_nodes,n_nodes) @@ -71,102 +73,100 @@ def sp_to_adjency(C,threshinf=0.2,threshsup=1.8): C : ndarray, shape (n_nodes,n_nodes) The threshold matrix. Each element is in {0,1} """ - H=np.zeros_like(C) - np.fill_diagonal(H,np.diagonal(C)) - C=C-H - C=np.minimum(np.maximum(C,threshinf),threshsup) - C[C==threshsup]=0 - C[C!=0]=1 - - return C - -def build_noisy_circular_graph(N=20,mu=0,sigma=0.3,with_noise=False,structure_noise=False,p=None): + H = np.zeros_like(C) + np.fill_diagonal(H, np.diagonal(C)) + C = C - H + C = np.minimum(np.maximum(C, threshinf), threshsup) + C[C == threshsup] = 0 + C[C != 0] = 1 + + return C + + +def build_noisy_circular_graph(N=20, mu=0, sigma=0.3, with_noise=False, structure_noise=False, p=None): """ Create a noisy circular graph """ - g=nx.Graph() + g = nx.Graph() g.add_nodes_from(list(range(N))) for i in range(N): - noise=float(np.random.normal(mu,sigma,1)) + noise = float(np.random.normal(mu, sigma, 1)) if with_noise: - g.add_node(i,attr_name=math.sin((2*i*math.pi/N))+noise) + g.add_node(i, attr_name=math.sin((2 * i * math.pi / N)) + noise) else: - g.add_node(i,attr_name=math.sin(2*i*math.pi/N)) - g.add_edge(i,i+1) + g.add_node(i, attr_name=math.sin(2 * i * math.pi / N)) + g.add_edge(i, i + 1) if structure_noise: - randomint=np.random.randint(0,p) - if randomint==0: - if i<=N-3: - g.add_edge(i,i+2) - if i==N-2: - g.add_edge(i,0) - if i==N-1: - g.add_edge(i,1) - g.add_edge(N,0) - noise=float(np.random.normal(mu,sigma,1)) + randomint = np.random.randint(0, p) + if randomint == 0: + if i <= N - 3: + g.add_edge(i, i + 2) + if i == N - 2: + g.add_edge(i, 0) + if i == N - 1: + g.add_edge(i, 1) + g.add_edge(N, 0) + noise = float(np.random.normal(mu, sigma, 1)) if with_noise: - g.add_node(N,attr_name=math.sin((2*N*math.pi/N))+noise) + g.add_node(N, attr_name=math.sin((2 * N * math.pi / N)) + noise) else: - g.add_node(N,attr_name=math.sin(2*N*math.pi/N)) + g.add_node(N, attr_name=math.sin(2 * N * math.pi / N)) return g -def graph_colors(nx_graph,vmin=0,vmax=7): - cnorm = mcol.Normalize(vmin=vmin,vmax=vmax) - cpick = cm.ScalarMappable(norm=cnorm,cmap='viridis') + +def graph_colors(nx_graph, vmin=0, vmax=7): + cnorm = mcol.Normalize(vmin=vmin, vmax=vmax) + cpick = cm.ScalarMappable(norm=cnorm, cmap='viridis') cpick.set_array([]) val_map = {} - for k,v in nx.get_node_attributes(nx_graph,'attr_name').items(): - val_map[k]=cpick.to_rgba(v) - colors=[] + for k, v in nx.get_node_attributes(nx_graph, 'attr_name').items(): + val_map[k] = cpick.to_rgba(v) + colors = [] for node in nx_graph.nodes(): colors.append(val_map[node]) return colors - + #%% create dataset # We build a dataset of noisy circular graphs. # Noise is added on the structures by random connections and on the features by gaussian noise. + np.random.seed(30) -X0=[] +X0 = [] for k in range(9): - X0.append(build_noisy_circular_graph(np.random.randint(15,25),with_noise=True,structure_noise=True,p=3)) - + X0.append(build_noisy_circular_graph(np.random.randint(15, 25), with_noise=True, structure_noise=True, p=3)) + #%% Plot dataset -plt.figure(figsize=(8,10)) +plt.figure(figsize=(8, 10)) for i in range(len(X0)): - plt.subplot(3,3,i+1) - g=X0[i] - pos=nx.kamada_kawai_layout(g) - nx.draw(g,pos=pos,node_color = graph_colors(g,vmin=-1,vmax=1),with_labels=False,node_size=100) -plt.suptitle('Dataset of noisy graphs. Color indicates the label',fontsize=20) + plt.subplot(3, 3, i + 1) + g = X0[i] + pos = nx.kamada_kawai_layout(g) + nx.draw(g, pos=pos, node_color=graph_colors(g, vmin=-1, vmax=1), with_labels=False, node_size=100) +plt.suptitle('Dataset of noisy graphs. Color indicates the label', fontsize=20) plt.show() - #%% # We compute the barycenter using FGW. Structure matrices are computed using the shortest_path distance in the graph # Features distances are the euclidean distances -Cs=[shortest_path(nx.adjacency_matrix(x)) for x in X0] -ps=[np.ones(len(x.nodes()))/len(x.nodes()) for x in X0] -Ys=[np.array([v for (k,v) in nx.get_node_attributes(x,'attr_name').items()]).reshape(-1,1) for x in X0] -lambdas=np.array([np.ones(len(Ys))/len(Ys)]).ravel() -sizebary=15 # we choose a barycenter with 15 nodes +Cs = [shortest_path(nx.adjacency_matrix(x)) for x in X0] +ps = [np.ones(len(x.nodes())) / len(x.nodes()) for x in X0] +Ys = [np.array([v for (k, v) in nx.get_node_attributes(x, 'attr_name').items()]).reshape(-1, 1) for x in X0] +lambdas = np.array([np.ones(len(Ys)) / len(Ys)]).ravel() +sizebary = 15 # we choose a barycenter with 15 nodes #%% -A,C,log=fgw_barycenters(sizebary,Ys,Cs,ps,lambdas,alpha=0.95) +A, C, log = fgw_barycenters(sizebary, Ys, Cs, ps, lambdas, alpha=0.95) #%% -bary=nx.from_numpy_matrix(sp_to_adjency(C,threshinf=0,threshsup=find_thresh(C,sup=100,step=100)[0])) +bary = nx.from_numpy_matrix(sp_to_adjency(C, threshinf=0, threshsup=find_thresh(C, sup=100, step=100)[0])) for i in range(len(A.ravel())): - bary.add_node(i,attr_name=float(A.ravel()[i])) - + bary.add_node(i, attr_name=float(A.ravel()[i])) + #%% pos = nx.kamada_kawai_layout(bary) -nx.draw(bary,pos=pos,node_color = graph_colors(bary,vmin=-1,vmax=1),with_labels=False) -plt.suptitle('Barycenter',fontsize=20) +nx.draw(bary, pos=pos, node_color=graph_colors(bary, vmin=-1, vmax=1), with_labels=False) +plt.suptitle('Barycenter', fontsize=20) plt.show() - - - - diff --git a/examples/plot_fgw.py b/examples/plot_fgw.py index bfa7fb4..ae3c487 100644 --- a/examples/plot_fgw.py +++ b/examples/plot_fgw.py @@ -20,132 +20,132 @@ This example illustrates the computation of FGW for 1D measures[18]. import matplotlib.pyplot as pl import numpy as np import ot -from ot.gromov import gromov_wasserstein,fused_gromov_wasserstein +from ot.gromov import gromov_wasserstein, fused_gromov_wasserstein #%% parameters -# We create two 1D random measures -n=20 -n2=30 -sig=1 -sig2=0.1 +# We create two 1D random measures +n = 20 +n2 = 30 +sig = 1 +sig2 = 0.1 np.random.seed(0) -phi=np.arange(n)[:,None] -xs=phi+sig*np.random.randn(n,1) -ys=np.vstack((np.ones((n//2,1)),0*np.ones((n//2,1))))+sig2*np.random.randn(n,1) +phi = np.arange(n)[:, None] +xs = phi + sig * np.random.randn(n, 1) +ys = np.vstack((np.ones((n // 2, 1)), 0 * np.ones((n // 2, 1)))) + sig2 * np.random.randn(n, 1) -phi2=np.arange(n2)[:,None] -xt=phi2+sig*np.random.randn(n2,1) -yt=np.vstack((np.ones((n2//2,1)),0*np.ones((n2//2,1))))+sig2*np.random.randn(n2,1) -yt= yt[::-1,:] +phi2 = np.arange(n2)[:, None] +xt = phi2 + sig * np.random.randn(n2, 1) +yt = np.vstack((np.ones((n2 // 2, 1)), 0 * np.ones((n2 // 2, 1)))) + sig2 * np.random.randn(n2, 1) +yt = yt[::-1, :] -p=ot.unif(n) -q=ot.unif(n2) +p = ot.unif(n) +q = ot.unif(n2) #%% plot the distributions pl.close(10) -pl.figure(10,(7,7)) +pl.figure(10, (7, 7)) -pl.subplot(2,1,1) +pl.subplot(2, 1, 1) -pl.scatter(ys,xs,c=phi,s=70) -pl.ylabel('Feature value a',fontsize=20) -pl.title('$\mu=\sum_i \delta_{x_i,a_i}$',fontsize=25, usetex=True, y=1) +pl.scatter(ys, xs, c=phi, s=70) +pl.ylabel('Feature value a', fontsize=20) +pl.title('$\mu=\sum_i \delta_{x_i,a_i}$', fontsize=25, usetex=True, y=1) pl.xticks(()) pl.yticks(()) -pl.subplot(2,1,2) -pl.scatter(yt,xt,c=phi2,s=70) -pl.xlabel('coordinates x/y',fontsize=25) -pl.ylabel('Feature value b',fontsize=20) -pl.title('$\\nu=\sum_j \delta_{y_j,b_j}$',fontsize=25, usetex=True, y=1) +pl.subplot(2, 1, 2) +pl.scatter(yt, xt, c=phi2, s=70) +pl.xlabel('coordinates x/y', fontsize=25) +pl.ylabel('Feature value b', fontsize=20) +pl.title('$\\nu=\sum_j \delta_{y_j,b_j}$', fontsize=25, usetex=True, y=1) pl.yticks(()) pl.tight_layout() pl.show() #%% Structure matrices and across-features distance matrix -C1=ot.dist(xs) -C2=ot.dist(xt).T -M=ot.dist(ys,yt) -w1=ot.unif(C1.shape[0]) -w2=ot.unif(C2.shape[0]) -Got=ot.emd([],[],M) +C1 = ot.dist(xs) +C2 = ot.dist(xt).T +M = ot.dist(ys, yt) +w1 = ot.unif(C1.shape[0]) +w2 = ot.unif(C2.shape[0]) +Got = ot.emd([], [], M) #%% -cmap='Reds' +cmap = 'Reds' pl.close(10) -pl.figure(10,(5,5)) -fs=15 -l_x=[0,5,10,15] -l_y=[0,5,10,15,20,25] +pl.figure(10, (5, 5)) +fs = 15 +l_x = [0, 5, 10, 15] +l_y = [0, 5, 10, 15, 20, 25] gs = pl.GridSpec(5, 5) -ax1=pl.subplot(gs[3:,:2]) +ax1 = pl.subplot(gs[3:, :2]) -pl.imshow(C1,cmap=cmap,interpolation='nearest') -pl.title("$C_1$",fontsize=fs) -pl.xlabel("$k$",fontsize=fs) -pl.ylabel("$i$",fontsize=fs) +pl.imshow(C1, cmap=cmap, interpolation='nearest') +pl.title("$C_1$", fontsize=fs) +pl.xlabel("$k$", fontsize=fs) +pl.ylabel("$i$", fontsize=fs) pl.xticks(l_x) pl.yticks(l_x) -ax2=pl.subplot(gs[:3,2:]) +ax2 = pl.subplot(gs[:3, 2:]) -pl.imshow(C2,cmap=cmap,interpolation='nearest') -pl.title("$C_2$",fontsize=fs) -pl.ylabel("$l$",fontsize=fs) +pl.imshow(C2, cmap=cmap, interpolation='nearest') +pl.title("$C_2$", fontsize=fs) +pl.ylabel("$l$", fontsize=fs) #pl.ylabel("$l$",fontsize=fs) pl.xticks(()) pl.yticks(l_y) ax2.set_aspect('auto') -ax3=pl.subplot(gs[3:,2:],sharex=ax2,sharey=ax1) -pl.imshow(M,cmap=cmap,interpolation='nearest') +ax3 = pl.subplot(gs[3:, 2:], sharex=ax2, sharey=ax1) +pl.imshow(M, cmap=cmap, interpolation='nearest') pl.yticks(l_x) pl.xticks(l_y) -pl.ylabel("$i$",fontsize=fs) -pl.title("$M_{AB}$",fontsize=fs) -pl.xlabel("$j$",fontsize=fs) +pl.ylabel("$i$", fontsize=fs) +pl.title("$M_{AB}$", fontsize=fs) +pl.xlabel("$j$", fontsize=fs) pl.tight_layout() ax3.set_aspect('auto') pl.show() #%% Computing FGW and GW -alpha=1e-3 - +alpha = 1e-3 + ot.tic() -Gwg,logw=fused_gromov_wasserstein(M,C1,C2,p,q,loss_fun='square_loss',alpha=alpha,verbose=True,log=True) +Gwg, logw = fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=alpha, verbose=True, log=True) ot.toc() -#%reload_ext WGW -Gg,log=gromov_wasserstein(C1,C2,p,q,loss_fun='square_loss',verbose=True,log=True) - +#%reload_ext WGW +Gg, log = gromov_wasserstein(C1, C2, p, q, loss_fun='square_loss', verbose=True, log=True) + #%% visu OT matrix -cmap='Blues' -fs=15 -pl.figure(2,(13,5)) +cmap = 'Blues' +fs = 15 +pl.figure(2, (13, 5)) pl.clf() -pl.subplot(1,3,1) -pl.imshow(Got,cmap=cmap,interpolation='nearest') +pl.subplot(1, 3, 1) +pl.imshow(Got, cmap=cmap, interpolation='nearest') #pl.xlabel("$y$",fontsize=fs) -pl.ylabel("$i$",fontsize=fs) +pl.ylabel("$i$", fontsize=fs) pl.xticks(()) pl.title('Wasserstein ($M$ only)') -pl.subplot(1,3,2) -pl.imshow(Gg,cmap=cmap,interpolation='nearest') +pl.subplot(1, 3, 2) +pl.imshow(Gg, cmap=cmap, interpolation='nearest') pl.title('Gromov ($C_1,C_2$ only)') pl.xticks(()) -pl.subplot(1,3,3) -pl.imshow(Gwg,cmap=cmap,interpolation='nearest') +pl.subplot(1, 3, 3) +pl.imshow(Gwg, cmap=cmap, interpolation='nearest') pl.title('FGW ($M+C_1,C_2$)') -pl.xlabel("$j$",fontsize=fs) -pl.ylabel("$i$",fontsize=fs) +pl.xlabel("$j$", fontsize=fs) +pl.ylabel("$i$", fontsize=fs) pl.tight_layout() -pl.show() \ No newline at end of file +pl.show() diff --git a/test/test_gromov.py b/test/test_gromov.py index 43b63e1..cd180d4 100644 --- a/test/test_gromov.py +++ b/test/test_gromov.py @@ -145,7 +145,8 @@ def test_gromov_entropic_barycenter(): 'kl_loss', 2e-3, max_iter=100, tol=1e-3) np.testing.assert_allclose(Cb2.shape, (n_samples, n_samples)) - + + def test_fgw(): n_samples = 50 # nb samples @@ -155,9 +156,9 @@ def test_fgw(): xs = ot.datasets.make_2D_samples_gauss(n_samples, mu_s, cov_s) xt = xs[::-1].copy() - - ys = np.random.randn(xs.shape[0],2) - yt= ys[::-1].copy() + + ys = np.random.randn(xs.shape[0], 2) + yt = ys[::-1].copy() p = ot.unif(n_samples) q = ot.unif(n_samples) @@ -167,11 +168,11 @@ def test_fgw(): C1 /= C1.max() C2 /= C2.max() - - M=ot.dist(ys,yt) - M/=M.max() - G = ot.gromov.fused_gromov_wasserstein(M,C1, C2, p, q, 'square_loss',alpha=0.5) + M = ot.dist(ys, yt) + M /= M.max() + + G = ot.gromov.fused_gromov_wasserstein(M, C1, C2, p, q, 'square_loss', alpha=0.5) # check constratints np.testing.assert_allclose( @@ -187,36 +188,36 @@ def test_fgw_barycenter(): Xs, ys = ot.datasets.make_data_classif('3gauss', ns) Xt, yt = ot.datasets.make_data_classif('3gauss2', nt) - - ys = np.random.randn(Xs.shape[0],2) - yt= np.random.randn(Xt.shape[0],2) + + ys = np.random.randn(Xs.shape[0], 2) + yt = np.random.randn(Xt.shape[0], 2) C1 = ot.dist(Xs) C2 = ot.dist(Xt) n_samples = 3 - X,C,log = ot.gromov.fgw_barycenters(n_samples,[ys,yt] ,[C1, C2],[ot.unif(ns), ot.unif(nt)],[.5, .5],0.5, - fixed_structure=False,fixed_features=False, - p=ot.unif(n_samples),loss_fun='square_loss', - max_iter=100, tol=1e-3) + X, C, log = ot.gromov.fgw_barycenters(n_samples, [ys, yt], [C1, C2], [ot.unif(ns), ot.unif(nt)], [.5, .5], 0.5, + fixed_structure=False, fixed_features=False, + p=ot.unif(n_samples), loss_fun='square_loss', + max_iter=100, tol=1e-3) np.testing.assert_allclose(C.shape, (n_samples, n_samples)) np.testing.assert_allclose(X.shape, (n_samples, ys.shape[1])) xalea = np.random.randn(n_samples, 2) init_C = ot.dist(xalea, xalea) - - X,C,log = ot.gromov.fgw_barycenters(n_samples,[ys,yt] ,[C1, C2],ps=[ot.unif(ns), ot.unif(nt)],lambdas=[.5, .5],alpha=0.5, - fixed_structure=True,init_C=init_C,fixed_features=False, - p=ot.unif(n_samples),loss_fun='square_loss', - max_iter=100, tol=1e-3) + + X, C, log = ot.gromov.fgw_barycenters(n_samples, [ys, yt], [C1, C2], ps=[ot.unif(ns), ot.unif(nt)], lambdas=[.5, .5], alpha=0.5, + fixed_structure=True, init_C=init_C, fixed_features=False, + p=ot.unif(n_samples), loss_fun='square_loss', + max_iter=100, tol=1e-3) np.testing.assert_allclose(C.shape, (n_samples, n_samples)) np.testing.assert_allclose(X.shape, (n_samples, ys.shape[1])) - - init_X=np.random.randn(n_samples,ys.shape[1]) - X,C,log = ot.gromov.fgw_barycenters(n_samples,[ys,yt] ,[C1, C2],[ot.unif(ns), ot.unif(nt)],[.5, .5],0.5, - fixed_structure=False,fixed_features=True, init_X=init_X, - p=ot.unif(n_samples),loss_fun='square_loss', - max_iter=100, tol=1e-3) + init_X = np.random.randn(n_samples, ys.shape[1]) + + X, C, log = ot.gromov.fgw_barycenters(n_samples, [ys, yt], [C1, C2], [ot.unif(ns), ot.unif(nt)], [.5, .5], 0.5, + fixed_structure=False, fixed_features=True, init_X=init_X, + p=ot.unif(n_samples), loss_fun='square_loss', + max_iter=100, tol=1e-3) np.testing.assert_allclose(C.shape, (n_samples, n_samples)) np.testing.assert_allclose(X.shape, (n_samples, ys.shape[1])) diff --git a/test/test_optim.py b/test/test_optim.py index 1188ef6..e7ba32a 100644 --- a/test/test_optim.py +++ b/test/test_optim.py @@ -65,8 +65,9 @@ def test_generalized_conditional_gradient(): np.testing.assert_allclose(a, G.sum(1), atol=1e-05) np.testing.assert_allclose(b, G.sum(0), atol=1e-05) - + + def test_solve_1d_linesearch_quad_funct(): - np.testing.assert_allclose(ot.optim.solve_1d_linesearch_quad_funct(1,-1,0),0.5) - np.testing.assert_allclose(ot.optim.solve_1d_linesearch_quad_funct(-1,5,0),0) - np.testing.assert_allclose(ot.optim.solve_1d_linesearch_quad_funct(-1,0.5,0),1) + np.testing.assert_allclose(ot.optim.solve_1d_linesearch_quad_funct(1, -1, 0), 0.5) + np.testing.assert_allclose(ot.optim.solve_1d_linesearch_quad_funct(-1, 5, 0), 0) + np.testing.assert_allclose(ot.optim.solve_1d_linesearch_quad_funct(-1, 0.5, 0), 1) -- cgit v1.2.3 From 103dfe0ee76e110bb9e0d1e36e3dd86109db3fce Mon Sep 17 00:00:00 2001 From: tvayer Date: Wed, 29 May 2019 15:10:37 +0200 Subject: test check --- ot/gromov.py | 2 +- ot/optim.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ot/gromov.py b/ot/gromov.py index 33134a2..44248d1 100644 --- a/ot/gromov.py +++ b/ot/gromov.py @@ -348,7 +348,7 @@ def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, amijo=False, **kwargs) log['gw_dist'] = gwloss(constC, hC1, hC2, res) return res, log else: - return cg(p, q, 0, 1, f, df, G0, amijo=amijo, **kwargs) + return cg(p, q, 0, 1, f, df, G0, amijo=amijo, C1=C1, C2=C2, constC=constC, **kwargs) def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, amijo=False, **kwargs): diff --git a/ot/optim.py b/ot/optim.py index cbfb187..2170c7e 100644 --- a/ot/optim.py +++ b/ot/optim.py @@ -73,7 +73,7 @@ def line_search_armijo(f, xk, pk, gfk, old_fval, def do_linesearch(cost, G, deltaG, Mi, f_val, - amijo=False, C1=None, C2=None, reg=None, Gc=None, constC=None, M=None): + amijo=True, C1=None, C2=None, reg=None, Gc=None, constC=None, M=None): """ Solve the linesearch in the FW iterations Parameters -- cgit v1.2.3 From 915d5fa4c4020536f2d41c21353b1477befa8af3 Mon Sep 17 00:00:00 2001 From: tvayer Date: Wed, 29 May 2019 15:19:41 +0200 Subject: python2 divide problem --- ot/optim.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ot/optim.py b/ot/optim.py index 2170c7e..282b30d 100644 --- a/ot/optim.py +++ b/ot/optim.py @@ -427,7 +427,7 @@ def solve_1d_linesearch_quad_funct(a, b, c): f1 = a + f0 + df0 if a > 0: # convex - minimum = min(1, max(0, -b / (2 * a))) + minimum = min(1, max(0, np.divide(-b, 2 * a))) return minimum else: # non convex if f0 > f1: -- cgit v1.2.3 From 94d2fe5fd0b07060426e9449de0331b88ab53df4 Mon Sep 17 00:00:00 2001 From: tvayer Date: Wed, 29 May 2019 15:32:03 +0200 Subject: wizard stuff --- ot/optim.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ot/optim.py b/ot/optim.py index 282b30d..b96d920 100644 --- a/ot/optim.py +++ b/ot/optim.py @@ -427,7 +427,7 @@ def solve_1d_linesearch_quad_funct(a, b, c): f1 = a + f0 + df0 if a > 0: # convex - minimum = min(1, max(0, np.divide(-b, 2 * a))) + minimum = min(1, max(0, np.divide(-b, 2.0 * a))) return minimum else: # non convex if f0 > f1: -- cgit v1.2.3 From 9421dddd8890d4c575b593d678eb7bdf5f933f83 Mon Sep 17 00:00:00 2001 From: tvayer Date: Wed, 29 May 2019 15:51:57 +0200 Subject: Doc+armijo --- ot/gromov.py | 39 ++++++++++++++++++++------------------- ot/optim.py | 22 +++++++++++----------- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/ot/gromov.py b/ot/gromov.py index 44248d1..5a57dc8 100644 --- a/ot/gromov.py +++ b/ot/gromov.py @@ -33,12 +33,12 @@ def init_matrix(C1, C2, p, q, loss_fun='square_loss'): * C2 : Metric cost matrix in the target space * T : A coupling between those two spaces - The square-loss function L(a,b)=(1/2)*|a-b|^2 is read as : + The square-loss function L(a,b)=|a-b|^2 is read as : L(a,b) = f1(a)+f2(b)-h1(a)*h2(b) with : - * f1(a)=(a^2)/2 - * f2(b)=(b^2)/2 + * f1(a)=(a^2) + * f2(b)=(b^2) * h1(a)=a - * h2(b)=b + * h2(b)=2*b The kl-loss function L(a,b)=a*log(a/b)-a+b is read as : L(a,b) = f1(a)+f2(b)-h1(a)*h2(b) with : @@ -269,7 +269,7 @@ def update_kl_loss(p, lambdas, T, Cs): return np.exp(np.divide(tmpsum, ppt)) -def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, amijo=False, **kwargs): +def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, armijo=False, **kwargs): """ Returns the gromov-wasserstein transport between (C1,p) and (C2,q) @@ -307,8 +307,8 @@ def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, amijo=False, **kwargs) Print information along iterations log : bool, optional record log if True - amijo : bool, optional - If True the steps of the line-search is found via an amijo research. Else closed form is used. + armijo : bool, optional + If True the steps of the line-search is found via an armijo research. Else closed form is used. If there is convergence issues use False. **kwargs : dict parameters can be directly pased to the ot.optim.cg solver @@ -344,14 +344,14 @@ def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, amijo=False, **kwargs) return gwggrad(constC, hC1, hC2, G) if log: - res, log = cg(p, q, 0, 1, f, df, G0, log=True, amijo=amijo, C1=C1, C2=C2, constC=constC, **kwargs) + res, log = cg(p, q, 0, 1, f, df, G0, log=True, armijo=armijo, C1=C1, C2=C2, constC=constC, **kwargs) log['gw_dist'] = gwloss(constC, hC1, hC2, res) return res, log else: - return cg(p, q, 0, 1, f, df, G0, amijo=amijo, C1=C1, C2=C2, constC=constC, **kwargs) + return cg(p, q, 0, 1, f, df, G0, armijo=armijo, C1=C1, C2=C2, constC=constC, **kwargs) -def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, amijo=False, **kwargs): +def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, armijo=False, **kwargs): """ Computes the FGW distance between two graphs see [3] .. math:: @@ -363,6 +363,7 @@ def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, - M is the (ns,nt) metric cost matrix - :math:`f` is the regularization term ( and df is its gradient) - a and b are source and target weights (sum to 1) + - L is a loss function to account for the misfit between the similarity matrices The algorithm used for solving the problem is conditional gradient as discussed in [1]_ Parameters ---------- @@ -386,8 +387,8 @@ def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, Print information along iterations log : bool, optional record log if True - amijo : bool, optional - If True the steps of the line-search is found via an amijo research. Else closed form is used. + armijo : bool, optional + If True the steps of the line-search is found via an armijo research. Else closed form is used. If there is convergence issues use False. **kwargs : dict parameters can be directly pased to the ot.optim.cg solver @@ -415,10 +416,10 @@ def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, def df(G): return gwggrad(constC, hC1, hC2, G) - return cg(p, q, M, alpha, f, df, G0, amijo=amijo, C1=C1, C2=C2, constC=constC, **kwargs) + return cg(p, q, M, alpha, f, df, G0, armijo=armijo, C1=C1, C2=C2, constC=constC, **kwargs) -def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False, amijo=False, **kwargs): +def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False, armijo=False, **kwargs): """ Returns the gromov-wasserstein discrepancy between (C1,p) and (C2,q) @@ -456,8 +457,8 @@ def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False, amijo=False, **kwargs Print information along iterations log : bool, optional record log if True - amijo : bool, optional - If True the steps of the line-search is found via an amijo research. Else closed form is used. + armijo : bool, optional + If True the steps of the line-search is found via an armijo research. Else closed form is used. If there is convergence issues use False. Returns ------- @@ -487,7 +488,7 @@ def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False, amijo=False, **kwargs def df(G): return gwggrad(constC, hC1, hC2, G) - res, log = cg(p, q, 0, 1, f, df, G0, log=True, amijo=amijo, C1=C1, C2=C2, constC=constC, **kwargs) + res, log = cg(p, q, 0, 1, f, df, G0, log=True, armijo=armijo, C1=C1, C2=C2, constC=constC, **kwargs) log['gw_dist'] = gwloss(constC, hC1, hC2, res) log['T'] = res if log: @@ -890,7 +891,7 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ p=None, loss_fun='square_loss', max_iter=100, tol=1e-9, verbose=False, log=True, init_C=None, init_X=None): """ - Compute the fgw barycenter as presented eq (5) in [3]. + Compute the fgw barycenter as presented eq (5) in [24]. ---------- N : integer Desired number of samples of the target barycenter @@ -1065,7 +1066,7 @@ def update_sructure_matrix(p, lambdas, T, Cs): def update_feature_matrix(lambdas, Ys, Ts, p): """ - Updates the feature with respect to the S Ts couplings. See "Solving the barycenter problem with Block Coordinate Descent (BCD)" in [3] + Updates the feature with respect to the S Ts couplings. See "Solving the barycenter problem with Block Coordinate Descent (BCD)" in [24] calculated at each iteration Parameters ---------- diff --git a/ot/optim.py b/ot/optim.py index b96d920..82a91bf 100644 --- a/ot/optim.py +++ b/ot/optim.py @@ -73,13 +73,13 @@ def line_search_armijo(f, xk, pk, gfk, old_fval, def do_linesearch(cost, G, deltaG, Mi, f_val, - amijo=True, C1=None, C2=None, reg=None, Gc=None, constC=None, M=None): + armijo=True, C1=None, C2=None, reg=None, Gc=None, constC=None, M=None): """ Solve the linesearch in the FW iterations Parameters ---------- cost : method - The FGW cost + Cost in the FW for the linesearch G : ndarray, shape(ns,nt) The transport map at a given iteration of the FW deltaG : ndarray (ns,nt) @@ -88,21 +88,21 @@ def do_linesearch(cost, G, deltaG, Mi, f_val, Cost matrix of the linearized transport problem. Corresponds to the gradient of the cost f_val : float Value of the cost at G - amijo : bool, optionnal - If True the steps of the line-search is found via an amijo research. Else closed form is used. + armijo : bool, optionnal + If True the steps of the line-search is found via an armijo research. Else closed form is used. If there is convergence issues use False. C1 : ndarray (ns,ns), optionnal - Structure matrix in the source domain. Only used when amijo=False + Structure matrix in the source domain. Only used when armijo=False C2 : ndarray (nt,nt), optionnal - Structure matrix in the target domain. Only used when amijo=False + Structure matrix in the target domain. Only used when armijo=False reg : float, optionnal - Regularization parameter. Corresponds to the alpha parameter of FGW. Only used when amijo=False + Regularization parameter. Only used when armijo=False Gc : ndarray (ns,nt) - Optimal map found by linearization in the FW algorithm. Only used when amijo=False + Optimal map found by linearization in the FW algorithm. Only used when armijo=False constC : ndarray (ns,nt) - Constant for the gromov cost. See [3]. Only used when amijo=False + Constant for the gromov cost. See [24]. Only used when armijo=False M : ndarray (ns,nt), optionnal - Cost matrix between the features. Only used when amijo=False + Cost matrix between the features. Only used when armijo=False Returns ------- alpha : float @@ -118,7 +118,7 @@ def do_linesearch(cost, G, deltaG, Mi, f_val, "Optimal Transport for structured data with application on graphs" International Conference on Machine Learning (ICML). 2019. """ - if amijo: + if armijo: alpha, fc, f_val = line_search_armijo(cost, G, deltaG, Mi, f_val) else: # requires symetric matrices dot1 = np.dot(C1, deltaG) -- cgit v1.2.3 From d4320382fa8873d15dcaec7adca3a4723c142515 Mon Sep 17 00:00:00 2001 From: tvayer Date: Wed, 29 May 2019 16:10:26 +0200 Subject: relative+absolute loss --- ot/optim.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/ot/optim.py b/ot/optim.py index 82a91bf..7d103e2 100644 --- a/ot/optim.py +++ b/ot/optim.py @@ -135,7 +135,7 @@ def do_linesearch(cost, G, deltaG, Mi, f_val, def cg(a, b, M, reg, f, df, G0=None, numItermax=200, - stopThr=1e-9, verbose=False, log=False, **kwargs): + stopThr=1e-9, stopThr2=1e-9, verbose=False, log=False, **kwargs): """ Solve the general regularized OT problem with conditional gradient @@ -173,7 +173,9 @@ def cg(a, b, M, reg, f, df, G0=None, numItermax=200, numItermax : int, optional Max number of iterations stopThr : float, optional - Stop threshol on error (>0) + Stop threshol on the relative variation (>0) + stopThr2 : float, optional + Stop threshol on the absolute variation (>0) verbose : bool, optional Print information along iterations log : bool, optional @@ -249,8 +251,9 @@ def cg(a, b, M, reg, f, df, G0=None, numItermax=200, if it >= numItermax: loop = 0 - delta_fval = (f_val - old_fval) / abs(f_val) - if abs(delta_fval) < stopThr: + abs_delta_fval = abs(f_val - old_fval) + relative_delta_fval = abs_delta_fval / abs(f_val) + if relative_delta_fval < stopThr and abs_delta_fval < stopThr2: loop = 0 if log: @@ -259,8 +262,8 @@ def cg(a, b, M, reg, f, df, G0=None, numItermax=200, if verbose: if it % 20 == 0: print('{:5s}|{:12s}|{:8s}'.format( - 'It.', 'Loss', 'Delta loss') + '\n' + '-' * 32) - print('{:5d}|{:8e}|{:8e}'.format(it, f_val, delta_fval)) + 'It.', 'Loss', 'Relative variation loss', 'Absolute variation loss') + '\n' + '-' * 32) + print('{:5d}|{:8e}|{:8e}|{:8e}'.format(it, f_val, relative_delta_fval, abs_delta_fval)) if log: return G, log @@ -269,7 +272,7 @@ def cg(a, b, M, reg, f, df, G0=None, numItermax=200, def gcg(a, b, M, reg1, reg2, f, df, G0=None, numItermax=10, - numInnerItermax=200, stopThr=1e-9, verbose=False, log=False): + numInnerItermax=200, stopThr=1e-9, stopThr2=1e-9, verbose=False, log=False): """ Solve the general regularized OT problem with the generalized conditional gradient @@ -312,7 +315,9 @@ def gcg(a, b, M, reg1, reg2, f, df, G0=None, numItermax=10, numInnerItermax : int, optional Max number of iterations of Sinkhorn stopThr : float, optional - Stop threshol on error (>0) + Stop threshol on the relative variation (>0) + stopThr2 : float, optional + Stop threshol on the absolute variation (>0) verbose : bool, optional Print information along iterations log : bool, optional @@ -386,8 +391,10 @@ def gcg(a, b, M, reg1, reg2, f, df, G0=None, numItermax=10, if it >= numItermax: loop = 0 - delta_fval = (f_val - old_fval) / abs(f_val) - if abs(delta_fval) < stopThr: + abs_delta_fval = abs(f_val - old_fval) + relative_delta_fval = abs_delta_fval / abs(f_val) + + if relative_delta_fval < stopThr and abs_delta_fval < stopThr2: loop = 0 if log: @@ -396,8 +403,8 @@ def gcg(a, b, M, reg1, reg2, f, df, G0=None, numItermax=10, if verbose: if it % 20 == 0: print('{:5s}|{:12s}|{:8s}'.format( - 'It.', 'Loss', 'Delta loss') + '\n' + '-' * 32) - print('{:5d}|{:8e}|{:8e}'.format(it, f_val, delta_fval)) + 'It.', 'Loss', 'Relative variation loss', 'Absolute variation loss') + '\n' + '-' * 32) + print('{:5d}|{:8e}|{:8e}|{:8e}'.format(it, f_val, relative_delta_fval, abs_delta_fval)) if log: return G, log -- cgit v1.2.3 From e1bd94bb7e85a0d2fd0fcd7642b06da12c1db6db Mon Sep 17 00:00:00 2001 From: tvayer Date: Wed, 29 May 2019 17:05:38 +0200 Subject: code review1 --- examples/plot_barycenter_fgw.py | 30 +++++++---- examples/plot_fgw.py | 32 ++++++++++-- ot/gromov.py | 108 +++++++++++++++++++++++++++++++++++----- ot/optim.py | 31 ++++++------ test/test_gromov.py | 57 ++++++++++++++++----- 5 files changed, 204 insertions(+), 54 deletions(-) diff --git a/examples/plot_barycenter_fgw.py b/examples/plot_barycenter_fgw.py index 9eea036..e4be447 100644 --- a/examples/plot_barycenter_fgw.py +++ b/examples/plot_barycenter_fgw.py @@ -125,7 +125,11 @@ def graph_colors(nx_graph, vmin=0, vmax=7): colors.append(val_map[node]) return colors -#%% create dataset +############################################################################## +# Generate data +# ------------- + +#%% circular dataset # We build a dataset of noisy circular graphs. # Noise is added on the structures by random connections and on the features by gaussian noise. @@ -135,7 +139,11 @@ X0 = [] for k in range(9): X0.append(build_noisy_circular_graph(np.random.randint(15, 25), with_noise=True, structure_noise=True, p=3)) -#%% Plot dataset +############################################################################## +# Plot data +# --------- + +#%% Plot graphs plt.figure(figsize=(8, 10)) for i in range(len(X0)): @@ -146,9 +154,11 @@ for i in range(len(X0)): plt.suptitle('Dataset of noisy graphs. Color indicates the label', fontsize=20) plt.show() +############################################################################## +# Barycenter computation +# ---------------------- -#%% -# We compute the barycenter using FGW. Structure matrices are computed using the shortest_path distance in the graph +#%% We compute the barycenter using FGW. Structure matrices are computed using the shortest_path distance in the graph # Features distances are the euclidean distances Cs = [shortest_path(nx.adjacency_matrix(x)) for x in X0] ps = [np.ones(len(x.nodes())) / len(x.nodes()) for x in X0] @@ -156,14 +166,16 @@ Ys = [np.array([v for (k, v) in nx.get_node_attributes(x, 'attr_name').items()]) lambdas = np.array([np.ones(len(Ys)) / len(Ys)]).ravel() sizebary = 15 # we choose a barycenter with 15 nodes -#%% - A, C, log = fgw_barycenters(sizebary, Ys, Cs, ps, lambdas, alpha=0.95) -#%% +############################################################################## +# Plot Barycenter +# ------------------------- + +#%% Create the barycenter bary = nx.from_numpy_matrix(sp_to_adjency(C, threshinf=0, threshsup=find_thresh(C, sup=100, step=100)[0])) -for i in range(len(A.ravel())): - bary.add_node(i, attr_name=float(A.ravel()[i])) +for i, v in enumerate(A.ravel()): + bary.add_node(i, attr_name=v) #%% pos = nx.kamada_kawai_layout(bary) diff --git a/examples/plot_fgw.py b/examples/plot_fgw.py index ae3c487..43efc94 100644 --- a/examples/plot_fgw.py +++ b/examples/plot_fgw.py @@ -22,12 +22,16 @@ import numpy as np import ot from ot.gromov import gromov_wasserstein, fused_gromov_wasserstein +############################################################################## +# Generate data +# --------- + #%% parameters # We create two 1D random measures -n = 20 -n2 = 30 -sig = 1 -sig2 = 0.1 +n = 20 # number of points in the first distribution +n2 = 30 # number of points in the second distribution +sig = 1 # std of first distribution +sig2 = 0.1 # std of second distribution np.random.seed(0) @@ -43,6 +47,10 @@ yt = yt[::-1, :] p = ot.unif(n) q = ot.unif(n2) +############################################################################## +# Plot data +# --------- + #%% plot the distributions pl.close(10) @@ -64,15 +72,22 @@ pl.yticks(()) pl.tight_layout() pl.show() +############################################################################## +# Create structure matrices and across-feature distance matrix +# --------- #%% Structure matrices and across-features distance matrix C1 = ot.dist(xs) -C2 = ot.dist(xt).T +C2 = ot.dist(xt) M = ot.dist(ys, yt) w1 = ot.unif(C1.shape[0]) w2 = ot.unif(C2.shape[0]) Got = ot.emd([], [], M) +############################################################################## +# Plot matrices +# --------- + #%% cmap = 'Reds' pl.close(10) @@ -112,6 +127,9 @@ pl.tight_layout() ax3.set_aspect('auto') pl.show() +############################################################################## +# Compute FGW/GW +# --------- #%% Computing FGW and GW alpha = 1e-3 @@ -123,6 +141,10 @@ ot.toc() #%reload_ext WGW Gg, log = gromov_wasserstein(C1, C2, p, q, loss_fun='square_loss', verbose=True, log=True) +############################################################################## +# Visualize transport matrices +# --------- + #%% visu OT matrix cmap = 'Blues' fs = 15 diff --git a/ot/gromov.py b/ot/gromov.py index 5a57dc8..53349b7 100644 --- a/ot/gromov.py +++ b/ot/gromov.py @@ -10,6 +10,7 @@ Gromov-Wasserstein transport method # Nicolas Courty # Rémi Flamary # Titouan Vayer +# # License: MIT License import numpy as np @@ -351,9 +352,9 @@ def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, armijo=False, **kwargs return cg(p, q, 0, 1, f, df, G0, armijo=armijo, C1=C1, C2=C2, constC=constC, **kwargs) -def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, armijo=False, **kwargs): +def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, armijo=False, log=False, **kwargs): """ - Computes the FGW distance between two graphs see [3] + Computes the FGW transport between two graphs see [24] .. math:: \gamma = arg\min_\gamma (1-\alpha)*<\gamma,M>_F + alpha* \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} s.t. \gamma 1 = p @@ -377,7 +378,7 @@ def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, distribution in the source space q : ndarray, shape (nt,) distribution in the target space - loss_fun : string,optionnal + loss_fun : string,optional loss function used for the solver max_iter : int, optional Max number of iterations @@ -416,7 +417,86 @@ def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, def df(G): return gwggrad(constC, hC1, hC2, G) - return cg(p, q, M, alpha, f, df, G0, armijo=armijo, C1=C1, C2=C2, constC=constC, **kwargs) + if log: + res, log = cg(p, q, M, alpha, f, df, G0, armijo=armijo, C1=C1, C2=C2, constC=constC, log=True, **kwargs) + log['fgw_dist'] = log['loss'][::-1][0] + return res, log + else: + return cg(p, q, M, alpha, f, df, G0, armijo=armijo, C1=C1, C2=C2, constC=constC, **kwargs) + + +def fused_gromov_wasserstein2(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, armijo=False, log=False, **kwargs): + """ + Computes the FGW distance between two graphs see [24] + .. math:: + \gamma = arg\min_\gamma (1-\alpha)*<\gamma,M>_F + alpha* \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} + s.t. \gamma 1 = p + \gamma^T 1= q + \gamma\geq 0 + where : + - M is the (ns,nt) metric cost matrix + - :math:`f` is the regularization term ( and df is its gradient) + - a and b are source and target weights (sum to 1) + - L is a loss function to account for the misfit between the similarity matrices + The algorithm used for solving the problem is conditional gradient as discussed in [1]_ + Parameters + ---------- + M : ndarray, shape (ns, nt) + Metric cost matrix between features across domains + C1 : ndarray, shape (ns, ns) + Metric cost matrix respresentative of the structure in the source space + C2 : ndarray, shape (nt, nt) + Metric cost matrix espresentative of the structure in the target space + p : ndarray, shape (ns,) + distribution in the source space + q : ndarray, shape (nt,) + distribution in the target space + loss_fun : string,optional + loss function used for the solver + max_iter : int, optional + Max number of iterations + tol : float, optional + Stop threshold on error (>0) + verbose : bool, optional + Print information along iterations + log : bool, optional + record log if True + armijo : bool, optional + If True the steps of the line-search is found via an armijo research. Else closed form is used. + If there is convergence issues use False. + **kwargs : dict + parameters can be directly pased to the ot.optim.cg solver + Returns + ------- + gamma : (ns x nt) ndarray + Optimal transportation matrix for the given parameters + log : dict + log dictionary return only if log==True in parameters + References + ---------- + .. [24] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain + and Courty Nicolas + "Optimal Transport for structured data with application on graphs" + International Conference on Machine Learning (ICML). 2019. + """ + + constC, hC1, hC2 = init_matrix(C1, C2, p, q, loss_fun) + + G0 = p[:, None] * q[None, :] + + def f(G): + return gwloss(constC, hC1, hC2, G) + + def df(G): + return gwggrad(constC, hC1, hC2, G) + + res, log = cg(p, q, M, alpha, f, df, G0, armijo=armijo, C1=C1, C2=C2, constC=constC, log=True, **kwargs) + if log: + log['fgw_dist'] = log['loss'][::-1][0] + log['T'] = res + return log['fgw_dist'], log + else: + return log['fgw_dist'] def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False, armijo=False, **kwargs): @@ -889,7 +969,7 @@ def gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_features=False, p=None, loss_fun='square_loss', max_iter=100, tol=1e-9, - verbose=False, log=True, init_C=None, init_X=None): + verbose=False, log=False, init_C=None, init_X=None): """ Compute the fgw barycenter as presented eq (5) in [24]. ---------- @@ -919,7 +999,8 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ Barycenters' features C : ndarray, shape (N,N) Barycenters' structure matrix - log_: + log_: dictionary + Only returned when log=True T : list of (N,ns) transport matrices Ms : all distance matrices between the feature of the barycenter and the other features dist(X,Ys) shape (N,ns) References @@ -1015,14 +1096,13 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ T = [fused_gromov_wasserstein((1 - alpha) * Ms[s], C, Cs[s], p, ps[s], loss_fun, alpha, numItermax=max_iter, stopThr=1e-5, verbose=verbose) for s in range(S)] # T is N,ns - - log_['Ts_iter'].append(T) err_feature = np.linalg.norm(X - Xprev.reshape(N, d)) err_structure = np.linalg.norm(C - Cprev) if log: log_['err_feature'].append(err_feature) log_['err_structure'].append(err_structure) + log_['Ts_iter'].append(T) if verbose: if cpt % 200 == 0: @@ -1032,11 +1112,15 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ print('{:5d}|{:8e}|'.format(cpt, err_feature)) cpt += 1 - log_['T'] = T # from target to Ys - log_['p'] = p - log_['Ms'] = Ms # Ms are N,ns + if log: + log_['T'] = T # from target to Ys + log_['p'] = p + log_['Ms'] = Ms # Ms are N,ns - return X, C, log_ + if log: + return X, C, log_ + else: + return X, C def update_sructure_matrix(p, lambdas, T, Cs): diff --git a/ot/optim.py b/ot/optim.py index 7d103e2..4d428d9 100644 --- a/ot/optim.py +++ b/ot/optim.py @@ -5,6 +5,7 @@ Optimization algorithms for OT # Author: Remi Flamary # Titouan Vayer +# # License: MIT License import numpy as np @@ -88,20 +89,20 @@ def do_linesearch(cost, G, deltaG, Mi, f_val, Cost matrix of the linearized transport problem. Corresponds to the gradient of the cost f_val : float Value of the cost at G - armijo : bool, optionnal + armijo : bool, optional If True the steps of the line-search is found via an armijo research. Else closed form is used. If there is convergence issues use False. - C1 : ndarray (ns,ns), optionnal + C1 : ndarray (ns,ns), optional Structure matrix in the source domain. Only used when armijo=False - C2 : ndarray (nt,nt), optionnal + C2 : ndarray (nt,nt), optional Structure matrix in the target domain. Only used when armijo=False - reg : float, optionnal + reg : float, optional Regularization parameter. Only used when armijo=False Gc : ndarray (ns,nt) Optimal map found by linearization in the FW algorithm. Only used when armijo=False constC : ndarray (ns,nt) Constant for the gromov cost. See [24]. Only used when armijo=False - M : ndarray (ns,nt), optionnal + M : ndarray (ns,nt), optional Cost matrix between the features. Only used when armijo=False Returns ------- @@ -223,9 +224,9 @@ def cg(a, b, M, reg, f, df, G0=None, numItermax=200, it = 0 if verbose: - print('{:5s}|{:12s}|{:8s}'.format( - 'It.', 'Loss', 'Delta loss') + '\n' + '-' * 32) - print('{:5d}|{:8e}|{:8e}'.format(it, f_val, 0)) + print('{:5s}|{:12s}|{:8s}|{:8s}'.format( + 'It.', 'Loss', 'Relative loss', 'Absolute loss') + '\n' + '-' * 48) + print('{:5d}|{:8e}|{:8e}|{:8e}'.format(it, f_val, 0, 0)) while loop: @@ -261,8 +262,8 @@ def cg(a, b, M, reg, f, df, G0=None, numItermax=200, if verbose: if it % 20 == 0: - print('{:5s}|{:12s}|{:8s}'.format( - 'It.', 'Loss', 'Relative variation loss', 'Absolute variation loss') + '\n' + '-' * 32) + print('{:5s}|{:12s}|{:8s}|{:8s}'.format( + 'It.', 'Loss', 'Relative loss', 'Absolute loss') + '\n' + '-' * 48) print('{:5d}|{:8e}|{:8e}|{:8e}'.format(it, f_val, relative_delta_fval, abs_delta_fval)) if log: @@ -363,9 +364,9 @@ def gcg(a, b, M, reg1, reg2, f, df, G0=None, numItermax=10, it = 0 if verbose: - print('{:5s}|{:12s}|{:8s}'.format( - 'It.', 'Loss', 'Delta loss') + '\n' + '-' * 32) - print('{:5d}|{:8e}|{:8e}'.format(it, f_val, 0)) + print('{:5s}|{:12s}|{:8s}|{:8s}'.format( + 'It.', 'Loss', 'Relative loss', 'Absolute loss') + '\n' + '-' * 48) + print('{:5d}|{:8e}|{:8e}|{:8e}'.format(it, f_val, 0, 0)) while loop: @@ -402,8 +403,8 @@ def gcg(a, b, M, reg1, reg2, f, df, G0=None, numItermax=10, if verbose: if it % 20 == 0: - print('{:5s}|{:12s}|{:8s}'.format( - 'It.', 'Loss', 'Relative variation loss', 'Absolute variation loss') + '\n' + '-' * 32) + print('{:5s}|{:12s}|{:8s}|{:8s}'.format( + 'It.', 'Loss', 'Relative loss', 'Absolute loss') + '\n' + '-' * 48) print('{:5d}|{:8e}|{:8e}|{:8e}'.format(it, f_val, relative_delta_fval, abs_delta_fval)) if log: diff --git a/test/test_gromov.py b/test/test_gromov.py index cd180d4..ec85abf 100644 --- a/test/test_gromov.py +++ b/test/test_gromov.py @@ -2,6 +2,7 @@ # Author: Erwan Vautier # Nicolas Courty +# Titouan Vayer # # License: MIT License @@ -10,6 +11,8 @@ import ot def test_gromov(): + np.random.seed(42) + n_samples = 50 # nb samples mu_s = np.array([0, 0]) @@ -36,6 +39,11 @@ def test_gromov(): np.testing.assert_allclose( q, G.sum(0), atol=1e-04) # cf convergence gromov + Id = (1 / n_samples) * np.eye(n_samples, n_samples) + + np.testing.assert_allclose( + G, np.flipud(Id), atol=1e-04) + gw, log = ot.gromov.gromov_wasserstein2(C1, C2, p, q, 'kl_loss', log=True) G = log['T'] @@ -50,6 +58,8 @@ def test_gromov(): def test_entropic_gromov(): + np.random.seed(42) + n_samples = 50 # nb samples mu_s = np.array([0, 0]) @@ -92,6 +102,7 @@ def test_entropic_gromov(): def test_gromov_barycenter(): + np.random.seed(42) ns = 50 nt = 60 @@ -120,7 +131,7 @@ def test_gromov_barycenter(): def test_gromov_entropic_barycenter(): - + np.random.seed(42) ns = 50 nt = 60 @@ -148,6 +159,8 @@ def test_gromov_entropic_barycenter(): def test_fgw(): + np.random.seed(42) + n_samples = 50 # nb samples mu_s = np.array([0, 0]) @@ -180,8 +193,26 @@ def test_fgw(): np.testing.assert_allclose( q, G.sum(0), atol=1e-04) # cf convergence fgw + Id = (1 / n_samples) * np.eye(n_samples, n_samples) + + np.testing.assert_allclose( + G, np.flipud(Id), atol=1e-04) # cf convergence gromov + + fgw, log = ot.gromov.fused_gromov_wasserstein2(M, C1, C2, p, q, 'square_loss', alpha=0.5, log=True) + + G = log['T'] + + np.testing.assert_allclose(fgw, 0, atol=1e-1, rtol=1e-1) + + # check constratints + np.testing.assert_allclose( + p, G.sum(1), atol=1e-04) # cf convergence gromov + np.testing.assert_allclose( + q, G.sum(0), atol=1e-04) # cf convergence gromov + def test_fgw_barycenter(): + np.random.seed(42) ns = 50 nt = 60 @@ -196,28 +227,28 @@ def test_fgw_barycenter(): C2 = ot.dist(Xt) n_samples = 3 - X, C, log = ot.gromov.fgw_barycenters(n_samples, [ys, yt], [C1, C2], [ot.unif(ns), ot.unif(nt)], [.5, .5], 0.5, - fixed_structure=False, fixed_features=False, - p=ot.unif(n_samples), loss_fun='square_loss', - max_iter=100, tol=1e-3) + X, C = ot.gromov.fgw_barycenters(n_samples, [ys, yt], [C1, C2], [ot.unif(ns), ot.unif(nt)], [.5, .5], 0.5, + fixed_structure=False, fixed_features=False, + p=ot.unif(n_samples), loss_fun='square_loss', + max_iter=100, tol=1e-3) np.testing.assert_allclose(C.shape, (n_samples, n_samples)) np.testing.assert_allclose(X.shape, (n_samples, ys.shape[1])) xalea = np.random.randn(n_samples, 2) init_C = ot.dist(xalea, xalea) - X, C, log = ot.gromov.fgw_barycenters(n_samples, [ys, yt], [C1, C2], ps=[ot.unif(ns), ot.unif(nt)], lambdas=[.5, .5], alpha=0.5, - fixed_structure=True, init_C=init_C, fixed_features=False, - p=ot.unif(n_samples), loss_fun='square_loss', - max_iter=100, tol=1e-3) + X, C = ot.gromov.fgw_barycenters(n_samples, [ys, yt], [C1, C2], ps=[ot.unif(ns), ot.unif(nt)], lambdas=[.5, .5], alpha=0.5, + fixed_structure=True, init_C=init_C, fixed_features=False, + p=ot.unif(n_samples), loss_fun='square_loss', + max_iter=100, tol=1e-3) np.testing.assert_allclose(C.shape, (n_samples, n_samples)) np.testing.assert_allclose(X.shape, (n_samples, ys.shape[1])) init_X = np.random.randn(n_samples, ys.shape[1]) - X, C, log = ot.gromov.fgw_barycenters(n_samples, [ys, yt], [C1, C2], [ot.unif(ns), ot.unif(nt)], [.5, .5], 0.5, - fixed_structure=False, fixed_features=True, init_X=init_X, - p=ot.unif(n_samples), loss_fun='square_loss', - max_iter=100, tol=1e-3) + X, C = ot.gromov.fgw_barycenters(n_samples, [ys, yt], [C1, C2], [ot.unif(ns), ot.unif(nt)], [.5, .5], 0.5, + fixed_structure=False, fixed_features=True, init_X=init_X, + p=ot.unif(n_samples), loss_fun='square_loss', + max_iter=100, tol=1e-3) np.testing.assert_allclose(C.shape, (n_samples, n_samples)) np.testing.assert_allclose(X.shape, (n_samples, ys.shape[1])) -- cgit v1.2.3 From 28059eb5e0aad715823ee4f6509d6a9e3d6e5db0 Mon Sep 17 00:00:00 2001 From: tvayer Date: Wed, 29 May 2019 17:11:41 +0200 Subject: py2 error --- test/test_gromov.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_gromov.py b/test/test_gromov.py index ec85abf..3ca184b 100644 --- a/test/test_gromov.py +++ b/test/test_gromov.py @@ -13,7 +13,7 @@ import ot def test_gromov(): np.random.seed(42) - n_samples = 50 # nb samples + n_samples = 50.0 # nb samples mu_s = np.array([0, 0]) cov_s = np.array([[1, 0], [0, 1]]) @@ -161,7 +161,7 @@ def test_gromov_entropic_barycenter(): def test_fgw(): np.random.seed(42) - n_samples = 50 # nb samples + n_samples = 50.0 # nb samples mu_s = np.array([0, 0]) cov_s = np.array([[1, 0], [0, 1]]) -- cgit v1.2.3 From 63093cef7af3350228251aa930872c6f30789432 Mon Sep 17 00:00:00 2001 From: tvayer Date: Wed, 29 May 2019 17:19:13 +0200 Subject: n_samples float --- test/test_gromov.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/test_gromov.py b/test/test_gromov.py index 3ca184b..d7a12f3 100644 --- a/test/test_gromov.py +++ b/test/test_gromov.py @@ -13,7 +13,7 @@ import ot def test_gromov(): np.random.seed(42) - n_samples = 50.0 # nb samples + n_samples = 50 # nb samples mu_s = np.array([0, 0]) cov_s = np.array([[1, 0], [0, 1]]) @@ -39,7 +39,7 @@ def test_gromov(): np.testing.assert_allclose( q, G.sum(0), atol=1e-04) # cf convergence gromov - Id = (1 / n_samples) * np.eye(n_samples, n_samples) + Id = (1 / float(n_samples)) * np.eye(n_samples, n_samples) np.testing.assert_allclose( G, np.flipud(Id), atol=1e-04) @@ -161,7 +161,7 @@ def test_gromov_entropic_barycenter(): def test_fgw(): np.random.seed(42) - n_samples = 50.0 # nb samples + n_samples = 50 # nb samples mu_s = np.array([0, 0]) cov_s = np.array([[1, 0], [0, 1]]) @@ -193,7 +193,7 @@ def test_fgw(): np.testing.assert_allclose( q, G.sum(0), atol=1e-04) # cf convergence fgw - Id = (1 / n_samples) * np.eye(n_samples, n_samples) + Id = (1 / float(n_samples)) * np.eye(n_samples, n_samples) np.testing.assert_allclose( G, np.flipud(Id), atol=1e-04) # cf convergence gromov -- cgit v1.2.3 From 9bb7d40b563f42bf2875efca860bf0c579307161 Mon Sep 17 00:00:00 2001 From: tvayer Date: Wed, 29 May 2019 17:52:20 +0200 Subject: .0 --- test/test_gromov.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_gromov.py b/test/test_gromov.py index d7a12f3..b7ede95 100644 --- a/test/test_gromov.py +++ b/test/test_gromov.py @@ -39,7 +39,7 @@ def test_gromov(): np.testing.assert_allclose( q, G.sum(0), atol=1e-04) # cf convergence gromov - Id = (1 / float(n_samples)) * np.eye(n_samples, n_samples) + Id = (1 / 1.0*n_samples) * np.eye(n_samples, n_samples) np.testing.assert_allclose( G, np.flipud(Id), atol=1e-04) @@ -193,7 +193,7 @@ def test_fgw(): np.testing.assert_allclose( q, G.sum(0), atol=1e-04) # cf convergence fgw - Id = (1 / float(n_samples)) * np.eye(n_samples, n_samples) + Id = (1 / 1.0*n_samples) * np.eye(n_samples, n_samples) np.testing.assert_allclose( G, np.flipud(Id), atol=1e-04) # cf convergence gromov -- cgit v1.2.3 From 89a2e0aee4353a051d924de0457f8976c26fa5d7 Mon Sep 17 00:00:00 2001 From: tvayer Date: Wed, 29 May 2019 18:02:27 +0200 Subject: pep8 + err --- test/test_gromov.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_gromov.py b/test/test_gromov.py index b7ede95..f218b74 100644 --- a/test/test_gromov.py +++ b/test/test_gromov.py @@ -39,7 +39,7 @@ def test_gromov(): np.testing.assert_allclose( q, G.sum(0), atol=1e-04) # cf convergence gromov - Id = (1 / 1.0*n_samples) * np.eye(n_samples, n_samples) + Id = (1 / (1.0 * n_samples)) * np.eye(n_samples, n_samples) np.testing.assert_allclose( G, np.flipud(Id), atol=1e-04) @@ -193,7 +193,7 @@ def test_fgw(): np.testing.assert_allclose( q, G.sum(0), atol=1e-04) # cf convergence fgw - Id = (1 / 1.0*n_samples) * np.eye(n_samples, n_samples) + Id = (1 / (1.0 * n_samples)) * np.eye(n_samples, n_samples) np.testing.assert_allclose( G, np.flipud(Id), atol=1e-04) # cf convergence gromov -- cgit v1.2.3 From ad450b0a5bb63ee9731e88d4a8e7423b16f1abd8 Mon Sep 17 00:00:00 2001 From: tvayer Date: Tue, 4 Jun 2019 10:32:30 +0200 Subject: changes forgotten coments --- ot/gromov.py | 26 +++----------------------- ot/optim.py | 32 ++++++++++++++++---------------- ot/utils.py | 8 ++++++++ test/test_optim.py | 6 +++--- 4 files changed, 30 insertions(+), 42 deletions(-) diff --git a/ot/gromov.py b/ot/gromov.py index 53349b7..ca96b31 100644 --- a/ot/gromov.py +++ b/ot/gromov.py @@ -17,7 +17,7 @@ import numpy as np from .bregman import sinkhorn -from .utils import dist +from .utils import dist, UndefinedParameter from .optim import cg @@ -1011,9 +1011,6 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ International Conference on Machine Learning (ICML). 2019. """ - class UndefinedParameter(Exception): - pass - S = len(Cs) d = Ys[0].shape[1] # dimension on the node features if p is None: @@ -1049,10 +1046,7 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ T = [np.outer(p, q) for q in ps] - # X is N,d - # Ys is ns,d - Ms = [np.asarray(dist(X, Ys[s]), dtype=np.float64) for s in range(len(Ys))] - # Ms is N,ns + Ms = [np.asarray(dist(X, Ys[s]), dtype=np.float64) for s in range(len(Ys))] # Ms is N,ns cpt = 0 err_feature = 1 @@ -1072,27 +1066,13 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ Ys_temp = [y.T for y in Ys] X = update_feature_matrix(lambdas, Ys_temp, T, p).T - # X must be N,d - # Ys must be ns,d Ms = [np.asarray(dist(X, Ys[s]), dtype=np.float64) for s in range(len(Ys))] if not fixed_structure: if loss_fun == 'square_loss': - # T must be ns,N - # Cs must be ns,ns - # p must be N,1 T_temp = [t.T for t in T] C = update_sructure_matrix(p, lambdas, T_temp, Cs) - # Ys must be d,ns - # Ts must be N,ns - # p must be N,1 - # Ms is N,ns - # C is N,N - # Cs is ns,ns - # p is N,1 - # ps is ns,1 - T = [fused_gromov_wasserstein((1 - alpha) * Ms[s], C, Cs[s], p, ps[s], loss_fun, alpha, numItermax=max_iter, stopThr=1e-5, verbose=verbose) for s in range(S)] # T is N,ns @@ -1115,7 +1095,7 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ if log: log_['T'] = T # from target to Ys log_['p'] = p - log_['Ms'] = Ms # Ms are N,ns + log_['Ms'] = Ms if log: return X, C, log_ diff --git a/ot/optim.py b/ot/optim.py index 4d428d9..f94aceb 100644 --- a/ot/optim.py +++ b/ot/optim.py @@ -73,8 +73,8 @@ def line_search_armijo(f, xk, pk, gfk, old_fval, return alpha, fc[0], phi1 -def do_linesearch(cost, G, deltaG, Mi, f_val, - armijo=True, C1=None, C2=None, reg=None, Gc=None, constC=None, M=None): +def solve_linesearch(cost, G, deltaG, Mi, f_val, + armijo=True, C1=None, C2=None, reg=None, Gc=None, constC=None, M=None): """ Solve the linesearch in the FW iterations Parameters @@ -93,17 +93,17 @@ def do_linesearch(cost, G, deltaG, Mi, f_val, If True the steps of the line-search is found via an armijo research. Else closed form is used. If there is convergence issues use False. C1 : ndarray (ns,ns), optional - Structure matrix in the source domain. Only used when armijo=False + Structure matrix in the source domain. Only used and necessary when armijo=False C2 : ndarray (nt,nt), optional - Structure matrix in the target domain. Only used when armijo=False + Structure matrix in the target domain. Only used and necessary when armijo=False reg : float, optional - Regularization parameter. Only used when armijo=False + Regularization parameter. Only used and necessary when armijo=False Gc : ndarray (ns,nt) - Optimal map found by linearization in the FW algorithm. Only used when armijo=False + Optimal map found by linearization in the FW algorithm. Only used and necessary when armijo=False constC : ndarray (ns,nt) - Constant for the gromov cost. See [24]. Only used when armijo=False + Constant for the gromov cost. See [24]. Only used and necessary when armijo=False M : ndarray (ns,nt), optional - Cost matrix between the features. Only used when armijo=False + Cost matrix between the features. Only used and necessary when armijo=False Returns ------- alpha : float @@ -128,7 +128,7 @@ def do_linesearch(cost, G, deltaG, Mi, f_val, b = np.sum((M + reg * constC) * deltaG) - 2 * reg * (np.sum(dot12 * G) + np.sum(np.dot(C1, G).dot(C2) * deltaG)) c = cost(G) - alpha = solve_1d_linesearch_quad_funct(a, b, c) + alpha = solve_1d_linesearch_quad(a, b, c) fc = None f_val = cost(G + alpha * deltaG) @@ -181,7 +181,7 @@ def cg(a, b, M, reg, f, df, G0=None, numItermax=200, Print information along iterations log : bool, optional record log if True - kwargs : dict + **kwargs : dict Parameters for linesearch Returns @@ -244,7 +244,7 @@ def cg(a, b, M, reg, f, df, G0=None, numItermax=200, deltaG = Gc - G # line search - alpha, fc, f_val = do_linesearch(cost, G, deltaG, Mi, f_val, reg=reg, M=M, Gc=Gc, **kwargs) + alpha, fc, f_val = solve_linesearch(cost, G, deltaG, Mi, f_val, reg=reg, M=M, Gc=Gc, **kwargs) G = G + alpha * deltaG @@ -254,7 +254,7 @@ def cg(a, b, M, reg, f, df, G0=None, numItermax=200, abs_delta_fval = abs(f_val - old_fval) relative_delta_fval = abs_delta_fval / abs(f_val) - if relative_delta_fval < stopThr and abs_delta_fval < stopThr2: + if relative_delta_fval < stopThr or abs_delta_fval < stopThr2: loop = 0 if log: @@ -395,7 +395,7 @@ def gcg(a, b, M, reg1, reg2, f, df, G0=None, numItermax=10, abs_delta_fval = abs(f_val - old_fval) relative_delta_fval = abs_delta_fval / abs(f_val) - if relative_delta_fval < stopThr and abs_delta_fval < stopThr2: + if relative_delta_fval < stopThr or abs_delta_fval < stopThr2: loop = 0 if log: @@ -413,11 +413,11 @@ def gcg(a, b, M, reg1, reg2, f, df, G0=None, numItermax=10, return G -def solve_1d_linesearch_quad_funct(a, b, c): +def solve_1d_linesearch_quad(a, b, c): """ - Solve on 0,1 the following problem: + For any convex or non-convex 1d quadratic function f, solve on [0,1] the following problem: .. math:: - \min f(x)=a*x^{2}+b*x+c + \argmin f(x)=a*x^{2}+b*x+c Parameters ---------- diff --git a/ot/utils.py b/ot/utils.py index bb21b38..efd1288 100644 --- a/ot/utils.py +++ b/ot/utils.py @@ -487,3 +487,11 @@ class BaseEstimator(object): (key, self.__class__.__name__)) setattr(self, key, value) return self + + +class UndefinedParameter(Exception): + """ + Aim at raising an Exception when a undefined parameter is called + + """ + pass diff --git a/test/test_optim.py b/test/test_optim.py index e7ba32a..ae31e1f 100644 --- a/test/test_optim.py +++ b/test/test_optim.py @@ -68,6 +68,6 @@ def test_generalized_conditional_gradient(): def test_solve_1d_linesearch_quad_funct(): - np.testing.assert_allclose(ot.optim.solve_1d_linesearch_quad_funct(1, -1, 0), 0.5) - np.testing.assert_allclose(ot.optim.solve_1d_linesearch_quad_funct(-1, 5, 0), 0) - np.testing.assert_allclose(ot.optim.solve_1d_linesearch_quad_funct(-1, 0.5, 0), 1) + np.testing.assert_allclose(ot.optim.solve_1d_linesearch_quad(1, -1, 0), 0.5) + np.testing.assert_allclose(ot.optim.solve_1d_linesearch_quad(-1, 5, 0), 0) + np.testing.assert_allclose(ot.optim.solve_1d_linesearch_quad(-1, 0.5, 0), 1) -- cgit v1.2.3 From 788a6506c9bf3b862a9652d74f65f8d07851e653 Mon Sep 17 00:00:00 2001 From: tvayer Date: Tue, 4 Jun 2019 11:34:46 +0200 Subject: seed --- test/test_gromov.py | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/test/test_gromov.py b/test/test_gromov.py index f218b74..70fa83f 100644 --- a/test/test_gromov.py +++ b/test/test_gromov.py @@ -11,14 +11,12 @@ import ot def test_gromov(): - np.random.seed(42) - n_samples = 50 # nb samples mu_s = np.array([0, 0]) cov_s = np.array([[1, 0], [0, 1]]) - xs = ot.datasets.make_2D_samples_gauss(n_samples, mu_s, cov_s) + xs = ot.datasets.make_2D_samples_gauss(n_samples, mu_s, cov_s, random_state=4) xt = xs[::-1].copy() @@ -58,14 +56,12 @@ def test_gromov(): def test_entropic_gromov(): - np.random.seed(42) - n_samples = 50 # nb samples mu_s = np.array([0, 0]) cov_s = np.array([[1, 0], [0, 1]]) - xs = ot.datasets.make_2D_samples_gauss(n_samples, mu_s, cov_s) + xs = ot.datasets.make_2D_samples_gauss(n_samples, mu_s, cov_s, random_state=42) xt = xs[::-1].copy() @@ -102,13 +98,11 @@ def test_entropic_gromov(): def test_gromov_barycenter(): - np.random.seed(42) - ns = 50 nt = 60 - Xs, ys = ot.datasets.make_data_classif('3gauss', ns) - Xt, yt = ot.datasets.make_data_classif('3gauss2', nt) + Xs, ys = ot.datasets.make_data_classif('3gauss', ns, random_state=42) + Xt, yt = ot.datasets.make_data_classif('3gauss2', nt, random_state=42) C1 = ot.dist(Xs) C2 = ot.dist(Xt) @@ -131,12 +125,11 @@ def test_gromov_barycenter(): def test_gromov_entropic_barycenter(): - np.random.seed(42) ns = 50 nt = 60 - Xs, ys = ot.datasets.make_data_classif('3gauss', ns) - Xt, yt = ot.datasets.make_data_classif('3gauss2', nt) + Xs, ys = ot.datasets.make_data_classif('3gauss', ns, random_state=42) + Xt, yt = ot.datasets.make_data_classif('3gauss2', nt, random_state=42) C1 = ot.dist(Xs) C2 = ot.dist(Xt) @@ -159,14 +152,13 @@ def test_gromov_entropic_barycenter(): def test_fgw(): - np.random.seed(42) n_samples = 50 # nb samples mu_s = np.array([0, 0]) cov_s = np.array([[1, 0], [0, 1]]) - xs = ot.datasets.make_2D_samples_gauss(n_samples, mu_s, cov_s) + xs = ot.datasets.make_2D_samples_gauss(n_samples, mu_s, cov_s, random_state=42) xt = xs[::-1].copy() @@ -217,8 +209,8 @@ def test_fgw_barycenter(): ns = 50 nt = 60 - Xs, ys = ot.datasets.make_data_classif('3gauss', ns) - Xt, yt = ot.datasets.make_data_classif('3gauss2', nt) + Xs, ys = ot.datasets.make_data_classif('3gauss', ns, random_state=42) + Xt, yt = ot.datasets.make_data_classif('3gauss2', nt, random_state=42) ys = np.random.randn(Xs.shape[0], 2) yt = np.random.randn(Xt.shape[0], 2) -- cgit v1.2.3 From 0fc6938dc15e8888b0a73fa4b6a421f39f0e0697 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Thu, 6 Jun 2019 12:09:34 +0200 Subject: update conf + readme --- docs/source/conf.py | 14 +++++++++++--- docs/source/readme.rst | 30 +++++++++++++++++++----------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 433eca6..d29b829 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -15,7 +15,10 @@ import sys import os import re -import sphinx_gallery +try: + import sphinx_gallery +except ImportError: + print("warning sphinx-gallery not installed") # !!!! allow readthedoc compilation try: @@ -65,6 +68,8 @@ extensions = [ #'sphinx_gallery.gen_gallery', ] +napoleon_numpy_docstring = True + # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -81,7 +86,7 @@ master_doc = 'index' # General information about the project. project = u'POT Python Optimal Transport' -copyright = u'2016-2018, Rémi Flamary, Nicolas Courty' +copyright = u'2016-2019, Rémi Flamary, Nicolas Courty' author = u'Rémi Flamary, Nicolas Courty' # The version info for the project you're documenting, acts as replacement for @@ -323,7 +328,10 @@ texinfo_documents = [ # Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {'https://docs.python.org/': None} +intersphinx_mapping = {'python': ('https://docs.python.org/3', None), + 'numpy': ('http://docs.scipy.org/doc/numpy/', None), + 'scipy': ('http://docs.scipy.org/doc/scipy/reference/', None), + 'matplotlib': ('http://matplotlib.sourceforge.net/', None)} sphinx_gallery_conf = { 'examples_dirs': ['../../examples','../../examples/da'], diff --git a/docs/source/readme.rst b/docs/source/readme.rst index e7c2bd1..d1063e8 100644 --- a/docs/source/readme.rst +++ b/docs/source/readme.rst @@ -12,9 +12,11 @@ It provides the following solvers: - OT Network Flow solver for the linear program/ Earth Movers Distance [1]. -- Entropic regularization OT solver with Sinkhorn Knopp Algorithm [2] - and stabilized version [9][10] and greedy SInkhorn [22] with optional - GPU implementation (requires cudamat). +- Entropic regularization OT solver with Sinkhorn Knopp Algorithm [2], + stabilized version [9][10] and greedy Sinkhorn [22] with optional GPU + implementation (requires cupy). +- Sinkhorn divergence [23] and entropic regularization OT from + empirical data. - Smooth optimal transport solvers (dual and semi-dual) for KL and squared L2 regularizations [17]. - Non regularized Wasserstein barycenters [16] with LP solver (only @@ -115,14 +117,9 @@ below pip install pymanopt autograd -- **ot.gpu** (GPU accelerated OT) depends on cudamat that have to be - installed with: - - :: - - git clone https://github.com/cudamat/cudamat.git - cd cudamat - python setup.py install --user # for user install (no root) +- **ot.gpu** (GPU accelerated OT) depends on cupy that have to be + installed following instructions on `this + page `__. obviously you need CUDA installed and a compatible GPU. @@ -226,6 +223,7 @@ The contributors to this library are: - `Kilian Fatras `__ - `Alain Rakotomamonjy `__ +- `Vayer Titouan `__ This toolbox benefit a lot from open source research and we would like to thank the following persons for providing some code (in various @@ -366,6 +364,16 @@ approximation algorithms for optimal transport via Sinkhorn iteration `__, Advances in Neural Information Processing Systems (NIPS) 31 +[23] Aude, G., Peyré, G., Cuturi, M., `Learning Generative Models with +Sinkhorn Divergences `__, Proceedings +of the Twenty-First International Conference on Artficial Intelligence +and Statistics, (AISTATS) 21, 2018 + +[24] Vayer, T., Chapel, L., Flamary, R., Tavenard, R. and Courty, N. +(2019). `Optimal Transport for structured data with application on +graphs `__ Proceedings +of the 36th International Conference on Machine Learning (ICML). + .. |PyPI version| image:: https://badge.fury.io/py/POT.svg :target: https://badge.fury.io/py/POT .. |Anaconda Cloud| image:: https://anaconda.org/conda-forge/pot/badges/version.svg -- cgit v1.2.3 From 1171f7e39742c207dad6ab5fd15f59ed62f8f4a5 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Thu, 6 Jun 2019 17:22:05 +0200 Subject: start documentation ot --- ot/__init__.py | 16 +++++++++++++++- ot/da.py | 8 ++++---- ot/gpu/__init__.py | 6 +++++- ot/lp/__init__.py | 47 +++++++++++++++++++++++++++++------------------ ot/lp/emd_wrap.pyx | 11 +++++++---- 5 files changed, 60 insertions(+), 28 deletions(-) diff --git a/ot/__init__.py b/ot/__init__.py index b74b924..6d6dc75 100644 --- a/ot/__init__.py +++ b/ot/__init__.py @@ -1,6 +1,20 @@ -"""Python Optimal Transport toolbox +""" + +This is the main module of the POT toolbox. It provides easy access to +a number of functions described below. + +### FAQ + +#### How to compute the Wasserstein distance ? +.. warning:: + The list of automatically imported sub-modules is as follows: + :py:mod:`ot.lp`, :py:mod:`ot.bregman`, :py:mod:`ot.optim` + :py:mod:`ot.utils`, :py:mod:`ot.datasets`, + :py:mod:`ot.gromov`, :py:mod:`ot.smooth` + :py:mod:`ot.stochastic` + The other sub-modules are not imported due to additional dependencies. """ diff --git a/ot/da.py b/ot/da.py index 479e698..83f9027 100644 --- a/ot/da.py +++ b/ot/da.py @@ -41,15 +41,15 @@ def sinkhorn_lpl1_mm(a, labels_a, b, M, reg, eta=0.1, numItermax=10, where : - M is the (ns,nt) metric cost matrix - - :math:`\Omega_e` is the entropic regularization term - :math:`\Omega_e(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - - :math:`\Omega_g` is the group lasso regulaization term + - :math:`\Omega_e` is the entropic regularization term :math:`\Omega_e + (\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` + - :math:`\Omega_g` is the group lasso regularization term :math:`\Omega_g(\gamma)=\sum_{i,c} \|\gamma_{i,\mathcal{I}_c}\|^{1/2}_1` where :math:`\mathcal{I}_c` are the index of samples from class c in the source domain. - a and b are source and target weights (sum to 1) - The algorithm used for solving the problem is the generalised conditional + The algorithm used for solving the problem is the generalized conditional gradient as proposed in [5]_ [7]_ diff --git a/ot/gpu/__init__.py b/ot/gpu/__init__.py index deda6b1..6a2afcf 100644 --- a/ot/gpu/__init__.py +++ b/ot/gpu/__init__.py @@ -5,11 +5,15 @@ This module provides GPU implementation for several OT solvers and utility functions. The GPU backend in handled by `cupy `_. +.. warning:: + Note that by default the module is not import in :mod:`ot`. in order to + use it you need to import :mod:`ot.gpu` . + By default, the functions in this module accept and return numpy arrays in order to proide drop-in replacement for the other POT function but the transfer between CPU en GPU comes with a significant overhead. -In order to get the best erformances, we recommend to give only cupy +In order to get the best performances, we recommend to give only cupy arrays to the functions and desactivate the conversion to numpy of the result of the function with parameter ``to_numpy=False``. diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index 02cbd8c..ed6fa52 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -1,6 +1,9 @@ # -*- coding: utf-8 -*- """ Solvers for the original linear program OT problem + + + """ # Author: Remi Flamary @@ -37,26 +40,30 @@ def emd(a, b, M, numItermax=100000, log=False): - M is the metric cost matrix - a and b are the sample weights + .. warning:: + Note that the M matrix needs to be a C-order numpy.array in float64 + format. + Uses the algorithm proposed in [1]_ Parameters ---------- - a : (ns,) ndarray, float64 - Source histogram (uniform weigth if empty list) - b : (nt,) ndarray, float64 - Target histogram (uniform weigth if empty list) - M : (ns,nt) ndarray, float64 - loss matrix + a : (ns,) numpy.ndarray, float64 + Source histogram (uniform weight if empty list) + b : (nt,) numpy.ndarray, float64 + Target histogram (uniform weight if empty list) + M : (ns,nt) numpy.ndarray, float64 + Loss matrix (c-order array with type float64) numItermax : int, optional (default=100000) The maximum number of iterations before stopping the optimization algorithm if it has not converged. - log: boolean, optional (default=False) + log: bool, optional (default=False) If True, returns a dictionary containing the cost and dual variables. Otherwise returns only the optimal transportation matrix. Returns ------- - gamma: (ns x nt) ndarray + gamma: (ns x nt) numpy.ndarray Optimal transportation matrix for the given parameters log: dict If input log is true, a dictionary containing the cost and dual @@ -128,16 +135,20 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), - M is the metric cost matrix - a and b are the sample weights + .. warning:: + Note that the M matrix needs to be a C-order numpy.array in float64 + format. + Uses the algorithm proposed in [1]_ Parameters ---------- - a : (ns,) ndarray, float64 - Source histogram (uniform weigth if empty list) - b : (nt,) ndarray, float64 - Target histogram (uniform weigth if empty list) - M : (ns,nt) ndarray, float64 - loss matrix + a : (ns,) numpy.ndarray, float64 + Source histogram (uniform weight if empty list) + b : (nt,) numpy.ndarray, float64 + Target histogram (uniform weight if empty list) + M : (ns,nt) numpy.ndarray, float64 + Loss matrix (c-order array with type float64) numItermax : int, optional (default=100000) The maximum number of iterations before stopping the optimization algorithm if it has not converged. @@ -151,7 +162,7 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), ------- gamma: (ns x nt) ndarray Optimal transportation matrix for the given parameters - log: dict + log: dictnp If input log is true, a dictionary containing the cost and dual variables and exit status @@ -231,9 +242,9 @@ def free_support_barycenter(measures_locations, measures_weights, X_init, b=None Parameters ---------- - measures_locations : list of (k_i,d) np.ndarray + measures_locations : list of (k_i,d) numpy.ndarray The discrete support of a measure supported on k_i locations of a d-dimensional space (k_i can be different for each element of the list) - measures_weights : list of (k_i,) np.ndarray + measures_weights : list of (k_i,) numpy.ndarray Numpy arrays where each numpy array has k_i non-negatives values summing to one representing the weights of each discrete input measure X_init : (k,d) np.ndarray @@ -246,7 +257,7 @@ def free_support_barycenter(measures_locations, measures_weights, X_init, b=None numItermax : int, optional Max number of iterations stopThr : float, optional - Stop threshol on error (>0) + Stop threshold on error (>0) verbose : bool, optional Print information along iterations log : bool, optional diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index 83ee6aa..edb5f7c 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -55,13 +55,16 @@ def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mod - M is the metric cost matrix - a and b are the sample weights + .. warning:: + Note that the M matrix needs to be a C-order :py.cls:`numpy.array` + Parameters ---------- - a : (ns,) ndarray, float64 + a : (ns,) numpy.ndarray, float64 source histogram - b : (nt,) ndarray, float64 + b : (nt,) numpy.ndarray, float64 target histogram - M : (ns,nt) ndarray, float64 + M : (ns,nt) numpy.ndarray, float64 loss matrix max_iter : int The maximum number of iterations before stopping the optimization @@ -70,7 +73,7 @@ def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mod Returns ------- - gamma: (ns x nt) ndarray + gamma: (ns x nt) numpy.ndarray Optimal transportation matrix for the given parameters """ -- cgit v1.2.3 From 4ae7e98b255bef3522e76b2c321b6938378d8dc7 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 7 Jun 2019 19:11:21 +0200 Subject: debut doc --- docs/source/howto.rst | 25 +++++++++++++++++++++++++ docs/source/index.rst | 1 + 2 files changed, 26 insertions(+) create mode 100644 docs/source/howto.rst diff --git a/docs/source/howto.rst b/docs/source/howto.rst new file mode 100644 index 0000000..48b1532 --- /dev/null +++ b/docs/source/howto.rst @@ -0,0 +1,25 @@ + +How to ? +======== + +In the following we provide some pointers about which functions and classes +to use for different problems related to optimal transport (OTs). + +1. **How to solve a discrete optimal transport problem ?** + + The solver for discrete is the function :py:mod:`ot.emd` that returns + the OT transport matrix. If you want to solve a regularized OT you can + use :py:mod:`ot.sinkhorn`. + + More detailed examples can be seen on this :ref:`auto_examples/plot_OT_2D_samples` + + Here is a simple use case: + + .. code:: python + + # a,b are 1D histograms (sum to 1 and positive) + # M is the ground cost matrix + T=ot.emd(a,b,M) # exact linear program + T_reg=ot.sinkhorn(a,b,M,reg) # entropic regularized OT + + diff --git a/docs/source/index.rst b/docs/source/index.rst index b8eabcb..d92f50f 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -13,6 +13,7 @@ Contents :maxdepth: 3 self + howto all auto_examples/index -- cgit v1.2.3 From 8c935200558a1071d8df33bc752afed60e2f49f7 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 7 Jun 2019 19:11:48 +0200 Subject: debut doc --- ot/__init__.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ot/__init__.py b/ot/__init__.py index 6d6dc75..16b0dd6 100644 --- a/ot/__init__.py +++ b/ot/__init__.py @@ -3,10 +3,6 @@ This is the main module of the POT toolbox. It provides easy access to a number of functions described below. -### FAQ - -#### How to compute the Wasserstein distance ? - .. warning:: The list of automatically imported sub-modules is as follows: :py:mod:`ot.lp`, :py:mod:`ot.bregman`, :py:mod:`ot.optim` -- cgit v1.2.3 From 3c53834d46f093f5770ec76748beb5667bebb6fa Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Wed, 12 Jun 2019 15:50:00 +0200 Subject: add unbalanced sinkhorn algorithm --- ot/__init__.py | 5 +- ot/unbalanced.py | 404 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 408 insertions(+), 1 deletion(-) create mode 100644 ot/unbalanced.py diff --git a/ot/__init__.py b/ot/__init__.py index b74b924..361be02 100644 --- a/ot/__init__.py +++ b/ot/__init__.py @@ -20,10 +20,12 @@ from . import da from . import gromov from . import smooth from . import stochastic +from . import unbalanced # OT functions from .lp import emd, emd2 from .bregman import sinkhorn, sinkhorn2, barycenter +from .unbalanced import sinkhorn_unbalanced from .da import sinkhorn_lpl1_mm # utils functions @@ -33,4 +35,5 @@ __version__ = "0.5.1" __all__ = ["emd", "emd2", "sinkhorn", "sinkhorn2", "utils", 'datasets', 'bregman', 'lp', 'tic', 'toc', 'toq', 'gromov', - 'dist', 'unif', 'barycenter', 'sinkhorn_lpl1_mm', 'da', 'optim'] + 'dist', 'unif', 'barycenter', 'sinkhorn_lpl1_mm', 'da', 'optim', + 'sinkhorn_unbalanced'] diff --git a/ot/unbalanced.py b/ot/unbalanced.py new file mode 100644 index 0000000..8bd02eb --- /dev/null +++ b/ot/unbalanced.py @@ -0,0 +1,404 @@ +# -*- coding: utf-8 -*- +""" +Regularized Unbalanced OT +""" + +# Author: Hicham Janati +# License: MIT License + +import numpy as np +# from .utils import unif, dist + + +def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, + stopThr=1e-9, verbose=False, log=False, **kwargs): + u""" + Solve the unbalanced entropic regularization optimal transport problem and return the loss + + The function solves the following optimization problem: + + .. math:: + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + alpha KL(\gamma 1, a) + alpha KL(\gamma^T 1, b) + + s.t. + \gamma\geq 0 + where : + + - M is the (ns, nt) metric cost matrix + - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` + - a and b are source and target weights + - KL is the Kullback-Leibler divergence + + The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10]_ + + + Parameters + ---------- + a : np.ndarray (ns,) + samples weights in the source domain + b : np.ndarray (nt,) or np.ndarray (nt,n_hists) + samples in the target domain, compute sinkhorn with multiple targets + and fixed M if b is a matrix (return OT loss + dual variables in log) + M : np.ndarray (ns, nt) + loss matrix + reg : float + Regularization term > 0 + alpha : float + Regulatization term > 0 + method : str + method used for the solver either 'sinkhorn', 'sinkhorn_stabilized' or + 'sinkhorn_epsilon_scaling', see those function for specific parameters + numItermax : int, optional + Max number of iterations + stopThr : float, optional + Stop threshol on error (> 0) + verbose : bool, optional + Print information along iterations + log : bool, optional + record log if True + + + Returns + ------- + W : (nt) ndarray or float + Optimal transportation matrix for the given parameters + log : dict + log dictionary return only if log==True in parameters + + Examples + -------- + + >>> import ot + >>> a=[.5, .5] + >>> b=[.5, .5] + >>> M=[[0., 1.], [1., 0.]] + >>> ot.sinkhorn2(a, b, M, 1, 1) + array([0.26894142]) + + + References + ---------- + + .. [2] M. Cuturi, Sinkhorn Distances : Lightspeed Computation of Optimal Transport, Advances in Neural Information Processing Systems (NIPS) 26, 2013 + + .. [9] Schmitzer, B. (2016). Stabilized Sparse Scaling Algorithms for Entropy Regularized Transport Problems. arXiv preprint arXiv:1610.06519. + + .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + + + + See Also + -------- + ot.lp.emd : Unregularized OT + ot.optim.cg : General regularized OT + ot.bregman.sinkhorn_knopp : Classic Sinkhorn [2] + ot.bregman.sinkhorn_stabilized: Stabilized sinkhorn [9][10] + ot.bregman.sinkhorn_epsilon_scaling: Sinkhorn with epslilon scaling [9][10] + + """ + + if method.lower() == 'sinkhorn': + def sink(): + return sinkhorn_knopp(a, b, M, reg, alpha, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, log=log, **kwargs) + # elif method.lower() == 'sinkhorn_stabilized': + # def sink(): + # return sinkhorn_stabilized(a, b, M, reg, numItermax=numItermax, + # stopThr=stopThr, verbose=verbose, log=log, **kwargs) + # elif method.lower() == 'sinkhorn_epsilon_scaling': + # def sink(): + # return sinkhorn_epsilon_scaling( + # a, b, M, reg, numItermax=numItermax, + # stopThr=stopThr, verbose=verbose, log=log, **kwargs) + else: + print('Warning : unknown method. Falling back to classic Sinkhorn Knopp') + + def sink(): + return sinkhorn_knopp(a, b, M, reg, alpha, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, log=log, **kwargs) + + return sink() + + +def sinkhorn2(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, + stopThr=1e-9, verbose=False, log=False, **kwargs): + u""" + Solve the entropic regularization unbalanced optimal transport problem and return the loss + + The function solves the following optimization problem: + + .. math:: + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + alpha KL(\gamma 1, a) + alpha KL(\gamma^T 1, b) + + s.t. + \gamma\geq 0 + where : + + - M is the (ns, nt) metric cost matrix + - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` + - a and b are source and target weights + - KL is the Kullback-Leibler divergence + + The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10]_ + + + Parameters + ---------- + a : np.ndarray (ns,) + samples weights in the source domain + b : np.ndarray (nt,) or np.ndarray (nt, n_hists) + samples in the target domain, compute sinkhorn with multiple targets + and fixed M if b is a matrix (return OT loss + dual variables in log) + M : np.ndarray (ns,nt) + loss matrix + reg : float + Regularization term > 0 + alpha: float + Regularization term > 0 + method : str + method used for the solver either 'sinkhorn', 'sinkhorn_stabilized' or + 'sinkhorn_epsilon_scaling', see those function for specific parameters + numItermax : int, optional + Max number of iterations + stopThr : float, optional + Stop threshol on error (>0) + verbose : bool, optional + Print information along iterations + log : bool, optional + record log if True + + + Returns + ------- + W : (nt) ndarray or float + Optimal transportation matrix for the given parameters + log : dict + log dictionary return only if log==True in parameters + + Examples + -------- + + >>> import ot + >>> a=[.5, .10] + >>> b=[.5, .5] + >>> M=[[0., 1.],[1., 0.]] + >>> ot.sinkhorn2(a, b, M, 1., 1.) + array([ 0.26894142]) + + + + References + ---------- + + .. [2] M. Cuturi, Sinkhorn Distances : Lightspeed Computation of Optimal Transport, Advances in Neural Information Processing Systems (NIPS) 26, 2013 + + .. [9] Schmitzer, B. (2016). Stabilized Sparse Scaling Algorithms for Entropy Regularized Transport Problems. arXiv preprint arXiv:1610.06519. + + .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + + [21] Altschuler J., Weed J., Rigollet P. : Near-linear time approximation algorithms for optimal transport via Sinkhorn iteration, Advances in Neural Information Processing Systems (NIPS) 31, 2017 + + + + See Also + -------- + ot.lp.emd : Unregularized OT + ot.optim.cg : General regularized OT + ot.bregman.sinkhorn_knopp : Classic Sinkhorn [2] + ot.bregman.greenkhorn : Greenkhorn [21] + ot.bregman.sinkhorn_stabilized: Stabilized sinkhorn [9][10] + ot.bregman.sinkhorn_epsilon_scaling: Sinkhorn with epslilon scaling [9][10] + + """ + + if method.lower() == 'sinkhorn': + def sink(): + return sinkhorn_knopp(a, b, M, reg, alpha, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, log=log, **kwargs) + # elif method.lower() == 'sinkhorn_stabilized': + # def sink(): + # return sinkhorn_stabilized(a, b, M, reg, numItermax=numItermax, + # stopThr=stopThr, verbose=verbose, log=log, **kwargs) + # elif method.lower() == 'sinkhorn_epsilon_scaling': + # def sink(): + # return sinkhorn_epsilon_scaling( + # a, b, M, reg, numItermax=numItermax, + # stopThr=stopThr, verbose=verbose, log=log, **kwargs) + else: + print('Warning : unknown method using classic Sinkhorn Knopp') + + def sink(): + return sinkhorn_knopp(a, b, M, reg, alpha, **kwargs) + + b = np.asarray(b, dtype=np.float64) + if len(b.shape) < 2: + b = b[None, :] + + return sink() + + +def sinkhorn_knopp(a, b, M, reg, alpha, numItermax=1000, + stopThr=1e-9, verbose=False, log=False, **kwargs): + """ + Solve the entropic regularization unbalanced optimal transport problem and return the loss + + The function solves the following optimization problem: + + .. math:: + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + alpha KL(\gamma 1, a) + alpha KL(\gamma^T 1, b) + + s.t. + \gamma\geq 0 + where : + + - M is the (ns, nt) metric cost matrix + - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` + - a and b are source and target weights + - KL is the Kullback-Leibler divergence + + The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10]_ + + + Parameters + ---------- + a : np.ndarray (ns,) + samples weights in the source domain + b : np.ndarray (nt,) or np.ndarray (nt, n_hists) + samples in the target domain, compute sinkhorn with multiple targets + and fixed M if b is a matrix (return OT loss + dual variables in log) + M : np.ndarray (ns,nt) + loss matrix + reg : float + Regularization term > 0 + alpha: float + Regularization term > 0 + numItermax : int, optional + Max number of iterations + stopThr : float, optional + Stop threshol on error (>0) + verbose : bool, optional + Print information along iterations + log : bool, optional + record log if True + + + Returns + ------- + gamma : (ns x nt) ndarray + Optimal transportation matrix for the given parameters + log : dict + log dictionary return only if log==True in parameters + + Examples + -------- + + >>> import ot + >>> a=[.5, .15] + >>> b=[.5, .5] + >>> M=[[0., 1.],[1., 0.]] + >>> ot.sinkhorn(a, b, M, 1., 1.) + array([[ 0.36552929, 0.13447071], + [ 0.13447071, 0.36552929]]) + + + References + ---------- + + .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + + + See Also + -------- + ot.lp.emd : Unregularized OT + ot.optim.cg : General regularized OT + + """ + + a = np.asarray(a, dtype=np.float64) + b = np.asarray(b, dtype=np.float64) + M = np.asarray(M, dtype=np.float64) + + n_a, n_b = M.shape + + if len(a) == 0: + a = np.ones(n_a, dtype=np.float64) / n_a + if len(b) == 0: + b = np.ones(n_b, dtype=np.float64) / n_b + + assert n_a == len(a) and n_b == len(b) + if b.ndim > 1: + n_hists = b.shape[1] + else: + n_hists = 0 + + if log: + log = {'err': []} + + # we assume that no distances are null except those of the diagonal of + # distances + if n_hists: + u = np.ones((n_a, n_hists)) / n_a + v = np.ones((n_b, n_hists)) / n_b + else: + u = np.ones(n_a) / n_a + v = np.ones(n_b) / n_b + + # print(reg) + # Next 3 lines equivalent to K= np.exp(-M/reg), but faster to compute + K = np.empty(M.shape, dtype=M.dtype) + np.divide(M, -reg, out=K) + np.exp(K, out=K) + + # print(np.min(K)) + fi = alpha / (alpha + reg) + + cpt = 0 + err = 1. + while (err > stopThr and cpt < numItermax): + uprev = u + vprev = v + + Kv = K.dot(v) + u = (a / Kv) ** fi + Ktu = K.T.dot(u) + v = (b / Ktu) ** fi + + if (np.any(Ktu == 0.) + or np.any(np.isnan(u)) or np.any(np.isnan(v)) + or np.any(np.isinf(u)) or np.any(np.isinf(v))): + # we have reached the machine precision + # come back to previous solution and quit loop + print('Warning: numerical errors at iteration', cpt) + u = uprev + v = vprev + break + if cpt % 10 == 0: + # we can speed up the process by checking for the error only all + # the 10th iterations + err = np.sum((u - uprev)**2) / np.sum((u)**2) + \ + np.sum((v - vprev)**2) / np.sum((v)**2) + if log: + log['err'].append(err) + if verbose: + if cpt % 200 == 0: + print( + '{:5s}|{:12s}'.format('It.', 'Err') + '\n' + '-' * 19) + print('{:5d}|{:8e}|'.format(cpt, err)) + cpt = cpt + 1 + if log: + log['u'] = u + log['v'] = v + + if n_hists: # return only loss + res = np.einsum('ik,ij,jk,ij->k', u, K, v, M) + if log: + return res, log + else: + return res + + else: # return OT matrix + + if log: + return u[:, None] * K * v[None, :], log + else: + return u[:, None] * K * v[None, :] -- cgit v1.2.3 From 28b549ef3ef93c01462cd811d6e55c36ae5a76a2 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Wed, 12 Jun 2019 15:50:25 +0200 Subject: add test and example of UOT --- examples/plot_UOT_1D.py | 76 +++++++++++++++++++++++++++++++++++++++++++++++++ test/test_unbalanced.py | 36 +++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 examples/plot_UOT_1D.py create mode 100644 test/test_unbalanced.py diff --git a/examples/plot_UOT_1D.py b/examples/plot_UOT_1D.py new file mode 100644 index 0000000..1b1dd9c --- /dev/null +++ b/examples/plot_UOT_1D.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +""" +==================== +1D Unbalanced optimal transport +==================== + +This example illustrates the computation of Unbalanced Optimal transport +using a Kullback-Leibler relaxation. +""" + +# Author: Hicham Janati +# +# License: MIT License + +import numpy as np +import matplotlib.pylab as pl +import ot +import ot.plot +from ot.datasets import make_1D_gauss as gauss + +############################################################################## +# Generate data +# ------------- + + +#%% parameters + +n = 100 # nb bins + +# bin positions +x = np.arange(n, dtype=np.float64) + +# Gaussian distributions +a = gauss(n, m=20, s=5) # m= mean, s= std +b = gauss(n, m=60, s=10) + +# make distributions unbalanced +b *= 5. + +# loss matrix +M = ot.dist(x.reshape((n, 1)), x.reshape((n, 1))) +M /= M.max() + + +############################################################################## +# Plot distributions and loss matrix +# ---------------------------------- + +#%% plot the distributions + +pl.figure(1, figsize=(6.4, 3)) +pl.plot(x, a, 'b', label='Source distribution') +pl.plot(x, b, 'r', label='Target distribution') +pl.legend() + +#%% plot distributions and loss matrix + +pl.figure(2, figsize=(5, 5)) +ot.plot.plot1D_mat(a, b, M, 'Cost matrix M') + + +############################################################################## +# Solve Unbalanced Sinkhorn +# -------------- + + +#%% Sinkhorn + +lambd = 0.1 +alpha = 1. +Gs = ot.unbalanced.sinkhorn_unbalanced(a, b, M, lambd, alpha, verbose=True) + +pl.figure(4, figsize=(5, 5)) +ot.plot.plot1D_mat(a, b, Gs, 'UOT matrix Sinkhorn') + +pl.show() diff --git a/test/test_unbalanced.py b/test/test_unbalanced.py new file mode 100644 index 0000000..863b6f3 --- /dev/null +++ b/test/test_unbalanced.py @@ -0,0 +1,36 @@ +"""Tests for module Unbalanced OT with entropy regularization""" + +# Author: Hicham Janati +# +# License: MIT License + +import numpy as np +import ot + + +def test_unbalanced(): + # test generalized sinkhorn for unbalanced OT + n = 100 + rng = np.random.RandomState(42) + + x = rng.randn(n, 2) + a = ot.utils.unif(n) + b = ot.utils.unif(n) * 1.5 + + M = ot.dist(x, x) + epsilon = 1. + alpha = 1. + K = np.exp(- M / epsilon) + + G, log = ot.unbalanced.sinkhorn_unbalanced(a, b, M, reg=epsilon, alpha=alpha, + stopThr=1e-10, log=True) + + # check fixed point equations + fi = alpha / (alpha + epsilon) + v_final = (b / K.T.dot(log["u"])) ** fi + u_final = (a / K.dot(log["v"])) ** fi + + np.testing.assert_allclose( + u_final, log["u"], atol=1e-05) + np.testing.assert_allclose( + v_final, log["v"], atol=1e-05) -- cgit v1.2.3 From 11381a7ecc79ef719ee9107167c3adc22b5a3f59 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Wed, 12 Jun 2019 17:06:32 +0200 Subject: integrate comments of jmassich --- examples/plot_UOT_1D.py | 6 +++--- ot/unbalanced.py | 54 +++++++++++++++---------------------------------- test/test_unbalanced.py | 9 +++++++-- 3 files changed, 26 insertions(+), 43 deletions(-) diff --git a/examples/plot_UOT_1D.py b/examples/plot_UOT_1D.py index 1b1dd9c..59b7e77 100644 --- a/examples/plot_UOT_1D.py +++ b/examples/plot_UOT_1D.py @@ -66,9 +66,9 @@ ot.plot.plot1D_mat(a, b, M, 'Cost matrix M') #%% Sinkhorn -lambd = 0.1 -alpha = 1. -Gs = ot.unbalanced.sinkhorn_unbalanced(a, b, M, lambd, alpha, verbose=True) +epsilon = 0.1 # entropy parameter +alpha = 1. # Unbalanced KL relaxation parameter +Gs = ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, verbose=True) pl.figure(4, figsize=(5, 5)) ot.plot.plot1D_mat(a, b, Gs, 'UOT matrix Sinkhorn') diff --git a/ot/unbalanced.py b/ot/unbalanced.py index 8bd02eb..f4208b5 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -6,6 +6,7 @@ Regularized Unbalanced OT # Author: Hicham Janati # License: MIT License +import warnings import numpy as np # from .utils import unif, dist @@ -29,7 +30,7 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, - a and b are source and target weights - KL is the Kullback-Leibler divergence - The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10]_ + The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10, 23]_ Parameters @@ -85,15 +86,14 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + .. [23] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : Learning with a Wasserstein Loss, Advances in Neural Information Processing Systems (NIPS) 2015 See Also -------- - ot.lp.emd : Unregularized OT - ot.optim.cg : General regularized OT - ot.bregman.sinkhorn_knopp : Classic Sinkhorn [2] - ot.bregman.sinkhorn_stabilized: Stabilized sinkhorn [9][10] - ot.bregman.sinkhorn_epsilon_scaling: Sinkhorn with epslilon scaling [9][10] + ot.unbalanced.sinkhorn_knopp : Unbalanced Classic Sinkhorn [10] + ot.unbalanced.sinkhorn_stabilized: Unbalanced Stabilized sinkhorn [9][10] + ot.unbalanced.sinkhorn_epsilon_scaling: Unbalanced Sinkhorn with epslilon scaling [9][10] """ @@ -101,17 +101,8 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, def sink(): return sinkhorn_knopp(a, b, M, reg, alpha, numItermax=numItermax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) - # elif method.lower() == 'sinkhorn_stabilized': - # def sink(): - # return sinkhorn_stabilized(a, b, M, reg, numItermax=numItermax, - # stopThr=stopThr, verbose=verbose, log=log, **kwargs) - # elif method.lower() == 'sinkhorn_epsilon_scaling': - # def sink(): - # return sinkhorn_epsilon_scaling( - # a, b, M, reg, numItermax=numItermax, - # stopThr=stopThr, verbose=verbose, log=log, **kwargs) else: - print('Warning : unknown method. Falling back to classic Sinkhorn Knopp') + warnings.warn('Unknown method. Falling back to classic Sinkhorn Knopp') def sink(): return sinkhorn_knopp(a, b, M, reg, alpha, numItermax=numItermax, @@ -139,7 +130,7 @@ def sinkhorn2(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, - a and b are source and target weights - KL is the Kullback-Leibler divergence - The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10]_ + The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10, 23]_ Parameters @@ -196,18 +187,13 @@ def sinkhorn2(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. - [21] Altschuler J., Weed J., Rigollet P. : Near-linear time approximation algorithms for optimal transport via Sinkhorn iteration, Advances in Neural Information Processing Systems (NIPS) 31, 2017 - - + .. [23] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : Learning with a Wasserstein Loss, Advances in Neural Information Processing Systems (NIPS) 2015 See Also -------- - ot.lp.emd : Unregularized OT - ot.optim.cg : General regularized OT - ot.bregman.sinkhorn_knopp : Classic Sinkhorn [2] - ot.bregman.greenkhorn : Greenkhorn [21] - ot.bregman.sinkhorn_stabilized: Stabilized sinkhorn [9][10] - ot.bregman.sinkhorn_epsilon_scaling: Sinkhorn with epslilon scaling [9][10] + ot.unbalanced.sinkhorn_knopp : Unbalanced Classic Sinkhorn [10] + ot.unbalanced.sinkhorn_stabilized: Unbalanced Stabilized sinkhorn [9][10] + ot.unbalanced.sinkhorn_epsilon_scaling: Unbalanced Sinkhorn with epslilon scaling [9][10] """ @@ -215,17 +201,8 @@ def sinkhorn2(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, def sink(): return sinkhorn_knopp(a, b, M, reg, alpha, numItermax=numItermax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) - # elif method.lower() == 'sinkhorn_stabilized': - # def sink(): - # return sinkhorn_stabilized(a, b, M, reg, numItermax=numItermax, - # stopThr=stopThr, verbose=verbose, log=log, **kwargs) - # elif method.lower() == 'sinkhorn_epsilon_scaling': - # def sink(): - # return sinkhorn_epsilon_scaling( - # a, b, M, reg, numItermax=numItermax, - # stopThr=stopThr, verbose=verbose, log=log, **kwargs) else: - print('Warning : unknown method using classic Sinkhorn Knopp') + warnings.warn('Unknown method using classic Sinkhorn Knopp') def sink(): return sinkhorn_knopp(a, b, M, reg, alpha, **kwargs) @@ -256,7 +233,7 @@ def sinkhorn_knopp(a, b, M, reg, alpha, numItermax=1000, - a and b are source and target weights - KL is the Kullback-Leibler divergence - The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10]_ + The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10, 23]_ Parameters @@ -306,6 +283,7 @@ def sinkhorn_knopp(a, b, M, reg, alpha, numItermax=1000, .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + .. [23] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : Learning with a Wasserstein Loss, Advances in Neural Information Processing Systems (NIPS) 2015 See Also -------- @@ -368,7 +346,7 @@ def sinkhorn_knopp(a, b, M, reg, alpha, numItermax=1000, or np.any(np.isinf(u)) or np.any(np.isinf(v))): # we have reached the machine precision # come back to previous solution and quit loop - print('Warning: numerical errors at iteration', cpt) + warnings.warn('Numerical errors at iteration', cpt) u = uprev v = vprev break diff --git a/test/test_unbalanced.py b/test/test_unbalanced.py index 863b6f3..e37498f 100644 --- a/test/test_unbalanced.py +++ b/test/test_unbalanced.py @@ -6,15 +6,19 @@ import numpy as np import ot +import pytest -def test_unbalanced(): +@pytest.mark.parametrize("metric", ["sinkhorn"]) +def test_unbalanced_convergence(method): # test generalized sinkhorn for unbalanced OT n = 100 rng = np.random.RandomState(42) x = rng.randn(n, 2) a = ot.utils.unif(n) + + # make dists unbalanced b = ot.utils.unif(n) * 1.5 M = ot.dist(x, x) @@ -23,7 +27,8 @@ def test_unbalanced(): K = np.exp(- M / epsilon) G, log = ot.unbalanced.sinkhorn_unbalanced(a, b, M, reg=epsilon, alpha=alpha, - stopThr=1e-10, log=True) + stopThr=1e-10, method=method, + log=True) # check fixed point equations fi = alpha / (alpha + epsilon) -- cgit v1.2.3 From 12ed1581225f70c7c8777b6ce31710453fda7f51 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Wed, 12 Jun 2019 17:15:40 +0200 Subject: fix typo in test argument --- test/test_unbalanced.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_unbalanced.py b/test/test_unbalanced.py index e37498f..b4fa355 100644 --- a/test/test_unbalanced.py +++ b/test/test_unbalanced.py @@ -9,7 +9,7 @@ import ot import pytest -@pytest.mark.parametrize("metric", ["sinkhorn"]) +@pytest.mark.parametrize("method", ["sinkhorn"]) def test_unbalanced_convergence(method): # test generalized sinkhorn for unbalanced OT n = 100 -- cgit v1.2.3 From 50bc90058940645a13e2f3e41129bdc97161dc63 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Wed, 12 Jun 2019 17:52:02 +0200 Subject: add unbalanced barycenters --- examples/plot_UOT_barycenter_1D.py | 164 +++++++++++++++++++++++++++++++++++++ ot/unbalanced.py | 118 ++++++++++++++++++++++++++ test/test_unbalanced.py | 30 +++++++ 3 files changed, 312 insertions(+) create mode 100644 examples/plot_UOT_barycenter_1D.py diff --git a/examples/plot_UOT_barycenter_1D.py b/examples/plot_UOT_barycenter_1D.py new file mode 100644 index 0000000..8dfb84f --- /dev/null +++ b/examples/plot_UOT_barycenter_1D.py @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- +""" +=========================================================== +1D Wasserstein barycenter demo for Unbalanced distributions +=========================================================== + +This example illustrates the computation of regularized Wassersyein Barycenter +as proposed in [10] for Unbalanced inputs. + + +[10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + +""" + +# Author: Hicham Janati +# +# License: MIT License + +import numpy as np +import matplotlib.pylab as pl +import ot +# necessary for 3d plot even if not used +from mpl_toolkits.mplot3d import Axes3D # noqa +from matplotlib.collections import PolyCollection + +############################################################################## +# Generate data +# ------------- + +#%% parameters + +n = 100 # nb bins + +# bin positions +x = np.arange(n, dtype=np.float64) + +# Gaussian distributions +a1 = ot.datasets.make_1D_gauss(n, m=20, s=5) # m= mean, s= std +a2 = ot.datasets.make_1D_gauss(n, m=60, s=8) + +# make unbalanced dists +a2 *= 3. + +# creating matrix A containing all distributions +A = np.vstack((a1, a2)).T +n_distributions = A.shape[1] + +# loss matrix + normalization +M = ot.utils.dist0(n) +M /= M.max() + +############################################################################## +# Plot data +# --------- + +#%% plot the distributions + +pl.figure(1, figsize=(6.4, 3)) +for i in range(n_distributions): + pl.plot(x, A[:, i]) +pl.title('Distributions') +pl.tight_layout() + +############################################################################## +# Barycenter computation +# ---------------------- + +#%% non weighted barycenter computation + +weight = 0.5 # 0<=weight<=1 +weights = np.array([1 - weight, weight]) + +# l2bary +bary_l2 = A.dot(weights) + +# wasserstein +reg = 1e-3 +alpha = 1. + +bary_wass = ot.unbalanced.barycenter_unbalanced(A, M, reg, alpha, weights) + +pl.figure(2) +pl.clf() +pl.subplot(2, 1, 1) +for i in range(n_distributions): + pl.plot(x, A[:, i]) +pl.title('Distributions') + +pl.subplot(2, 1, 2) +pl.plot(x, bary_l2, 'r', label='l2') +pl.plot(x, bary_wass, 'g', label='Wasserstein') +pl.legend() +pl.title('Barycenters') +pl.tight_layout() + +############################################################################## +# Barycentric interpolation +# ------------------------- + +#%% barycenter interpolation + +n_weight = 11 +weight_list = np.linspace(0, 1, n_weight) + + +B_l2 = np.zeros((n, n_weight)) + +B_wass = np.copy(B_l2) + +for i in range(0, n_weight): + weight = weight_list[i] + weights = np.array([1 - weight, weight]) + B_l2[:, i] = A.dot(weights) + B_wass[:, i] = ot.unbalanced.barycenter_unbalanced(A, M, reg, alpha, weights) + + +#%% plot interpolation + +pl.figure(3) + +cmap = pl.cm.get_cmap('viridis') +verts = [] +zs = weight_list +for i, z in enumerate(zs): + ys = B_l2[:, i] + verts.append(list(zip(x, ys))) + +ax = pl.gcf().gca(projection='3d') + +poly = PolyCollection(verts, facecolors=[cmap(a) for a in weight_list]) +poly.set_alpha(0.7) +ax.add_collection3d(poly, zs=zs, zdir='y') +ax.set_xlabel('x') +ax.set_xlim3d(0, n) +ax.set_ylabel(r'$\alpha$') +ax.set_ylim3d(0, 1) +ax.set_zlabel('') +ax.set_zlim3d(0, B_l2.max() * 1.01) +pl.title('Barycenter interpolation with l2') +pl.tight_layout() + +pl.figure(4) +cmap = pl.cm.get_cmap('viridis') +verts = [] +zs = weight_list +for i, z in enumerate(zs): + ys = B_wass[:, i] + verts.append(list(zip(x, ys))) + +ax = pl.gcf().gca(projection='3d') + +poly = PolyCollection(verts, facecolors=[cmap(a) for a in weight_list]) +poly.set_alpha(0.7) +ax.add_collection3d(poly, zs=zs, zdir='y') +ax.set_xlabel('x') +ax.set_xlim3d(0, n) +ax.set_ylabel(r'$\alpha$') +ax.set_ylim3d(0, 1) +ax.set_zlabel('') +ax.set_zlim3d(0, B_l2.max() * 1.01) +pl.title('Barycenter interpolation with Wasserstein') +pl.tight_layout() + +pl.show() diff --git a/ot/unbalanced.py b/ot/unbalanced.py index f4208b5..a30fc18 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -380,3 +380,121 @@ def sinkhorn_knopp(a, b, M, reg, alpha, numItermax=1000, return u[:, None] * K * v[None, :], log else: return u[:, None] * K * v[None, :] + + +def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, + stopThr=1e-4, verbose=False, log=False): + """Compute the entropic regularized unbalanced wasserstein barycenter of distributions A + + The function solves the following optimization problem: + + .. math:: + \mathbf{a} = arg\min_\mathbf{a} \sum_i Wu_{reg}(\mathbf{a},\mathbf{a}_i) + + where : + + - :math:`W_{reg}(\cdot,\cdot)` is the unbalanced entropic regularized Wasserstein distance (see ot.unbalanced.sinkhorn_unbalanced) + - :math:`\mathbf{a}_i` are training distributions in the columns of matrix :math:`\mathbf{A}` + - reg and :math:`\mathbf{M}` are respectively the regularization term and the cost matrix for OT + - alpha is the marginal relaxation hyperparameter + The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10]_ + + Parameters + ---------- + A : np.ndarray (d,n) + n training distributions a_i of size d + M : np.ndarray (d,d) + loss matrix for OT + reg : float + Regularization term > 0 + alpha : float + Regularization term > 0 + weights : np.ndarray (n,) + Weights of each histogram a_i on the simplex (barycentric coodinates) + numItermax : int, optional + Max number of iterations + stopThr : float, optional + Stop threshol on error (>0) + verbose : bool, optional + Print information along iterations + log : bool, optional + record log if True + + + Returns + ------- + a : (d,) ndarray + Unbalanced Wasserstein barycenter + log : dict + log dictionary return only if log==True in parameters + + + References + ---------- + + .. [3] Benamou, J. D., Carlier, G., Cuturi, M., Nenna, L., & Peyré, G. (2015). Iterative Bregman projections for regularized transportation problems. SIAM Journal on Scientific Computing, 37(2), A1111-A1138. + .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + + + """ + p, n_hists = A.shape + if weights is None: + weights = np.ones(n_hists) / n_hists + else: + assert(len(weights) == A.shape[1]) + + if log: + log = {'err': []} + + K = np.exp(- M / reg) + + fi = alpha / (alpha + reg) + + v = np.ones((p, n_hists)) / p + u = np.ones((p, 1)) / p + + cpt = 0 + err = 1. + + while (err > stopThr and cpt < numItermax): + uprev = u + vprev = v + + Kv = K.dot(v) + u = (A / Kv) ** fi + Ktu = K.T.dot(u) + q = ((Ktu ** (1 - fi)).dot(weights)) + q = q ** (1 / (1 - fi)) + Q = q[:, None] + v = (Q / Ktu) ** fi + + if (np.any(Ktu == 0.) + or np.any(np.isnan(u)) or np.any(np.isnan(v)) + or np.any(np.isinf(u)) or np.any(np.isinf(v))): + # we have reached the machine precision + # come back to previous solution and quit loop + warnings.warn('Numerical errors at iteration', cpt) + u = uprev + v = vprev + break + if cpt % 10 == 0: + # we can speed up the process by checking for the error only all + # the 10th iterations + err = np.sum((u - uprev) ** 2) / np.sum((u) ** 2) + \ + np.sum((v - vprev) ** 2) / np.sum((v) ** 2) + if log: + log['err'].append(err) + if verbose: + if cpt % 50 == 0: + print( + '{:5s}|{:12s}'.format('It.', 'Err') + '\n' + '-' * 19) + print('{:5d}|{:8e}|'.format(cpt, err)) + + cpt += 1 + if log: + log['niter'] = cpt + log['u'] = u + log['v'] = v + return q, log + else: + return q diff --git a/test/test_unbalanced.py b/test/test_unbalanced.py index b4fa355..b39e457 100644 --- a/test/test_unbalanced.py +++ b/test/test_unbalanced.py @@ -39,3 +39,33 @@ def test_unbalanced_convergence(method): u_final, log["u"], atol=1e-05) np.testing.assert_allclose( v_final, log["v"], atol=1e-05) + + +def test_unbalanced_barycenter(): + # test generalized sinkhorn for unbalanced OT barycenter + n = 100 + rng = np.random.RandomState(42) + + x = rng.randn(n, 2) + A = rng.rand(n, 2) + + # make dists unbalanced + A = A * np.array([1, 2])[None, :] + M = ot.dist(x, x) + epsilon = 1. + alpha = 1. + K = np.exp(- M / epsilon) + + q, log = ot.unbalanced.barycenter_unbalanced(A, M, reg=epsilon, alpha=alpha, + stopThr=1e-10, + log=True) + + # check fixed point equations + fi = alpha / (alpha + epsilon) + v_final = (q[:, None] / K.T.dot(log["u"])) ** fi + u_final = (A / K.dot(log["v"])) ** fi + + np.testing.assert_allclose( + u_final, log["u"], atol=1e-05) + np.testing.assert_allclose( + v_final, log["v"], atol=1e-05) -- cgit v1.2.3 From 897982718a5fd81a9a591d80a7d50839399fc088 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Tue, 18 Jun 2019 16:40:06 +0200 Subject: fix func names + add more tests --- ot/__init__.py | 2 +- ot/bregman.py | 2 +- ot/unbalanced.py | 79 ++++++++++++++++++++++++++++++------------------- test/test_unbalanced.py | 79 +++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 127 insertions(+), 35 deletions(-) diff --git a/ot/__init__.py b/ot/__init__.py index 361be02..acb05e6 100644 --- a/ot/__init__.py +++ b/ot/__init__.py @@ -25,7 +25,7 @@ from . import unbalanced # OT functions from .lp import emd, emd2 from .bregman import sinkhorn, sinkhorn2, barycenter -from .unbalanced import sinkhorn_unbalanced +from .unbalanced import sinkhorn_unbalanced, barycenter_unbalanced from .da import sinkhorn_lpl1_mm # utils functions diff --git a/ot/bregman.py b/ot/bregman.py index 321712b..09716e6 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -241,7 +241,7 @@ def sinkhorn2(a, b, M, reg, method='sinkhorn', numItermax=1000, b = np.asarray(b, dtype=np.float64) if len(b.shape) < 2: - b = b.reshape((-1, 1)) + b = b[:, None] return sink() diff --git a/ot/unbalanced.py b/ot/unbalanced.py index a30fc18..97e2576 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -73,8 +73,9 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, >>> a=[.5, .5] >>> b=[.5, .5] >>> M=[[0., 1.], [1., 0.]] - >>> ot.sinkhorn2(a, b, M, 1, 1) - array([0.26894142]) + >>> ot.sinkhorn_unbalanced(a, b, M, 1, 1) + array([[0.51122823, 0.18807035], + [0.18807035, 0.51122823]]) References @@ -91,28 +92,36 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, See Also -------- - ot.unbalanced.sinkhorn_knopp : Unbalanced Classic Sinkhorn [10] - ot.unbalanced.sinkhorn_stabilized: Unbalanced Stabilized sinkhorn [9][10] - ot.unbalanced.sinkhorn_epsilon_scaling: Unbalanced Sinkhorn with epslilon scaling [9][10] + ot.unbalanced.sinkhorn_knopp_unbalanced : Unbalanced Classic Sinkhorn [10] + ot.unbalanced.sinkhorn_stabilized_unbalanced: Unbalanced Stabilized sinkhorn [9][10] + ot.unbalanced.sinkhorn_epsilon_scaling_unbalanced: Unbalanced Sinkhorn with epslilon scaling [9][10] """ if method.lower() == 'sinkhorn': def sink(): - return sinkhorn_knopp(a, b, M, reg, alpha, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, log=log, **kwargs) - else: - warnings.warn('Unknown method. Falling back to classic Sinkhorn Knopp') + return sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) + + elif method.lower() in ['sinkhorn_stabilized', 'sinkhorn_epsilon_scaling']: + warnings.warn('Method not implemented yet. Using classic Sinkhorn Knopp') def sink(): - return sinkhorn_knopp(a, b, M, reg, alpha, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, log=log, **kwargs) + return sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) + else: + raise ValueError('Unknown method. Using classic Sinkhorn Knopp') return sink() -def sinkhorn2(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, - stopThr=1e-9, verbose=False, log=False, **kwargs): +def sinkhorn_unbalanced2(a, b, M, reg, alpha, method='sinkhorn', + numItermax=1000, stopThr=1e-9, verbose=False, + log=False, **kwargs): u""" Solve the entropic regularization unbalanced optimal transport problem and return the loss @@ -173,8 +182,8 @@ def sinkhorn2(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, >>> a=[.5, .10] >>> b=[.5, .5] >>> M=[[0., 1.],[1., 0.]] - >>> ot.sinkhorn2(a, b, M, 1., 1.) - array([ 0.26894142]) + >>> ot.unbalanced.sinkhorn_unbalanced2(a, b, M, 1., 1.) + array([0.31912866]) @@ -199,23 +208,31 @@ def sinkhorn2(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, if method.lower() == 'sinkhorn': def sink(): - return sinkhorn_knopp(a, b, M, reg, alpha, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, log=log, **kwargs) - else: - warnings.warn('Unknown method using classic Sinkhorn Knopp') + return sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) + + elif method.lower() in ['sinkhorn_stabilized', 'sinkhorn_epsilon_scaling']: + warnings.warn('Method not implemented yet. Using classic Sinkhorn Knopp') def sink(): - return sinkhorn_knopp(a, b, M, reg, alpha, **kwargs) + return sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) + else: + raise ValueError('Unknown method. Using classic Sinkhorn Knopp') b = np.asarray(b, dtype=np.float64) if len(b.shape) < 2: - b = b[None, :] + b = b[:, None] return sink() -def sinkhorn_knopp(a, b, M, reg, alpha, numItermax=1000, - stopThr=1e-9, verbose=False, log=False, **kwargs): +def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, + stopThr=1e-9, verbose=False, log=False, **kwargs): """ Solve the entropic regularization unbalanced optimal transport problem and return the loss @@ -273,10 +290,9 @@ def sinkhorn_knopp(a, b, M, reg, alpha, numItermax=1000, >>> a=[.5, .15] >>> b=[.5, .5] >>> M=[[0., 1.],[1., 0.]] - >>> ot.sinkhorn(a, b, M, 1., 1.) - array([[ 0.36552929, 0.13447071], - [ 0.13447071, 0.36552929]]) - + >>> ot.sinkhorn_knopp_unbalanced(a, b, M, 1., 1.) + array([[0.52761554, 0.22392482], + [0.10286295, 0.32257641]]) References ---------- @@ -303,8 +319,7 @@ def sinkhorn_knopp(a, b, M, reg, alpha, numItermax=1000, if len(b) == 0: b = np.ones(n_b, dtype=np.float64) / n_b - assert n_a == len(a) and n_b == len(b) - if b.ndim > 1: + if len(b.shape) > 1: n_hists = b.shape[1] else: n_hists = 0 @@ -315,8 +330,9 @@ def sinkhorn_knopp(a, b, M, reg, alpha, numItermax=1000, # we assume that no distances are null except those of the diagonal of # distances if n_hists: - u = np.ones((n_a, n_hists)) / n_a + u = np.ones((n_a, 1)) / n_a v = np.ones((n_b, n_hists)) / n_b + a = a.reshape(n_a, 1) else: u = np.ones(n_a) / n_a v = np.ones(n_b) / n_b @@ -332,6 +348,7 @@ def sinkhorn_knopp(a, b, M, reg, alpha, numItermax=1000, cpt = 0 err = 1. + while (err > stopThr and cpt < numItermax): uprev = u vprev = v @@ -473,7 +490,7 @@ def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, or np.any(np.isinf(u)) or np.any(np.isinf(v))): # we have reached the machine precision # come back to previous solution and quit loop - warnings.warn('Numerical errors at iteration', cpt) + warnings.warn('Numerical errors at iteration %s' % cpt) u = uprev v = vprev break diff --git a/test/test_unbalanced.py b/test/test_unbalanced.py index b39e457..1395fe1 100644 --- a/test/test_unbalanced.py +++ b/test/test_unbalanced.py @@ -29,7 +29,8 @@ def test_unbalanced_convergence(method): G, log = ot.unbalanced.sinkhorn_unbalanced(a, b, M, reg=epsilon, alpha=alpha, stopThr=1e-10, method=method, log=True) - + loss = ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, alpha, + method=method) # check fixed point equations fi = alpha / (alpha + epsilon) v_final = (b / K.T.dot(log["u"])) ** fi @@ -40,6 +41,44 @@ def test_unbalanced_convergence(method): np.testing.assert_allclose( v_final, log["v"], atol=1e-05) + # check if sinkhorn_unbalanced2 returns the correct loss + np.testing.assert_allclose((G * M).sum(), loss, atol=1e-5) + + +@pytest.mark.parametrize("method", ["sinkhorn"]) +def test_unbalanced_multiple_inputs(method): + # test generalized sinkhorn for unbalanced OT + n = 100 + rng = np.random.RandomState(42) + + x = rng.randn(n, 2) + a = ot.utils.unif(n) + + # make dists unbalanced + b = rng.rand(n, 2) + + M = ot.dist(x, x) + epsilon = 1. + alpha = 1. + K = np.exp(- M / epsilon) + + loss, log = ot.unbalanced.sinkhorn_unbalanced(a, b, M, reg=epsilon, + alpha=alpha, + stopThr=1e-10, method=method, + log=True) + # check fixed point equations + fi = alpha / (alpha + epsilon) + v_final = (b / K.T.dot(log["u"])) ** fi + + u_final = (a[:, None] / K.dot(log["v"])) ** fi + + np.testing.assert_allclose( + u_final, log["u"], atol=1e-05) + np.testing.assert_allclose( + v_final, log["v"], atol=1e-05) + + assert len(loss) == b.shape[1] + def test_unbalanced_barycenter(): # test generalized sinkhorn for unbalanced OT barycenter @@ -59,7 +98,6 @@ def test_unbalanced_barycenter(): q, log = ot.unbalanced.barycenter_unbalanced(A, M, reg=epsilon, alpha=alpha, stopThr=1e-10, log=True) - # check fixed point equations fi = alpha / (alpha + epsilon) v_final = (q[:, None] / K.T.dot(log["u"])) ** fi @@ -69,3 +107,40 @@ def test_unbalanced_barycenter(): u_final, log["u"], atol=1e-05) np.testing.assert_allclose( v_final, log["v"], atol=1e-05) + + +def test_implemented_methods(): + IMPLEMENTED_METHODS = ['sinkhorn'] + TO_BE_IMPLEMENTED_METHODS = ['sinkhorn_stabilized', + 'sinkhorn_epsilon_scaling'] + NOT_VALID_TOKENS = ['foo'] + # test generalized sinkhorn for unbalanced OT barycenter + n = 3 + rng = np.random.RandomState(42) + + x = rng.randn(n, 2) + a = ot.utils.unif(n) + + # make dists unbalanced + b = ot.utils.unif(n) * 1.5 + + M = ot.dist(x, x) + epsilon = 1. + alpha = 1. + for method in IMPLEMENTED_METHODS: + ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, + method=method) + ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, alpha, + method=method) + with pytest.warns(UserWarning, match='not implemented'): + for method in set(TO_BE_IMPLEMENTED_METHODS): + ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, + method=method) + ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, alpha, + method=method) + with pytest.raises(ValueError): + for method in set(NOT_VALID_TOKENS): + ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, + method=method) + ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, alpha, + method=method) -- cgit v1.2.3 From adf9d046445bf142a29d914352f397b36f7905c0 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Tue, 18 Jun 2019 22:26:48 +0200 Subject: update Readme + minor rendering in examples --- README.md | 4 ++++ examples/plot_UOT_1D.py | 8 ++++---- examples/plot_UOT_barycenter_1D.py | 10 +++++----- ot/unbalanced.py | 6 +++--- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index b6b215c..d24d8b9 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ It provides the following solvers: * Gromov-Wasserstein distances and barycenters ([13] and regularized [12]) * Stochastic Optimization for Large-scale Optimal Transport (semi-dual problem [18] and dual problem [19]) * Non regularized free support Wasserstein barycenters [20]. +* Unbalanced OT with KL relaxation distance and barycenter [10, 25]. Some demonstrations (both in Python and Jupyter Notebook format) are available in the examples folder. @@ -165,6 +166,7 @@ The contributors to this library are: * [Kilian Fatras](https://kilianfatras.github.io/) * [Alain Rakotomamonjy](https://sites.google.com/site/alainrakotomamonjy/home) * [Vayer Titouan](https://tvayer.github.io/) +* [Hicham Janati](https://hichamjanati.github.io/) (Unbalanced OT) This toolbox benefit a lot from open source research and we would like to thank the following persons for providing some code (in various languages): @@ -236,3 +238,5 @@ You can also post bug reports and feature requests in Github issues. Make sure t [23] Aude, G., Peyré, G., Cuturi, M., [Learning Generative Models with Sinkhorn Divergences](https://arxiv.org/abs/1706.00292), Proceedings of the Twenty-First International Conference on Artficial Intelligence and Statistics, (AISTATS) 21, 2018 [24] Vayer, T., Chapel, L., Flamary, R., Tavenard, R. and Courty, N. (2019). [Optimal Transport for structured data with application on graphs](http://proceedings.mlr.press/v97/titouan19a.html) Proceedings of the 36th International Conference on Machine Learning (ICML). + +[25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. (2019). [Learning with a Wasserstein Loss](http://cbcl.mit.edu/wasserstein/) Advances in Neural Information Processing Systems (NIPS). diff --git a/examples/plot_UOT_1D.py b/examples/plot_UOT_1D.py index 59b7e77..2ea8b05 100644 --- a/examples/plot_UOT_1D.py +++ b/examples/plot_UOT_1D.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- """ -==================== +=============================== 1D Unbalanced optimal transport -==================== +=============================== This example illustrates the computation of Unbalanced Optimal transport using a Kullback-Leibler relaxation. @@ -53,7 +53,7 @@ pl.plot(x, a, 'b', label='Source distribution') pl.plot(x, b, 'r', label='Target distribution') pl.legend() -#%% plot distributions and loss matrix +# plot distributions and loss matrix pl.figure(2, figsize=(5, 5)) ot.plot.plot1D_mat(a, b, M, 'Cost matrix M') @@ -64,7 +64,7 @@ ot.plot.plot1D_mat(a, b, M, 'Cost matrix M') # -------------- -#%% Sinkhorn +# Sinkhorn epsilon = 0.1 # entropy parameter alpha = 1. # Unbalanced KL relaxation parameter diff --git a/examples/plot_UOT_barycenter_1D.py b/examples/plot_UOT_barycenter_1D.py index 8dfb84f..c8d9d3b 100644 --- a/examples/plot_UOT_barycenter_1D.py +++ b/examples/plot_UOT_barycenter_1D.py @@ -27,7 +27,7 @@ from matplotlib.collections import PolyCollection # Generate data # ------------- -#%% parameters +# parameters n = 100 # nb bins @@ -53,7 +53,7 @@ M /= M.max() # Plot data # --------- -#%% plot the distributions +# plot the distributions pl.figure(1, figsize=(6.4, 3)) for i in range(n_distributions): @@ -65,7 +65,7 @@ pl.tight_layout() # Barycenter computation # ---------------------- -#%% non weighted barycenter computation +# non weighted barycenter computation weight = 0.5 # 0<=weight<=1 weights = np.array([1 - weight, weight]) @@ -97,7 +97,7 @@ pl.tight_layout() # Barycentric interpolation # ------------------------- -#%% barycenter interpolation +# barycenter interpolation n_weight = 11 weight_list = np.linspace(0, 1, n_weight) @@ -114,7 +114,7 @@ for i in range(0, n_weight): B_wass[:, i] = ot.unbalanced.barycenter_unbalanced(A, M, reg, alpha, weights) -#%% plot interpolation +# plot interpolation pl.figure(3) diff --git a/ot/unbalanced.py b/ot/unbalanced.py index 97e2576..918dda4 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -87,7 +87,7 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. - .. [23] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : Learning with a Wasserstein Loss, Advances in Neural Information Processing Systems (NIPS) 2015 + .. [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : Learning with a Wasserstein Loss, Advances in Neural Information Processing Systems (NIPS) 2015 See Also @@ -196,7 +196,7 @@ def sinkhorn_unbalanced2(a, b, M, reg, alpha, method='sinkhorn', .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. - .. [23] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : Learning with a Wasserstein Loss, Advances in Neural Information Processing Systems (NIPS) 2015 + .. [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : Learning with a Wasserstein Loss, Advances in Neural Information Processing Systems (NIPS) 2015 See Also -------- @@ -299,7 +299,7 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. - .. [23] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : Learning with a Wasserstein Loss, Advances in Neural Information Processing Systems (NIPS) 2015 + .. [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : Learning with a Wasserstein Loss, Advances in Neural Information Processing Systems (NIPS) 2015 See Also -------- -- cgit v1.2.3 From f63f34f8adb6943b6410f8b773b4b4d8f1c7b4ba Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Thu, 20 Jun 2019 14:29:56 +0200 Subject: EMD 1d without doc --- ot/__init__.py | 4 ++-- ot/lp/__init__.py | 43 ++++++++++++++++++++++++++++++++++++++----- ot/lp/emd_wrap.pyx | 35 +++++++++++++++++++++++++++++++++++ test/test_ot.py | 26 ++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 7 deletions(-) diff --git a/ot/__init__.py b/ot/__init__.py index b74b924..5d5b700 100644 --- a/ot/__init__.py +++ b/ot/__init__.py @@ -22,7 +22,7 @@ from . import smooth from . import stochastic # OT functions -from .lp import emd, emd2 +from .lp import emd, emd2, emd_1d from .bregman import sinkhorn, sinkhorn2, barycenter from .da import sinkhorn_lpl1_mm @@ -31,6 +31,6 @@ from .utils import dist, unif, tic, toc, toq __version__ = "0.5.1" -__all__ = ["emd", "emd2", "sinkhorn", "sinkhorn2", "utils", 'datasets', +__all__ = ["emd", "emd2", 'emd_1d', "sinkhorn", "sinkhorn2", "utils", 'datasets', 'bregman', 'lp', 'tic', 'toc', 'toq', 'gromov', 'dist', 'unif', 'barycenter', 'sinkhorn_lpl1_mm', 'da', 'optim'] diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index 02cbd8c..49ded5b 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -14,12 +14,12 @@ import numpy as np from .import cvx # import compiled emd -from .emd_wrap import emd_c, check_result +from .emd_wrap import emd_c, check_result, emd_1d_sorted from ..utils import parmap from .cvx import barycenter from ..utils import dist -__all__=['emd', 'emd2', 'barycenter', 'free_support_barycenter', 'cvx'] +__all__=['emd', 'emd2', 'barycenter', 'free_support_barycenter', 'cvx', 'emd_1d_sorted'] def emd(a, b, M, numItermax=100000, log=False): @@ -94,7 +94,7 @@ def emd(a, b, M, numItermax=100000, log=False): b = np.asarray(b, dtype=np.float64) M = np.asarray(M, dtype=np.float64) - # if empty array given then use unifor distributions + # if empty array given then use uniform distributions if len(a) == 0: a = np.ones((M.shape[0],), dtype=np.float64) / M.shape[0] if len(b) == 0: @@ -187,7 +187,7 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), b = np.asarray(b, dtype=np.float64) M = np.asarray(M, dtype=np.float64) - # if empty array given then use unifor distributions + # if empty array given then use uniform distributions if len(a) == 0: a = np.ones((M.shape[0],), dtype=np.float64) / M.shape[0] if len(b) == 0: @@ -308,4 +308,37 @@ def free_support_barycenter(measures_locations, measures_weights, X_init, b=None log_dict['displacement_square_norms'] = displacement_square_norms return X, log_dict else: - return X \ No newline at end of file + return X + + +def emd_1d(a, b, x_a, x_b, metric='sqeuclidean', log=False): + """Solves the Earth Movers distance problem between 1d measures and returns + the OT matrix + + """ + assert x_a.shape[1] == x_b.shape[1] == 1, "emd_1d should only be used " + \ + "with monodimensional data" + + a = np.asarray(a, dtype=np.float64) + b = np.asarray(b, dtype=np.float64) + + # if empty array given then use uniform distributions + if len(a) == 0: + a = np.ones((x_a.shape[0],), dtype=np.float64) / x_a.shape[0] + if len(b) == 0: + b = np.ones((x_b.shape[0],), dtype=np.float64) / x_b.shape[0] + + perm_a = np.argsort(x_a.reshape((-1, ))) + perm_b = np.argsort(x_b.reshape((-1, ))) + inv_perm_a = np.argsort(perm_a) + inv_perm_b = np.argsort(perm_b) + + M = dist(x_a[perm_a], x_b[perm_b], metric=metric) + + G_sorted, cost = emd_1d_sorted(a, b, M) + G = G_sorted[inv_perm_a, :][:, inv_perm_b] + if log: + log = {} + log['cost'] = cost + return G, log + return G \ No newline at end of file diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index 83ee6aa..a3d189d 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -93,3 +93,38 @@ def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mod cdef int result_code = EMD_wrap(n1, n2, a.data, b.data, M.data, G.data, alpha.data, beta.data, &cost, max_iter) return G, cost, alpha, beta, result_code + + +@cython.boundscheck(False) +@cython.wraparound(False) +def emd_1d_sorted(np.ndarray[double, ndim=1, mode="c"] u_weights, + np.ndarray[double, ndim=1, mode="c"] v_weights, + np.ndarray[double, ndim=2, mode="c"] M): + r""" + Roro's stuff + """ + cdef double cost = 0. + cdef int n = u_weights.shape[0] + cdef int m = v_weights.shape[0] + + cdef int i = 0 + cdef double w_i = u_weights[0] + cdef int j = 0 + cdef double w_j = v_weights[0] + + cdef np.ndarray[double, ndim=2, mode="c"] G = np.zeros((n, m), + dtype=np.float64) + while i < n and j < m: + if w_i < w_j or j == m - 1: + cost += M[i, j] * w_i + G[i, j] = w_i + i += 1 + w_j -= w_i + w_i = u_weights[i] + else: + cost += M[i, j] * w_j + G[i, j] = w_j + j += 1 + w_i -= w_j + w_j = v_weights[j] + return G, cost \ No newline at end of file diff --git a/test/test_ot.py b/test/test_ot.py index 7652394..7008002 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -46,6 +46,32 @@ def test_emd_emd2(): np.testing.assert_allclose(w, 0) +def test_emd1d(): + # test emd1d gives similar results as emd + n = 20 + m = 30 + u = np.random.randn(n, 1) + v = np.random.randn(m, 1) + + M = ot.dist(u, v, metric='sqeuclidean') + + G, log = ot.emd([], [], M, log=True) + wass = log["cost"] + G_1d, log = ot.emd_1d([], [], u, v, metric='sqeuclidean', log=True) + wass1d = log["cost"] + + # check loss is similar + np.testing.assert_allclose(wass, wass1d) + + # check G is similar + np.testing.assert_allclose(G, G_1d) + + # check AssertionError is raised if called on non 1d arrays + u = np.random.randn(n, 2) + v = np.random.randn(m, 2) + np.testing.assert_raises(AssertionError, ot.emd_1d, [], [], u, v) + + def test_emd_empty(): # test emd and emd2 for simple identity n = 100 -- cgit v1.2.3 From 15b21611a3a93043d30c4eaaf9d622200453a884 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Thu, 20 Jun 2019 14:52:23 +0200 Subject: EMD 1d without doc made faster --- ot/lp/__init__.py | 5 ++--- ot/lp/emd_wrap.pyx | 14 +++++++++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index 49ded5b..c4457dc 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -333,9 +333,8 @@ def emd_1d(a, b, x_a, x_b, metric='sqeuclidean', log=False): inv_perm_a = np.argsort(perm_a) inv_perm_b = np.argsort(perm_b) - M = dist(x_a[perm_a], x_b[perm_b], metric=metric) - - G_sorted, cost = emd_1d_sorted(a, b, M) + G_sorted, cost = emd_1d_sorted(a, b, x_a[perm_a], x_b[perm_b], + metric=metric) G = G_sorted[inv_perm_a, :][:, inv_perm_b] if log: log = {} diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index a3d189d..2966206 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -10,6 +10,8 @@ Cython linker with C solver import numpy as np cimport numpy as np +from ..utils import dist + cimport cython import warnings @@ -99,7 +101,9 @@ def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mod @cython.wraparound(False) def emd_1d_sorted(np.ndarray[double, ndim=1, mode="c"] u_weights, np.ndarray[double, ndim=1, mode="c"] v_weights, - np.ndarray[double, ndim=2, mode="c"] M): + np.ndarray[double, ndim=2, mode="c"] u, + np.ndarray[double, ndim=2, mode="c"] v, + str metric='sqeuclidean'): r""" Roro's stuff """ @@ -112,17 +116,21 @@ def emd_1d_sorted(np.ndarray[double, ndim=1, mode="c"] u_weights, cdef int j = 0 cdef double w_j = v_weights[0] + cdef double m_ij = 0. + cdef np.ndarray[double, ndim=2, mode="c"] G = np.zeros((n, m), dtype=np.float64) while i < n and j < m: + m_ij = dist(u[i].reshape((1, 1)), v[j].reshape((1, 1)), + metric=metric)[0, 0] if w_i < w_j or j == m - 1: - cost += M[i, j] * w_i + cost += m_ij * w_i G[i, j] = w_i i += 1 w_j -= w_i w_i = u_weights[i] else: - cost += M[i, j] * w_j + cost += m_ij * w_j G[i, j] = w_j j += 1 w_i -= w_j -- cgit v1.2.3 From cada9a3019997e8efb95d96c86985110f1e937b9 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Fri, 21 Jun 2019 11:15:42 +0200 Subject: Sparse G matrix for EMD1d + standard metrics computed without cdist --- ot/lp/__init__.py | 54 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index c4457dc..decff29 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -10,6 +10,7 @@ Solvers for the original linear program OT problem import multiprocessing import numpy as np +from scipy.sparse import coo_matrix from .import cvx @@ -19,7 +20,8 @@ from ..utils import parmap from .cvx import barycenter from ..utils import dist -__all__=['emd', 'emd2', 'barycenter', 'free_support_barycenter', 'cvx', 'emd_1d_sorted'] +__all__=['emd', 'emd2', 'barycenter', 'free_support_barycenter', 'cvx', + 'emd_1d', 'emd2_1d'] def emd(a, b, M, numItermax=100000, log=False): @@ -311,16 +313,20 @@ def free_support_barycenter(measures_locations, measures_weights, X_init, b=None return X -def emd_1d(a, b, x_a, x_b, metric='sqeuclidean', log=False): +def emd_1d(a, b, x_a, x_b, metric='sqeuclidean', dense=True, log=False): """Solves the Earth Movers distance problem between 1d measures and returns the OT matrix """ - assert x_a.shape[1] == x_b.shape[1] == 1, "emd_1d should only be used " + \ - "with monodimensional data" - a = np.asarray(a, dtype=np.float64) b = np.asarray(b, dtype=np.float64) + x_a = np.asarray(x_a, dtype=np.float64) + x_b = np.asarray(x_b, dtype=np.float64) + + assert (x_a.ndim == 1 or x_a.ndim == 2 and x_a.shape[1] == 1), \ + "emd_1d should only be used with monodimensional data" + assert (x_b.ndim == 1 or x_b.ndim == 2 and x_b.shape[1] == 1), \ + "emd_1d should only be used with monodimensional data" # if empty array given then use uniform distributions if len(a) == 0: @@ -328,16 +334,36 @@ def emd_1d(a, b, x_a, x_b, metric='sqeuclidean', log=False): if len(b) == 0: b = np.ones((x_b.shape[0],), dtype=np.float64) / x_b.shape[0] - perm_a = np.argsort(x_a.reshape((-1, ))) - perm_b = np.argsort(x_b.reshape((-1, ))) - inv_perm_a = np.argsort(perm_a) - inv_perm_b = np.argsort(perm_b) - - G_sorted, cost = emd_1d_sorted(a, b, x_a[perm_a], x_b[perm_b], - metric=metric) - G = G_sorted[inv_perm_a, :][:, inv_perm_b] + x_a_1d = x_a.reshape((-1, )) + x_b_1d = x_b.reshape((-1, )) + perm_a = np.argsort(x_a_1d) + perm_b = np.argsort(x_b_1d) + + G_sorted, indices, cost = emd_1d_sorted(a, b, + x_a_1d[perm_a], x_b_1d[perm_b], + metric=metric) + G = coo_matrix((G_sorted, (perm_a[indices[:, 0]], perm_b[indices[:, 1]])), + shape=(a.shape[0], b.shape[0])) + if dense: + G = G.todense() if log: log = {} log['cost'] = cost return G, log - return G \ No newline at end of file + return G + + +def emd2_1d(a, b, x_a, x_b, metric='sqeuclidean', dense=True, log=False): + """Solves the Earth Movers distance problem between 1d measures and returns + the loss + + """ + # If we do not return G (log==False), then we should not to cast it to dense + # (useless overhead) + G, log_emd = emd_1d(a=a, b=b, x_a=x_a, x_b=x_b, metric=metric, + dense=dense and log, log=True) + cost = log_emd['cost'] + if log: + log_emd = {'G': G} + return cost, log_emd + return cost \ No newline at end of file -- cgit v1.2.3 From 18502d6861a4977cbade957f2e48eeb8dbb55414 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Fri, 21 Jun 2019 11:21:08 +0200 Subject: Sparse G matrix for EMD1d + standard metrics computed without cdist --- ot/__init__.py | 4 ++-- ot/lp/emd_wrap.pyx | 29 +++++++++++++++++++++-------- test/test_ot.py | 23 ++++++++++++++++++----- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/ot/__init__.py b/ot/__init__.py index 5d5b700..f0e526c 100644 --- a/ot/__init__.py +++ b/ot/__init__.py @@ -22,7 +22,7 @@ from . import smooth from . import stochastic # OT functions -from .lp import emd, emd2, emd_1d +from .lp import emd, emd2, emd_1d, emd2_1d from .bregman import sinkhorn, sinkhorn2, barycenter from .da import sinkhorn_lpl1_mm @@ -32,5 +32,5 @@ from .utils import dist, unif, tic, toc, toq __version__ = "0.5.1" __all__ = ["emd", "emd2", 'emd_1d', "sinkhorn", "sinkhorn2", "utils", 'datasets', - 'bregman', 'lp', 'tic', 'toc', 'toq', 'gromov', + 'bregman', 'lp', 'tic', 'toc', 'toq', 'gromov', 'emd_1d', 'emd2_1d', 'dist', 'unif', 'barycenter', 'sinkhorn_lpl1_mm', 'da', 'optim'] diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index 2966206..ab88d7f 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -101,8 +101,8 @@ def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mod @cython.wraparound(False) def emd_1d_sorted(np.ndarray[double, ndim=1, mode="c"] u_weights, np.ndarray[double, ndim=1, mode="c"] v_weights, - np.ndarray[double, ndim=2, mode="c"] u, - np.ndarray[double, ndim=2, mode="c"] v, + np.ndarray[double, ndim=1, mode="c"] u, + np.ndarray[double, ndim=1, mode="c"] v, str metric='sqeuclidean'): r""" Roro's stuff @@ -118,21 +118,34 @@ def emd_1d_sorted(np.ndarray[double, ndim=1, mode="c"] u_weights, cdef double m_ij = 0. - cdef np.ndarray[double, ndim=2, mode="c"] G = np.zeros((n, m), + cdef np.ndarray[double, ndim=1, mode="c"] G = np.zeros((n + m - 1, ), dtype=np.float64) + cdef np.ndarray[long, ndim=2, mode="c"] indices = np.zeros((n + m - 1, 2), + dtype=np.int) + cdef int cur_idx = 0 while i < n and j < m: - m_ij = dist(u[i].reshape((1, 1)), v[j].reshape((1, 1)), - metric=metric)[0, 0] + if metric == 'sqeuclidean': + m_ij = (u[i] - v[j]) ** 2 + elif metric == 'cityblock' or metric == 'euclidean': + m_ij = np.abs(u[i] - v[j]) + else: + m_ij = dist(u[i].reshape((1, 1)), v[j].reshape((1, 1)), + metric=metric)[0, 0] if w_i < w_j or j == m - 1: cost += m_ij * w_i - G[i, j] = w_i + G[cur_idx] = w_i + indices[cur_idx, 0] = i + indices[cur_idx, 1] = j i += 1 w_j -= w_i w_i = u_weights[i] else: cost += m_ij * w_j - G[i, j] = w_j + G[cur_idx] = w_j + indices[cur_idx, 0] = i + indices[cur_idx, 1] = j j += 1 w_i -= w_j w_j = v_weights[j] - return G, cost \ No newline at end of file + cur_idx += 1 + return G[:cur_idx], indices[:cur_idx], cost diff --git a/test/test_ot.py b/test/test_ot.py index 7008002..2a2e0a5 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -7,6 +7,7 @@ import warnings import numpy as np +from scipy.stats import wasserstein_distance import ot from ot.datasets import make_1D_gauss as gauss @@ -37,7 +38,7 @@ def test_emd_emd2(): # check G is identity np.testing.assert_allclose(G, np.eye(n) / n) - # check constratints + # check constraints np.testing.assert_allclose(u, G.sum(1)) # cf convergence sinkhorn np.testing.assert_allclose(u, G.sum(0)) # cf convergence sinkhorn @@ -46,12 +47,13 @@ def test_emd_emd2(): np.testing.assert_allclose(w, 0) -def test_emd1d(): +def test_emd_1d_emd2_1d(): # test emd1d gives similar results as emd n = 20 m = 30 - u = np.random.randn(n, 1) - v = np.random.randn(m, 1) + rng = np.random.RandomState(0) + u = rng.randn(n, 1) + v = rng.randn(m, 1) M = ot.dist(u, v, metric='sqeuclidean') @@ -59,9 +61,20 @@ def test_emd1d(): wass = log["cost"] G_1d, log = ot.emd_1d([], [], u, v, metric='sqeuclidean', log=True) wass1d = log["cost"] + wass1d_emd2 = ot.emd2_1d([], [], u, v, metric='sqeuclidean', log=False) + wass1d_euc = ot.emd2_1d([], [], u, v, metric='euclidean', log=False) # check loss is similar np.testing.assert_allclose(wass, wass1d) + np.testing.assert_allclose(wass, wass1d_emd2) + + # check loss is similar to scipy's implementation for Euclidean metric + wass_sp = wasserstein_distance(u.reshape((-1, )), v.reshape((-1, ))) + np.testing.assert_allclose(wass_sp, wass1d_euc) + + # check constraints + np.testing.assert_allclose(np.ones((n, )) / n, G.sum(1)) + np.testing.assert_allclose(np.ones((m, )) / m, G.sum(0)) # check G is similar np.testing.assert_allclose(G, G_1d) @@ -86,7 +99,7 @@ def test_emd_empty(): # check G is identity np.testing.assert_allclose(G, np.eye(n) / n) - # check constratints + # check constraints np.testing.assert_allclose(u, G.sum(1)) # cf convergence sinkhorn np.testing.assert_allclose(u, G.sum(0)) # cf convergence sinkhorn -- cgit v1.2.3 From 67d3bd4bf0f593aa611d6bf09bbd3a9c883299ba Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Fri, 21 Jun 2019 13:37:14 +0200 Subject: Removed np.abs in Cython code --- ot/lp/emd_wrap.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index ab88d7f..5e055fb 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -127,7 +127,7 @@ def emd_1d_sorted(np.ndarray[double, ndim=1, mode="c"] u_weights, if metric == 'sqeuclidean': m_ij = (u[i] - v[j]) ** 2 elif metric == 'cityblock' or metric == 'euclidean': - m_ij = np.abs(u[i] - v[j]) + m_ij = abs(u[i] - v[j]) else: m_ij = dist(u[i].reshape((1, 1)), v[j].reshape((1, 1)), metric=metric)[0, 0] -- cgit v1.2.3 From 9e1d74f44473deb1f4766329bb0d1c8af4dfdd73 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Fri, 21 Jun 2019 18:27:42 +0200 Subject: Started documenting --- ot/lp/__init__.py | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- test/test_ot.py | 8 +++--- 2 files changed, 79 insertions(+), 6 deletions(-) diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index decff29..e9635a1 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -313,10 +313,83 @@ def free_support_barycenter(measures_locations, measures_weights, X_init, b=None return X -def emd_1d(a, b, x_a, x_b, metric='sqeuclidean', dense=True, log=False): +def emd_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): """Solves the Earth Movers distance problem between 1d measures and returns the OT matrix + + .. math:: + \gamma = arg\min_\gamma \sum_i \sum_j \gamma_{ij} d(x_a[i], x_b[j]) + + s.t. \gamma 1 = a + \gamma^T 1= b + \gamma\geq 0 + where : + + - d is the metric + - x_a and x_b are the samples + - a and b are the sample weights + + Uses the algorithm proposed in [1]_ + + Parameters + ---------- + x_a : (ns,) or (ns, 1) ndarray, float64 + Source histogram (uniform weight if empty list) + x_b : (nt,) or (ns, 1) ndarray, float64 + Target histogram (uniform weight if empty list) + a : (ns,) ndarray, float64 + Source histogram (uniform weight if empty list) + b : (nt,) ndarray, float64 + Target histogram (uniform weight if empty list) + dense: boolean, optional (default=True) + If True, returns math:`\gamma` as a dense ndarray of shape (ns, nt). + Otherwise returns a sparse representation using scipy's `coo_matrix` + format. + Due to implementation details, this function runs faster when + dense is set to False. + metric: str, optional (default='sqeuclidean') + Metric to be used. Has to be a string. + Due to implementation details, this function runs faster when + `'sqeuclidean'` or `'euclidean'` metrics are used. + log: boolean, optional (default=False) + If True, returns a dictionary containing the cost. + Otherwise returns only the optimal transportation matrix. + + Returns + ------- + gamma: (ns, nt) ndarray + Optimal transportation matrix for the given parameters + log: dict + If input log is True, a dictionary containing the cost + + + Examples + -------- + + Simple example with obvious solution. The function emd_1d accepts lists and + perform automatic conversion to numpy arrays + + >>> import ot + >>> a=[.5, .5] + >>> b=[.5, .5] + >>> x_a = [0., 2.] + >>> x_b = [0., 3.] + >>> ot.emd_1d(a, b, x_a, x_b) + array([[ 0.5, 0. ], + [ 0. , 0.5]]) + + References + ---------- + + .. [1] TODO + + See Also + -------- + ot.lp.emd : EMD for multidimensional distributions + ot.lp.emd2_1d : EMD for 1d distributions (returns cost instead of the + transportation matrix) + """ a = np.asarray(a, dtype=np.float64) b = np.asarray(b, dtype=np.float64) @@ -353,7 +426,7 @@ def emd_1d(a, b, x_a, x_b, metric='sqeuclidean', dense=True, log=False): return G -def emd2_1d(a, b, x_a, x_b, metric='sqeuclidean', dense=True, log=False): +def emd2_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): """Solves the Earth Movers distance problem between 1d measures and returns the loss diff --git a/test/test_ot.py b/test/test_ot.py index 2a2e0a5..6d6ea26 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -59,10 +59,10 @@ def test_emd_1d_emd2_1d(): G, log = ot.emd([], [], M, log=True) wass = log["cost"] - G_1d, log = ot.emd_1d([], [], u, v, metric='sqeuclidean', log=True) + G_1d, log = ot.emd_1d(u, v, [], [], metric='sqeuclidean', log=True) wass1d = log["cost"] - wass1d_emd2 = ot.emd2_1d([], [], u, v, metric='sqeuclidean', log=False) - wass1d_euc = ot.emd2_1d([], [], u, v, metric='euclidean', log=False) + wass1d_emd2 = ot.emd2_1d(u, v, [], [], metric='sqeuclidean', log=False) + wass1d_euc = ot.emd2_1d(u, v, [], [], metric='euclidean', log=False) # check loss is similar np.testing.assert_allclose(wass, wass1d) @@ -82,7 +82,7 @@ def test_emd_1d_emd2_1d(): # check AssertionError is raised if called on non 1d arrays u = np.random.randn(n, 2) v = np.random.randn(m, 2) - np.testing.assert_raises(AssertionError, ot.emd_1d, [], [], u, v) + np.testing.assert_raises(AssertionError, ot.emd_1d, u, v, [], []) def test_emd_empty(): -- cgit v1.2.3 From 71f9b5adfb8d8f4481948391f22e49f45494d071 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Mon, 24 Jun 2019 09:17:54 +0200 Subject: Added docstrings --- ot/lp/__init__.py | 114 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 92 insertions(+), 22 deletions(-) diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index e9635a1..a350d60 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -321,8 +321,8 @@ def emd_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): .. math:: \gamma = arg\min_\gamma \sum_i \sum_j \gamma_{ij} d(x_a[i], x_b[j]) - s.t. \gamma 1 = a - \gamma^T 1= b + s.t. \gamma 1 = a, + \gamma^T 1= b, \gamma\geq 0 where : @@ -330,28 +330,27 @@ def emd_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): - x_a and x_b are the samples - a and b are the sample weights - Uses the algorithm proposed in [1]_ + Uses the algorithm detailed in [1]_ Parameters ---------- x_a : (ns,) or (ns, 1) ndarray, float64 - Source histogram (uniform weight if empty list) + Source dirac locations (on the real line) x_b : (nt,) or (ns, 1) ndarray, float64 - Target histogram (uniform weight if empty list) + Target dirac locations (on the real line) a : (ns,) ndarray, float64 Source histogram (uniform weight if empty list) b : (nt,) ndarray, float64 Target histogram (uniform weight if empty list) + metric: str, optional (default='sqeuclidean') + Metric to be used. Only strings listed in ... are accepted. + Due to implementation details, this function runs faster when + `'sqeuclidean'`, `'cityblock'`, or `'euclidean'` metrics are used. dense: boolean, optional (default=True) If True, returns math:`\gamma` as a dense ndarray of shape (ns, nt). Otherwise returns a sparse representation using scipy's `coo_matrix` - format. - Due to implementation details, this function runs faster when + format. Due to implementation details, this function runs faster when dense is set to False. - metric: str, optional (default='sqeuclidean') - Metric to be used. Has to be a string. - Due to implementation details, this function runs faster when - `'sqeuclidean'` or `'euclidean'` metrics are used. log: boolean, optional (default=False) If True, returns a dictionary containing the cost. Otherwise returns only the optimal transportation matrix. @@ -368,28 +367,28 @@ def emd_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): -------- Simple example with obvious solution. The function emd_1d accepts lists and - perform automatic conversion to numpy arrays + performs automatic conversion to numpy arrays >>> import ot >>> a=[.5, .5] >>> b=[.5, .5] - >>> x_a = [0., 2.] + >>> x_a = [2., 0.] >>> x_b = [0., 3.] - >>> ot.emd_1d(a, b, x_a, x_b) - array([[ 0.5, 0. ], - [ 0. , 0.5]]) + >>> ot.emd_1d(x_a, x_b, a, b) + array([[0. , 0.5], + [0.5, 0. ]]) References ---------- - .. [1] TODO + .. [1] Peyré, G., & Cuturi, M. (2017). "Computational Optimal + Transport", 2018. See Also -------- ot.lp.emd : EMD for multidimensional distributions ot.lp.emd2_1d : EMD for 1d distributions (returns cost instead of the transportation matrix) - """ a = np.asarray(a, dtype=np.float64) b = np.asarray(b, dtype=np.float64) @@ -418,10 +417,9 @@ def emd_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): G = coo_matrix((G_sorted, (perm_a[indices[:, 0]], perm_b[indices[:, 1]])), shape=(a.shape[0], b.shape[0])) if dense: - G = G.todense() + G = G.toarray() if log: - log = {} - log['cost'] = cost + log = {'cost': cost} return G, log return G @@ -430,10 +428,82 @@ def emd2_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): """Solves the Earth Movers distance problem between 1d measures and returns the loss + + .. math:: + \gamma = arg\min_\gamma \sum_i \sum_j \gamma_{ij} d(x_a[i], x_b[j]) + + s.t. \gamma 1 = a, + \gamma^T 1= b, + \gamma\geq 0 + where : + + - d is the metric + - x_a and x_b are the samples + - a and b are the sample weights + + Uses the algorithm detailed in [1]_ + + Parameters + ---------- + x_a : (ns,) or (ns, 1) ndarray, float64 + Source dirac locations (on the real line) + x_b : (nt,) or (ns, 1) ndarray, float64 + Target dirac locations (on the real line) + a : (ns,) ndarray, float64 + Source histogram (uniform weight if empty list) + b : (nt,) ndarray, float64 + Target histogram (uniform weight if empty list) + metric: str, optional (default='sqeuclidean') + Metric to be used. Only strings listed in ... are accepted. + Due to implementation details, this function runs faster when + `'sqeuclidean'`, `'cityblock'`, or `'euclidean'` metrics are used. + dense: boolean, optional (default=True) + If True, returns math:`\gamma` as a dense ndarray of shape (ns, nt). + Otherwise returns a sparse representation using scipy's `coo_matrix` + format. Only used if log is set to True. Due to implementation details, + this function runs faster when dense is set to False. + log: boolean, optional (default=False) + If True, returns a dictionary containing the transportation matrix. + Otherwise returns only the loss. + + Returns + ------- + loss: float + Cost associated to the optimal transportation + log: dict + If input log is True, a dictionary containing the Optimal transportation + matrix for the given parameters + + + Examples + -------- + + Simple example with obvious solution. The function emd2_1d accepts lists and + performs automatic conversion to numpy arrays + + >>> import ot + >>> a=[.5, .5] + >>> b=[.5, .5] + >>> x_a = [2., 0.] + >>> x_b = [0., 3.] + >>> ot.emd2_1d(x_a, x_b, a, b) + 0.5 + + References + ---------- + + .. [1] Peyré, G., & Cuturi, M. (2017). "Computational Optimal + Transport", 2018. + + See Also + -------- + ot.lp.emd2 : EMD for multidimensional distributions + ot.lp.emd_1d : EMD for 1d distributions (returns the transportation matrix + instead of the cost) """ # If we do not return G (log==False), then we should not to cast it to dense # (useless overhead) - G, log_emd = emd_1d(a=a, b=b, x_a=x_a, x_b=x_b, metric=metric, + G, log_emd = emd_1d(x_a=x_a, x_b=x_b, a=a, b=b, metric=metric, dense=dense and log, log=True) cost = log_emd['cost'] if log: -- cgit v1.2.3 From 77452dd92f607c3f18a6420cb8cd09fa5cd905a6 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Mon, 24 Jun 2019 13:09:36 +0200 Subject: Added more docstrings (Cython) + fixed link to ot.dist doc --- ot/lp/__init__.py | 4 ++-- ot/lp/emd_wrap.pyx | 28 +++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index a350d60..645ed8b 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -343,7 +343,7 @@ def emd_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): b : (nt,) ndarray, float64 Target histogram (uniform weight if empty list) metric: str, optional (default='sqeuclidean') - Metric to be used. Only strings listed in ... are accepted. + Metric to be used. Only strings listed in :func:`ot.dist` are accepted. Due to implementation details, this function runs faster when `'sqeuclidean'`, `'cityblock'`, or `'euclidean'` metrics are used. dense: boolean, optional (default=True) @@ -454,7 +454,7 @@ def emd2_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): b : (nt,) ndarray, float64 Target histogram (uniform weight if empty list) metric: str, optional (default='sqeuclidean') - Metric to be used. Only strings listed in ... are accepted. + Metric to be used. Only strings listed in :func:`ot.dist` are accepted. Due to implementation details, this function runs faster when `'sqeuclidean'`, `'cityblock'`, or `'euclidean'` metrics are used. dense: boolean, optional (default=True) diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index 5e055fb..2825ba2 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -105,7 +105,33 @@ def emd_1d_sorted(np.ndarray[double, ndim=1, mode="c"] u_weights, np.ndarray[double, ndim=1, mode="c"] v, str metric='sqeuclidean'): r""" - Roro's stuff + Solves the Earth Movers distance problem between sorted 1d measures and + returns the OT matrix and the associated cost + + Parameters + ---------- + u_weights : (ns,) ndarray, float64 + Source histogram + v_weights : (nt,) ndarray, float64 + Target histogram + u : (ns,) ndarray, float64 + Source dirac locations (on the real line) + v : (nt,) ndarray, float64 + Target dirac locations (on the real line) + metric: str, optional (default='sqeuclidean') + Metric to be used. Only strings listed in :func:`ot.dist` are accepted. + Due to implementation details, this function runs faster when + `'sqeuclidean'`, `'cityblock'`, or `'euclidean'` metrics are used. + + Returns + ------- + gamma: (n, ) ndarray, float64 + Values in the Optimal transportation matrix + indices: (n, 2) ndarray, int64 + Indices of the values stored in gamma for the Optimal transportation + matrix + cost + cost associated to the optimal transportation """ cdef double cost = 0. cdef int n = u_weights.shape[0] -- cgit v1.2.3 From 0a039eb07a3ca9ae3c5635cca1719428f62bf67d Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Mon, 24 Jun 2019 13:15:38 +0200 Subject: Made weight vectors optional to match scipy's wass1d API --- ot/lp/__init__.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index 645ed8b..bf218d3 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -313,7 +313,7 @@ def free_support_barycenter(measures_locations, measures_weights, X_init, b=None return X -def emd_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): +def emd_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', dense=True, log=False): """Solves the Earth Movers distance problem between 1d measures and returns the OT matrix @@ -338,10 +338,10 @@ def emd_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): Source dirac locations (on the real line) x_b : (nt,) or (ns, 1) ndarray, float64 Target dirac locations (on the real line) - a : (ns,) ndarray, float64 - Source histogram (uniform weight if empty list) - b : (nt,) ndarray, float64 - Target histogram (uniform weight if empty list) + a : (ns,) ndarray, float64, optional + Source histogram (default is uniform weight) + b : (nt,) ndarray, float64, optional + Target histogram (default is uniform weight) metric: str, optional (default='sqeuclidean') Metric to be used. Only strings listed in :func:`ot.dist` are accepted. Due to implementation details, this function runs faster when @@ -375,6 +375,9 @@ def emd_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): >>> x_a = [2., 0.] >>> x_b = [0., 3.] >>> ot.emd_1d(x_a, x_b, a, b) + array([[0. , 0.5], + [0.5, 0. ]]) + >>> ot.emd_1d(x_a, x_b) array([[0. , 0.5], [0.5, 0. ]]) @@ -401,9 +404,9 @@ def emd_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): "emd_1d should only be used with monodimensional data" # if empty array given then use uniform distributions - if len(a) == 0: + if a.ndim == 0 or len(a) == 0: a = np.ones((x_a.shape[0],), dtype=np.float64) / x_a.shape[0] - if len(b) == 0: + if b.ndim == 0 or len(b) == 0: b = np.ones((x_b.shape[0],), dtype=np.float64) / x_b.shape[0] x_a_1d = x_a.reshape((-1, )) @@ -424,7 +427,7 @@ def emd_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): return G -def emd2_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): +def emd2_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', dense=True, log=False): """Solves the Earth Movers distance problem between 1d measures and returns the loss @@ -449,10 +452,10 @@ def emd2_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): Source dirac locations (on the real line) x_b : (nt,) or (ns, 1) ndarray, float64 Target dirac locations (on the real line) - a : (ns,) ndarray, float64 - Source histogram (uniform weight if empty list) - b : (nt,) ndarray, float64 - Target histogram (uniform weight if empty list) + a : (ns,) ndarray, float64, optional + Source histogram (default is uniform weight) + b : (nt,) ndarray, float64, optional + Target histogram (default is uniform weight) metric: str, optional (default='sqeuclidean') Metric to be used. Only strings listed in :func:`ot.dist` are accepted. Due to implementation details, this function runs faster when @@ -488,6 +491,8 @@ def emd2_1d(x_a, x_b, a, b, metric='sqeuclidean', dense=True, log=False): >>> x_b = [0., 3.] >>> ot.emd2_1d(x_a, x_b, a, b) 0.5 + >>> ot.emd2_1d(x_a, x_b) + 0.5 References ---------- -- cgit v1.2.3 From 632bc9a8ec8a227d90db9635a34bb364d128cccb Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Mon, 24 Jun 2019 16:19:31 +0200 Subject: update docstrings + init --- ot/__init__.py | 2 +- ot/unbalanced.py | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/ot/__init__.py b/ot/__init__.py index acb05e6..3892d1d 100644 --- a/ot/__init__.py +++ b/ot/__init__.py @@ -36,4 +36,4 @@ __version__ = "0.5.1" __all__ = ["emd", "emd2", "sinkhorn", "sinkhorn2", "utils", 'datasets', 'bregman', 'lp', 'tic', 'toc', 'toq', 'gromov', 'dist', 'unif', 'barycenter', 'sinkhorn_lpl1_mm', 'da', 'optim', - 'sinkhorn_unbalanced'] + 'sinkhorn_unbalanced', "barycenter_unbalanced"] diff --git a/ot/unbalanced.py b/ot/unbalanced.py index 918dda4..484ce95 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -19,7 +19,7 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, The function solves the following optimization problem: .. math:: - W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + alpha KL(\gamma 1, a) + alpha KL(\gamma^T 1, b) + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \alpha KL(\gamma 1, a) + \alpha KL(\gamma^T 1, b) s.t. \gamma\geq 0 @@ -43,9 +43,9 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, M : np.ndarray (ns, nt) loss matrix reg : float - Regularization term > 0 + Entropy regularization term > 0 alpha : float - Regulatization term > 0 + Marginal relaxation term > 0 method : str method used for the solver either 'sinkhorn', 'sinkhorn_stabilized' or 'sinkhorn_epsilon_scaling', see those function for specific parameters @@ -128,7 +128,7 @@ def sinkhorn_unbalanced2(a, b, M, reg, alpha, method='sinkhorn', The function solves the following optimization problem: .. math:: - W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + alpha KL(\gamma 1, a) + alpha KL(\gamma^T 1, b) + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \alpha KL(\gamma 1, a) + \alpha KL(\gamma^T 1, b) s.t. \gamma\geq 0 @@ -152,9 +152,9 @@ def sinkhorn_unbalanced2(a, b, M, reg, alpha, method='sinkhorn', M : np.ndarray (ns,nt) loss matrix reg : float - Regularization term > 0 - alpha: float - Regularization term > 0 + Entropy regularization term > 0 + alpha : float + Marginal relaxation term > 0 method : str method used for the solver either 'sinkhorn', 'sinkhorn_stabilized' or 'sinkhorn_epsilon_scaling', see those function for specific parameters @@ -239,7 +239,7 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, The function solves the following optimization problem: .. math:: - W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + alpha KL(\gamma 1, a) + alpha KL(\gamma^T 1, b) + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \alpha KL(\gamma 1, a) + \alpha KL(\gamma^T 1, b) s.t. \gamma\geq 0 @@ -263,9 +263,9 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, M : np.ndarray (ns,nt) loss matrix reg : float - Regularization term > 0 - alpha: float - Regularization term > 0 + Entropy regularization term > 0 + alpha : float + Marginal relaxation term > 0 numItermax : int, optional Max number of iterations stopThr : float, optional @@ -410,7 +410,7 @@ def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, where : - - :math:`W_{reg}(\cdot,\cdot)` is the unbalanced entropic regularized Wasserstein distance (see ot.unbalanced.sinkhorn_unbalanced) + - :math:`Wu_{reg}(\cdot,\cdot)` is the unbalanced entropic regularized Wasserstein distance (see ot.unbalanced.sinkhorn_unbalanced) - :math:`\mathbf{a}_i` are training distributions in the columns of matrix :math:`\mathbf{A}` - reg and :math:`\mathbf{M}` are respectively the regularization term and the cost matrix for OT - alpha is the marginal relaxation hyperparameter @@ -423,9 +423,9 @@ def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, M : np.ndarray (d,d) loss matrix for OT reg : float - Regularization term > 0 + Entropy regularization term > 0 alpha : float - Regularization term > 0 + Marginal relaxation term > 0 weights : np.ndarray (n,) Weights of each histogram a_i on the simplex (barycentric coodinates) numItermax : int, optional -- cgit v1.2.3 From c9df24649d359b21280328f6bd580eb049cae3d3 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Mon, 24 Jun 2019 16:24:46 +0200 Subject: add unbalanced to doc modules --- docs/source/all.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/source/all.rst b/docs/source/all.rst index 32930fd..c968aa1 100644 --- a/docs/source/all.rst +++ b/docs/source/all.rst @@ -43,7 +43,7 @@ ot.da .. automodule:: ot.da :members: - + ot.gpu -------- @@ -80,3 +80,9 @@ ot.stochastic .. automodule:: ot.stochastic :members: + +ot.unbalanced +------------- + +.. automodule:: ot.unbalanced + :members: -- cgit v1.2.3 From 4e2f6b45662fe206414652ccc8f715c420f3b9cd Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 24 Jun 2019 17:13:33 +0200 Subject: first shot part OT Wass --- docs/source/howto.rst | 25 ---------- docs/source/index.rst | 2 +- docs/source/quickstart.rst | 119 +++++++++++++++++++++++++++++++++++++++++++++ docs/source/readme.rst | 7 ++- 4 files changed, 126 insertions(+), 27 deletions(-) delete mode 100644 docs/source/howto.rst create mode 100644 docs/source/quickstart.rst diff --git a/docs/source/howto.rst b/docs/source/howto.rst deleted file mode 100644 index 48b1532..0000000 --- a/docs/source/howto.rst +++ /dev/null @@ -1,25 +0,0 @@ - -How to ? -======== - -In the following we provide some pointers about which functions and classes -to use for different problems related to optimal transport (OTs). - -1. **How to solve a discrete optimal transport problem ?** - - The solver for discrete is the function :py:mod:`ot.emd` that returns - the OT transport matrix. If you want to solve a regularized OT you can - use :py:mod:`ot.sinkhorn`. - - More detailed examples can be seen on this :ref:`auto_examples/plot_OT_2D_samples` - - Here is a simple use case: - - .. code:: python - - # a,b are 1D histograms (sum to 1 and positive) - # M is the ground cost matrix - T=ot.emd(a,b,M) # exact linear program - T_reg=ot.sinkhorn(a,b,M,reg) # entropic regularized OT - - diff --git a/docs/source/index.rst b/docs/source/index.rst index d92f50f..03943e8 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -13,7 +13,7 @@ Contents :maxdepth: 3 self - howto + quickstart all auto_examples/index diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst new file mode 100644 index 0000000..3d3ce98 --- /dev/null +++ b/docs/source/quickstart.rst @@ -0,0 +1,119 @@ + +Quick start +=========== + + + +In the following we provide some pointers about which functions and classes +to use for different problems related to optimal transport (OT). + + +Optimal transport and Wasserstein distance +------------------------------------------ + +The optimal transport problem between discrete distributions is often expressed +as + .. math:: + \gamma^* = arg\min_\gamma \sum_{i,j}\gamma_{i,j}M_{i,j} + + s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 + +where : + +- :math:`M\in\mathbb{R}_+^{m\times n}` is the metric cost matrix defining the cost to move mass from bin :math:`a_i` to bin :math:`b_j`. +- :math:`a` and :math:`b` are histograms (positive, sum to 1) that represent the weights of each samples in the source an target distributions. + +Solving the linear program above can be done using the function :any:`ot.emd` +that will return the optimal transport matrix :math:`\gamma^*`: + +.. code:: python + + # a,b are 1D histograms (sum to 1 and positive) + # M is the ground cost matrix + T=ot.emd(a,b,M) # exact linear program + +.. hint:: + Examples of use for :any:`ot.emd` are available in the following examples: + + - :any:`auto_examples/plot_OT_2D_samples` + - :any:`auto_examples/plot_OT_1D` + - :any:`auto_examples/plot_OT_L1_vs_L2` + + +The value of the OT solution is often more of interest that the OT matrix : + + .. math:: + W(a,b)=\min_\gamma \sum_{i,j}\gamma_{i,j}M_{i,j} + + s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 + + +where :math:`W(a,b)` is the `Wasserstein distance +`_ between distributions a and b +It is a metrix that has nice statistical +properties. It can computed from an already estimated OT matrix with +:code:`np.sum(T*M)` or directly with the function :any:`ot.emd2`. + +.. code:: python + + # a,b are 1D histograms (sum to 1 and positive) + # M is the ground cost matrix + W=ot.emd2(a,b,M) # Wasserstein distance / EMD value + +.. note:: + In POT, most functions that solve OT or regularized OT problems have two + versions that return the OT matrix or the value of the optimal solution. Fir + instance :any:`ot.emd` return the OT matrix and :any:`ot.emd2` return the + Wassertsein distance. + + +Regularized Optimal Transport +----------------------------- + +Wasserstein Barycenters +----------------------- + +Monge mapping and Domain adaptation with Optimal transport +---------------------------------------- + + +Other applications +------------------ + + +GPU acceleration +---------------- + + + +How to? +------- + + + +1. **How to solve a discrete optimal transport problem ?** + + The solver for discrete is the function :py:mod:`ot.emd` that returns + the OT transport matrix. If you want to solve a regularized OT you can + use :py:mod:`ot.sinkhorn`. + + + + Here is a simple use case: + + .. code:: python + + # a,b are 1D histograms (sum to 1 and positive) + # M is the ground cost matrix + T=ot.emd(a,b,M) # exact linear program + T_reg=ot.sinkhorn(a,b,M,reg) # entropic regularized OT + + More detailed examples can be seen on this + :doc:`auto_examples/plot_OT_2D_samples` + + +2. **Compute a Wasserstein distance** + + + + diff --git a/docs/source/readme.rst b/docs/source/readme.rst index d1063e8..b7828d3 100644 --- a/docs/source/readme.rst +++ b/docs/source/readme.rst @@ -206,7 +206,12 @@ nbviewer `__ +- `Nicolas Courty `__ + +The contributors to this library are - `Rémi Flamary `__ - `Nicolas Courty `__ -- cgit v1.2.3 From 7f0739f73fa6a8c7fa22269c727b48d3640627be Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 25 Jun 2019 07:41:47 +0200 Subject: first shot part OT Wass --- docs/source/quickstart.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 3d3ce98..ac96f26 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -11,6 +11,10 @@ to use for different problems related to optimal transport (OT). Optimal transport and Wasserstein distance ------------------------------------------ + +Solving optimal transport +^^^^^^^^^^^^^^^^^^^^^^^^^ + The optimal transport problem between discrete distributions is often expressed as .. math:: @@ -39,6 +43,8 @@ that will return the optimal transport matrix :math:`\gamma^*`: - :any:`auto_examples/plot_OT_1D` - :any:`auto_examples/plot_OT_L1_vs_L2` +Computing Wasserstein distance +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The value of the OT solution is often more of interest that the OT matrix : @@ -60,6 +66,13 @@ properties. It can computed from an already estimated OT matrix with # M is the ground cost matrix W=ot.emd2(a,b,M) # Wasserstein distance / EMD value + +.. hint:: + Examples of use for :any:`ot.emd2` are available in the following examples: + + - :any:`auto_examples/plot_compute_emd` + + .. note:: In POT, most functions that solve OT or regularized OT problems have two versions that return the OT matrix or the value of the optimal solution. Fir -- cgit v1.2.3 From 1e0977fd346d91c837ef90dff8c75a65b182d021 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 25 Jun 2019 08:34:59 +0200 Subject: cleaunup gromov + stat guide --- docs/source/index.rst | 2 +- docs/source/quickstart.rst | 156 ++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 142 insertions(+), 16 deletions(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index 03943e8..9078d35 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -10,7 +10,7 @@ Contents -------- .. toctree:: - :maxdepth: 3 + :maxdepth: 2 self quickstart diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index ac96f26..d8d4838 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -1,8 +1,6 @@ -Quick start -=========== - - +Quick start guide +================= In the following we provide some pointers about which functions and classes to use for different problems related to optimal transport (OT). @@ -11,6 +9,11 @@ to use for different problems related to optimal transport (OT). Optimal transport and Wasserstein distance ------------------------------------------ +.. note:: + In POT, most functions that solve OT or regularized OT problems have two + versions that return the OT matrix or the value of the optimal solution. For + instance :any:`ot.emd` return the OT matrix and :any:`ot.emd2` return the + Wassertsein distance. Solving optimal transport ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -36,6 +39,10 @@ that will return the optimal transport matrix :math:`\gamma^*`: # M is the ground cost matrix T=ot.emd(a,b,M) # exact linear program +The method used for solving the OT problem is the network simplex, it is +implemented in C from [1]_. It has a complexity of :math:`O(n^3)` but the +solver is quite efficient and uses sparsity of the solution. + .. hint:: Examples of use for :any:`ot.emd` are available in the following examples: @@ -73,16 +80,19 @@ properties. It can computed from an already estimated OT matrix with - :any:`auto_examples/plot_compute_emd` -.. note:: - In POT, most functions that solve OT or regularized OT problems have two - versions that return the OT matrix or the value of the optimal solution. Fir - instance :any:`ot.emd` return the OT matrix and :any:`ot.emd2` return the - Wassertsein distance. - - Regularized Optimal Transport ----------------------------- +Entropic regularized OT +^^^^^^^^^^^^^^^^^^^^^^^ + + +Other regularization +^^^^^^^^^^^^^^^^^^^^ + +Stochastic gradient decsent +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Wasserstein Barycenters ----------------------- @@ -99,8 +109,8 @@ GPU acceleration -How to? -------- +FAQ +--- @@ -128,5 +138,121 @@ How to? 2. **Compute a Wasserstein distance** - - +References +---------- + +.. [1] Bonneel, N., Van De Panne, M., Paris, S., & Heidrich, W. (2011, + December). `Displacement nterpolation using Lagrangian mass transport + `__. + In ACM Transactions on Graphics (TOG) (Vol. 30, No. 6, p. 158). ACM. + +.. [2] Cuturi, M. (2013). `Sinkhorn distances: Lightspeed computation of + optimal transport `__. In Advances + in Neural Information Processing Systems (pp. 2292-2300). + +.. [3] Benamou, J. D., Carlier, G., Cuturi, M., Nenna, L., & Peyré, G. + (2015). `Iterative Bregman projections for regularized transportation + problems `__. SIAM Journal on + Scientific Computing, 37(2), A1111-A1138. + +.. [4] S. Nakhostin, N. Courty, R. Flamary, D. Tuia, T. Corpetti, + `Supervised planetary unmixing with optimal + transport `__, + Whorkshop on Hyperspectral Image and Signal Processing : Evolution in + Remote Sensing (WHISPERS), 2016. + +.. [5] N. Courty; R. Flamary; D. Tuia; A. Rakotomamonjy, `Optimal Transport + for Domain Adaptation `__, in IEEE + Transactions on Pattern Analysis and Machine Intelligence , vol.PP, + no.99, pp.1-1 + +.. [6] Ferradans, S., Papadakis, N., Peyré, G., & Aujol, J. F. (2014). + `Regularized discrete optimal + transport `__. SIAM Journal on + Imaging Sciences, 7(3), 1853-1882. + +.. [7] Rakotomamonjy, A., Flamary, R., & Courty, N. (2015). `Generalized + conditional gradient: analysis of convergence and + applications `__. arXiv preprint + arXiv:1510.06567. + +.. [8] M. Perrot, N. Courty, R. Flamary, A. Habrard (2016), `Mapping + estimation for discrete optimal + transport `__, + Neural Information Processing Systems (NIPS). + +.. [9] Schmitzer, B. (2016). `Stabilized Sparse Scaling Algorithms for + Entropy Regularized Transport + Problems `__. arXiv preprint + arXiv:1610.06519. + +.. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). + `Scaling algorithms for unbalanced transport + problems `__. arXiv preprint + arXiv:1607.05816. + +.. [11] Flamary, R., Cuturi, M., Courty, N., & Rakotomamonjy, A. (2016). + `Wasserstein Discriminant + Analysis `__. arXiv preprint + arXiv:1608.08063. + +.. [12] Gabriel Peyré, Marco Cuturi, and Justin Solomon (2016), + `Gromov-Wasserstein averaging of kernel and distance + matrices `__ + International Conference on Machine Learning (ICML). + +.. [13] Mémoli, Facundo (2011). `Gromov–Wasserstein distances and the + metric approach to object + matching `__. + Foundations of computational mathematics 11.4 : 417-487. + +.. [14] Knott, M. and Smith, C. S. (1984).`On the optimal mapping of + distributions `__, + Journal of Optimization Theory and Applications Vol 43. + +.. [15] Peyré, G., & Cuturi, M. (2018). `Computational Optimal + Transport `__ . + +.. [16] Agueh, M., & Carlier, G. (2011). `Barycenters in the Wasserstein + space `__. SIAM + Journal on Mathematical Analysis, 43(2), 904-924. + +.. [17] Blondel, M., Seguy, V., & Rolet, A. (2018). `Smooth and Sparse + Optimal Transport `__. Proceedings of + the Twenty-First International Conference on Artificial Intelligence and + Statistics (AISTATS). + +.. [18] Genevay, A., Cuturi, M., Peyré, G. & Bach, F. (2016) `Stochastic + Optimization for Large-scale Optimal + Transport `__. Advances in Neural + Information Processing Systems (2016). + +.. [19] Seguy, V., Bhushan Damodaran, B., Flamary, R., Courty, N., Rolet, + A.& Blondel, M. `Large-scale Optimal Transport and Mapping + Estimation `__. International + Conference on Learning Representation (2018) + +.. [20] Cuturi, M. and Doucet, A. (2014) `Fast Computation of Wasserstein + Barycenters `__. + International Conference in Machine Learning + +.. [21] Solomon, J., De Goes, F., Peyré, G., Cuturi, M., Butscher, A., + Nguyen, A. & Guibas, L. (2015). `Convolutional wasserstein distances: + Efficient optimal transportation on geometric + domains `__. ACM + Transactions on Graphics (TOG), 34(4), 66. + +.. [22] J. Altschuler, J.Weed, P. Rigollet, (2017) `Near-linear time + approximation algorithms for optimal transport via Sinkhorn + iteration `__, + Advances in Neural Information Processing Systems (NIPS) 31 + +.. [23] Aude, G., Peyré, G., Cuturi, M., `Learning Generative Models with + Sinkhorn Divergences `__, Proceedings + of the Twenty-First International Conference on Artficial Intelligence + and Statistics, (AISTATS) 21, 2018 + +.. [24] Vayer, T., Chapel, L., Flamary, R., Tavenard, R. and Courty, N. + (2019). `Optimal Transport for structured data with application on + graphs `__ Proceedings + of the 36th International Conference on Machine Learning (ICML). \ No newline at end of file -- cgit v1.2.3 From c112190ab0cf9b02a25fb86919a11f9544cd5c58 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 25 Jun 2019 08:35:20 +0200 Subject: cleanup documentation gromov --- ot/gromov.py | 164 ++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 95 insertions(+), 69 deletions(-) diff --git a/ot/gromov.py b/ot/gromov.py index ca96b31..43729dc 100644 --- a/ot/gromov.py +++ b/ot/gromov.py @@ -72,8 +72,8 @@ def init_matrix(C1, C2, p, q, loss_fun='square_loss'): References ---------- .. [12] Peyré, Gabriel, Marco Cuturi, and Justin Solomon, - "Gromov-Wasserstein averaging of kernel and distance matrices." - International Conference on Machine Learning (ICML). 2016. + "Gromov-Wasserstein averaging of kernel and distance matrices." + International Conference on Machine Learning (ICML). 2016. """ @@ -137,8 +137,8 @@ def tensor_product(constC, hC1, hC2, T): References ---------- .. [12] Peyré, Gabriel, Marco Cuturi, and Justin Solomon, - "Gromov-Wasserstein averaging of kernel and distance matrices." - International Conference on Machine Learning (ICML). 2016. + "Gromov-Wasserstein averaging of kernel and distance matrices." + International Conference on Machine Learning (ICML). 2016. """ A = -np.dot(hC1, T).dot(hC2.T) @@ -172,8 +172,8 @@ def gwloss(constC, hC1, hC2, T): References ---------- .. [12] Peyré, Gabriel, Marco Cuturi, and Justin Solomon, - "Gromov-Wasserstein averaging of kernel and distance matrices." - International Conference on Machine Learning (ICML). 2016. + "Gromov-Wasserstein averaging of kernel and distance matrices." + International Conference on Machine Learning (ICML). 2016. """ @@ -207,8 +207,8 @@ def gwggrad(constC, hC1, hC2, T): References ---------- .. [12] Peyré, Gabriel, Marco Cuturi, and Justin Solomon, - "Gromov-Wasserstein averaging of kernel and distance matrices." - International Conference on Machine Learning (ICML). 2016. + "Gromov-Wasserstein averaging of kernel and distance matrices." + International Conference on Machine Learning (ICML). 2016. """ return 2 * tensor_product(constC, hC1, hC2, @@ -277,15 +277,15 @@ def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, armijo=False, **kwargs The function solves the following optimization problem: .. math:: - \GW_Dist = \min_T \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} + GW = \min_T \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} Where : - C1 : Metric cost matrix in the source space - C2 : Metric cost matrix in the target space - p : distribution in the source space - q : distribution in the target space - L : loss function to account for the misfit between the similarity matrices - H : entropy + - C1 : Metric cost matrix in the source space + - C2 : Metric cost matrix in the target space + - p : distribution in the source space + - q : distribution in the target space + - L : loss function to account for the misfit between the similarity matrices + - H : entropy Parameters ---------- @@ -312,7 +312,7 @@ def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, armijo=False, **kwargs If True the steps of the line-search is found via an armijo research. Else closed form is used. If there is convergence issues use False. **kwargs : dict - parameters can be directly pased to the ot.optim.cg solver + parameters can be directly passed to the ot.optim.cg solver Returns ------- @@ -355,25 +355,31 @@ def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, armijo=False, **kwargs def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, armijo=False, log=False, **kwargs): """ Computes the FGW transport between two graphs see [24] + .. math:: - \gamma = arg\min_\gamma (1-\alpha)*<\gamma,M>_F + alpha* \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} + \gamma = arg\min_\gamma (1-\alpha)*<\gamma,M>_F + \alpha* \sum_{i,j,k,l} + L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} + s.t. \gamma 1 = p \gamma^T 1= q \gamma\geq 0 + where : - M is the (ns,nt) metric cost matrix - :math:`f` is the regularization term ( and df is its gradient) - a and b are source and target weights (sum to 1) - L is a loss function to account for the misfit between the similarity matrices - The algorithm used for solving the problem is conditional gradient as discussed in [1]_ + + The algorithm used for solving the problem is conditional gradient as discussed in [24]_ + Parameters ---------- M : ndarray, shape (ns, nt) Metric cost matrix between features across domains C1 : ndarray, shape (ns, ns) - Metric cost matrix respresentative of the structure in the source space + Metric cost matrix representative of the structure in the source space C2 : ndarray, shape (nt, nt) - Metric cost matrix espresentative of the structure in the target space + Metric cost matrix representative of the structure in the target space p : ndarray, shape (ns,) distribution in the source space q : ndarray, shape (nt,) @@ -392,19 +398,23 @@ def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, If True the steps of the line-search is found via an armijo research. Else closed form is used. If there is convergence issues use False. **kwargs : dict - parameters can be directly pased to the ot.optim.cg solver + parameters can be directly passed to the ot.optim.cg solver + Returns ------- gamma : (ns x nt) ndarray Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters + + References ---------- .. [24] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain - and Courty Nicolas - "Optimal Transport for structured data with application on graphs" - International Conference on Machine Learning (ICML). 2019. + and Courty Nicolas "Optimal Transport for structured data with + application on graphs", International Conference on Machine Learning + (ICML). 2019. + """ constC, hC1, hC2 = init_matrix(C1, C2, p, q, loss_fun) @@ -428,17 +438,23 @@ def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, def fused_gromov_wasserstein2(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, armijo=False, log=False, **kwargs): """ Computes the FGW distance between two graphs see [24] + .. math:: - \gamma = arg\min_\gamma (1-\alpha)*<\gamma,M>_F + alpha* \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} + \min_\gamma (1-\alpha)*<\gamma,M>_F + \alpha* \sum_{i,j,k,l} + L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} + + s.t. \gamma 1 = p \gamma^T 1= q \gamma\geq 0 + where : - M is the (ns,nt) metric cost matrix - :math:`f` is the regularization term ( and df is its gradient) - a and b are source and target weights (sum to 1) - L is a loss function to account for the misfit between the similarity matrices The algorithm used for solving the problem is conditional gradient as discussed in [1]_ + Parameters ---------- M : ndarray, shape (ns, nt) @@ -466,16 +482,18 @@ def fused_gromov_wasserstein2(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5 If there is convergence issues use False. **kwargs : dict parameters can be directly pased to the ot.optim.cg solver + Returns ------- gamma : (ns x nt) ndarray Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters + References ---------- .. [24] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain - and Courty Nicolas + and Courty Nicolas "Optimal Transport for structured data with application on graphs" International Conference on Machine Learning (ICML). 2019. """ @@ -506,22 +524,22 @@ def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False, armijo=False, **kwarg The function solves the following optimization problem: .. math:: - \GW_Dist = \min_T \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} + GW = \min_T \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} Where : - C1 : Metric cost matrix in the source space - C2 : Metric cost matrix in the target space - p : distribution in the source space - q : distribution in the target space - L : loss function to account for the misfit between the similarity matrices - H : entropy + - C1 : Metric cost matrix in the source space + - C2 : Metric cost matrix in the target space + - p : distribution in the source space + - q : distribution in the target space + - L : loss function to account for the misfit between the similarity matrices + - H : entropy Parameters ---------- C1 : ndarray, shape (ns, ns) Metric cost matrix in the source space C2 : ndarray, shape (nt, nt) - Metric costfr matrix in the target space + Metric cost matrix in the target space p : ndarray, shape (ns,) distribution in the source space q : ndarray, shape (nt,) @@ -587,21 +605,21 @@ def entropic_gromov_wasserstein(C1, C2, p, q, loss_fun, epsilon, The function solves the following optimization problem: .. math:: - \GW = arg\min_T \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l}-\epsilon(H(T)) + GW = arg\min_T \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l}-\epsilon(H(T)) - s.t. \GW 1 = p + s.t. T 1 = p - \GW^T 1= q + T^T 1= q - \GW\geq 0 + T\geq 0 Where : - C1 : Metric cost matrix in the source space - C2 : Metric cost matrix in the target space - p : distribution in the source space - q : distribution in the target space - L : loss function to account for the misfit between the similarity matrices - H : entropy + - C1 : Metric cost matrix in the source space + - C2 : Metric cost matrix in the target space + - p : distribution in the source space + - q : distribution in the target space + - L : loss function to account for the misfit between the similarity matrices + - H : entropy Parameters ---------- @@ -629,14 +647,13 @@ def entropic_gromov_wasserstein(C1, C2, p, q, loss_fun, epsilon, Returns ------- T : ndarray, shape (ns, nt) - coupling between the two spaces that minimizes : - \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l}-\epsilon(H(T)) + Optimal coupling between the two spaces References ---------- .. [12] Peyré, Gabriel, Marco Cuturi, and Justin Solomon, - "Gromov-Wasserstein averaging of kernel and distance matrices." - International Conference on Machine Learning (ICML). 2016. + "Gromov-Wasserstein averaging of kernel and distance matrices." + International Conference on Machine Learning (ICML). 2016. """ @@ -695,15 +712,15 @@ def entropic_gromov_wasserstein2(C1, C2, p, q, loss_fun, epsilon, The function solves the following optimization problem: .. math:: - \GW_Dist = \min_T \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l}-\epsilon(H(T)) + GW = \min_T \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l}-\epsilon(H(T)) Where : - C1 : Metric cost matrix in the source space - C2 : Metric cost matrix in the target space - p : distribution in the source space - q : distribution in the target space - L : loss function to account for the misfit between the similarity matrices - H : entropy + - C1 : Metric cost matrix in the source space + - C2 : Metric cost matrix in the target space + - p : distribution in the source space + - q : distribution in the target space + - L : loss function to account for the misfit between the similarity matrices + - H : entropy Parameters ---------- @@ -736,8 +753,8 @@ def entropic_gromov_wasserstein2(C1, C2, p, q, loss_fun, epsilon, References ---------- .. [12] Peyré, Gabriel, Marco Cuturi, and Justin Solomon, - "Gromov-Wasserstein averaging of kernel and distance matrices." - International Conference on Machine Learning (ICML). 2016. + "Gromov-Wasserstein averaging of kernel and distance matrices." + International Conference on Machine Learning (ICML). 2016. """ @@ -762,13 +779,13 @@ def entropic_gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, epsilon, The function solves the following optimization problem: .. math:: - C = argmin_C\in R^{NxN} \sum_s \lambda_s GW(C,Cs,p,ps) + C = argmin_{C\in R^{NxN}} \sum_s \lambda_s GW(C,C_s,p,p_s) Where : - Cs : metric cost matrix - ps : distribution + - :math:`C_s` : metric cost matrix + - :math:`p_s` : distribution Parameters ---------- @@ -806,8 +823,8 @@ def entropic_gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, epsilon, References ---------- .. [12] Peyré, Gabriel, Marco Cuturi, and Justin Solomon, - "Gromov-Wasserstein averaging of kernel and distance matrices." - International Conference on Machine Learning (ICML). 2016. + "Gromov-Wasserstein averaging of kernel and distance matrices." + International Conference on Machine Learning (ICML). 2016. """ @@ -876,8 +893,8 @@ def gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, Where : - Cs : metric cost matrix - ps : distribution + - Cs : metric cost matrix + - ps : distribution Parameters ---------- @@ -913,8 +930,8 @@ def gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, References ---------- .. [12] Peyré, Gabriel, Marco Cuturi, and Justin Solomon, - "Gromov-Wasserstein averaging of kernel and distance matrices." - International Conference on Machine Learning (ICML). 2016. + "Gromov-Wasserstein averaging of kernel and distance matrices." + International Conference on Machine Learning (ICML). 2016. """ @@ -972,6 +989,8 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ verbose=False, log=False, init_C=None, init_X=None): """ Compute the fgw barycenter as presented eq (5) in [24]. + + Parameters ---------- N : integer Desired number of samples of the target barycenter @@ -993,8 +1012,9 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ initialization for the barycenters' structure matrix. If not set random init init_X : ndarray, shape (N,d), optional initialization for the barycenters' features. If not set random init + Returns - ---------- + ------- X : ndarray, shape (N,d) Barycenters' features C : ndarray, shape (N,N) @@ -1002,11 +1022,13 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ log_: dictionary Only returned when log=True T : list of (N,ns) transport matrices - Ms : all distance matrices between the feature of the barycenter and the other features dist(X,Ys) shape (N,ns) + Ms : all distance matrices between the feature of the barycenter and the + other features dist(X,Ys) shape (N,ns) + References ---------- .. [24] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain - and Courty Nicolas + and Courty Nicolas "Optimal Transport for structured data with application on graphs" International Conference on Machine Learning (ICML). 2019. """ @@ -1107,6 +1129,7 @@ def update_sructure_matrix(p, lambdas, T, Cs): """ Updates C according to the L2 Loss kernel with the S Ts couplings calculated at each iteration + Parameters ---------- p : ndarray, shape (N,) @@ -1117,6 +1140,7 @@ def update_sructure_matrix(p, lambdas, T, Cs): the S Ts couplings calculated at each iteration Cs : list of S ndarray, shape(ns,ns) Metric cost matrices + Returns ---------- C : ndarray, shape (nt,nt) @@ -1132,6 +1156,7 @@ def update_feature_matrix(lambdas, Ys, Ts, p): """ Updates the feature with respect to the S Ts couplings. See "Solving the barycenter problem with Block Coordinate Descent (BCD)" in [24] calculated at each iteration + Parameters ---------- p : ndarray, shape (N,) @@ -1142,6 +1167,7 @@ def update_feature_matrix(lambdas, Ys, Ts, p): the S Ts couplings calculated at each iteration Ys : list of S ndarray, shape(d,ns) The features + Returns ---------- X : ndarray, shape (d,N) -- cgit v1.2.3 From 042b52d4edad20d246481c389007ba1abb67c3b4 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 25 Jun 2019 08:43:00 +0200 Subject: pep8 --- README.md | 15 ++++++++++++++- ot/gromov.py | 10 +++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b6b215c..288ba13 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,12 @@ The library has been tested on Linux, MacOSX and Windows. It requires a C++ comp #### Pip installation +Note that due to a limitation of pip, `cython` and `numpy` need to be installed +prior to installing POT. This can be done easily with +``` +pip install numpy cython +``` + You can install the toolbox through PyPI with: ``` pip install POT @@ -62,6 +68,8 @@ or get the very latest version by downloading it and then running: python setup.py install --user # for user install (no root) ``` + + #### Anaconda installation with conda-forge If you use the Anaconda python distribution, POT is available in [conda-forge](https://conda-forge.org). To install it and the required dependencies: @@ -150,7 +158,12 @@ You can also see the notebooks with [Jupyter nbviewer](https://nbviewer.jupyter. ## Acknowledgements -The contributors to this library are: +This toolbox has been created and is maintained by + +* [Rémi Flamary](http://remi.flamary.com/) +* [Nicolas Courty](http://people.irisa.fr/Nicolas.Courty/) + +The contributors to this library are * [Rémi Flamary](http://remi.flamary.com/) * [Nicolas Courty](http://people.irisa.fr/Nicolas.Courty/) diff --git a/ot/gromov.py b/ot/gromov.py index 43729dc..cd961b0 100644 --- a/ot/gromov.py +++ b/ot/gromov.py @@ -359,7 +359,7 @@ def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, .. math:: \gamma = arg\min_\gamma (1-\alpha)*<\gamma,M>_F + \alpha* \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} - + s.t. \gamma 1 = p \gamma^T 1= q \gamma\geq 0 @@ -414,7 +414,7 @@ def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, and Courty Nicolas "Optimal Transport for structured data with application on graphs", International Conference on Machine Learning (ICML). 2019. - + """ constC, hC1, hC2 = init_matrix(C1, C2, p, q, loss_fun) @@ -442,7 +442,7 @@ def fused_gromov_wasserstein2(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5 .. math:: \min_\gamma (1-\alpha)*<\gamma,M>_F + \alpha* \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} - + s.t. \gamma 1 = p \gamma^T 1= q @@ -647,7 +647,7 @@ def entropic_gromov_wasserstein(C1, C2, p, q, loss_fun, epsilon, Returns ------- T : ndarray, shape (ns, nt) - Optimal coupling between the two spaces + Optimal coupling between the two spaces References ---------- @@ -1024,7 +1024,7 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ T : list of (N,ns) transport matrices Ms : all distance matrices between the feature of the barycenter and the other features dist(X,Ys) shape (N,ns) - + References ---------- .. [24] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain -- cgit v1.2.3 From c4b0aeb20d920ba366a656a9aee7afe78871c9c7 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 25 Jun 2019 14:26:16 +0200 Subject: add fgw examples in doc --- docs/cache_nbrun | 2 +- .../source/auto_examples/auto_examples_jupyter.zip | Bin 122957 -> 139016 bytes docs/source/auto_examples/auto_examples_python.zip | Bin 81905 -> 93470 bytes .../images/sphx_glr_plot_OT_2D_samples_001.png | Bin 22281 -> 20785 bytes .../images/sphx_glr_plot_OT_2D_samples_002.png | Bin 20743 -> 21134 bytes .../images/sphx_glr_plot_OT_2D_samples_005.png | Bin 9695 -> 9704 bytes .../images/sphx_glr_plot_OT_2D_samples_006.png | Bin 90088 -> 79153 bytes .../images/sphx_glr_plot_OT_2D_samples_009.png | Bin 15036 -> 14611 bytes .../images/sphx_glr_plot_OT_2D_samples_010.png | Bin 103143 -> 97487 bytes .../images/sphx_glr_plot_OT_2D_samples_013.png | Bin 0 -> 10846 bytes .../images/sphx_glr_plot_OT_2D_samples_014.png | Bin 0 -> 20361 bytes .../images/sphx_glr_plot_barycenter_fgw_001.png | Bin 0 -> 131827 bytes .../images/sphx_glr_plot_barycenter_fgw_002.png | Bin 0 -> 29423 bytes .../auto_examples/images/sphx_glr_plot_fgw_004.png | Bin 0 -> 19490 bytes .../auto_examples/images/sphx_glr_plot_fgw_010.png | Bin 0 -> 44747 bytes .../auto_examples/images/sphx_glr_plot_fgw_011.png | Bin 0 -> 21337 bytes .../thumb/sphx_glr_plot_OT_2D_samples_thumb.png | Bin 19155 -> 17987 bytes .../thumb/sphx_glr_plot_barycenter_fgw_thumb.png | Bin 0 -> 28694 bytes .../images/thumb/sphx_glr_plot_fgw_thumb.png | Bin 0 -> 17541 bytes docs/source/auto_examples/index.rst | 80 ++++-- docs/source/auto_examples/plot_OT_2D_samples.ipynb | 22 +- docs/source/auto_examples/plot_OT_2D_samples.py | 26 ++ docs/source/auto_examples/plot_OT_2D_samples.rst | 56 +++- .../source/auto_examples/plot_barycenter_fgw.ipynb | 126 +++++++++ docs/source/auto_examples/plot_barycenter_fgw.py | 184 +++++++++++++ docs/source/auto_examples/plot_barycenter_fgw.rst | 268 +++++++++++++++++++ docs/source/auto_examples/plot_fgw.ipynb | 162 +++++++++++ docs/source/auto_examples/plot_fgw.py | 173 ++++++++++++ docs/source/auto_examples/plot_fgw.rst | 297 +++++++++++++++++++++ 29 files changed, 1372 insertions(+), 24 deletions(-) create mode 100644 docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_013.png create mode 100644 docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_014.png create mode 100644 docs/source/auto_examples/images/sphx_glr_plot_barycenter_fgw_001.png create mode 100644 docs/source/auto_examples/images/sphx_glr_plot_barycenter_fgw_002.png create mode 100644 docs/source/auto_examples/images/sphx_glr_plot_fgw_004.png create mode 100644 docs/source/auto_examples/images/sphx_glr_plot_fgw_010.png create mode 100644 docs/source/auto_examples/images/sphx_glr_plot_fgw_011.png create mode 100644 docs/source/auto_examples/images/thumb/sphx_glr_plot_barycenter_fgw_thumb.png create mode 100644 docs/source/auto_examples/images/thumb/sphx_glr_plot_fgw_thumb.png create mode 100644 docs/source/auto_examples/plot_barycenter_fgw.ipynb create mode 100644 docs/source/auto_examples/plot_barycenter_fgw.py create mode 100644 docs/source/auto_examples/plot_barycenter_fgw.rst create mode 100644 docs/source/auto_examples/plot_fgw.ipynb create mode 100644 docs/source/auto_examples/plot_fgw.py create mode 100644 docs/source/auto_examples/plot_fgw.rst diff --git a/docs/cache_nbrun b/docs/cache_nbrun index 6f10375..04f6fce 100644 --- a/docs/cache_nbrun +++ b/docs/cache_nbrun @@ -1 +1 @@ -{"plot_otda_mapping_colors_images.ipynb": "cc8bf9a857f52e4a159fe71dfda19018", "plot_optim_OTreg.ipynb": "481801bb0d133ef350a65179cf8f739a", "plot_otda_color_images.ipynb": "f804d5806c7ac1a0901e4542b1eaa77b", "plot_stochastic.ipynb": "e18253354c8c1d72567a4259eb1094f7", "plot_WDA.ipynb": "27f8de4c6d7db46497076523673eedfb", "plot_otda_linear_mapping.ipynb": "a472c767abe82020e0a58125a528785c", "plot_OT_1D_smooth.ipynb": "3a059103652225a0c78ea53895cf79e5", "plot_OT_L1_vs_L2.ipynb": "5d565b8aaf03be4309eba731127851dc", "plot_barycenter_1D.ipynb": "5f6fb8aebd8e2e91ebc77c923cb112b3", "plot_otda_classes.ipynb": "39087b6e98217851575f2271c22853a4", "plot_otda_d2.ipynb": "e6feae588103f2a8fab942e5f4eff483", "plot_otda_mapping.ipynb": "2f1ebbdc0f855d9e2b7adf9edec24d25", "plot_gromov.ipynb": "24f2aea489714d34779521f46d5e2c47", "plot_compute_emd.ipynb": "f5cd71cad882ec157dc8222721e9820c", "plot_OT_1D.ipynb": "b5348bdc561c07ec168a1622e5af4b93", "plot_gromov_barycenter.ipynb": "953e5047b886ec69ec621ec52f5e21d1", "plot_free_support_barycenter.ipynb": "246dd2feff4b233a4f1a553c5a202fdc", "plot_convolutional_barycenter.ipynb": "a72bb3716a1baaffd81ae267a673f9b6", "plot_otda_semi_supervised.ipynb": "f6dfb02ba2bbd939408ffcd22a3b007c", "plot_OT_2D_samples.ipynb": "07dbc14859fa019a966caa79fa0825bd", "plot_barycenter_lp_vs_entropic.ipynb": "51833e8c76aaedeba9599ac7a30eb357"} \ No newline at end of file +{"plot_otda_color_images.ipynb": "f804d5806c7ac1a0901e4542b1eaa77b", "plot_WDA.ipynb": "27f8de4c6d7db46497076523673eedfb", "plot_OT_L1_vs_L2.ipynb": "5d565b8aaf03be4309eba731127851dc", "plot_otda_semi_supervised.ipynb": "f6dfb02ba2bbd939408ffcd22a3b007c", "plot_fgw.ipynb": "2ba3e100e92ecf4dfbeb605de20b40ab", "plot_otda_d2.ipynb": "e6feae588103f2a8fab942e5f4eff483", "plot_compute_emd.ipynb": "f5cd71cad882ec157dc8222721e9820c", "plot_barycenter_fgw.ipynb": "e14100dd276bff3ffdfdf176f1b6b070", "plot_convolutional_barycenter.ipynb": "a72bb3716a1baaffd81ae267a673f9b6", "plot_optim_OTreg.ipynb": "481801bb0d133ef350a65179cf8f739a", "plot_barycenter_lp_vs_entropic.ipynb": "51833e8c76aaedeba9599ac7a30eb357", "plot_OT_1D_smooth.ipynb": "3a059103652225a0c78ea53895cf79e5", "plot_barycenter_1D.ipynb": "5f6fb8aebd8e2e91ebc77c923cb112b3", "plot_otda_mapping.ipynb": "2f1ebbdc0f855d9e2b7adf9edec24d25", "plot_OT_1D.ipynb": "b5348bdc561c07ec168a1622e5af4b93", "plot_gromov_barycenter.ipynb": "953e5047b886ec69ec621ec52f5e21d1", "plot_otda_mapping_colors_images.ipynb": "cc8bf9a857f52e4a159fe71dfda19018", "plot_stochastic.ipynb": "e18253354c8c1d72567a4259eb1094f7", "plot_otda_linear_mapping.ipynb": "a472c767abe82020e0a58125a528785c", "plot_otda_classes.ipynb": "39087b6e98217851575f2271c22853a4", "plot_free_support_barycenter.ipynb": "246dd2feff4b233a4f1a553c5a202fdc", "plot_gromov.ipynb": "24f2aea489714d34779521f46d5e2c47", "plot_OT_2D_samples.ipynb": "912a77c5dd0fc0fafa03fac3d86f1502"} \ No newline at end of file diff --git a/docs/source/auto_examples/auto_examples_jupyter.zip b/docs/source/auto_examples/auto_examples_jupyter.zip index 88e1e9b..a3a7c29 100644 Binary files a/docs/source/auto_examples/auto_examples_jupyter.zip and b/docs/source/auto_examples/auto_examples_jupyter.zip differ diff --git a/docs/source/auto_examples/auto_examples_python.zip b/docs/source/auto_examples/auto_examples_python.zip index 120a586..86a6841 100644 Binary files a/docs/source/auto_examples/auto_examples_python.zip and b/docs/source/auto_examples/auto_examples_python.zip differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_001.png b/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_001.png index 2e93ed1..a5bded7 100644 Binary files a/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_001.png and b/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_001.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_002.png b/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_002.png index d6db0ed..1d90c2d 100644 Binary files a/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_002.png and b/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_002.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_005.png b/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_005.png index 9a215ab..ea6a405 100644 Binary files a/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_005.png and b/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_005.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_006.png b/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_006.png index 81c4ddb..8bc46dc 100644 Binary files a/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_006.png and b/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_006.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_009.png b/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_009.png index 892b2a2..56d18ef 100644 Binary files a/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_009.png and b/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_009.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_010.png b/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_010.png index c53717f..5aef7d2 100644 Binary files a/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_010.png and b/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_010.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_013.png b/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_013.png new file mode 100644 index 0000000..bb8bd7c Binary files /dev/null and b/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_013.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_014.png b/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_014.png new file mode 100644 index 0000000..30cec7b Binary files /dev/null and b/docs/source/auto_examples/images/sphx_glr_plot_OT_2D_samples_014.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_barycenter_fgw_001.png b/docs/source/auto_examples/images/sphx_glr_plot_barycenter_fgw_001.png new file mode 100644 index 0000000..77e1282 Binary files /dev/null and b/docs/source/auto_examples/images/sphx_glr_plot_barycenter_fgw_001.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_barycenter_fgw_002.png b/docs/source/auto_examples/images/sphx_glr_plot_barycenter_fgw_002.png new file mode 100644 index 0000000..ca6d7f8 Binary files /dev/null and b/docs/source/auto_examples/images/sphx_glr_plot_barycenter_fgw_002.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_fgw_004.png b/docs/source/auto_examples/images/sphx_glr_plot_fgw_004.png new file mode 100644 index 0000000..4e0df9f Binary files /dev/null and b/docs/source/auto_examples/images/sphx_glr_plot_fgw_004.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_fgw_010.png b/docs/source/auto_examples/images/sphx_glr_plot_fgw_010.png new file mode 100644 index 0000000..d0e36e8 Binary files /dev/null and b/docs/source/auto_examples/images/sphx_glr_plot_fgw_010.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_fgw_011.png b/docs/source/auto_examples/images/sphx_glr_plot_fgw_011.png new file mode 100644 index 0000000..6d7e630 Binary files /dev/null and b/docs/source/auto_examples/images/sphx_glr_plot_fgw_011.png differ diff --git a/docs/source/auto_examples/images/thumb/sphx_glr_plot_OT_2D_samples_thumb.png b/docs/source/auto_examples/images/thumb/sphx_glr_plot_OT_2D_samples_thumb.png index b9135dd..ae33588 100644 Binary files a/docs/source/auto_examples/images/thumb/sphx_glr_plot_OT_2D_samples_thumb.png and b/docs/source/auto_examples/images/thumb/sphx_glr_plot_OT_2D_samples_thumb.png differ diff --git a/docs/source/auto_examples/images/thumb/sphx_glr_plot_barycenter_fgw_thumb.png b/docs/source/auto_examples/images/thumb/sphx_glr_plot_barycenter_fgw_thumb.png new file mode 100644 index 0000000..9c3244e Binary files /dev/null and b/docs/source/auto_examples/images/thumb/sphx_glr_plot_barycenter_fgw_thumb.png differ diff --git a/docs/source/auto_examples/images/thumb/sphx_glr_plot_fgw_thumb.png b/docs/source/auto_examples/images/thumb/sphx_glr_plot_fgw_thumb.png new file mode 100644 index 0000000..609339d Binary files /dev/null and b/docs/source/auto_examples/images/thumb/sphx_glr_plot_fgw_thumb.png differ diff --git a/docs/source/auto_examples/index.rst b/docs/source/auto_examples/index.rst index 17a9710..9f02da4 100644 --- a/docs/source/auto_examples/index.rst +++ b/docs/source/auto_examples/index.rst @@ -107,26 +107,6 @@ This is a gallery of all the POT example files. /auto_examples/plot_gromov -.. raw:: html - -
- -.. only:: html - - .. figure:: /auto_examples/images/thumb/sphx_glr_plot_OT_2D_samples_thumb.png - - :ref:`sphx_glr_auto_examples_plot_OT_2D_samples.py` - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /auto_examples/plot_OT_2D_samples - .. raw:: html
@@ -207,6 +187,26 @@ This is a gallery of all the POT example files. /auto_examples/plot_WDA +.. raw:: html + +
+ +.. only:: html + + .. figure:: /auto_examples/images/thumb/sphx_glr_plot_OT_2D_samples_thumb.png + + :ref:`sphx_glr_auto_examples_plot_OT_2D_samples.py` + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /auto_examples/plot_OT_2D_samples + .. raw:: html
@@ -327,6 +327,26 @@ This is a gallery of all the POT example files. /auto_examples/plot_otda_semi_supervised +.. raw:: html + +
+ +.. only:: html + + .. figure:: /auto_examples/images/thumb/sphx_glr_plot_fgw_thumb.png + + :ref:`sphx_glr_auto_examples_plot_fgw.py` + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /auto_examples/plot_fgw + .. raw:: html
@@ -407,6 +427,26 @@ This is a gallery of all the POT example files. /auto_examples/plot_barycenter_lp_vs_entropic +.. raw:: html + +
+ +.. only:: html + + .. figure:: /auto_examples/images/thumb/sphx_glr_plot_barycenter_fgw_thumb.png + + :ref:`sphx_glr_auto_examples_plot_barycenter_fgw.py` + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /auto_examples/plot_barycenter_fgw + .. raw:: html
diff --git a/docs/source/auto_examples/plot_OT_2D_samples.ipynb b/docs/source/auto_examples/plot_OT_2D_samples.ipynb index 26831f9..dad138b 100644 --- a/docs/source/auto_examples/plot_OT_2D_samples.ipynb +++ b/docs/source/auto_examples/plot_OT_2D_samples.ipynb @@ -26,7 +26,7 @@ }, "outputs": [], "source": [ - "# Author: Remi Flamary \n#\n# License: MIT License\n\nimport numpy as np\nimport matplotlib.pylab as pl\nimport ot\nimport ot.plot" + "# Author: Remi Flamary \n# Kilian Fatras \n#\n# License: MIT License\n\nimport numpy as np\nimport matplotlib.pylab as pl\nimport ot\nimport ot.plot" ] }, { @@ -100,6 +100,24 @@ "source": [ "#%% sinkhorn\n\n# reg term\nlambd = 1e-3\n\nGs = ot.sinkhorn(a, b, M, lambd)\n\npl.figure(5)\npl.imshow(Gs, interpolation='nearest')\npl.title('OT matrix sinkhorn')\n\npl.figure(6)\not.plot.plot2D_samples_mat(xs, xt, Gs, color=[.5, .5, 1])\npl.plot(xs[:, 0], xs[:, 1], '+b', label='Source samples')\npl.plot(xt[:, 0], xt[:, 1], 'xr', label='Target samples')\npl.legend(loc=0)\npl.title('OT matrix Sinkhorn with samples')\n\npl.show()" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Emprirical Sinkhorn\n----------------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% sinkhorn\n\n# reg term\nlambd = 1e-3\n\nGes = ot.bregman.empirical_sinkhorn(xs, xt, lambd)\n\npl.figure(7)\npl.imshow(Ges, interpolation='nearest')\npl.title('OT matrix empirical sinkhorn')\n\npl.figure(8)\not.plot.plot2D_samples_mat(xs, xt, Ges, color=[.5, .5, 1])\npl.plot(xs[:, 0], xs[:, 1], '+b', label='Source samples')\npl.plot(xt[:, 0], xt[:, 1], 'xr', label='Target samples')\npl.legend(loc=0)\npl.title('OT matrix Sinkhorn from samples')\n\npl.show()" + ] } ], "metadata": { @@ -118,7 +136,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.5" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/docs/source/auto_examples/plot_OT_2D_samples.py b/docs/source/auto_examples/plot_OT_2D_samples.py index bb952a0..63126ba 100644 --- a/docs/source/auto_examples/plot_OT_2D_samples.py +++ b/docs/source/auto_examples/plot_OT_2D_samples.py @@ -10,6 +10,7 @@ sum of diracs. The OT matrix is plotted with the samples. """ # Author: Remi Flamary +# Kilian Fatras # # License: MIT License @@ -100,3 +101,28 @@ pl.legend(loc=0) pl.title('OT matrix Sinkhorn with samples') pl.show() + + +############################################################################## +# Emprirical Sinkhorn +# ---------------- + +#%% sinkhorn + +# reg term +lambd = 1e-3 + +Ges = ot.bregman.empirical_sinkhorn(xs, xt, lambd) + +pl.figure(7) +pl.imshow(Ges, interpolation='nearest') +pl.title('OT matrix empirical sinkhorn') + +pl.figure(8) +ot.plot.plot2D_samples_mat(xs, xt, Ges, color=[.5, .5, 1]) +pl.plot(xs[:, 0], xs[:, 1], '+b', label='Source samples') +pl.plot(xt[:, 0], xt[:, 1], 'xr', label='Target samples') +pl.legend(loc=0) +pl.title('OT matrix Sinkhorn from samples') + +pl.show() diff --git a/docs/source/auto_examples/plot_OT_2D_samples.rst b/docs/source/auto_examples/plot_OT_2D_samples.rst index 624ae3e..1f1d713 100644 --- a/docs/source/auto_examples/plot_OT_2D_samples.rst +++ b/docs/source/auto_examples/plot_OT_2D_samples.rst @@ -17,6 +17,7 @@ sum of diracs. The OT matrix is plotted with the samples. # Author: Remi Flamary + # Kilian Fatras # # License: MIT License @@ -176,6 +177,8 @@ Compute Sinkhorn + + .. rst-class:: sphx-glr-horizontal @@ -192,7 +195,58 @@ Compute Sinkhorn -**Total running time of the script:** ( 0 minutes 3.027 seconds) +Emprirical Sinkhorn +---------------- + + + +.. code-block:: python + + + #%% sinkhorn + + # reg term + lambd = 1e-3 + + Ges = ot.bregman.empirical_sinkhorn(xs, xt, lambd) + + pl.figure(7) + pl.imshow(Ges, interpolation='nearest') + pl.title('OT matrix empirical sinkhorn') + + pl.figure(8) + ot.plot.plot2D_samples_mat(xs, xt, Ges, color=[.5, .5, 1]) + pl.plot(xs[:, 0], xs[:, 1], '+b', label='Source samples') + pl.plot(xt[:, 0], xt[:, 1], 'xr', label='Target samples') + pl.legend(loc=0) + pl.title('OT matrix Sinkhorn from samples') + + pl.show() + + + +.. rst-class:: sphx-glr-horizontal + + + * + + .. image:: /auto_examples/images/sphx_glr_plot_OT_2D_samples_013.png + :scale: 47 + + * + + .. image:: /auto_examples/images/sphx_glr_plot_OT_2D_samples_014.png + :scale: 47 + + +.. rst-class:: sphx-glr-script-out + + Out:: + + Warning: numerical errors at iteration 0 + + +**Total running time of the script:** ( 0 minutes 2.616 seconds) diff --git a/docs/source/auto_examples/plot_barycenter_fgw.ipynb b/docs/source/auto_examples/plot_barycenter_fgw.ipynb new file mode 100644 index 0000000..28229b2 --- /dev/null +++ b/docs/source/auto_examples/plot_barycenter_fgw.ipynb @@ -0,0 +1,126 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n=================================\nPlot graphs' barycenter using FGW\n=================================\n\nThis example illustrates the computation barycenter of labeled graphs using FGW\n\nRequires networkx >=2\n\n.. [18] Vayer Titouan, Chapel Laetitia, Flamary R{'e}mi, Tavenard Romain\n and Courty Nicolas\n \"Optimal Transport for structured data with application on graphs\"\n International Conference on Machine Learning (ICML). 2019.\n\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Author: Titouan Vayer \n#\n# License: MIT License\n\n#%% load libraries\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport networkx as nx\nimport math\nfrom scipy.sparse.csgraph import shortest_path\nimport matplotlib.colors as mcol\nfrom matplotlib import cm\nfrom ot.gromov import fgw_barycenters\n#%% Graph functions\n\n\ndef find_thresh(C, inf=0.5, sup=3, step=10):\n \"\"\" Trick to find the adequate thresholds from where value of the C matrix are considered close enough to say that nodes are connected\n Tthe threshold is found by a linesearch between values \"inf\" and \"sup\" with \"step\" thresholds tested.\n The optimal threshold is the one which minimizes the reconstruction error between the shortest_path matrix coming from the thresholded adjency matrix\n and the original matrix.\n Parameters\n ----------\n C : ndarray, shape (n_nodes,n_nodes)\n The structure matrix to threshold\n inf : float\n The beginning of the linesearch\n sup : float\n The end of the linesearch\n step : integer\n Number of thresholds tested\n \"\"\"\n dist = []\n search = np.linspace(inf, sup, step)\n for thresh in search:\n Cprime = sp_to_adjency(C, 0, thresh)\n SC = shortest_path(Cprime, method='D')\n SC[SC == float('inf')] = 100\n dist.append(np.linalg.norm(SC - C))\n return search[np.argmin(dist)], dist\n\n\ndef sp_to_adjency(C, threshinf=0.2, threshsup=1.8):\n \"\"\" Thresholds the structure matrix in order to compute an adjency matrix.\n All values between threshinf and threshsup are considered representing connected nodes and set to 1. Else are set to 0\n Parameters\n ----------\n C : ndarray, shape (n_nodes,n_nodes)\n The structure matrix to threshold\n threshinf : float\n The minimum value of distance from which the new value is set to 1\n threshsup : float\n The maximum value of distance from which the new value is set to 1\n Returns\n -------\n C : ndarray, shape (n_nodes,n_nodes)\n The threshold matrix. Each element is in {0,1}\n \"\"\"\n H = np.zeros_like(C)\n np.fill_diagonal(H, np.diagonal(C))\n C = C - H\n C = np.minimum(np.maximum(C, threshinf), threshsup)\n C[C == threshsup] = 0\n C[C != 0] = 1\n\n return C\n\n\ndef build_noisy_circular_graph(N=20, mu=0, sigma=0.3, with_noise=False, structure_noise=False, p=None):\n \"\"\" Create a noisy circular graph\n \"\"\"\n g = nx.Graph()\n g.add_nodes_from(list(range(N)))\n for i in range(N):\n noise = float(np.random.normal(mu, sigma, 1))\n if with_noise:\n g.add_node(i, attr_name=math.sin((2 * i * math.pi / N)) + noise)\n else:\n g.add_node(i, attr_name=math.sin(2 * i * math.pi / N))\n g.add_edge(i, i + 1)\n if structure_noise:\n randomint = np.random.randint(0, p)\n if randomint == 0:\n if i <= N - 3:\n g.add_edge(i, i + 2)\n if i == N - 2:\n g.add_edge(i, 0)\n if i == N - 1:\n g.add_edge(i, 1)\n g.add_edge(N, 0)\n noise = float(np.random.normal(mu, sigma, 1))\n if with_noise:\n g.add_node(N, attr_name=math.sin((2 * N * math.pi / N)) + noise)\n else:\n g.add_node(N, attr_name=math.sin(2 * N * math.pi / N))\n return g\n\n\ndef graph_colors(nx_graph, vmin=0, vmax=7):\n cnorm = mcol.Normalize(vmin=vmin, vmax=vmax)\n cpick = cm.ScalarMappable(norm=cnorm, cmap='viridis')\n cpick.set_array([])\n val_map = {}\n for k, v in nx.get_node_attributes(nx_graph, 'attr_name').items():\n val_map[k] = cpick.to_rgba(v)\n colors = []\n for node in nx_graph.nodes():\n colors.append(val_map[node])\n return colors" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Generate data\n-------------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% circular dataset\n# We build a dataset of noisy circular graphs.\n# Noise is added on the structures by random connections and on the features by gaussian noise.\n\n\nnp.random.seed(30)\nX0 = []\nfor k in range(9):\n X0.append(build_noisy_circular_graph(np.random.randint(15, 25), with_noise=True, structure_noise=True, p=3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot data\n---------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% Plot graphs\n\nplt.figure(figsize=(8, 10))\nfor i in range(len(X0)):\n plt.subplot(3, 3, i + 1)\n g = X0[i]\n pos = nx.kamada_kawai_layout(g)\n nx.draw(g, pos=pos, node_color=graph_colors(g, vmin=-1, vmax=1), with_labels=False, node_size=100)\nplt.suptitle('Dataset of noisy graphs. Color indicates the label', fontsize=20)\nplt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Barycenter computation\n----------------------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% We compute the barycenter using FGW. Structure matrices are computed using the shortest_path distance in the graph\n# Features distances are the euclidean distances\nCs = [shortest_path(nx.adjacency_matrix(x)) for x in X0]\nps = [np.ones(len(x.nodes())) / len(x.nodes()) for x in X0]\nYs = [np.array([v for (k, v) in nx.get_node_attributes(x, 'attr_name').items()]).reshape(-1, 1) for x in X0]\nlambdas = np.array([np.ones(len(Ys)) / len(Ys)]).ravel()\nsizebary = 15 # we choose a barycenter with 15 nodes\n\nA, C, log = fgw_barycenters(sizebary, Ys, Cs, ps, lambdas, alpha=0.95, log=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot Barycenter\n-------------------------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% Create the barycenter\nbary = nx.from_numpy_matrix(sp_to_adjency(C, threshinf=0, threshsup=find_thresh(C, sup=100, step=100)[0]))\nfor i, v in enumerate(A.ravel()):\n bary.add_node(i, attr_name=v)\n\n#%%\npos = nx.kamada_kawai_layout(bary)\nnx.draw(bary, pos=pos, node_color=graph_colors(bary, vmin=-1, vmax=1), with_labels=False)\nplt.suptitle('Barycenter', fontsize=20)\nplt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/docs/source/auto_examples/plot_barycenter_fgw.py b/docs/source/auto_examples/plot_barycenter_fgw.py new file mode 100644 index 0000000..77b0370 --- /dev/null +++ b/docs/source/auto_examples/plot_barycenter_fgw.py @@ -0,0 +1,184 @@ +# -*- coding: utf-8 -*- +""" +================================= +Plot graphs' barycenter using FGW +================================= + +This example illustrates the computation barycenter of labeled graphs using FGW + +Requires networkx >=2 + +.. [18] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain + and Courty Nicolas + "Optimal Transport for structured data with application on graphs" + International Conference on Machine Learning (ICML). 2019. + +""" + +# Author: Titouan Vayer +# +# License: MIT License + +#%% load libraries +import numpy as np +import matplotlib.pyplot as plt +import networkx as nx +import math +from scipy.sparse.csgraph import shortest_path +import matplotlib.colors as mcol +from matplotlib import cm +from ot.gromov import fgw_barycenters +#%% Graph functions + + +def find_thresh(C, inf=0.5, sup=3, step=10): + """ Trick to find the adequate thresholds from where value of the C matrix are considered close enough to say that nodes are connected + Tthe threshold is found by a linesearch between values "inf" and "sup" with "step" thresholds tested. + The optimal threshold is the one which minimizes the reconstruction error between the shortest_path matrix coming from the thresholded adjency matrix + and the original matrix. + Parameters + ---------- + C : ndarray, shape (n_nodes,n_nodes) + The structure matrix to threshold + inf : float + The beginning of the linesearch + sup : float + The end of the linesearch + step : integer + Number of thresholds tested + """ + dist = [] + search = np.linspace(inf, sup, step) + for thresh in search: + Cprime = sp_to_adjency(C, 0, thresh) + SC = shortest_path(Cprime, method='D') + SC[SC == float('inf')] = 100 + dist.append(np.linalg.norm(SC - C)) + return search[np.argmin(dist)], dist + + +def sp_to_adjency(C, threshinf=0.2, threshsup=1.8): + """ Thresholds the structure matrix in order to compute an adjency matrix. + All values between threshinf and threshsup are considered representing connected nodes and set to 1. Else are set to 0 + Parameters + ---------- + C : ndarray, shape (n_nodes,n_nodes) + The structure matrix to threshold + threshinf : float + The minimum value of distance from which the new value is set to 1 + threshsup : float + The maximum value of distance from which the new value is set to 1 + Returns + ------- + C : ndarray, shape (n_nodes,n_nodes) + The threshold matrix. Each element is in {0,1} + """ + H = np.zeros_like(C) + np.fill_diagonal(H, np.diagonal(C)) + C = C - H + C = np.minimum(np.maximum(C, threshinf), threshsup) + C[C == threshsup] = 0 + C[C != 0] = 1 + + return C + + +def build_noisy_circular_graph(N=20, mu=0, sigma=0.3, with_noise=False, structure_noise=False, p=None): + """ Create a noisy circular graph + """ + g = nx.Graph() + g.add_nodes_from(list(range(N))) + for i in range(N): + noise = float(np.random.normal(mu, sigma, 1)) + if with_noise: + g.add_node(i, attr_name=math.sin((2 * i * math.pi / N)) + noise) + else: + g.add_node(i, attr_name=math.sin(2 * i * math.pi / N)) + g.add_edge(i, i + 1) + if structure_noise: + randomint = np.random.randint(0, p) + if randomint == 0: + if i <= N - 3: + g.add_edge(i, i + 2) + if i == N - 2: + g.add_edge(i, 0) + if i == N - 1: + g.add_edge(i, 1) + g.add_edge(N, 0) + noise = float(np.random.normal(mu, sigma, 1)) + if with_noise: + g.add_node(N, attr_name=math.sin((2 * N * math.pi / N)) + noise) + else: + g.add_node(N, attr_name=math.sin(2 * N * math.pi / N)) + return g + + +def graph_colors(nx_graph, vmin=0, vmax=7): + cnorm = mcol.Normalize(vmin=vmin, vmax=vmax) + cpick = cm.ScalarMappable(norm=cnorm, cmap='viridis') + cpick.set_array([]) + val_map = {} + for k, v in nx.get_node_attributes(nx_graph, 'attr_name').items(): + val_map[k] = cpick.to_rgba(v) + colors = [] + for node in nx_graph.nodes(): + colors.append(val_map[node]) + return colors + +############################################################################## +# Generate data +# ------------- + +#%% circular dataset +# We build a dataset of noisy circular graphs. +# Noise is added on the structures by random connections and on the features by gaussian noise. + + +np.random.seed(30) +X0 = [] +for k in range(9): + X0.append(build_noisy_circular_graph(np.random.randint(15, 25), with_noise=True, structure_noise=True, p=3)) + +############################################################################## +# Plot data +# --------- + +#%% Plot graphs + +plt.figure(figsize=(8, 10)) +for i in range(len(X0)): + plt.subplot(3, 3, i + 1) + g = X0[i] + pos = nx.kamada_kawai_layout(g) + nx.draw(g, pos=pos, node_color=graph_colors(g, vmin=-1, vmax=1), with_labels=False, node_size=100) +plt.suptitle('Dataset of noisy graphs. Color indicates the label', fontsize=20) +plt.show() + +############################################################################## +# Barycenter computation +# ---------------------- + +#%% We compute the barycenter using FGW. Structure matrices are computed using the shortest_path distance in the graph +# Features distances are the euclidean distances +Cs = [shortest_path(nx.adjacency_matrix(x)) for x in X0] +ps = [np.ones(len(x.nodes())) / len(x.nodes()) for x in X0] +Ys = [np.array([v for (k, v) in nx.get_node_attributes(x, 'attr_name').items()]).reshape(-1, 1) for x in X0] +lambdas = np.array([np.ones(len(Ys)) / len(Ys)]).ravel() +sizebary = 15 # we choose a barycenter with 15 nodes + +A, C, log = fgw_barycenters(sizebary, Ys, Cs, ps, lambdas, alpha=0.95, log=True) + +############################################################################## +# Plot Barycenter +# ------------------------- + +#%% Create the barycenter +bary = nx.from_numpy_matrix(sp_to_adjency(C, threshinf=0, threshsup=find_thresh(C, sup=100, step=100)[0])) +for i, v in enumerate(A.ravel()): + bary.add_node(i, attr_name=v) + +#%% +pos = nx.kamada_kawai_layout(bary) +nx.draw(bary, pos=pos, node_color=graph_colors(bary, vmin=-1, vmax=1), with_labels=False) +plt.suptitle('Barycenter', fontsize=20) +plt.show() diff --git a/docs/source/auto_examples/plot_barycenter_fgw.rst b/docs/source/auto_examples/plot_barycenter_fgw.rst new file mode 100644 index 0000000..2c44a65 --- /dev/null +++ b/docs/source/auto_examples/plot_barycenter_fgw.rst @@ -0,0 +1,268 @@ + + +.. _sphx_glr_auto_examples_plot_barycenter_fgw.py: + + +================================= +Plot graphs' barycenter using FGW +================================= + +This example illustrates the computation barycenter of labeled graphs using FGW + +Requires networkx >=2 + +.. [18] Vayer Titouan, Chapel Laetitia, Flamary R{'e}mi, Tavenard Romain + and Courty Nicolas + "Optimal Transport for structured data with application on graphs" + International Conference on Machine Learning (ICML). 2019. + + + + +.. code-block:: python + + + # Author: Titouan Vayer + # + # License: MIT License + + #%% load libraries + import numpy as np + import matplotlib.pyplot as plt + import networkx as nx + import math + from scipy.sparse.csgraph import shortest_path + import matplotlib.colors as mcol + from matplotlib import cm + from ot.gromov import fgw_barycenters + #%% Graph functions + + + def find_thresh(C, inf=0.5, sup=3, step=10): + """ Trick to find the adequate thresholds from where value of the C matrix are considered close enough to say that nodes are connected + Tthe threshold is found by a linesearch between values "inf" and "sup" with "step" thresholds tested. + The optimal threshold is the one which minimizes the reconstruction error between the shortest_path matrix coming from the thresholded adjency matrix + and the original matrix. + Parameters + ---------- + C : ndarray, shape (n_nodes,n_nodes) + The structure matrix to threshold + inf : float + The beginning of the linesearch + sup : float + The end of the linesearch + step : integer + Number of thresholds tested + """ + dist = [] + search = np.linspace(inf, sup, step) + for thresh in search: + Cprime = sp_to_adjency(C, 0, thresh) + SC = shortest_path(Cprime, method='D') + SC[SC == float('inf')] = 100 + dist.append(np.linalg.norm(SC - C)) + return search[np.argmin(dist)], dist + + + def sp_to_adjency(C, threshinf=0.2, threshsup=1.8): + """ Thresholds the structure matrix in order to compute an adjency matrix. + All values between threshinf and threshsup are considered representing connected nodes and set to 1. Else are set to 0 + Parameters + ---------- + C : ndarray, shape (n_nodes,n_nodes) + The structure matrix to threshold + threshinf : float + The minimum value of distance from which the new value is set to 1 + threshsup : float + The maximum value of distance from which the new value is set to 1 + Returns + ------- + C : ndarray, shape (n_nodes,n_nodes) + The threshold matrix. Each element is in {0,1} + """ + H = np.zeros_like(C) + np.fill_diagonal(H, np.diagonal(C)) + C = C - H + C = np.minimum(np.maximum(C, threshinf), threshsup) + C[C == threshsup] = 0 + C[C != 0] = 1 + + return C + + + def build_noisy_circular_graph(N=20, mu=0, sigma=0.3, with_noise=False, structure_noise=False, p=None): + """ Create a noisy circular graph + """ + g = nx.Graph() + g.add_nodes_from(list(range(N))) + for i in range(N): + noise = float(np.random.normal(mu, sigma, 1)) + if with_noise: + g.add_node(i, attr_name=math.sin((2 * i * math.pi / N)) + noise) + else: + g.add_node(i, attr_name=math.sin(2 * i * math.pi / N)) + g.add_edge(i, i + 1) + if structure_noise: + randomint = np.random.randint(0, p) + if randomint == 0: + if i <= N - 3: + g.add_edge(i, i + 2) + if i == N - 2: + g.add_edge(i, 0) + if i == N - 1: + g.add_edge(i, 1) + g.add_edge(N, 0) + noise = float(np.random.normal(mu, sigma, 1)) + if with_noise: + g.add_node(N, attr_name=math.sin((2 * N * math.pi / N)) + noise) + else: + g.add_node(N, attr_name=math.sin(2 * N * math.pi / N)) + return g + + + def graph_colors(nx_graph, vmin=0, vmax=7): + cnorm = mcol.Normalize(vmin=vmin, vmax=vmax) + cpick = cm.ScalarMappable(norm=cnorm, cmap='viridis') + cpick.set_array([]) + val_map = {} + for k, v in nx.get_node_attributes(nx_graph, 'attr_name').items(): + val_map[k] = cpick.to_rgba(v) + colors = [] + for node in nx_graph.nodes(): + colors.append(val_map[node]) + return colors + + + + + + + +Generate data +------------- + + + +.. code-block:: python + + + #%% circular dataset + # We build a dataset of noisy circular graphs. + # Noise is added on the structures by random connections and on the features by gaussian noise. + + + np.random.seed(30) + X0 = [] + for k in range(9): + X0.append(build_noisy_circular_graph(np.random.randint(15, 25), with_noise=True, structure_noise=True, p=3)) + + + + + + + +Plot data +--------- + + + +.. code-block:: python + + + #%% Plot graphs + + plt.figure(figsize=(8, 10)) + for i in range(len(X0)): + plt.subplot(3, 3, i + 1) + g = X0[i] + pos = nx.kamada_kawai_layout(g) + nx.draw(g, pos=pos, node_color=graph_colors(g, vmin=-1, vmax=1), with_labels=False, node_size=100) + plt.suptitle('Dataset of noisy graphs. Color indicates the label', fontsize=20) + plt.show() + + + + +.. image:: /auto_examples/images/sphx_glr_plot_barycenter_fgw_001.png + :align: center + + + + +Barycenter computation +---------------------- + + + +.. code-block:: python + + + #%% We compute the barycenter using FGW. Structure matrices are computed using the shortest_path distance in the graph + # Features distances are the euclidean distances + Cs = [shortest_path(nx.adjacency_matrix(x)) for x in X0] + ps = [np.ones(len(x.nodes())) / len(x.nodes()) for x in X0] + Ys = [np.array([v for (k, v) in nx.get_node_attributes(x, 'attr_name').items()]).reshape(-1, 1) for x in X0] + lambdas = np.array([np.ones(len(Ys)) / len(Ys)]).ravel() + sizebary = 15 # we choose a barycenter with 15 nodes + + A, C, log = fgw_barycenters(sizebary, Ys, Cs, ps, lambdas, alpha=0.95, log=True) + + + + + + + +Plot Barycenter +------------------------- + + + +.. code-block:: python + + + #%% Create the barycenter + bary = nx.from_numpy_matrix(sp_to_adjency(C, threshinf=0, threshsup=find_thresh(C, sup=100, step=100)[0])) + for i, v in enumerate(A.ravel()): + bary.add_node(i, attr_name=v) + + #%% + pos = nx.kamada_kawai_layout(bary) + nx.draw(bary, pos=pos, node_color=graph_colors(bary, vmin=-1, vmax=1), with_labels=False) + plt.suptitle('Barycenter', fontsize=20) + plt.show() + + + +.. image:: /auto_examples/images/sphx_glr_plot_barycenter_fgw_002.png + :align: center + + + + +**Total running time of the script:** ( 0 minutes 2.065 seconds) + + + +.. only :: html + + .. container:: sphx-glr-footer + + + .. container:: sphx-glr-download + + :download:`Download Python source code: plot_barycenter_fgw.py ` + + + + .. container:: sphx-glr-download + + :download:`Download Jupyter notebook: plot_barycenter_fgw.ipynb ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/auto_examples/plot_fgw.ipynb b/docs/source/auto_examples/plot_fgw.ipynb new file mode 100644 index 0000000..1b150bd --- /dev/null +++ b/docs/source/auto_examples/plot_fgw.ipynb @@ -0,0 +1,162 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# Plot Fused-gromov-Wasserstein\n\n\nThis example illustrates the computation of FGW for 1D measures[18].\n\n.. [18] Vayer Titouan, Chapel Laetitia, Flamary R{'e}mi, Tavenard Romain\n and Courty Nicolas\n \"Optimal Transport for structured data with application on graphs\"\n International Conference on Machine Learning (ICML). 2019.\n\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Author: Titouan Vayer \n#\n# License: MIT License\n\nimport matplotlib.pyplot as pl\nimport numpy as np\nimport ot\nfrom ot.gromov import gromov_wasserstein, fused_gromov_wasserstein" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Generate data\n---------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% parameters\n# We create two 1D random measures\nn = 20 # number of points in the first distribution\nn2 = 30 # number of points in the second distribution\nsig = 1 # std of first distribution\nsig2 = 0.1 # std of second distribution\n\nnp.random.seed(0)\n\nphi = np.arange(n)[:, None]\nxs = phi + sig * np.random.randn(n, 1)\nys = np.vstack((np.ones((n // 2, 1)), 0 * np.ones((n // 2, 1)))) + sig2 * np.random.randn(n, 1)\n\nphi2 = np.arange(n2)[:, None]\nxt = phi2 + sig * np.random.randn(n2, 1)\nyt = np.vstack((np.ones((n2 // 2, 1)), 0 * np.ones((n2 // 2, 1)))) + sig2 * np.random.randn(n2, 1)\nyt = yt[::-1, :]\n\np = ot.unif(n)\nq = ot.unif(n2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot data\n---------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% plot the distributions\n\npl.close(10)\npl.figure(10, (7, 7))\n\npl.subplot(2, 1, 1)\n\npl.scatter(ys, xs, c=phi, s=70)\npl.ylabel('Feature value a', fontsize=20)\npl.title('$\\mu=\\sum_i \\delta_{x_i,a_i}$', fontsize=25, usetex=True, y=1)\npl.xticks(())\npl.yticks(())\npl.subplot(2, 1, 2)\npl.scatter(yt, xt, c=phi2, s=70)\npl.xlabel('coordinates x/y', fontsize=25)\npl.ylabel('Feature value b', fontsize=20)\npl.title('$\\\\nu=\\sum_j \\delta_{y_j,b_j}$', fontsize=25, usetex=True, y=1)\npl.yticks(())\npl.tight_layout()\npl.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create structure matrices and across-feature distance matrix\n---------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% Structure matrices and across-features distance matrix\nC1 = ot.dist(xs)\nC2 = ot.dist(xt)\nM = ot.dist(ys, yt)\nw1 = ot.unif(C1.shape[0])\nw2 = ot.unif(C2.shape[0])\nGot = ot.emd([], [], M)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot matrices\n---------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%%\ncmap = 'Reds'\npl.close(10)\npl.figure(10, (5, 5))\nfs = 15\nl_x = [0, 5, 10, 15]\nl_y = [0, 5, 10, 15, 20, 25]\ngs = pl.GridSpec(5, 5)\n\nax1 = pl.subplot(gs[3:, :2])\n\npl.imshow(C1, cmap=cmap, interpolation='nearest')\npl.title(\"$C_1$\", fontsize=fs)\npl.xlabel(\"$k$\", fontsize=fs)\npl.ylabel(\"$i$\", fontsize=fs)\npl.xticks(l_x)\npl.yticks(l_x)\n\nax2 = pl.subplot(gs[:3, 2:])\n\npl.imshow(C2, cmap=cmap, interpolation='nearest')\npl.title(\"$C_2$\", fontsize=fs)\npl.ylabel(\"$l$\", fontsize=fs)\n#pl.ylabel(\"$l$\",fontsize=fs)\npl.xticks(())\npl.yticks(l_y)\nax2.set_aspect('auto')\n\nax3 = pl.subplot(gs[3:, 2:], sharex=ax2, sharey=ax1)\npl.imshow(M, cmap=cmap, interpolation='nearest')\npl.yticks(l_x)\npl.xticks(l_y)\npl.ylabel(\"$i$\", fontsize=fs)\npl.title(\"$M_{AB}$\", fontsize=fs)\npl.xlabel(\"$j$\", fontsize=fs)\npl.tight_layout()\nax3.set_aspect('auto')\npl.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Compute FGW/GW\n---------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% Computing FGW and GW\nalpha = 1e-3\n\not.tic()\nGwg, logw = fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=alpha, verbose=True, log=True)\not.toc()\n\n#%reload_ext WGW\nGg, log = gromov_wasserstein(C1, C2, p, q, loss_fun='square_loss', verbose=True, log=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Visualize transport matrices\n---------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% visu OT matrix\ncmap = 'Blues'\nfs = 15\npl.figure(2, (13, 5))\npl.clf()\npl.subplot(1, 3, 1)\npl.imshow(Got, cmap=cmap, interpolation='nearest')\n#pl.xlabel(\"$y$\",fontsize=fs)\npl.ylabel(\"$i$\", fontsize=fs)\npl.xticks(())\n\npl.title('Wasserstein ($M$ only)')\n\npl.subplot(1, 3, 2)\npl.imshow(Gg, cmap=cmap, interpolation='nearest')\npl.title('Gromov ($C_1,C_2$ only)')\npl.xticks(())\npl.subplot(1, 3, 3)\npl.imshow(Gwg, cmap=cmap, interpolation='nearest')\npl.title('FGW ($M+C_1,C_2$)')\n\npl.xlabel(\"$j$\", fontsize=fs)\npl.ylabel(\"$i$\", fontsize=fs)\n\npl.tight_layout()\npl.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/docs/source/auto_examples/plot_fgw.py b/docs/source/auto_examples/plot_fgw.py new file mode 100644 index 0000000..43efc94 --- /dev/null +++ b/docs/source/auto_examples/plot_fgw.py @@ -0,0 +1,173 @@ +# -*- coding: utf-8 -*- +""" +============================== +Plot Fused-gromov-Wasserstein +============================== + +This example illustrates the computation of FGW for 1D measures[18]. + +.. [18] Vayer Titouan, Chapel Laetitia, Flamary R{\'e}mi, Tavenard Romain + and Courty Nicolas + "Optimal Transport for structured data with application on graphs" + International Conference on Machine Learning (ICML). 2019. + +""" + +# Author: Titouan Vayer +# +# License: MIT License + +import matplotlib.pyplot as pl +import numpy as np +import ot +from ot.gromov import gromov_wasserstein, fused_gromov_wasserstein + +############################################################################## +# Generate data +# --------- + +#%% parameters +# We create two 1D random measures +n = 20 # number of points in the first distribution +n2 = 30 # number of points in the second distribution +sig = 1 # std of first distribution +sig2 = 0.1 # std of second distribution + +np.random.seed(0) + +phi = np.arange(n)[:, None] +xs = phi + sig * np.random.randn(n, 1) +ys = np.vstack((np.ones((n // 2, 1)), 0 * np.ones((n // 2, 1)))) + sig2 * np.random.randn(n, 1) + +phi2 = np.arange(n2)[:, None] +xt = phi2 + sig * np.random.randn(n2, 1) +yt = np.vstack((np.ones((n2 // 2, 1)), 0 * np.ones((n2 // 2, 1)))) + sig2 * np.random.randn(n2, 1) +yt = yt[::-1, :] + +p = ot.unif(n) +q = ot.unif(n2) + +############################################################################## +# Plot data +# --------- + +#%% plot the distributions + +pl.close(10) +pl.figure(10, (7, 7)) + +pl.subplot(2, 1, 1) + +pl.scatter(ys, xs, c=phi, s=70) +pl.ylabel('Feature value a', fontsize=20) +pl.title('$\mu=\sum_i \delta_{x_i,a_i}$', fontsize=25, usetex=True, y=1) +pl.xticks(()) +pl.yticks(()) +pl.subplot(2, 1, 2) +pl.scatter(yt, xt, c=phi2, s=70) +pl.xlabel('coordinates x/y', fontsize=25) +pl.ylabel('Feature value b', fontsize=20) +pl.title('$\\nu=\sum_j \delta_{y_j,b_j}$', fontsize=25, usetex=True, y=1) +pl.yticks(()) +pl.tight_layout() +pl.show() + +############################################################################## +# Create structure matrices and across-feature distance matrix +# --------- + +#%% Structure matrices and across-features distance matrix +C1 = ot.dist(xs) +C2 = ot.dist(xt) +M = ot.dist(ys, yt) +w1 = ot.unif(C1.shape[0]) +w2 = ot.unif(C2.shape[0]) +Got = ot.emd([], [], M) + +############################################################################## +# Plot matrices +# --------- + +#%% +cmap = 'Reds' +pl.close(10) +pl.figure(10, (5, 5)) +fs = 15 +l_x = [0, 5, 10, 15] +l_y = [0, 5, 10, 15, 20, 25] +gs = pl.GridSpec(5, 5) + +ax1 = pl.subplot(gs[3:, :2]) + +pl.imshow(C1, cmap=cmap, interpolation='nearest') +pl.title("$C_1$", fontsize=fs) +pl.xlabel("$k$", fontsize=fs) +pl.ylabel("$i$", fontsize=fs) +pl.xticks(l_x) +pl.yticks(l_x) + +ax2 = pl.subplot(gs[:3, 2:]) + +pl.imshow(C2, cmap=cmap, interpolation='nearest') +pl.title("$C_2$", fontsize=fs) +pl.ylabel("$l$", fontsize=fs) +#pl.ylabel("$l$",fontsize=fs) +pl.xticks(()) +pl.yticks(l_y) +ax2.set_aspect('auto') + +ax3 = pl.subplot(gs[3:, 2:], sharex=ax2, sharey=ax1) +pl.imshow(M, cmap=cmap, interpolation='nearest') +pl.yticks(l_x) +pl.xticks(l_y) +pl.ylabel("$i$", fontsize=fs) +pl.title("$M_{AB}$", fontsize=fs) +pl.xlabel("$j$", fontsize=fs) +pl.tight_layout() +ax3.set_aspect('auto') +pl.show() + +############################################################################## +# Compute FGW/GW +# --------- + +#%% Computing FGW and GW +alpha = 1e-3 + +ot.tic() +Gwg, logw = fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=alpha, verbose=True, log=True) +ot.toc() + +#%reload_ext WGW +Gg, log = gromov_wasserstein(C1, C2, p, q, loss_fun='square_loss', verbose=True, log=True) + +############################################################################## +# Visualize transport matrices +# --------- + +#%% visu OT matrix +cmap = 'Blues' +fs = 15 +pl.figure(2, (13, 5)) +pl.clf() +pl.subplot(1, 3, 1) +pl.imshow(Got, cmap=cmap, interpolation='nearest') +#pl.xlabel("$y$",fontsize=fs) +pl.ylabel("$i$", fontsize=fs) +pl.xticks(()) + +pl.title('Wasserstein ($M$ only)') + +pl.subplot(1, 3, 2) +pl.imshow(Gg, cmap=cmap, interpolation='nearest') +pl.title('Gromov ($C_1,C_2$ only)') +pl.xticks(()) +pl.subplot(1, 3, 3) +pl.imshow(Gwg, cmap=cmap, interpolation='nearest') +pl.title('FGW ($M+C_1,C_2$)') + +pl.xlabel("$j$", fontsize=fs) +pl.ylabel("$i$", fontsize=fs) + +pl.tight_layout() +pl.show() diff --git a/docs/source/auto_examples/plot_fgw.rst b/docs/source/auto_examples/plot_fgw.rst new file mode 100644 index 0000000..aec725d --- /dev/null +++ b/docs/source/auto_examples/plot_fgw.rst @@ -0,0 +1,297 @@ + + +.. _sphx_glr_auto_examples_plot_fgw.py: + + +============================== +Plot Fused-gromov-Wasserstein +============================== + +This example illustrates the computation of FGW for 1D measures[18]. + +.. [18] Vayer Titouan, Chapel Laetitia, Flamary R{'e}mi, Tavenard Romain + and Courty Nicolas + "Optimal Transport for structured data with application on graphs" + International Conference on Machine Learning (ICML). 2019. + + + + +.. code-block:: python + + + # Author: Titouan Vayer + # + # License: MIT License + + import matplotlib.pyplot as pl + import numpy as np + import ot + from ot.gromov import gromov_wasserstein, fused_gromov_wasserstein + + + + + + + +Generate data +--------- + + + +.. code-block:: python + + + #%% parameters + # We create two 1D random measures + n = 20 # number of points in the first distribution + n2 = 30 # number of points in the second distribution + sig = 1 # std of first distribution + sig2 = 0.1 # std of second distribution + + np.random.seed(0) + + phi = np.arange(n)[:, None] + xs = phi + sig * np.random.randn(n, 1) + ys = np.vstack((np.ones((n // 2, 1)), 0 * np.ones((n // 2, 1)))) + sig2 * np.random.randn(n, 1) + + phi2 = np.arange(n2)[:, None] + xt = phi2 + sig * np.random.randn(n2, 1) + yt = np.vstack((np.ones((n2 // 2, 1)), 0 * np.ones((n2 // 2, 1)))) + sig2 * np.random.randn(n2, 1) + yt = yt[::-1, :] + + p = ot.unif(n) + q = ot.unif(n2) + + + + + + + +Plot data +--------- + + + +.. code-block:: python + + + #%% plot the distributions + + pl.close(10) + pl.figure(10, (7, 7)) + + pl.subplot(2, 1, 1) + + pl.scatter(ys, xs, c=phi, s=70) + pl.ylabel('Feature value a', fontsize=20) + pl.title('$\mu=\sum_i \delta_{x_i,a_i}$', fontsize=25, usetex=True, y=1) + pl.xticks(()) + pl.yticks(()) + pl.subplot(2, 1, 2) + pl.scatter(yt, xt, c=phi2, s=70) + pl.xlabel('coordinates x/y', fontsize=25) + pl.ylabel('Feature value b', fontsize=20) + pl.title('$\\nu=\sum_j \delta_{y_j,b_j}$', fontsize=25, usetex=True, y=1) + pl.yticks(()) + pl.tight_layout() + pl.show() + + + + +.. image:: /auto_examples/images/sphx_glr_plot_fgw_010.png + :align: center + + + + +Create structure matrices and across-feature distance matrix +--------- + + + +.. code-block:: python + + + #%% Structure matrices and across-features distance matrix + C1 = ot.dist(xs) + C2 = ot.dist(xt) + M = ot.dist(ys, yt) + w1 = ot.unif(C1.shape[0]) + w2 = ot.unif(C2.shape[0]) + Got = ot.emd([], [], M) + + + + + + + +Plot matrices +--------- + + + +.. code-block:: python + + + #%% + cmap = 'Reds' + pl.close(10) + pl.figure(10, (5, 5)) + fs = 15 + l_x = [0, 5, 10, 15] + l_y = [0, 5, 10, 15, 20, 25] + gs = pl.GridSpec(5, 5) + + ax1 = pl.subplot(gs[3:, :2]) + + pl.imshow(C1, cmap=cmap, interpolation='nearest') + pl.title("$C_1$", fontsize=fs) + pl.xlabel("$k$", fontsize=fs) + pl.ylabel("$i$", fontsize=fs) + pl.xticks(l_x) + pl.yticks(l_x) + + ax2 = pl.subplot(gs[:3, 2:]) + + pl.imshow(C2, cmap=cmap, interpolation='nearest') + pl.title("$C_2$", fontsize=fs) + pl.ylabel("$l$", fontsize=fs) + #pl.ylabel("$l$",fontsize=fs) + pl.xticks(()) + pl.yticks(l_y) + ax2.set_aspect('auto') + + ax3 = pl.subplot(gs[3:, 2:], sharex=ax2, sharey=ax1) + pl.imshow(M, cmap=cmap, interpolation='nearest') + pl.yticks(l_x) + pl.xticks(l_y) + pl.ylabel("$i$", fontsize=fs) + pl.title("$M_{AB}$", fontsize=fs) + pl.xlabel("$j$", fontsize=fs) + pl.tight_layout() + ax3.set_aspect('auto') + pl.show() + + + + +.. image:: /auto_examples/images/sphx_glr_plot_fgw_011.png + :align: center + + + + +Compute FGW/GW +--------- + + + +.. code-block:: python + + + #%% Computing FGW and GW + alpha = 1e-3 + + ot.tic() + Gwg, logw = fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=alpha, verbose=True, log=True) + ot.toc() + + #%reload_ext WGW + Gg, log = gromov_wasserstein(C1, C2, p, q, loss_fun='square_loss', verbose=True, log=True) + + + + + +.. rst-class:: sphx-glr-script-out + + Out:: + + It. |Loss |Relative loss|Absolute loss + ------------------------------------------------ + 0|4.734462e+01|0.000000e+00|0.000000e+00 + 1|2.508258e+01|8.875498e-01|2.226204e+01 + 2|2.189329e+01|1.456747e-01|3.189297e+00 + 3|2.189329e+01|0.000000e+00|0.000000e+00 + Elapsed time : 0.0016989707946777344 s + It. |Loss |Relative loss|Absolute loss + ------------------------------------------------ + 0|4.683978e+04|0.000000e+00|0.000000e+00 + 1|3.860061e+04|2.134468e-01|8.239175e+03 + 2|2.182948e+04|7.682787e-01|1.677113e+04 + 3|2.182948e+04|0.000000e+00|0.000000e+00 + + +Visualize transport matrices +--------- + + + +.. code-block:: python + + + #%% visu OT matrix + cmap = 'Blues' + fs = 15 + pl.figure(2, (13, 5)) + pl.clf() + pl.subplot(1, 3, 1) + pl.imshow(Got, cmap=cmap, interpolation='nearest') + #pl.xlabel("$y$",fontsize=fs) + pl.ylabel("$i$", fontsize=fs) + pl.xticks(()) + + pl.title('Wasserstein ($M$ only)') + + pl.subplot(1, 3, 2) + pl.imshow(Gg, cmap=cmap, interpolation='nearest') + pl.title('Gromov ($C_1,C_2$ only)') + pl.xticks(()) + pl.subplot(1, 3, 3) + pl.imshow(Gwg, cmap=cmap, interpolation='nearest') + pl.title('FGW ($M+C_1,C_2$)') + + pl.xlabel("$j$", fontsize=fs) + pl.ylabel("$i$", fontsize=fs) + + pl.tight_layout() + pl.show() + + + +.. image:: /auto_examples/images/sphx_glr_plot_fgw_004.png + :align: center + + + + +**Total running time of the script:** ( 0 minutes 1.468 seconds) + + + +.. only :: html + + .. container:: sphx-glr-footer + + + .. container:: sphx-glr-download + + :download:`Download Python source code: plot_fgw.py ` + + + + .. container:: sphx-glr-download + + :download:`Download Jupyter notebook: plot_fgw.ipynb ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ -- cgit v1.2.3 From 830d4ebd2e2c85b4f3503f358bb31a07918a27c5 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 25 Jun 2019 14:27:19 +0200 Subject: update fgw example + add notebook --- examples/plot_barycenter_fgw.py | 2 +- notebooks/plot_OT_2D_samples.ipynb | 91 ++++++++- notebooks/plot_barycenter_fgw.ipynb | 312 +++++++++++++++++++++++++++++++ notebooks/plot_fgw.ipynb | 359 ++++++++++++++++++++++++++++++++++++ 4 files changed, 756 insertions(+), 8 deletions(-) create mode 100644 notebooks/plot_barycenter_fgw.ipynb create mode 100644 notebooks/plot_fgw.ipynb diff --git a/examples/plot_barycenter_fgw.py b/examples/plot_barycenter_fgw.py index e4be447..77b0370 100644 --- a/examples/plot_barycenter_fgw.py +++ b/examples/plot_barycenter_fgw.py @@ -166,7 +166,7 @@ Ys = [np.array([v for (k, v) in nx.get_node_attributes(x, 'attr_name').items()]) lambdas = np.array([np.ones(len(Ys)) / len(Ys)]).ravel() sizebary = 15 # we choose a barycenter with 15 nodes -A, C, log = fgw_barycenters(sizebary, Ys, Cs, ps, lambdas, alpha=0.95) +A, C, log = fgw_barycenters(sizebary, Ys, Cs, ps, lambdas, alpha=0.95, log=True) ############################################################################## # Plot Barycenter diff --git a/notebooks/plot_OT_2D_samples.ipynb b/notebooks/plot_OT_2D_samples.ipynb index 96e84a5..cd1b541 100644 --- a/notebooks/plot_OT_2D_samples.ipynb +++ b/notebooks/plot_OT_2D_samples.ipynb @@ -34,6 +34,7 @@ "outputs": [], "source": [ "# Author: Remi Flamary \n", + "# Kilian Fatras \n", "#\n", "# License: MIT License\n", "\n", @@ -108,7 +109,7 @@ }, { "data": { - "image/png": "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EP74xz8CQYt71KhRTJw4kb59+3LNNdfwyCOPMGLECCoqKlizJpirevLkyUydOpVhw4ZxzDHH8NxzzzXZ7tatW7ngggsYMWIEgwcP5plnngFgxYoVjBgxgurqaiorK/nLX/4SyvEvuHhN/bHHYMaMvWWZVMld9XiJOnfP+2Po0KGebOXKlU1eywS06WNNbN682auqqrxfv35+ySWX+CuvvOLu7tu3b/devXr5qlWr3N190qRJ/uMf/9jd3Y844givq6tzd/dFixb5qFGj3N19+vTpPmTIEN+2bZu7u//85z/3b37zm75r1y53d9+wYYPv3LnTR44c6X//+9/d3X327Nl+/vnnN4lr0KBBXltb6+7u//jHP9zdfevWrb59+3Z3d1+9erXHj+eCBQu8W7du/re//c137Njhhx12mN9www3u7v6Tn/zEL7vsMnd3P++883zs2LG+Z88eX716tffs2dO3b9/uCxYs8NNOO83d3a+99lp/6KGHGrbbr18/37Jli1966aX+8MMPu7v7559/3rCPidr6uyyomTPd589v/Nr8+cHrqcyf7969u/u0acG/yZ8VyQFgsWeQY0NpsZvZgWY2x8zeNbN3zGxkGOtNp6YGzIJHsP3gkU1ZpmvXrixZsoRf/vKX9OjRg29961s88MADrFq1iiOPPJJjjjkGgPPOO49XX321xfV9/etfp3PnzgC8/PLLXHzxxXToEFyrPuigg1i1ahXLly/nlFNOobq6mptuuona2qbTkp5wwglMnjyZe++9lz179gDBzVwXXXQRFRUVnHnmmaxcubLh/cOHD+fQQw9l33335aijjuKf/zmYS7qiooJ169Y1vO+ss86iXbt29OvXj759+/Luu+822u68efP40Y9+RHV1NaNHj2bHjh389a9/ZeTIkdxyyy3MnDmT999/v2Efi97VVzetqY8ZE7yeiurxEmFh9Yr5KfCiu59hZh2B/UJab0o1NXuTuBmENVdI+/btGT16NKNHj6aiooIHH3yQwYMHp31/hw4dqK8PJlhP7rvdpUuXZrfl7gwcOJDXX3+92ffdfffdLFy4kLlz5zJ06FCWLFnCXXfdxSGHHMJbb71FfX09nTp1anh/vJQE0K5du4bn7dq1a1TvT+6WmPzc3XniiSfo379/o9ePPfZYjjvuOObOncupp57KPffcw4knntjsPpSk5Hr8mDFK7hIZWbfYzawb8FWCWe1x953uvinb9ebbqlWrGtWLly1bxhFHHEH//v1Zt24d7733HgAPPfQQo0aNAoIa+5IlSwB44okn0q77lFNO4Z577mlIrBs3bqR///7U1dU1JPZdu3axYsWKJp9ds2YNxx13HDNmzKBHjx6sX7+eTz/9lEMPPZR27drx0EMPNbTkW+Pxxx+nvr6eNWvWsHbt2iYJfOzYsdx111147Kz55ptvArB27Vr69u3L9773PSZOnMjbb7/d6m0XvdbU40UKIIxSzJFAHXC/mb1pZveZWZPmqplNMbPFZra4rq4uhM0Gpk8PZz1btmzhvPPOY8CAAVRWVrJy5Upqamro1KkT999/P2eeeSYVFRW0a9eOqVOnxrY9ncsuu4xhw4bRvn37tOu+8MIL6d27N5WVlVRVVfHoo4/SsWNH5syZww9+8AOqqqqorq5uuAia6KqrrqKiooJBgwbxpS99iaqqKr7zne/w4IMPUlVVxbvvvtvit4NUevfuzYgRIxg/fjx33313o1Y/wLRp09i1axeVlZUMHDiQadOmAfDYY48xaNAgqqurWb58Of/6r//a6m0XvUWLGvdxj/eBX7SosHGJxGQ956mZDQPeAE5w94Vm9lPgM3eflu4zw4YN8+SJNt555x2OPfbYrGKRzEyePJkJEyZwxhln5GT9+l2K5IaZLXH3YS29L4wWey1Q6+7xu3nmAENCWK9I8VEfd4mArBO7u38ErDezeJH2JGBlMx+RAnvggQdy1love+rjLhEQVq+Y7wKPxHrErAXOD2m9IsVFY85IBISS2N19GdBi3UekLCT2cZ82TUld8q7ohxQQiZxMx5wRyREldpEwqY+7RIASe8yGDRuorq6murqaL37xi/Ts2bPh+c6dO3OyzaVLl/Liiy/mZN2tsXv3bg488MBCh1Ea1MddIqA4J9q47bagl0Fi7XLBguA/T7qxPVpw8MEHs2zZMiAYnbFr165ceeWVGX9+z549zd6klMrSpUtZvnw548aNa9XnJMJS/f1puAHJs+Jssee5S9nXvvY1hg4dysCBA7nvvvuAva3c73//+1RWVvKnP/2JZ599lv79+zN06FC++93vcvrppwPBXa2TJ09uGAL3d7/7Hdu3b2fGjBk88sgjVFdXM2fOnEbb/POf/8zw4cMbhsddu3Zti7FcfvnlDBw4kLFjx7Jw4UJGjRpF3759ef755wG47777+MY3vsGoUaPo168fN910U8r9/dGPfsSIESOorKxkxowZAGzevJnx48dTVVXFoEGDmsQrIhGSyRCQYT9CGbY3h8OmTp8+3W+//faG5xs2bHD3YLjcY4891jdu3Oi7du1ywJ944omGZT179vR169Z5fX29n3HGGT5x4kR3d7/qqqv8N7/5jbu7b9y40fv16+fbt2/3e++9t2Eo3WRTp0712bNnu7v7jh07GobpbS6WefPmubv7hAkTfNy4cb5r1y5fvHhxw7C+9957rx922GG+ceNG37Jlix977LH+5ptv+q5du7xbt27u7j537ly/5JJLvL6+3vfs2eNjx4711157zWfPnu1Tp05tiG/Tpk1pj19RDtubL8nDA8+c6T5rVuPhgZsbLljKGvkctrcg8jhs6o9//GOqqqoYOXIktbW1DRNWdOzYkW984xsArFy5kv79+3PEEUdgZpxzzjkNn583bx4333wz1dXVjBkzpmEI3OZ86Utf4qabbuK2225j/fr1DWO5pIulc+fOnHLKKUAwRO/o0aPp0KFDk+F6x44dyxe+8AW6dOnC6aefzh/+8IdG2503bx4vvPACgwcPZsiQIbz33nusXr2ayspKXnzxRa655hpee+01unXrlt1BLVfJ3zY7dIArrwz+Bd3QJKEozho75G3Y1JdffplXX32VN954g86dO/PlL3+5YYjezp07NxnuNhV35+mnn+aoo45q9Hpz47pPmjSJkSNHMnfuXMaNG8evf/1rdu7cmTaWjh07Nnw22+F6r7/+er797W83iWnx4sU8//zzXHPNNYwfP57rrruuxX2XJKluYPr3f4dbb4VNm3RDk4SiOFvseexS9umnn3LQQQfRuXNnVqxYwaI0vRsGDBjAqlWrWL9+Pe7Ob3/724Zl8SFw4+JD4O6///5s3rw55frWrl3L0UcfzWWXXcaECRN4++23M46lOfPmzWPTpk1s27aNZ555hhNOOKHR8rFjx/KrX/2KrVu3AlBbW8snn3zCBx98QNeuXZk0aRJXXHEFS5cubfW2JSb52+bll2vSDglVcSb2PHYpO+2009i2bRsDBgzg+uuv57jjjkv5vv3224+f/exnnHzyyQwbNowDDzywoVwxffp0tm7dSkVFBQMHDqQmNkvIiSeeyFtvvcXgwYObXIx89NFH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\n", + "image/png": "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57XXXqNfv37ss08wwVa/fv04+OBg7u8//OEPjBw5khEjRnDWWWfxzjvvAMEQI2+++SYALS0tjB8/HoC5c+fS3NzM8ccfT3NzMzt37uT8889n+PDh1NfXc9111wGwZMkSxo0bx+jRo5k4cSKvvbbnqMt33303w4cPp6GhgY985CMArFu3jg9/+MOMGjWKUaNG8ac//QkIWtzjxo1j6tSpHHHEEVx44YXccccdjB07lhEjRvDSS8Gc79OnT2fmzJk0NTVx9NFHc//99++x3a1bt3LWWWcxduxYRo4cyX333QfAihUrGDt2LI2NjdTX1/PXv/41kv3fzt0LfgCPA4PD53OBq7MtP3r0aJcK973vuS9a1PG9RYuC93Mxe7Y7BD+zWbTIvV+/3dtKfS0drFy5skvrQTTb37x5szc0NPigQYN81qxZ/uijj7q7+7Zt27x///6+atUqd3dvbm7273//++7ufthhh3lbW5u7uz/zzDM+btw4d3efM2eOjxo1yt9++213d//JT37in/70p33Hjh3u7r5hwwZ/9913/bjjjvM33njD3d0XLFjgn//85/eo1/Dhw721tdXd3f/xj3+4u/vWrVt927Zt7u6+evVqT8SlxYsXe58+ffxvf/ubb9++3Q8++GC/5JJL3N39Bz/4gZ9zzjnu7n7mmWf6xIkTfefOnb569Wo/5JBDfNu2bb548WI/+eST3d39oosu8vnz57dvd9CgQb5lyxY/++yz/fbbb3d393feeaf9OyZL97sEWjyHmBxVr5ivAneY2XNAI8HktlLNvvnNPVvZEyYE73cmnxb4M890bNEnWvzPPNP1ugsQpF/Mggfsfl5IWma//fZjyZIl3HjjjdTV1fGZz3yGW2+9lVWrVnH44Ydz9NFHA3DmmWfy2GOPdVreJz/5SXr16gXAI488wpe//GV69Ahuv/nABz7AqlWreP755znxxBNpbGzksssuo7V1z+l9jz/+eKZPn85NN93Ezp07geBmri996UuMGDGC0047jZUrV7YvP2bMGA466CD22WcfjjzySD7+8WBO9hEjRrBu3br25U4//XS6devGoEGDOOKII3jxxRc7bHfhwoV897vfpbGxkfHjx7N9+3ZeeeUVjjvuOK644gq+973v8fLLL7d/x6hEcoOSuy8DmqIoS6pccgpnwoTgkS0dk+5AkVhPCjJ37u4gbgZRzbnTvXt3xo8fz/jx4xkxYgS33XYbI0eOzLh8jx492LVrF8Aefbd7996jH0YH7s6wYcN48sknsy53/fXX89RTT/HAAw8wevRolixZwnXXXceBBx7I8uXL2bVrFz179mxfPpFKAujWrVv7627dunXI96d2S0x97e7ce++9DB48uMP7Q4YM4ZhjjuGBBx7gpJNO4oYbbuCEE07I+h3yobFipLTUAq9qq1at6pAvXrZsGYcddhiDBw9m3bp1rFmzBoD58+czbtw4IMixL1myBIB77703Y9knnngiN9xwQ3tg3bhxI4MHD6atra09sO/YsYMVK1bsse5LL73EMcccw7x586irq2P9+vW89dZbHHTQQXTr1o358+e3t+Tzcffdd7Nr1y5eeukl1q5du0cAnzhxItddd10iZc2zzz4LwNq1azniiCP42te+xtSpU3nuuefy3nY2CuxSWoWkcKRo5syJppwtW7Zw5plnMnToUOrr61m5ciVz586lZ8+e3HLLLZx22mmMGDGCbt26MXPmzHDbczjnnHNoamqie/fuGcv+4he/yIABA6ivr6ehoYE777yTvffem3vuuYdvfetbNDQ00NjY2H4RNNkFF1zAiBEjGD58OB/60IdoaGjgK1/5CrfddhsNDQ28+OKLnZ4dpDNgwADGjh3L5MmTuf766zu0+gFmz57Njh07qK+vZ9iwYcyePRuAu+66i+HDh9PY2Mjzzz/P5z73uby3nU0sc542NTW5JtqQWFx1VdC1MvngsnhxcMZQBQeXF154gSFDhsRdjZowffp0pkyZwqmnnlqU8tP9Ls1sibt3mvZWi11qi+5klRqg0R2ltiT3o581K+iVoztZpQtuvfXWuKuQkVrsUnt0J6tUOQV2qT26k1WqnAK71JauDoUgUkEU2KW2qB+91ABdPJXaojtZi2rDhg189KMfBeD111+ne/fuJEZzffrpp9l7770j3+bSpUt54403mDRpUuRl5+O9996jX79+bNoU/3QUarGL1KoizE7Vt29fli1bxrJly5g5cybf+MY32l/nEtS7cvfn0qVLefjhh7tS3aqlwC6SSbVPy1fiPv2f+MQnGD16NMOGDePmm28GglbuAQccwNe//nXq6+t5+umn+c1vfsPgwYMZPXo0X/3qVznllFOA4K7W6dOntw+B+9vf/pZt27Yxb9487rjjDhob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\n", "text/plain": [ "
" ] @@ -118,7 +119,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -169,7 +170,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP4AAAEICAYAAAB/KknhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAEDdJREFUeJzt3XuMXPV5xvHvE+MLxDjGATnGRsFpSBBNubSWgdCkyBQFSBpbLUpBtHJUV26aViKFlFvUFKS2grQKoLSFmEuzJCg2IahGNBFyXSMaQQzmfnEBgxrF1GDANcZAjA1v/5jfpsOyuzM71zP7Ph9p5Dlnzsx5Zz3P/ub9zTmzigjMLJf39bsAM+s9B98sIQffLCEH3ywhB98sIQffLCEH39om6VOSnup3HdY8B78CJH1R0mOS3pD0gqRrJM0ut10raXe5vCVpb93yj3tQW0j66HjbRMR/RsTH29jHWZI2Snpd0vZy/cuSVG6XpCskvVIuVwzfZq1x8PtM0vnAFcBfAh8ATgA+DKyTNC0ivhQRMyNiJvB3wJrh5Yg4vX+V10jar837nw9cDfw98CFgLvAl4CRgWtlsJbAMOAY4Gvgd4E/a2W96EeFLny7ALGA38IUR62cCLwF/NGL9pcD3GjzmycBW4AJgO7CNWmjOAJ4GdgCX1G2/GLgX2Fm2/UdgWrntbiCA10udv1/3+BcCLwDfHV5X7vMrZR+/XpYPLc/l5FFq/UB57N9r8JzuAVbWLa8Aftrv/79BvnjE769PAjOA2+pXRsRu4EfAqS0+7ofK484Hvg5cB/wB8BvAp4C/krSwbPs28BfAwcCJwCnAl0sdny7bHBO1dxhr6h5/DrV3JitH1P4stV8K35N0APAvwFBE3DVKnScC04G1DZ7PrwKP1C0/UtZZixz8/joYeDki9o1y27Zyeyv2An8bEXuB1eVxro6I1yLiCeBJam+biYgHIuKnEbEvIv4b+DbwWw0e/x3gryNiT0S8OfLGiLgO2AJsBOYBXxvjcd7z/CXdI2mnpDclDf/imQm8Wne/V4GZ7vNb5+D318vAwWP0yfPK7a14JSLeLteHg/li3e1vUgsTkj4m6Y4yqbiL2jxCo184L0XELxpscx3wCeBbEbFnrDoZ8fwj4pMRMbvcNvz63E2tLRo2C9gd5X2/TZyD31/3AnuA361fKWkmcDqwvgc1XAP8F3BERMwCLgEajaTjBq7UfxVwA3CppDljbDr8/Jc22N8TlHcoxTFlnbXIwe+jiHgVuAz4lqTTJE2VdDhwC7UJtO/2oIwDgV3AbklHAn864vYXgY9M8DGvBjZFxB8D/wZcO9pGEbGT2vP/Z0lnSjpQ0vskHQu8v27Tm4DzJM2XdChwPvCdCdZkddr6KMbaFxHfkPQK8A/UZsR3Af8KnDPOW+RO+iqwitqnAA8Ba4AldbdfCgxJ2p/aRN728R5M0lLgNODXyqrzgIclnRMRN4/cvjz/58v+b6I2y/8ctQnCe8pm36b2y+exsnx9WWctktsks3z8Vt8sIQffLCEH3yyhtoJfZqKfkrRF0kWdKsrMuqvlyT1JU6gd+30qtY+e7gfOjognx7rPNE2PGe/6lMassz529BvvWn760QP6VEl//ILXeSv2NDyisZ2P8xYDWyLiOQBJq6kdiDFm8Gfwfo7XKW3s0mx8d9758LuWP3PosX2qpD82RnPHfLXzVn8+8PO65a1lnZlVXNcP4JG0knIG1wxyve0yq6p2gv88cFjd8oKy7l0iYhW1I8OYpTk+WqgJd/5P7rer7fDPqjntvNW/HzhC0kJJ04CzgNs7U5aZdVPLI35E7JP058CdwBTgxnKut5lVXFs9fkT8iNo3xZjZAPGRe2YJ+bTcCqrSBJUnGicnj/hmCTn4Zgk5+GYJuce3cfWqpx85l9DLfWfkEd8sIQffLCEH3ywh9/hWCe7na3p13IRHfLOEHHyzhBx8s4QcfLOEevontBYdMyPuu/P/v7THEzpmnbUx1rMrdjT8ll2P+GYJOfhmCTn4Zgn19ACepx89wH29TUqD9oUlHvHNEnLwzRJy8M0ScvDNEvLZeRUwaBND9l6D9n/mEd8sIQffLCEH3yyhyvX4GfvdDM/RqsUjvllCDr5ZQg6+WUKV6/FH9rsZe36zbvOIb5aQg2+WkINvllDD4Eu6UdJ2SY/XrZsjaZ2kZ8q/B3W3TDPrpIbfsivp08Bu4KaI+ERZ9w1gR0RcLuki4KCIuLDRzmZpThyvUzpQtllOjf6ceMe+ZTci7gZ2jFi9FBgq14eAZY0ex8yqo9WP8+ZGxLZy/QVg7lgbSloJrASYwQEt7s7MOqntyb2o9Qpj9gsRsSoiFkXEoqlMb3d3ZtYBrY74L0qaFxHbJM0DtneyKOsfHzBVbZ36/2h1xL8dWF6uLwfWdqQaM+uJZj7O+z5wL/BxSVslrQAuB06V9Azw22XZzAZEw7f6EXH2GDf5czmzAVW5k3Ra4b60c/yzy8GH7Jol5OCbJeTgmyXk4JslNCkm9zwhVW2NTiyx3vOIb5aQg2+WkINvltCk6PGtd1rp193PV49HfLOEHHyzhBx8s4Tc44/DJ/+8l38Gk4NHfLOEHHyzhBx8s4QcfLOEPLk3jkYTWT75xAaVR3yzhBx8s4QcfLOE+trjD3qPPEi1mtXziG+WkINvlpCDb5ZQX3t898h5+QSo/vKIb5aQg2+WkINvlpCDb5aQT9KxvvBkXnO6NQnqEd8sIQffLKGGwZd0mKQNkp6U9ISkc8v6OZLWSXqm/HtQ98s1s05QRIy/gTQPmBcRD0o6EHgAWAZ8EdgREZdLugg4KCIuHO+xZmlOHK9TOlO5VZYPzumfjbGeXbFDjbZrOOJHxLaIeLBcfw3YDMwHlgJDZbMhar8MzGwATKjHl3Q4cBywEZgbEdvKTS8AcztamZl1TdPBlzQT+CHwlYjYVX9b1PqFUXsGSSslbZK0aS972irWzDqjqeBLmkot9DdHxG1l9Yul/x+eB9g+2n0jYlVELIqIRVOZ3omazaxNDQ/gkSTgBmBzRHyz7qbbgeXA5eXftV2p0EZV5Qm0KtVio2vmyL2TgD8EHpM0/Gq7hFrgb5G0AvgZ8IXulGhmndYw+BHxE2Csjwf82ZzZAPKRe2YJpT1Jp8o9cjMGrV6rFo/4Zgk5+GYJOfhmCaXt8d0j5zTof72pUzzimyXk4Jsl5OCbJeTgmyWUdnLPchptIm/QD+ZqhUd8s4QcfLOEHHyzhNzj28DoVi+eoacfySO+WUIOvllCDr5ZQu7xB4BPLKnJ+Jy7xSO+WUIOvllCDr5ZQg6+WUKe3BsAWSe1Mp480yse8c0ScvDNEnLwzRJyj29t88kzg8cjvllCDr5ZQg6+WUID1+P7hJXq8c9/8HjEN0vIwTdLyME3S6hh8CXNkHSfpEckPSHpsrJ+oaSNkrZIWiNpWvfLNbNOaGZybw+wJCJ2S5oK/ETSj4HzgCsjYrWka4EVwDVdrBXwRJL13mScUG444kfN7rI4tVwCWALcWtYPAcu6UqGZdVxTPb6kKZIeBrYD64BngZ0Rsa9sshWYP8Z9V0raJGnTXvZ0omYza1NTwY+ItyPiWGABsBg4stkdRMSqiFgUEYumMr3FMs2skyZ0AE9E7JS0ATgRmC1pvzLqLwCe70aBneIvdbBWTcbXSjOz+odIml2u7w+cCmwGNgBnls2WA2u7VaSZdVYzI/48YEjSFGq/KG6JiDskPQmslvQ3wEPADV2s08w6qGHwI+JR4LhR1j9Hrd83swHjI/fMEhq4s/NaNRknaBrxhKaNxSO+WUIOvllCDr5ZQml6/Izc01dbP0/+8YhvlpCDb5aQg2+WkHv8DvNn59asfr42POKbJeTgmyXk4Jsl5OCbJTQpJ/f6eWCEJ/NsEHjEN0vIwTdLyME3S2hS9vjus3OYjH/hplc84psl5OCbJeTgmyU0KXv8KvFJO93jn2XrPOKbJeTgmyXk4Jsl5OCbJeTJvS7zBJR1W/0E8uLPvNHUfTzimyXk4Jsl5OCbJeQe36wFVTowq37fT8crTd3HI75ZQg6+WUJNB1/SFEkPSbqjLC+UtFHSFklrJE3rXplm1kkT6fHPBTYDs8ryFcCVEbFa0rXACuCaDtdXKVXq66y/Bv3/vqkRX9IC4LPA9WVZwBLg1rLJELCsGwWaWec1+1b/KuAC4J2y/EFgZ0TsK8tbgfmj3VHSSkmbJG3ay562ijWzzmgYfEmfA7ZHxAOt7CAiVkXEoohYNJXprTyEmXVYMz3+ScDnJZ0BzKDW418NzJa0Xxn1FwDPd69MM+ukhsGPiIuBiwEknQx8NSLOkfQD4ExgNbAcWNvFOiuhyhM6/sZZm4h2Pse/EDhP0hZqPf8NnSnJzLptQofsRsRdwF3l+nPA4s6XZGbd5iP3zBLySTo91q1e3P28TYRHfLOEHHyzhBx8s4Tc4/eYe/G8qnSSl0d8s4QcfLOEHHyzhBx8s4Q8uWc2Qrcm4ao0sesR3ywhB98sIQffLCH3+DaptdKvV6kX7xaP+GYJOfhmCTn4Zgk5+GYJeXLPJrV+TdRV/VuPPeKbJeTgmyXk4Jsl5B6/qHpPZoOl6q8dj/hmCTn4Zgk5+GYJuccvqt6TdUKVvuXV+ssjvllCDr5ZQg6+WUIOvllCntxLZORkng9ayssjvllCDr5ZQg6+WUKKiN7tTHoJ+BlwMPByz3bcnkGqFQar3kGqFQaj3g9HxCGNNupp8H+5U2lTRCzq+Y5bMEi1wmDVO0i1wuDVOx6/1TdLyME3S6hfwV/Vp/22YpBqhcGqd5BqhcGrd0x96fHNrL/8Vt8sIQffLKGeBl/SaZKekrRF0kW93HczJN0oabukx+vWzZG0TtIz5d+D+lnjMEmHSdog6UlJT0g6t6yvar0zJN0n6ZFS72Vl/UJJG8trYo2kaf2udZikKZIeknRHWa5srRPVs+BLmgL8E3A6cBRwtqSjerX/Jn0HOG3EuouA9RFxBLC+LFfBPuD8iDgKOAH4s/LzrGq9e4AlEXEMcCxwmqQTgCuAKyPio8D/Aiv6WONI5wKb65arXOuE9HLEXwxsiYjnIuItYDWwtIf7bygi7gZ2jFi9FBgq14eAZT0tagwRsS0iHizXX6P2Ap1PdeuNiNhdFqeWSwBLgFvL+srUK2kB8Fng+rIsKlprK3oZ/PnAz+uWt5Z1VTc3IraV6y8Ac/tZzGgkHQ4cB2ykwvWWt84PA9uBdcCzwM6I2Fc2qdJr4irgAuCdsvxBqlvrhHlybwKi9tlnpT7/lDQT+CHwlYjYVX9b1eqNiLcj4lhgAbV3gEf2uaRRSfocsD0iHuh3Ld3Syy/ieB44rG55QVlXdS9KmhcR2yTNozZaVYKkqdRCf3NE3FZWV7beYRGxU9IG4ERgtqT9ykhaldfEScDnJZ0BzABmAVdTzVpb0ssR/37giDIzOg04C7i9h/tv1e3A8nJ9ObC2j7X8Uuk5bwA2R8Q3626qar2HSJpdru8PnEptXmIDcGbZrBL1RsTFEbEgIg6n9jr9j4g4hwrW2rKI6NkFOAN4mlpv97Ve7rvJ+r4PbAP2UuvhVlDr7dYDzwD/Dszpd52l1t+k9jb+UeDhcjmjwvUeDTxU6n0c+HpZ/xHgPmAL8ANger9rHVH3ycAdg1DrRC4+ZNcsIU/umSXk4Jsl5OCbJeTgmyXk4Jsl5OCbJeTgmyX0f8BneHj0wfxYAAAAAElFTkSuQmCC\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -179,7 +180,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -223,7 +224,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -233,7 +234,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -263,6 +264,82 @@ "\n", "pl.show()" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Emprirical Sinkhorn\n", + "----------------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning: numerical errors at iteration 0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/rflamary/PYTHON/POT/ot/bregman.py:374: RuntimeWarning: divide by zero encountered in true_divide\n", + " v = np.divide(b, KtransposeU)\n", + "/home/rflamary/PYTHON/POT/ot/plot.py:83: RuntimeWarning: invalid value encountered in double_scalars\n", + " if G[i, j] / mx > thr:\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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oUOHMnToUF566SUgaHGPHDmS8ePHc8ghh3DxxRdzzz33MGLECAYPHszbb78NwIQJE5g0aRL19fUcdthhPPbYYzutd+PGjXzve99jxIgRDBkyhEcffRSAxYsXM2LECOrq6qipqeHPf/5zJNu/hbsXfAOeB/qH96cB12VaftiwYS4V7tpr3efMaf3cnDnB89mYMsUdgr+ZzJnj3rPnjnWlPpZWlixZktf7IJr1r1+/3mtra71fv34+efJkf/bZZ93dffPmzd67d29ftmyZu7s3NDT4z372M3d3P+igg7y5udnd3V999VUfOXKku7tPnTrVhw4d6ps2bXJ391/+8pf+D//wD75161Z3d1+zZo1/9tlnfuSRR/qHH37o7u6zZs3y7373uzvVa9CgQd7U1OTu7n/729/c3X3jxo2+efNmd3dfvny5J+LS3LlzvUePHv7Xv/7Vt2zZ4vvvv79fdtll7u7+85//3M855xx3dz/rrLN8zJgxvm3bNl++fLkfcMABvnnzZp87d66fdNJJ7u5+ySWX+F133dWy3n79+vmGDRv8Rz/6kd99993u7v7pp5+2fMZk6b5LgrmE243JUfWK+TFwj5m9DtQBV0VUrpSriy7auZU9enTwfHtyaYG/+mrrFn2ixf/qq/nXXYAg/WIW3GDH/ULSMnvssQfz58/ntttuo1evXnz729/mjjvuYNmyZRx88MEcdthhAJx11lk899xz7Zb3rW99i+7duwPwzDPP8IMf/IAuXYLLb/bee2+WLVvGm2++yfHHH09dXR1XXHEFTU1NO5Vz1FFHMWHCBGbOnMm2bduA4GKus88+m8GDB3PaaaexZMmSluWHDx/OfvvtR9euXTn00EP5xje+AcDgwYNZtWpVy3Knn346nTp1ol+/fhxyyCG89VbrKV5nz57NNddcQ11dHaNGjWLLli28++67HHnkkVx11VVce+21vPPOOy2fMSqRXKDk7guB+ijKkiqXnMIZPTq4ZUrHpNtRJN4nBZk2bUcQN4Oo5tzp3Lkzo0aNYtSoUQwePJg777yTIUOGtLl8ly5d2L59O8BOfbd3332nfhituDsDBw7k5ZdfzrjcLbfcwrx583j88ccZNmwY8+fP58Ybb2Tfffdl0aJFbN++nW7durUsn0glAXTq1KnlcadOnVrl+1O7JaY+dnceeugh+vfv3+r5AQMGcMQRR/D4449z4okncuutt3Lsscdm/Ay50FgxUlpqgVe1ZcuWtcoXL1y4kIMOOoj+/fuzatUqVqxYAcBdd93FyJEjgSDHPn/+fAAeeuihNss+/vjjufXWW1sC69q1a+nfvz/Nzc0tgX3r1q0sXrx4p/e+/fbbHHHEEUyfPp1evXqxevVqPv74Y/bbbz86derEXXfd1dKSz8UDDzzA9u3befvtt1m5cuVOAXzMmDHceOONiZQ1r732GgArV67kkEMO4V/+5V8YP348r7/+es7rzkSBXUqrkBSOFM3UqdGUs2HDBs466ywOP/xwampqWLJkCdOmTaNbt278+te/5rTTTmPw4MF06tSJSZMmheueyjnnnEN9fT2dO3dus+zvf//79OnTh5qaGmpra7n33nvZddddefDBB/nJT35CbW0tdXV1LSdBk1144YUMHjyYQYMG8dWvfpXa2lp++MMfcuedd1JbW8tbb73V7tFBOn369GHEiBGccMIJ3HLLLa1a/QBTpkxh69at1NTUMHDgQKZMmQLA/fffz6BBg6irq+PNN9/kO9/5Ts7rziSWOU/r6+tdE21ILGbMCLpWJu9c5s4NjhiqYOeydOlSBgwYEHc1OoQJEyYwbtw4Tj311KKUn+67NLP57t5u2lstdulYdCWrdAAa3VE6luR+9JMnB71ydCWr5OGOO+6IuwptUotdOh5dySpVToFdOh5dySpVToFdOpZ8h0IQqSAK7NKxqB+9dAA6eSodi65kLao1a9Zw3HHHAfDBBx/QuXNnEqO5vvLKK+y6666Rr3PBggV8+OGHjB07NvKyc/H555/Ts2dP1q2LfzoKtdhFOqoizE61zz77sHDhQhYuXMikSZP413/915bH2QT1fK7+XLBgAU899VQ+1a1aCuwiban2aflK3Kf/m9/8JsOGDWPgwIHcfvvtQNDK3WuvvTj33HOpqanhlVde4Xe/+x39+/dn2LBh/PjHP+bkk08GgqtaJ0yY0DIE7u9//3s2b97M9OnTueeee6irq+PBBx9stc433niD4cOHtwyPu3Llynbrct555zFw4EDGjBnDvHnzGDlyJIcccghPPPEEALfffjunnHIKI0eOpF+/flxxxRVpP+8111zDiBEjqKmpYfr06QCsX7+eE044gdraWgYNGrRTfSOTzRCQUd80bK9EotChg9tTgUMG5zxsb+IzTZkS+WebOnWqX3fddS2P16xZ4+7BcLkDBgzwtWvX+tatWx3whx56qOW1Aw44wFetWuXbt2/3U0891cePH+/u7hdeeKHfd9997u6+du1a79evn2/evNlnzpzZMpRuqkmTJvmsWbPc3X3Lli0tw/Rmqsvs2bPd3X3cuHE+duxY37p1qzc2NrYM6ztz5kzff//9fe3atb5hwwYfMGCAv/baa75161bv0aOHu7s//vjjPnnyZN++fbtv27bNx4wZ4y+++KLPmjXLJ02a1FK/devWtbn9ymHYXpHWStHaLXaLsyNMy1fCPv0/+9nPqK2t5cgjj6Spqallwopdd92VU045BYAlS5bQv39/DjroIMyMM844o+X9s2fP5sorr6Suro7Ro0e3DIGbyVe/+lWuuOIKZsyYwerVq1vGcmmrLt27d+f4448HgiF6R40aRZcuXXYarnfMmDF88YtfZPfdd+fkk0/mhRdeaLXe2bNn8+STTzJkyBCGDh3KihUrWL58OTU1NTz11FNcfPHFvPjii/To0aOwjdoGBXYpjlIc5pci8EYZ+MoxtVOiPv3PPPMMzz33HH/6059YtGgRNTU1LUP0du/efafhbtNxdx555JGWnP27777bMr57WxoaGnj44Yfp2rUrY8eO5bnnnstYl+TzAIUO1/vTn/60pa4rVqxgwoQJDBgwgMbGRgYOHMjFF1/MVVcVZ+qKSAK7ma0yszfMbKGZaXQvKV1rt9gtzigDX7mNU1PCPv0ff/wxe++9N927d2fx4sW82kb30sMPP5xly5axevVq3J3f/OY3La8lhsBNSAyBu+eee7J+/fq05a1cuZIvfelLnHPOOYwbN47XX38967pkMnv2bNatW8emTZt49NFHOeqoo1q9PmbMGH71q1+xceNGAJqamvjoo49477332GOPPWhoaOD8889nwYIFOa87G1G22Ee7e51nMfKYdBClOMwvZouzvcCXawu83FI7JezTf9JJJ7Fp0yYOP/xwfvrTn3LEEUekXW633Xbjpptu4utf/zr19fXstddeLemKqVOnsnHjRgYPHszAgQOZFs4Scuyxx7Jo0SKGDBmy08nIe++9l4EDB1JXV8fy5cs588wzs65LJsOHD2f8+PHU1tZyxhlnUFdX1+r1E088kVNPPZWvfOUrDB48mNNPP50NGzawaNGilpO5V111FZdeemnO685K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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#%% sinkhorn\n", + "\n", + "# reg term\n", + "lambd = 1e-3\n", + "\n", + "Ges = ot.bregman.empirical_sinkhorn(xs, xt, lambd)\n", + "\n", + "pl.figure(7)\n", + "pl.imshow(Ges, interpolation='nearest')\n", + "pl.title('OT matrix empirical sinkhorn')\n", + "\n", + "pl.figure(8)\n", + "ot.plot.plot2D_samples_mat(xs, xt, Ges, color=[.5, .5, 1])\n", + "pl.plot(xs[:, 0], xs[:, 1], '+b', label='Source samples')\n", + "pl.plot(xt[:, 0], xt[:, 1], 'xr', label='Target samples')\n", + "pl.legend(loc=0)\n", + "pl.title('OT matrix Sinkhorn from samples')\n", + "\n", + "pl.show()" + ] } ], "metadata": { @@ -281,7 +358,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.5" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/notebooks/plot_barycenter_fgw.ipynb b/notebooks/plot_barycenter_fgw.ipynb new file mode 100644 index 0000000..8da80a6 --- /dev/null +++ b/notebooks/plot_barycenter_fgw.ipynb @@ -0,0 +1,312 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "=================================\n", + "Plot graphs' barycenter using FGW\n", + "=================================\n", + "\n", + "This example illustrates the computation barycenter of labeled graphs using FGW\n", + "\n", + "Requires networkx >=2\n", + "\n", + ".. [18] Vayer Titouan, Chapel Laetitia, Flamary R{'e}mi, Tavenard Romain\n", + " and Courty Nicolas\n", + " \"Optimal Transport for structured data with application on graphs\"\n", + " International Conference on Machine Learning (ICML). 2019.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Author: Titouan Vayer \n", + "#\n", + "# License: MIT License\n", + "\n", + "#%% load libraries\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import networkx as nx\n", + "import math\n", + "from scipy.sparse.csgraph import shortest_path\n", + "import matplotlib.colors as mcol\n", + "from matplotlib import cm\n", + "from ot.gromov import fgw_barycenters\n", + "#%% Graph functions\n", + "\n", + "\n", + "def find_thresh(C, inf=0.5, sup=3, step=10):\n", + " \"\"\" Trick to find the adequate thresholds from where value of the C matrix are considered close enough to say that nodes are connected\n", + " Tthe threshold is found by a linesearch between values \"inf\" and \"sup\" with \"step\" thresholds tested.\n", + " The optimal threshold is the one which minimizes the reconstruction error between the shortest_path matrix coming from the thresholded adjency matrix\n", + " and the original matrix.\n", + " Parameters\n", + " ----------\n", + " C : ndarray, shape (n_nodes,n_nodes)\n", + " The structure matrix to threshold\n", + " inf : float\n", + " The beginning of the linesearch\n", + " sup : float\n", + " The end of the linesearch\n", + " step : integer\n", + " Number of thresholds tested\n", + " \"\"\"\n", + " dist = []\n", + " search = np.linspace(inf, sup, step)\n", + " for thresh in search:\n", + " Cprime = sp_to_adjency(C, 0, thresh)\n", + " SC = shortest_path(Cprime, method='D')\n", + " SC[SC == float('inf')] = 100\n", + " dist.append(np.linalg.norm(SC - C))\n", + " return search[np.argmin(dist)], dist\n", + "\n", + "\n", + "def sp_to_adjency(C, threshinf=0.2, threshsup=1.8):\n", + " \"\"\" Thresholds the structure matrix in order to compute an adjency matrix.\n", + " All values between threshinf and threshsup are considered representing connected nodes and set to 1. Else are set to 0\n", + " Parameters\n", + " ----------\n", + " C : ndarray, shape (n_nodes,n_nodes)\n", + " The structure matrix to threshold\n", + " threshinf : float\n", + " The minimum value of distance from which the new value is set to 1\n", + " threshsup : float\n", + " The maximum value of distance from which the new value is set to 1\n", + " Returns\n", + " -------\n", + " C : ndarray, shape (n_nodes,n_nodes)\n", + " The threshold matrix. Each element is in {0,1}\n", + " \"\"\"\n", + " H = np.zeros_like(C)\n", + " np.fill_diagonal(H, np.diagonal(C))\n", + " C = C - H\n", + " C = np.minimum(np.maximum(C, threshinf), threshsup)\n", + " C[C == threshsup] = 0\n", + " C[C != 0] = 1\n", + "\n", + " return C\n", + "\n", + "\n", + "def build_noisy_circular_graph(N=20, mu=0, sigma=0.3, with_noise=False, structure_noise=False, p=None):\n", + " \"\"\" Create a noisy circular graph\n", + " \"\"\"\n", + " g = nx.Graph()\n", + " g.add_nodes_from(list(range(N)))\n", + " for i in range(N):\n", + " noise = float(np.random.normal(mu, sigma, 1))\n", + " if with_noise:\n", + " g.add_node(i, attr_name=math.sin((2 * i * math.pi / N)) + noise)\n", + " else:\n", + " g.add_node(i, attr_name=math.sin(2 * i * math.pi / N))\n", + " g.add_edge(i, i + 1)\n", + " if structure_noise:\n", + " randomint = np.random.randint(0, p)\n", + " if randomint == 0:\n", + " if i <= N - 3:\n", + " g.add_edge(i, i + 2)\n", + " if i == N - 2:\n", + " g.add_edge(i, 0)\n", + " if i == N - 1:\n", + " g.add_edge(i, 1)\n", + " g.add_edge(N, 0)\n", + " noise = float(np.random.normal(mu, sigma, 1))\n", + " if with_noise:\n", + " g.add_node(N, attr_name=math.sin((2 * N * math.pi / N)) + noise)\n", + " else:\n", + " g.add_node(N, attr_name=math.sin(2 * N * math.pi / N))\n", + " return g\n", + "\n", + "\n", + "def graph_colors(nx_graph, vmin=0, vmax=7):\n", + " cnorm = mcol.Normalize(vmin=vmin, vmax=vmax)\n", + " cpick = cm.ScalarMappable(norm=cnorm, cmap='viridis')\n", + " cpick.set_array([])\n", + " val_map = {}\n", + " for k, v in nx.get_node_attributes(nx_graph, 'attr_name').items():\n", + " val_map[k] = cpick.to_rgba(v)\n", + " colors = []\n", + " for node in nx_graph.nodes():\n", + " colors.append(val_map[node])\n", + " return colors" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Generate data\n", + "-------------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% circular dataset\n", + "# We build a dataset of noisy circular graphs.\n", + "# Noise is added on the structures by random connections and on the features by gaussian noise.\n", + "\n", + "\n", + "np.random.seed(30)\n", + "X0 = []\n", + "for k in range(9):\n", + " X0.append(build_noisy_circular_graph(np.random.randint(15, 25), with_noise=True, structure_noise=True, p=3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot data\n", + "---------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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GbCWnH700UcZbrCpN9eFCxda3d7EiRMFkGmVclr23GCFyP6e9vgNXwghjEajqFy5sgDE9evXhRApiZRarRYNGjSwup/U7+qdd97JUaxPtZoglfj3Lclpi0ANBgNLly7lp59+4sKFC8TExGA2my3zb9++bfd+tm3bxpIlSzhx4gTh4eEYjcZ088PDwy1FnAMHDuStt96iRo0a9OvXjxYtWhAYGEiJEiXSrXPkyBEAYmJirDaUfPDgAQAXL160O97HnTp1CoDWrVtnmFetWjXKlStHaGgoMTExudI4r0GDBhmmlS9fHoCoqCjLtODgYACaN2+ORqPJsE7r1q358ccfCQ4OZtCgQZnur2/fvsyfP5/u3bvTu3dv2rZtS2BgIJUrV86wbIcOHfDz82PlypXMmjULvV4PpBRXu7i4MGLECJuOMTg4GJVKRdOmTTPMa9asWZbrNmrUKNN5N27cYNasWfzxxx/cuHGDhISEdPMzO39btGhhNQ61Wm35nNOqWrUqXl5eGaan/Z48PDyAlHP6q6++okaNGvTp04cWLVrQpEkThzbkPHXqFCqVyuq4AS1atMj0uNMKCQkhPj6ewMBAihUrlmF+69atmTFjhtXtZPUd5oQ930fqsVs7z+wZR+Ho0aNAym/CFhEREXzxxRds376da9euERcXl26+PddWe69/Xl5edOnShS1btlC3bl169epF8+bNef755y2/4dxk6zUs9TjOnDlj9TguX74MpBxHjRo1chRLTu9p1q4JarWaZs2acfXqVYKDg/H19SUoKAiTyZTpuAEGg8FyDDnx1JOBxMREIiMjAdLdaPv27cvGjRupVKkS3bp1o3Tp0pa6xnnz5pGUlGTXfubPn8/EiRMpWrQoL774IhUqVECv16MoiqX+Ke02J02ahI+PD4sWLWLBggXMmzcPRVFo0aIFX3zxheUki4iIAGD37t3s3r070/3HxsbaFa81qXXSmdXJlilThhs3bhAdHZ0rF3hrdXAuLimnRNq+4rbEBSn1WVlp1KgRBw8e5NNPP2XDhg2Wukt/f3+mTp1K//79LcuqVCpGjx7N5MmTWbt2LUOHDuXkyZOcOnWK7t2729x7IiYmhmLFilmOK61SpUpluW7p0qWtTr927RqNGjUiKiqK5s2b065dO4oUKYJareb69et8//33mZ6/1vbp4uJiabPyuMzamVj7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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#%% Plot graphs\n", + "\n", + "plt.figure(figsize=(8, 10))\n", + "for i in range(len(X0)):\n", + " plt.subplot(3, 3, i + 1)\n", + " g = X0[i]\n", + " pos = nx.kamada_kawai_layout(g)\n", + " nx.draw(g, pos=pos, node_color=graph_colors(g, vmin=-1, vmax=1), with_labels=False, node_size=100)\n", + "plt.suptitle('Dataset of noisy graphs. Color indicates the label', fontsize=20)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Barycenter computation\n", + "----------------------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% We compute the barycenter using FGW. Structure matrices are computed using the shortest_path distance in the graph\n", + "# Features distances are the euclidean distances\n", + "Cs = [shortest_path(nx.adjacency_matrix(x)) for x in X0]\n", + "ps = [np.ones(len(x.nodes())) / len(x.nodes()) for x in X0]\n", + "Ys = [np.array([v for (k, v) in nx.get_node_attributes(x, 'attr_name').items()]).reshape(-1, 1) for x in X0]\n", + "lambdas = np.array([np.ones(len(Ys)) / len(Ys)]).ravel()\n", + "sizebary = 15 # we choose a barycenter with 15 nodes\n", + "\n", + "A, C, log = fgw_barycenters(sizebary, Ys, Cs, ps, lambdas, alpha=0.95, log=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot Barycenter\n", + "-------------------------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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tk6J27dvWygR2QOWMEnu8uXLmDBhAurVq4cbN25g9+7d2L17N3r37v3UTRRkghw9q4/FpAZ/oEu1MXBVVIEMcigEB8gFBeSCEk3cu2FM7e/xZt0F8FB5PfF4REVRyj3h4dgNApSler2LswfSExugefPmCAoKQmJiooUTki3i6miShCiK2L9/P4KDg3HixAm88847ePfdd1G9unk7M4miCL2ohdaYDYXMAQ4yJ8gEyyyoITKYMnAxvi90xngAxmK/7t5uWWvh4tAcCQkJmD17Nv744w+MGzcOU6dOReXKlcsuNFk1ljCVK51Oh3Xr1iE4OBh5eXkICgrC6NGj4ejoKHU0omLRGRJx6e7L0BnuQHxsr+1HySAT1Kjv+Svc1M8V+ExsbCxmzpyJjRs34v3338fkyZPh5uZWdsHJKrGEqVykpqZiyZIlWLBgARo3bowPP/wQgYGBFXavZrJtRlMW4jIWIil7FQDxsa0sBUENiCZ4OHaHt8cUOCrrFXmsa9euYcaMGdi9ezemTp2K9957D05OvIypomAJU5m6evUqQkJCsHr1avTv3x9BQUFo3ry51LGILMIkapGWuwtJ2etgMCVBFI2Qy9zh4dgdni4jSnQP4cjISEybNg1HjhzBZ599hrFjx8LBoXTXwpPtYAmTxYmiiEOHDiE4OBhHjhzBO++8g/feew81atSQOhqR1YuIiMBXX32F8+fP46uvvsKYMWOgVJZuMRhZP5YwWYxer8f69esRHByMrKwsBAUFYcyYMZxaIyqFf/75B19++SViYmIwffp0vPLKK5DLucjQ3rCEyWzp6en473//i/nz56NevXr48MMP0bdvX57vJbKAffv24YsvvkBmZia+/vprDBo0qFj3PybbwBKmUrtx4wZCQkKwcuVK9OvXD0FBQWjZsqXUsYjsjiiK2LlzJ7744gsIgoBZs2YhMDCQZWwHOFShEhFFEUeOHMGQIUPQtm1bODk54fz58/j9999ZwERlRBAEvPjiizh16hQ+++wzfPTRR+jUqRP2798vdTQyE0fCVCwGgwGhoaEIDg5GamoqJk+ejNdeew0uLi5SRyOqcIxGI9asWYPp06fD398fs2bNQvv27aWORaXAEqYnysjIwK+//or58+fD398fH374Ifr168cFIkRWQK/XY/ny5Zg5cyaaN2+OmTNnokWLFlLHohJgCduB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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#%% Create the barycenter\n", + "bary = nx.from_numpy_matrix(sp_to_adjency(C, threshinf=0, threshsup=find_thresh(C, sup=100, step=100)[0]))\n", + "for i, v in enumerate(A.ravel()):\n", + " bary.add_node(i, attr_name=v)\n", + "\n", + "#%%\n", + "pos = nx.kamada_kawai_layout(bary)\n", + "nx.draw(bary, pos=pos, node_color=graph_colors(bary, vmin=-1, vmax=1), with_labels=False)\n", + "plt.suptitle('Barycenter', fontsize=20)\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/notebooks/plot_fgw.ipynb b/notebooks/plot_fgw.ipynb new file mode 100644 index 0000000..b41f280 --- /dev/null +++ b/notebooks/plot_fgw.ipynb @@ -0,0 +1,359 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Plot Fused-gromov-Wasserstein\n", + "\n", + "\n", + "This example illustrates the computation of FGW for 1D measures[18].\n", + "\n", + ".. [18] Vayer Titouan, Chapel Laetitia, Flamary R{'e}mi, Tavenard Romain\n", + " and Courty Nicolas\n", + " \"Optimal Transport for structured data with application on graphs\"\n", + " International Conference on Machine Learning (ICML). 2019.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Author: Titouan Vayer \n", + "#\n", + "# License: MIT License\n", + "\n", + "import matplotlib.pyplot as pl\n", + "import numpy as np\n", + "import ot\n", + "from ot.gromov import gromov_wasserstein, fused_gromov_wasserstein" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Generate data\n", + "---------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% parameters\n", + "# We create two 1D random measures\n", + "n = 20 # number of points in the first distribution\n", + "n2 = 30 # number of points in the second distribution\n", + "sig = 1 # std of first distribution\n", + "sig2 = 0.1 # std of second distribution\n", + "\n", + "np.random.seed(0)\n", + "\n", + "phi = np.arange(n)[:, None]\n", + "xs = phi + sig * np.random.randn(n, 1)\n", + "ys = np.vstack((np.ones((n // 2, 1)), 0 * np.ones((n // 2, 1)))) + sig2 * np.random.randn(n, 1)\n", + "\n", + "phi2 = np.arange(n2)[:, None]\n", + "xt = phi2 + sig * np.random.randn(n2, 1)\n", + "yt = np.vstack((np.ones((n2 // 2, 1)), 0 * np.ones((n2 // 2, 1)))) + sig2 * np.random.randn(n2, 1)\n", + "yt = yt[::-1, :]\n", + "\n", + "p = ot.unif(n)\n", + "q = ot.unif(n2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot data\n", + "---------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfAAAAHwCAYAAABZrD3mAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3Xec1OW5///XPWULC8vSBBSQrmCHVcFewBhb1IAmscQUNdF8j8nv5GhyjiknzZCck97QmKjJSTRgLLFEwRoRC2BHRRZBqYK7sGydnZnr98d8FmaXmdmZ3Sk7u+/n48EDZz73fD7Xgg+uudt1OzNDREREiouv0AGIiIhI5pTARfoA59wC55xl+VddoX8uEUnOaQhdpPg55yYCNd7LG8zsRxl8tgqoBmYAc4E5cZfnmtnSLMY5w7v/TmAdsMLMdmbr/iL9iRK4SB/hnJsHLPJezjSzVd28TxWwALgKWGxm87MU31Xef9YCFwPzgJ1mNiQb9xfpb5TARfoQ59wiYolxnZlN6uG95gGLzMxlKbaFZnZ13OsqYGJ3v2iI9HdK4CJ9jHOuBphIFnrPzrnriX0ZWJyFuFaa2cye3kdEYrSITaTvaU/a87xedLd5c+lH9zwkANY55xZk6V4i/Z564CJ9kNdzbk+Wk8xsXSHjAXDOzQGWkOWFcSL9lRK4SB/lnFtCbMX3qt4ydO0N7w8FJmj1uUjPaAhdJAnn3Dwv4SS6tsg5tzDfMWVoPrHtWjN6w9C11wNfAFQBtxQ4HJGipwQuktzXiSXADrzV0/MSXetNvB5u+3z49V4CzTvn3Azn3CIzW2pmNwNLic3PzyhEPCJ9hRK4SHIziCWbzqq935fkMZZu8eaab/ZeLvK+fOSNl6QfA66Me7t95OLifMYi0tcECh2ASG8U11tNlKTnwp7kmO79FtKxwlkmFmZSWa0zM7va+3kmEiv0Mre79+qGRcBNnea72//cJuYxDpE+RwlcJLFUSXoekFHxkfgCJgUyl1ip1TnOuRn5KJ7iVV6byN4RACA2tO+cg1hFNhHpJiVwkcTmkCBJt1cPA7rdIy4EM1vnnFtKrChLviqfzQeWplhtnnCBoIikRwlcpBMvSc8gcZJONbTea3n7woeaWdaGz72V7RNTVHurplPv2/tc+9D5qk7vtxedmUtstXr7n/XM7oxgeD9z+5eHKthTmEakT1ACF9lXe+J4McG1DkPrzrnr00kKhZwD9+a/vw5M6O49klhI18PgHyZ4r71W+57pCS/Gpd7w+lBiX5BmAhfRjbly59xK4Mr20QbvaNSsHMoi0lsogYvsq72Xmmjo9yJix2C2G5bODQs1B+71dhcBp2e7cEoa1d1WAIkOVLmavVXi4u/XHt8kYsVndhLrwXfoxXs961XJFhHG1W+P7+FXefGkfR+R3k6V2EQ6iTsMpMO52t6Q8QwAM5vrLdJa0ZtP0/J+lgXe/ut8P3sisJK4qmvtBWXM7IYUn1tC7BS0bsXsnDPiyrV6W9kW9fR0NpHeRglcJI43/10HtJ++Fd/LvMn7/RZiw+s7C5EY0+UdLVrb096/c25ifG87bkvapFSJ2Gs7g9jw/YvEetY1XU0HeAm4W/XbvS8NNfFHoHo97aOzda65SG+hIXSRjtrnqRemGFrt9YkgjQVm6d5nInADsWHv+DO8b/YSbcoE7o1OpB1De3W29uTtPW+ot4q+itjfz8QUXwKq2HfqYy6xaYT2Lx8r0riPSK+nSmwiHWVcpKW38ZLUVcDpWbjdIvZWTgOo9pL3HDqOTnSbc25OXM35izvd96K4nni1dy75xXGfneiNNLTrEJP3haAaWBGXvPe5j0gxUg9cpKM5JC6fWhSytWjN6+0uItZL3TPHH/fF5mo6JvaeqAWWetvIFnrPv4pYb3rPFIWZLW1frR732YnEitPM8Wqt73TOXdm+kM37dQOxZP2i92eS6D4iRUdz4CKeuPnvG4pxaNWLfyWx+Bd31T7FPa4iNm9dBfyo8zx33J/TkHwfCer1tm/oPD/unJuXyc+c7D4ixUQ9cJG9JhKbP+1W8usF2oeSh3o92K5UEdsGV0XsjO4Z7Lvn+q4En7uIvXu25+R5umGiNx++57neqEOmiXif+4gUGyVwEY83VDyk0HF0h5ew9yzAy9Jtk5VdnQksiSsrm09LE/S253VjxCTRfUSKiobQRSQj3vzxXGLbtQq6jc77ElGtXrT0R0rgIiIiRUjbyERERIqQEriIiEgRUgIXEREpQkrgIiIiRahg28iGDx9u48ePL9TjRUREeqWVK1fuMLMRXbUrWAIfP348K1as6LqhiIhIP+Kc25BOOw2hi4iIFCElcBERkSKkUqoFZhahoekedjX8lrbwe/h8g6isuITKis/g9w8tdHgiItJLKYEXkFmYrTs+TUvoOcyaAIhGGmiu/xWtDX9g+PC/Eyg5qMBRiohIb6Qh9AKqb7iDltble5J3lSthrH8g+/kDDHMhXO15RHd9DbPmAkcqIiK9jRJ4Ae1s+DVGLDkP85VS6SvB5xw+5/A7h8Ow5gew2k9jFilwtCIi0psogReIWRuRyBYAAjgqXBCfc/u0c4QgvAZan8xzhCIi0pspgRdMAPADMNAXZN/UHceasKb/y0dQIiJSJJTAC8Q5x4Cy0wGHHx8uQe+7g+iOvMQlIiLFQQm8gIZUXo9zZbRZhGjKc9kd+CfkLS4REen9tI2sgEpLpjNq+J/Z/uHnqaItRcsyXMXleYsrXbWt7/JS7V283/giAGMrjuGooRcztHR8YQMTEekH1AMvsPLS4xg7+jUi5Z/AEn2fcuVQfg4EZ+Q/uBRq6p9i8YYvsqZ+CU2RWpoitaypf5TFG75ATf3ThQ5PRKTPUwLvBZzzU1r1XXxVv4bANGKL2wLg2x8G/ieu8ntdz5HnUVO4lqVbbyJsrRjRPe8bUcLWytKtP6ApXFfACEVE+j4NofciruxUXNmpWLQRiIAb1KsSd7s3dj4ApJqzN1bvepDqYZfmKyQRkX4nowTuYtnkfOAjwAFAaYJmZmYfyUJs/ZbzVRQ6hJS2Nr9OxEJJr0csxNbm1/IYkYhI/5N2AnfOlQAPALG9T7EuWHz30OLelz4s6Cvvuo3ruo2IiHRfJnPg1wNzgB8Co4gl6+8A44DLgU3AnYD+5e7jplbOjUvQRufvbEFXztTBc/Mel4hIf5LJEPrFwEtm9l9A+9xs1Mw2An92zi0HXgauBX6a7UCl9xg/cDaVgQGURLdQ4WsBoA0/dZEB7I4OoiI4ggMrZhU4ShGRvi2THvhEYFncawOCe16Y1QAPAp/NTmjSW9W1PM9wXw0V/hacA+egxEUY4W9gXEkb54/5GT7nL3SYIiJ9WiYJPAw0xb1uAEZ0arOeWKKXPipqbbz6wVeIWss+9dt9zih3DTSEVhYkNhGR/iSTBL4JGBP3eg3QeZz0CEAbgPuw7U1PpDzaNGLNrN/1hzxGJCLSP2WSwJfRMWHfBxzunFvonPuIc+4m4AzgySzGJ71MU9t6ItbSRZsNeYpGRKT/ymQR21+B8c658Wa2nthCtfOBK4HPE1uV/i7wtWwHKb1HwFeJzwWJpuiFB3wD8xiRiEj/lHYCN7PHgcfjXjc652YDFwKTic1/32dmDdkOUnqPkRVnsKb2pqTXfa6UMYMuymNEIiL9U49KqZpZG3BXlmKRIlDiH8rYyst4v/4vRK25wzWHn6CvigMqlcBFRHJNtdAlY1OG/Dt+V86GXbcSO3gFjDYqSw7jsP3+l6BvUGEDFBHpB5TAJWPOOSYNuZbxgz9LbcsLRK2VQSUHMyA4rtChiYj0G0rg0m1+XzkjBpxc6DBERPolnQcuIiJShJTARUREipASuIiISBHSHHiRi1qEN+tXsaruaVojzYyrmMqsYXOpDA4pdGgiIpJDGSdw59whwCeBaUCFmZ3pvT8OqAYeN7OdWY1SEmoM7+Z3a79FXdt2QtFYedN1jat58oP7mD/2Cxw15MQCRygiIrmSUQJ3zn0T+CZ7h94t7nIQWARcB/wqK9FJSrev/xE7WrcQIbznvbC1AbD4/d8xsmwM+5dPKFR4IiKSQ2nPgTvnLgK+TaycajWwIP66dx74SuC8LMYnSWxteZ9NTes6JO94YWvjiQ/uzXNUIiKSL5ksYrsOqAHONbNVQKIjqVYDU7IRmKRWs/t1rMMASEeG8c7uV/MYkYiI5FMmCfxw4J9m1pqizRZgZM9CkuxxhQ5ARERyJJME7oBoF21GAKkSvGTJpEGH4lIkaIdjyqDD8hiRiIjkUyYJfC0wO9lF55wPOIHYMLrk2KiysYwZMAm/d5hIZwEX5NT9LshzVCIiki+ZJPC/ATOdc9cluX49sfnvv/Y4KknL5eP/g+Gl+1PqK9vzXsAFCboS5o+9hv3LxxcuOBERySlnlnwhVIeGzg0AngUOA54jNqR+LPBj4ERgFvAicKJ3TnhK1dXVtmLFim6G3beYGc99uJJ7Nz3CpuatBH0BZg2bwfkHnMnIshEpPxu1CG/tfplVtU/RGm3mwAFTOXbYHAapkIuISFFyzq00s+ou26WbwL2bVhHb4/0JOvbeDbgT+KKZ1adzLyXwGDPjdzV3sPzDlbRGQ3ve9+GjxBfkG4d8hckDxxcuQBERyat0E3hGtdDNbKeZXQqMBs4FrgAuAA4ws0vSTd6y14q6V/ZJ3gBRorREW/mft35L1LpaOygiIv1Nt2qhm9l24MEsx9Iv3b/p0X2Sd7zmSAuv7XqLI6qm5zEqERHp7XQaWYFtat6a8nrYwrzftDlP0YiISLFIuwfunLs5zaZmZld3M55+p9RfQmOkKel1v/NT7i9Lel1ERPqnTIbQP9/FdSO2Mt0AJfA0nTRiFg9sXkrYEtc0j1qUo4cekeeoRESkt8tkCH1Kkl9HA9cQK6N6FzA1yzH2aR8ddRpl/tKEVdVKfSXMGXkilcFBBYhMRER6s7R74N5pY8msdM49DLwKPELs0BNJQ1VJJd899Hr+5+3fsqO1FoiVQY1YhDkjT+LSAy8scIQiItIbZbQPvMubOXcHcLiZHdlVW+0D78jMqGncwIbGjZT6SjhyyCEMDFQUOiwREcmzdPeBd2sbWQrb0BB6tzjnmDxwvIq2iIhIWrK2jcw7zORUQMVcREREciyTbWTHpbjHWOCzwFHArVmIS0RERFLIZAj9GWJbxJJxxA47ub5HEfXAqtq13L5+Ka/vXA/A4VUT+PSEuRw5ZGKhQhIREcmJTBL4D0icwKNAHfCCmT2blai64e/vL+O3ax+kNbr3ILSVdWt5fdcGvjTlXD42JulR5iIiIkUnk21kN+YykJ7Y2lzHb9Y+QCi6bzGU1mgbv3znfmYPn8Z+ZVUFiE5ERCT7+kQt9Hs2Pkuq7XBmcP+m53Iex65QM/e+9zJ/rnmeZz+o0SliIiKSM9neRlYQa3Zvos0iSa+3WZg1uzfl7Plmxs/ffJzb1i4n4HyELULA56fCX8Ivjr2YI4aOzdmzRUSkf0qawJ1za7p5TzOzg7r52W6pDJan0WZAzp7/m7ee5I6a5whFw7QfDBqKRmgKh/jcsjtYfOrVjB84PGfPFxGR/ifVEPoAoLwbv3KXKZM4e/9jKPeXJL1e7i/ho6OPzsmzG8Ot3Lp2GS2RtoTXW6Nhfvf20zl5dlfC0SiPb1zL7W+v4IENb9IcThyjiIgUn6Q9cDMbk89AeqJ66BTGDxjJ2oYttHU61SvoAkwcOJoZQybl5NnLP1iH3yX/HhQx49HNb/LDmTl5fFJPba7hy8/cT1s0SjgaJeDzEcX4+lGncdlBM/IbjIiIZF2fWMTmcz5+OuMqjhk2lRJfgAH+Usr9pZT4AswefjD/e+SVOLfvaV/Z0Bxpo6ty8m0JVsfn0qrtG/nCU39nZ6iFxnCI1miYxnCI5nAbN616nLtrXstrPCIikn19YhEbwIBAGTcd8Rm2tezk1Z3vAnBk1URGlA3O6XMPqhxJNGV9GxhbMTSnMXS24KUnaYkk/tLQHGnjhy89wQUTD8WXoy81IiKSexkncOdcEJgJHACUJmpjZn/pYVzdNrKsirmjjsrb86YOHsn4gcNYs2tbwkRe7g/y+Skn5C2exrYQq7anXnHfHG7j9dqtHD5sdJ6iEhGRbMsogTvnLgd+DCRbUu2IVWsrWAIvhJ8dcxGfeOoWmsIhQtG929nK/UFOGDmZ88cdkbdYmiNt+J0jnGJQwOccTVrQJiJS1NKeA3fOnQH8EfgQ+BqxZP0P4FvAE97rxcBV2Q+zdxtXMZT7T7uWKybPZkTZICoCpUwfPJrvHnUePz16Pr4Ui9yybUhJOaX+1N/LWiNhJlUOy1NEIiKSC5n0wL9KrOb5LDOrd84tAFaZ2feA7znnrgZ+CfwsB3H2esPLBvLl6XP48vQ5BY3D7/Nx+UEz+f2bLyScBw84HyeMnsCI8ooCRCciItmSSddwJnC/mcWf973n82a2EHgO6LU10/uLLx12PNOGjKS8U0+81Odnv/KBLJh9VoEiExGRbMmkB14BbIl73QoM6tTmBeAzPQ1KeqbUH+DOuZewqOYVbn3zRbY172ZwSRmXTJ3BZVNnUFlSVugQRUSkhzJJ4FuBEXGvNwOdS6ZWZnhPyZESv59Lps7gkqkq2iIi0hdlMoS+mo4JexlwunNuNoBzbhpwkddOREREciiTBP4wcLxzrn3z8I+IbRl7xjm3BXiNWA/8+9kNUURERDrLJIEvBA4EagHM7HVgLrAEaCC2lewcM3sg20GKiIhIR2nPV5tZCNjU6b1lwJnZDkpERERSy6SQS2UuAxEREZH0ZTKEvsU593/OuTNcro72EhERkbRkksA3AZ8ktpjtfefcTd7KcxEREcmztBO4mU0Fjgd+DwwAbgBed84975y7xjk3JEcxioiISCcZnbJhZsvN7GpgNLHe+CPADOBXwGbn3GLn3DnZD1NERETideuYLDNrNbO7zOwsYAxwPbAGuBC4N4vxiYiISAI9PufSzLYBK4GXgDZix4qKiIhIDnW7brlzbjLwaeAyYCyxxP0ucEd2QhMREZFkMkrgzrnBwMXEEvcsYkm7AbgduM3Mns56hJJSU1uIe9a8yd/ffoPmSJijRx3AZw6fwfjBWlMoItKXpZ3AnXN3AecCpd5bTwK3AXebWVPWI5MuvV+/k4/f81caQiGawm0AvFO7g7vefI3/PvF0Lp52WIEjFBGRXMmkBz4fqCHW277DzN7LTUiSDjPj0w/ezY7mJqJme95vi0ZpI8q3nnmMQ0eM5JDh+xUwShERyZVMFrGdaGZTzOx7St6F9+KWTWxtaOiQvOOFIhEWvvRCnqMSEZF8yaSQy7JcBiKZeXHrJloj4aTXo2Y8t/n9PEYkIiL51ONtZFIYAefwdVGSPuDTX6+ISF+lf+GL1CnjJuB3yf/6gj4fH5kwJY8RiYhIPnV7H7gU1kHDRnDkyNGs2rqZUDSyz/Wgz89nD59ZgMhERArnvZ07uX/1W2xvbGTysKF8bPo0KsvKCh1WTiiBF7GFZ36MTz9wN2tqd9AcbsOAAcEgDsetZ13A2MrBhQ5RRCQvomZ849Gl3PvGaiJmhKNRygMBfvjUv/ju3NO58NBDCh1i1imBF7HBpWXcc+GnWLl1Mw/WvE1TWxszR+3PuZMPpjwYLHR4IiJ589N/LeP+1W/SGtk7Itkcji30/eaSxxhdOYjZ48YVKrycUAIvcs45qkcfQPXoAwodiohIQTS3tXHbqlV7EnZnLeEwP3vmWWZ/qp8ncOdcADgFmAYMNLObvPdLgIFAnVmSzckiIiJZtmrT5pSLegFe2ryFUCRCid+fp6hyL6NV6M65OcA6YueA/xz4XtzlmcB2YrXSRURE8iIcjXbZxgHRNNoVk7QTuHNuBvAAsV77fwB3xl83s+XAeuCCLMYnIiKS0iEj9yMU2Xc3Trz9Kysp62NrgzLpgX8TaAaqzewnwNsJ2rwIHJmNwERERNIxvKKC0yZNTDo8Xh4Mcs2sY/McVe5lksBPAO4xs80p2rwHjO5ZSCIiIpm56cwzmDBkCAPietkOKA8GOOfgg5h3WP/eRjaQ2Bx3KuWoupuIiOTZoNJS7rn8Eh5Z8w7/99Ir1DY3MWnoUK6onsExY8bguig9XYwySeCbgK6+whwJvNv9cERERLqnxO/n3GkHc+60gwsdSl5k0lt+BDjTOTc70UXn3BnA8cQWuomIiEgOZZLAfwDsApY6574PHAzgnPuI9/puYBvwk6xHKSIiIh2kPYRuZhudcx8B/gZ8HTBiawQe8n5fD1xoZl3Nk4uIiEgPZVSJzcxWOOemAh8DZgHDiPXKnyO2Qj2U/RBFRESks7QTuHNuf6DN62Hf7f0SERHpVULhCEtWv8N9r7xJc6iNGeP255PHHMGowYMKHVpWZdIDfx+4A/hMjmIRERHpkQ/qG/jU7++irqmZplAbAK9u3Mrty1/i++fP5ezD+84K9UwWse0EPshVICIiIj1hZlz1p3vYWr97T/IGCEUitIbD3HjfEtZs21HACLMrkwT+PHBUrgIRERHpiVc3buW92p1EookPxGyLRPjDMyvyHFXuZJLA/xs42Tl3RY5iERER6bYX129MeahJJGo8W/NeHiPKrUzmwE8HHgdudc59gdjBJVuJbSeLZ+1nhIuIiOSLzzkcjn3T0l59qaJqJgk8/uzvY7xfiRigBC4iInk1e9I4fvnE8qTngwd8jlMOmpjnqHInkwQ+N2dRiIiI9NC00ftx8KgRvL55G+HIvkk86PdzxXEzCxBZbmRSie2xXAYiIiLSU7+55GNc8cdFbKyr37MSvSwYwAE/vfgcJgwfUtgAsyijSmwiItJ/hSNRnntjPVs+rGfIoAGccNgEykqDXX8wj4YMKOeeL17GszUbeOC1t2gKtTFj7P5cMOMQBpeXFTq8rFICFxGRDtZs3s7L6zfj9/k47qADGT2kkuWvr+fG3z9EWzhCJGL4/T7MjOvmncS8U48odMgd+HyOE6aM54Qp4wsdSk5lUkq1jVRL+/YyMyvtfkgiIlII2+sbuO7W+1m79UMMw+GImnHEuNG8tXozraG4LVpenZSfLXqKstIA5xx3SGGC7scy6YE/T+IEXgVMBkqB14D6LMQlIiJ51BIKc9nP72Lbrt37FEJZsW4j+I1Eg+UtoTC/WPwvzpo1HZ+vD+3RKgKZLGI7Idk151wl8AugGjg3C3GJiEge/fPlt6lrbE5YxcwAAhD1gS/BDq2W1jbeem8b08ePynmcslcmldiSMrN64HPE/p6/n417iohI/vz9uddpjqsfnkg0yXo1n8/R3Jr6s5J9WUngAGYWAZ4ALsjWPUVEJD8aW0OpGzgHSUbIQ20RDhw1NPtBSUpZS+CeEqDvbLITEeknDh03En+qOqMGLkGZcb/PcfS0cQwfXJG74CShrCVw59wUYD5Qk617iohIflx60gwCAX/S6z7nGOA6Xi8J+hk+eCDfvOKMXIcnCWSyjezmFPcYC5zk/fcNWYhLRETyaMro4Vx75mx+88/ltLSF97zvc46SgJ8fXXYWO7bv5i9LX2L7zgYGDSjl4ycfzkWnHcmgAX2rQEqxcGbpbO0G51zi6vB7rQV+bGa3pHO/6upqW7Gi75zLKiLSF6xYu5HfP/YCr6zfjM/n46TpE/jc6UczedTwQofWbzjnVppZdVftMtkHPiXJ+1Ggzsx2ZnAvERHphaonj6F68phCh9HrtLS08dgTq/nHQy/T2NjKxAkjmHfh0Rx2SOH+rDLZB665bRER6XfqdjZy7XV/om5nEy0tse1ymzbX8fyL6zjv7KO45urTChJX2ovYnHM3O+fO6aLNWSnmykVERIrOf3//Pj7YvntP8gYwg9bWMP946GX+tWxNQeLKZBX654EZXbQ5ilhBFxERkaK3aVMdb761hUiC88UhNrT+p788m+eoYnKxDzzBTkEREZHi8+bbW/D7U6fKde9+kKdoOso0gSddsu6cCwInAtt6FJGIiEgvEQj4SFXfBsDny3ZfOD0pF7E55zoP7F/nnLssQVM/sB8wANAcuIhIgYRawzz9+GqW/+ttMDj2hKmcfPp0SsuSFDKXlGYceSDhcPKBZefgmOqJeYxor65WoQ9gb6/bgCBQnqBdBFgDPAb8d9aiExGRtG14dztf/eLthEJhmptitc1XPF/Dzb9Ywo9/fRkTJo8scITFp7KynDPnHsYjS1+ntTW8z/WSkgCXX3JcASLrIoGb2Z4Nbl4hl/81s+/kPCoREclIa0sbX/3i7eza2dTh/eamEM2E+I9r7+BP915HeXlJgSIsXv/vmjk0NLbyzLPvEIlEiUSilHkjGjd+7VymTinMMaqZFHKZC6zLVSAiItJ9Ty19I2EPsV0oFOHJJW/w0fOOymNUfUMg4OcbXz+P9zfW8sRTb1K/u5kJ40dw2inTKC8r3BeiTAq5PJbLQEREpPuWPf02Lc3JjwRtaQ6x7Mk3lcB7YOyYoVx+yfGFDmOPTHrgwJ7V5jOBA4DSRG3M7C89jEtERDJg0a7PtYim0UaKR0YJ3Dl3OfBjIFlVe0dssZsSuIhIHh17whReXvkuLc1tCa+XlQeZdeLUPEcluZRJKdUzgD8CHwJfI5as/wF8C3jCe70YuCr7YYqISCqnfeSwlOd5+/0+5px5eB4jklzLZPf5V4E6YJaZ/dh7b5WZfc/M5gBfBM4H3sxyjCIi0oXy8hIW/PIyBg4s27NCGqCsLEjFwFIW/PIyBlQknPWUIpXJEPpM4D4zq497b88XADNb6Jy7BLgROCtL8YmISJqmHDyaP993HUsffpVnn34LM5h94kHMPfsIKpS8+5xMEngFsCXudSswqFObF4DP9DQoERHpngEVpZw372jOm3d0oUORHMtkCH0rMCLu9WbgoE5tKunGynYRERHJTCbJdjUdE/YyYL5zbraZLXfOTQMu8tqJiEga1r2/g7sfeZn1Gz9k+JCBfGzO4Rw1fQyuqxM0pN/LJIE/DPzUOTfazLYAPwLmAc845z4g1jv3Ad/PfpgiIn2LmfHbv/yLRQ+/RDgcIRI1HPDMihoOPWh/fnzD+ZQENaApyWUyhL4QOBCoBTCz14mVV10CNBDbSnaOmT0VD/VUAAAgAElEQVSQ7SBFRPqaJcveYvE/X6I1FCbiFVgxoLm1jVff2sTPb3+yoPFJ75d2AjezkJltMrPWuPeWmdmZZjbFzOaa2UO5CVNEpG/5/aJnaUlSu7w1FOahJ9+gsak14XURyKwHLiIiWdDYHGLLtvqUbQIBH2+u25aniKQYdacW+iHAJ4FpQIWZnem9Pw6oBh43s51ZjVJEpA9xjljtylSs6ybSv2XUA3fOfRN4BfhP4AJic+DtgsAi4NKsRSci0gcNKCth7KiqlG0ikSjTJ4/OU0RSjDKphX4R8G3gcWI97QXx182sBlgJnJfF+ERE+qQrLz6estLEg6ClJQE+NvdwyuNKoop0lkkP/DqgBjjXzFYBLQnarAamZCMwEZG+7NRZU7n8/GMpCfoJ+GP/FPuco6w0wLFHjOfaS04qcITS22UyB344cFv8KvQEtgAjexaSiEj/cMXHZ3HGidO4d8krewq5nHPaYUyfPKrQoUkRyCSBOyDaRZsRxGqki4hIGvbfbzDXqLcNwPs1H7Bq2TuYGYcdPZFJ0/cvdEi9WiYJfC0wO9lF55wPOAGVUhURkQw01Dfz/f/3Z1avWo/Fatrg8zkOnDKSb/3uCoaO6HxulkBmc+B/A2Y6565Lcv16YvPff+1xVCIi0i+YGf95xS28vuJdQq1h2kKxX60tbdS8uZmvfvK3tIUSF7zp7zJJ4D8DXgN+4pxbBnwEwDn3Q+/194EXiZVcFRER6dIrz9Xw/rrthNsi+1yLhKPU7djNs0veKEBkvV8mpVSbgFOI9bCPBWYRmxe/3vvvO4EzzKwt+2GKiEhf9MT9L9HSFEp6vaUpxJK/r8hjRMUjo0psXoW1S51zXwGOAYYBu4DnzWxrDuITEZE+rKkh0Y7kjppTJPj+rFtn1ZnZduDBLMciIiL9zLSjDuTFp96mtSXx4G0g6GfakePyHFVxSDmE7py73Dl3eL6CERGR/mXux6tTFn33+RznXnpc/gIqIl3Ngd8GnB//hnPu0865x3MWkYiI9BuDBg/gaz/5FKVlQXz+vSnJ+RylZUGu/fYFjDxgSAEj7L26M4Q+Hjg5y3GIiEg/Nev06fz87i+x6PdPseKpt7Gocfixk5h/1SlMPWxMocPrtbo1By4iIpJNB04ZxVcXXFzoMIpKRseJioiISO+gHriI9HtrVtaw/P4VhENhph93EMecdRR+v7/QYYmklE4Ct5xHISJSAA07G7nxnJtY+/J6Qi0hLGqUDyqjfGA5P3zkRiYcqu1L0ns5s+T52TkXJfMEbmbW5ReD6upqW7FC1XVEpDDMjOuOv5G1q9YlrLU9cEgFt6/5JZXDdJCG5JdzbqWZVXfVLp05cJfhL82ri0iv9/aLa3n3tQ1JD8oItbTx0O8fy3NUIulL2VM2MyVjEemTnr3vRVpTlOgMNYd4/K//4hM3nJ+0jWTu9eXv8Jf/fYg3nnsHgENmTeZT/342h86eUuDIio8WsYlIvxRqCZFqChGgrUXHWGbTQ7c/zc3fWExr894vTi899RarX1jHld+Zx9lXnFTA6IqPetgi0i8dctzBlA8qS3rdH/Bx+MnT8xhR37Z9Uy0L/2tRh+TdrrU5xM03LmL7ptoCRFa8lMBFpF+afV41JWUlSa8HggEu/PLZeYyob3vwtqdTjniYGQ/+8ek8RlT8lMBFpF8KBAP88J83UjF4ACVlwT3v+/w+SgeU8KVffY4Dp6mMZ7asffW9pAsGAdpCYd559b08RlT8NAcuIv3W5KMm8Me3f8GDCx/liTuXEW6LcPhJ05j3/53LgdPHFjq8PmVQVUUabQbkIZK+QwlcRPq1IfsN5tJvzOfSb8wvdCh92pxPzOa5R16lpbE14fWyilLmflLHhmZCQ+giIpJzR518MAceNJpg6b79xmBpgHFTR3HUyQcXILLipQQuIiI55/P5+MHdX2bmqdMJlgYoqyilrKKUYGmAmadO56a/fwWfTykpExpCFxGRvBgwsIxv/ekaPthYy+vLY4VcDp09hf3GDC1wZMVJCVxERPJqvzFDOW3+sYUOo+hpvEJERKQIKYGLiIgUoZTHieb0wc5tBzYU5OEiIiK914FmNqKrRgVL4CIiItJ9GkIXEREpQkrgIiIiRUgJXEREpAgpgYuIiBQhJXAREZEipAQuIiJShJTARUREipASuIiISBFSAhcRESlCSuAiIiJFSAlcRESkCCmBixQx59wC55xl+VddoX8uEemaDjMRKWLOuYlAjffyBjP7UQafrQKqgRnAXGBO3OW5ZrY0a4HufeYM7zk7gXXACjPbme3niPQHSuAiRc45Nw9Y5L2caWarunmfKmABcBWw2MzmZynE9vtf5f1nLXAxMA/YaWZDsvkckf5CCVykD3DOLSKWENeZ2aQe3msesMjMXFaC23vfhWZ2ddzrKmBid79wiPR3SuAifYRzrgaYSBZ6z86564l9GVicleBi91xpZjOzdT+R/k6L2ET6jvakPc/rRXebN5d+dM9D6mCdc25Blu8p0m+pBy7Sh3g95/YkOcnM1hUynnjOuTnAEnK0QE6kv1ECF+ljnHNLiK30XtXbhqy9Yf6hwAStPhfpGQ2hi3icc1XOuZXOuTpvP/RVSdot8BaN9VbziW3TmtGbhqy9HvgCoAq4pcDhiBQ9JXARj5nt9HqsN3lv7TPM662cvp7YHuZeyevZts+HX+8lzoJxzs1wzi0ys6VmdjOxP9d53p5wEekmJXCRfR1NbH9yoiTd3iu/K4/xZMybY77Ze7nI++KRd16Sfgy4Mu7thd7vF+fyud5oiuYIpc/SHLhIJ14p0aWJtmJ5c7jrzGxuGvdZSMfqZplYmElVtRQxtG8tW5pOzNnmPb/Dz+J9magjB8ViOj37KmB+IX5ukXwIFDoAkd7EK01aRWy1dOdr84glw7QSQnzRkgKaS6zU6hzn3Ix8Fk3xEuhE9o4EALEhfuccxCqy5dJcEvw9ivQVSuAiHbX3mDvMf3u9xluAq3vT1qyumNk659xSYqMG+a54Np9Yzz/ZavOaJO9nyxz2rmcQ6XM0By7S0VwSz38/RiwZ3ZzgM72Wty98aIFGA6qBfb40eKMcxF9zzs1xzl3VedW8c25Rdxa7xT1jonNunrdzYGLKD4kUGfXARTqaA6yIf8PbMrYu0/naQs+Be6vPvw5M6Ml9Utz/emJFWVJNKXyY4L32mu1LvftUAVVmdrO36OyGTm2vTHCPruwZSfGG7NcRO/ClV+2LF+kJJXART+f5by+xPAbc1Z1kWsg5cO9nWQScnsOCKTfTaX67kxVAooNVrmZvtTiAajNb7H3h6NArJzYasjPuvSrgljS+TM0ldrxq+2d3Ejs2dY8M7iXSK2kVuojHW3S1kNg//jOIbSe7oZjmvNt5q78XFHLI3/sSsZK4qmvtQ+RmdkOC9guBmvYvS14P/+juJFhvJ8HM9r87bwHiLTq6VPoS9cBF9ppJrEDLXLrZ6+4NvCH/Hs/XO+cmJvry4iXDocQSZNJRBm8B3enALc65F4n1xmtS/LleRMch7rnsPec8k7jbh+TjY59LgsI8IsVMPXCRPsTr4c7paQ10r/d8Q+cE7Y1SLPWScx1ZqmnuPa8m/gxybz58Zvvq+bhtfItTjYp491oSfy66F+vpmd5LpDfTKnSRPsKbM74KOD0Lt1vE3opp8Wq95F1FbL1AttQSm6cG9nxRIC7hziHWg040lz0xvja9l5Dj77UAuDmde4kUE/XARfqAuPnmPb3Mbt6niljyrk41X+wlwYXxvdye8ua8IZZY5xIbBp/bqc1C77mdF7stIlZ1rX1l+zxiaxg+JLYQbp/phET3EikmSuAiRc5LuiuJDXkv7sE9riK27awK+FGihWZx7RcQS7A5WWnvHYm6pPN8uXNuZbLpAefcvEx+/lT3EikGWsQmUvzah4+HJjsCtZMqYJj3+1Biw8idi5x0dVhLVqucxc9Re18mqtl7olq8hOVXvRGITOeyc13KVSSnlMBFipiXsNuLliSas+6OdMquziBLq7q9hH1z3DNvAa7svDiu8z7xTuZlsmugi3uJFAUlcJEi5s3t5nWvt1fadGfnBNtdXqW0Gu/LyCRi89KJvhwkPJzE+wKQaTLWQSdS9DQHLiIZ6UmBlW4+b55Xqa3Hc9bZvJdIoakHLiKZupj8nvJ1sXNuKN2riZ7Le4kUlHrgIpKSN0T9LrEqaVXAomxuHxOR7lEPXETSsZTYYrlJ6EQvkV5BPXAREZEipFKqIiIiRahgQ+jDhw+38ePHF+rxIiIivdLKlSt3mNmIrtoVLIGPHz+eFStWFOrxIiIivZJzbkM67TSELiIiUoS0Cl1ERIqeRbZCy6NgjRCYCqUn41zfTnF9+6cTEZE+zSyM1X8bmu8FHNAGrhwogSG/xZX03SPfNYQuIiJFy+q/D833AyGgFYjGeuFWh9V9FgunNZ1clJTARUSkKFm0FpoXAy1JGrRijXk96yevlMBFRKQ4tf4L8KdoEIGWf+YrmrxTAhcRkeJkLUC0izZteQmlEJTARUSkOAUPAedStwlMyU8sBaAELiIiRckFDwXfGJKmMleOG3h1XmPKJyVwEREpWm7Ib8ENBko7XSiHsgugdG5B4soH7QMXEZGi5QLjYMQ/saa/QvPdYE0QmIqruBJKjselGGJvDr3Bh7v/SGu4hqB/FEMHXkpF6XEpP9ObKIGLiEhRc74huIHXwMBr0mpvZmzZ+S1qG/+KWQiIAFDf8hgVJUdz4Ig/4nMlOYw4OzSELiIieReNfEjj7l+w88NL2VX7BVpbHsUskpdn1zXe5SXvZtqTN4BZE42tz7N153fzEkdPZdwDd87NAj4DHAUMBnYBq4DbzOy57IYnIiJ9TUvzQ+yu+zfAaC/C0tb6OD7//lQNuxuff1jOnm1mfFD/My95J7hOC7WNdzJy8Nfw+ypyFkc2ZNQDd879FFgGXAlUA1O8368CljnnfpL1CEVEpM8It73N7p3/BjQTX0HNrJFIeD27aq/I6fMj0Z2EI9tStnEEaGl7PadxZEPaCdw5dw1wHbCBWAKfAgzyfr8KeA+4zjn3xRzEKSIifUBTw2/BQkmuthEOv0k4h8nTOR+WVsveP8OcSYTXAFuBajO71cxqzKzR+/33wNHANuDaXAQqIiLFL9T6FPHzzvuwCKHWZ3L2fL9vMCWBsV20ilBecljOYsiWTBL4JGCRmdUmumhmO4C7vXYiIiLdkF7/uCdGDv4PnCtPeM25coYO/Cw+V5bzOHoqkwReS+ystlRagA+7H46IiPRlJaUnkfIAEhcgWHpCTmOoGnAuIwZdi6MUaN8u5se5MirLP8Kowf+R0+dnSyar0O8DznPO/aeZhTtfdM4FgfO8diIiIvsYMPCLtDY/QOJh9ACBwMEEg4fmPI6Rg7/MkIqPU9vwf7SGawj4RzG04pOUl0zP+bOzxZmlN1zhnBsMPE5s29jXzOyFuGvHAj8ktqjtNDOr7+p+1dXVtmLFim4FLSIixaul6QF277yO2HC5N7DrKvD7RlI1/B58/uGFDK/gnHMrzay6q3ZJe+DOuTUJ3i4FjgSWO+dage3ACPYWod0IvAgclHHEIiLSL5QNOIeS0mNobvo/2lpfwPkqKCufR0nZHJxTgdB0pfqTGkDi1QSb4/7bR8c5b5/3ORERkaR8/v2oGPSV2LitdEvSBG5mY/IZiIiIiKSv9+9UFxERkX0ogYuIiBQhrRYQEZFexyzKhobHeaPuz+xu20jQV8GUyvM4qGoepf7BhQ6vV1ACFxHpA5raNrCxfjFN4fWUBUYzZtA8BpZMLXRY3WIW5aktX2dL0/OEzTutLNrA63W38/auuzlr7B+oCI4qcJSFpwQuIlLEzIy1dT/lvfo7MItghAE/m3YvYlTFWUwf/l2cS3+2tC60idW7HqMxXMvQkrEcMngu5YHK3P0ACbyz6342Nz1PxFo6vB+xENHITp7eeiMfHfv7vMbUGymBi4gUsc0N9/Be/Z+JWnyl6whRi7C18SHKA2OZOOQLXd7HLMqjW3/B6l2PYRYhSoSAK+Ff22/jtJFf5IghZ+Xuh+jkjbo/7ZO898RJlLrWd6gPvUdlybi8xdQbaRGbiEiRMjPW1f2aqDUnvB61FjbU/4GotXV5r2Xb/8Sbux6P9XK9MqdhCxGxEE9s+x3vNryY1diTMYvSEN6cso3DT13rO3mJpzdTAhcRKVKtke2EoqnPjzKL0hBKnezaoq2srP07YUt8XlXYWnlm+x3djjMzDl+qw04A5xwBX+LTxPqTjBO4c+4Q59z3nHN3O+f+Gff+OOfchc65quyGKCIiiUXTbJf6zIstzW91OU/+Qcta2qJdHUjZc845xgw8EXBJ25hFGVk+I+ex9HYZJXDn3DeBV4D/BC4A5sZdDgKLgEuzFp2IiCRV6t+PgK+rWqRGRXByFy0iuBQJE8DhMEt0glj2HT708/hdacJrflfGIUMuJ+Dr/ed151raCdw5dxHwbWInklUDC+Kvm1kNsJLYkaIiIpJjzvmYMPgL+Fzi4WSfK2NM5afw+xInw3b7lU4mbKGUbQYGhxPM07D1kNJJnL7/Tyj1VRFwA/ARJODK8bsSplV9gsOGXpGXOHq7TFahXwfUAOeaWatz7twEbVYDJ2clMhER6dLYyk/REHqLLY0PELUQsWF1h9+VMaRsFpOHXNflPcoDlUwddAJrdj9DJMGCt4Ar5dhhn8C51L30bBo5YAbzJj7I5qbnqA+9R4lvEGMHnqgiLnEySeCHA7eZJVnlELMFGNmzkEREJF3OOaaP+C4HVF7M+/V/obltA6WBUYyt/CRVpTPTTrpzR19HbWgjta0baduzqt0RdKUcXHkyh1d9NHc/RBI+52dMxfFQcXzen10MMkngjq5XTIxgz+nsIiKSL4NLD2XwiB90+/MlvnIuGf9z1u5+lpfq/kFTZCdDS8Yyc+gFHFB+SF5735KeTBL4WmB2sosutoTxBGLD6CIiUmR8zs/UyhOZWnlioUORNGSyCv1vwEznXLIJleuBKcBfexyViIiIpJRJD/xnwEXAT7wV6Q7AOfdD4ERgFvAisDDbQYqIiEhHaSdwM2tyzp0C/Ar4BHt779cTqxJwJ/BFszRq9omIiEiPZHSYiZntBC51zn0FOAYYBuwCnjezrTmIT0RERBLo1mlkZrYdeDDLsYiIiEiadJyoiEg/VBvaxit1y2iI7GJk6RiOqDqBUv++ldbMjJZoCwHnJ+grKUCkkkzaCdw5d3OaTc3Mru5mPCIikkNRi3DvpltYVfcUUTOihClxpfxj8x+ZN+ZajhhyvNcuymMfLOGfWx+mIbwbM2PiwElceMA8pg46qMA/hQA4s9Sn1Oxp6FxXRVyM2Mp0M7PUZ8EB1dXVtmLFirSeLSIi2fHwlj/z7I6HaUtQVDPoSvjcxG8wbsBB/KbmV6ze9TqhTjXSg66Ez034PNVDj8lXyP2Oc26lmVV31S6TfeBTkvw6GriGWBnVu4CpGUcrIiI51xpp5tkdDyVM3gBtFuLRrXfxys6XeLP+jX2Sd3ubP66/ldbI3ntELUpzpIWopXu8qWRDJtvIalJcXumcexh4FXiE2KEnIiLSi6xveguf86c8HvzdxjeoC5XQ2sXZ36t2rmDaoMO48/2HeOKD54hYBL/zc8qIY/nkuLOpKqnMcvTSWUbngadiZhuA+4AvZ+ueIiKSPZE0z/PeHtqW8nprtJX3mt7nKy/fxNKtzxKKthGxKKFoG49tW85XXv4Bta07sxGypJC1BO7ZhobQRUR6pQPKJxCxcMo2w0pGMTCQuvccdEFerltDfVsDETp+KYgQob6tkVvW/a3H8UpqWUvg3mEmpwL12bqniIhkz+DgMCYPPBx/ktnTElfKqft9nFNGnEpJii1jhrGuYTvRJAdURomysu4NGsNNWYlbEks7gTvnjkvy6yTn3CXAEuAo4P6cRSsiIj1y0dgvMbR0JCW+0rh3HSW+Uo6oOoEZQ05m9rDjGRocit/tu6GoxFfCsUOPx+8LpnxOwBdgh4bRcyqTQi7PkHLpAw54llhtdBER6YUGBAbxb1N+zKu7nuW5HY/QFGlgROkBnDjiHCZWxM79LvWX8vVp3+C29bfy2q7XCPoCmIFzcPbo8zh6yGwe3vJyyueEo2EGBSvy9FP1T5kk8B+QOIFHgTrgBTN7NitRiYhIzgR9Jcwccgozh5yStE1FoIJrJ/8bu9p2sbHpfYK+IBMrJhHwxdLGhIoxrGlYn/Tz4ysOYGjJ4CxHLvEy2UZ2Yy4DERGR3mdwcDCDB++biD83cT7ffP3ntEb33Ste4gvyuYnz93k/HI3w9PbX+Pv7z1Ab2s3+5cOYP/ZEjhl2MM65nMTfl6kWuoiIZGzqoPF885Br+eU7f6YutAu/8xGxKENKKvl/ky/joEETOrRvjrTylZW/Y0PTNpojsaS/uflDXt+1nuohU/nvwy/H77K9MapvUwIXEZFumV45md/M+BbrGzfyYWgXw0oGM75iTMLe9C/evpd1jVsIRTtuY2uJhHix9m0WbXiKT4w/NV+h9wlJE7hzbk0372lmpkr3IiL9gHOOCQPHMoGxSds0hJt5bNtL+yTvdq3RNu5870kuOvBkfOqFpy1VD3wAqVedi4hIL2JmPLjpZf5Q8xTvNX6I3+fjpP0O5qrJpzKlclTB4lrfsI2gCxAieRGZpkgrdaEGhpWqBGu6kiZwMxuTz0BERKT7zIwbX1nME9tW0xJpAyAajfDE1tUs276Gn828lGOGTypIbAGfH+uiPxg1I+jTrG4mNFYhItIHPP3BWzwZl7zbRTFaIm1c/9KdtEXTq4WebZMH7p+wKEy8cQP2ozI4IE8R9Q1K4CIifcAd656huVPyjheORnj6g7fyGNFeAZ+fyyecTlmS6m2lviCfn/zRPEdV/DIer3DOBYGZwAFAaaI2ZvaXHsYlIiIZWN+4I+X11kgbGxpSt8mleWNPoi7UwKL3/wVmtFmEUl8Qw7hmyrkcN3x6wWIrVhklcOfc5cCPgeHJmhBb+KYELiKSRwMDpdSFGpNeD/oCDAyW5TGijpxzXDX5bC4cewKPbX2JHa31HDBgGKePPIpBGjrvlrQTuHPuDOCPwNvA/wALiB1csgI4BTgNWAw8kvUoRUQkpfPHzuTmd56gNclWrSjG6aMOyXNU+xpeOpiLDzyl0GH0CZn0wL9KrOb5LDOrd84tAFaZ2feA7znnrgZ+CfwsB3GKiEgK88Ydw53rn6M21EjEOh7zWeYPcuHYoxlWOrBA0fVMbUsTi9a9wmu1WxlcUsYFEw5l5vDEBWPamRmPbH6T3771L9bWbyfg83HyqClce/BJHDR4ZB6jzx1nlt5Wb+fch8B9ZvZZ73UU+I6ZfTuuzdNAg5md1dX9qqurbcWKFd0KWkRE9rWteRc3vHQnb9dvIeCLrfoOR6NcMmE210ydU5RFUv6x/g2uf/5BHNASCeOA8kCQw4aO5tZTLmJAYN9zy82M77zyMPdseKXDwj4fjlJ/gF/PuojjRxZmS106nHMrzay6q3aZ9MArgC1xr1uBQZ3avAB8JoN7iohIlowsH8xtx13N+obtvF2/hVJ/kGOGTWRAIOF6417vlQ83c8PzD9Ia2TstYEBTuI2Xd2ziq8v/wW9O/Pg+n3tu+7v7JG+ITSM0R9r4t+cXs/zsf6fEX9z7zjOJfiswIu71ZqBzydTKDO8pIiJZNn7gCMYPHNF1w17u168v65C847VGIzy+aS1bmuoZPaBj9bY/vPNcyi11hvHo5rc4Z+yhWY033zIZT1lNx4S9DDjdOTcbwDk3DbjIayciItIjy7auT1m/LeDzsXzrhn3ef6f+g5T3bQyHqKnf3sPoCi+TBP4wcLxzbrT3+kfERjOecc5tAV4j1gP/fnZDFBGR/qir8qtYbFi8s4HB1FMGJT5/l22KQSYJfCFwIFALYGavA3OBJUAD8ARwjpk9kO0gRUSk/5kxPPWRHBEzqkfs22b++BmU+RNXfYtxnDmm+AvHpD1fbWYhYFOn95YBZ2Y7KBERiXltx1Zufu0FXtmxlYpgCfOnHMb8KYcyqKT4e5Bd+dKhx/PSjk0J57ODPj8zR4xh/KCh+1z7+IFHcuuaZ2mLRhJuqTtrzCEcMKAqZ3HnSybbyCrNrD5bD9Y2MhGR1H758rP86pXnCEUjRL1/q8v9AQaWlHLPOZcydtDgAkeYe7e++QL/8+qTRKJRwl4yrgiUsP+ASu6aexlVpeUJP7etuZ5/e34xb+3aig8fzsW21F00fgZfO/wMAr7eu6Uu3W1kmSTwRuBe4HZgiaX7wSSUwEVEklu+5T0+s2QxzeF9V2H7nGNK1TAeveCzBYgs/9bVf8gda1bsKeQyf+IRzBkzhaAv9QlnADW7d/Ba3WZKfQGO228Cg0sSJ/zeJBf7wDcBnwQ+AWxxzv0JuMPM3uxmjCIiksSvX1meMHlD7Ozs93bv4pXtWzhixOiEbfqSiZXD+Hb1R7r12UmDhjNpULLjOzJT19LMG9s/wO/zcdTIUZQFUs2z514mc+BTvS1jVwDzgRuA651zK4j1yv9qZnU5iVJEpJ95ZcfWlNej0Sirtm/uFwm80BpDIf7rqaU8XLOGEn+s1x8x43NHzOQrxxyHL0VJ11zKaBLAzJab2dXAaGK98UeAGcCvgM3OucXOuXOyH6aISP8S6KLsqXOOkjSGkKVnwtEon7z3bzxcs4bWSITdoRC7QyGa2tr4/csr+K8nlxQstm7N4ptZq5nd5dU8HwNcD6wBLiQ2Ty4iIj3wkQOn4E91WAfGKWMm5jGi/unRdWtZu7OW1khkn2vN4TB/f3s1G3btLEBk3Uzg8cxsG7ASeAloI3YmuIiI9MDVhx2TtFZ3qd/PnLGTOWBgZcLrkj1/fv1lmtqSl2WNmHH3W2/kMaK9up3AnXOTnXPfdc6tB5YClxXuKlAAACAASURBVAMbge9kKTYRkX5rwuCh3Db34wwKllLhLZbyO0eZP8AJ+4/nJyd1eeijZMH2pqaU18PRKNubGvMUTUcZHTzinBsMXAx8GphFrLfdQGwR221m9nTWIxQR6admjR7Hyk9dy8Pr1/Dajq0MKinlrPEHMXVIdlZVS9cmDRnC2roPkxZ1LQsEmDxkWF5japd2AnfO3QWcC7SX/3kSuA2428xSf0UREZFuKfUHOH/SdM6fVPylP4vRZ4+YyVPvbaA5nHgY3cy48ODC/N1kMoQ+n9he8G8BE8zsdDP7k5K3dLatoYEXN25kzY4d9LDej4hIQR09+gDOnXIQ5YF9+7tlgQDfOuFUhpQVpjhMJkPoJ3q1z0US2lRfz9cfeZQXN22i1O8nHI0yvKKCb512KqdO1GpZESk+zjkWnHoGR40cza9WPs+2xgbMjOnD9+Pfjz2eUw6cULjYCtVDUinVvuWDhgbOvuNP7GppIdLp/6myQICfn302cyZPKlB0IiI9Z2Y0trUR8LmcVmFLt5Rq763mLkXlV889T31r6z7JG6AlHObGJUv2HMYgIlKMnHMMLCkpeAnVdkrgkhV/X72acDSa9HpTuI2V/397dx7nRH0/fvz13iR7cSgIcgseqAioHCoqCkqp900p3kcrHvWobe23WtuirW3VCrWXZ621/hQFtYKiqBxSVFAUlYpHQRG5FHA5dzfZJO/fHzOBISTZZDfn8n4+HvNIMvP5zLwzm807M/OZz2flyqTLjTHGZMYSuGm2SDRKXYqODgAEYX0j91MaY4xJnyVw02y+sjJ2q6hIWSaqSte21muUMcZkiyVwkxXnH3rItlF6EulQXU3/Tp3yGJExxrRslsBNVow97DC6tmmTMIlX+f3cffJJSIGG3DPGmJYo4wQuIn4R+ZaIXCsiN3nml4tIe7Fv6V1Sm4oKnj3/PL7bvx9VgQCVfj+BsjKG9tyLp84dw8CuXQsdojHGtCgZ3QcuIt8CHga64fSDrqrqc5cdCcwFzlfViY2ty+4Db7lCkQg1dXW0Ki+ndXl5ocMxxpiSkvX7wEVkIPA8Tu9tNwI7JGlVfRNYBpyVUaSmxSn3+ejUurUlb2OMyaFMulL9JVAHDFbVVSLyqwRl3gYGZCUykzMNkQjzln1JTW0de7XbnUO6dbbr08YYU2IySeBDgWdVdVWKMssBG6S2iP37g8X85uXZRKIKKKrQvlUVE846mUO6dSl0eMYYY9KUSQJvDaxtpEwVu2DL9uXrN/DSok/YVB+kd6cOfLtvb6rKi6OrPa+p//2YX06bQX04vMP82g0NXPTYZCZdei7772njDBtjTCnIJIGvBPo2UuZQ4POmh9M86zfX8o/ZC/j32x+ypT5Ix7atueCYAYw56hAqApm81fSEI1F+/sx0Xv7wf0SiSjgapao8wK+nzuTu757CsAMKN0pNvEg0ym9fnr1T8o6pbwgzYfbr3Dv6jDxHZowxpikyOVqeDpzotjbfiYh8Gzgap6Fb3q2u2cTZdz/K43MXsrG2nkhUWbNhM39+6Q0u+uuT1DckTlzN8dsXZvHK4iUEw5Ft/YDXhRqoDTVww8Tn+Wj111nfZlMtWvVV0uQNoMBrS5bREInkLyhjjDFNlkkC/y2wEXhVRG4HDgQQkRPc108DXwHjsx5lGn4+cTobttbTENlxQI1gQ5ila9bz4Kvzs7q9DbV1PPPuh0l/GITCEe6bld1tNsfmYJCyNBqqBVMkeWOMMcUj7QSuqiuAE3CS9E3AaJx7wae5r9cCJ6lqY9fJs251zSY++GJ10uEqg+EIT7zxPtFo9oazfHPpcgIpug6NqjLn02VZ215z9WrfjlAjR9fV5QGq7dYvY4wpCRldGFbVBSKyP3AGMATYA+eofB5OC/VQ9kNs3Odrawj4fQTDyRNUfaiBLcEgbasqs7LNhkiUxjrBiaQYXjPferTbjb6dO/HeysQ/dCr8Pi4YfEhaR+nGGGMKL+0ELiJdgQb3CPtpdyoKrSvKkx59x0RVqcxiQ7b+3To1mqD371RcLbrvOuNERj38OJuDoR3G7q70+9m3Q3uuOPrwAkZnjDEmE5lcA/8SuDNXgTRHvx6dUyZnAY7avyfl/uwl8L07tqdv1074yxIfsVYF/FwxvLgSYo92uzF17IWcO+hgWleUUybCnq1bcc2xQ3ji4u9SFSi+W9+MMcYklnZf6CKyHnhIVf8vGxvOdl/oL7zzEeMmv5qwUVllwM9j147hgK4ds7Y9gLWbt3Lu/ROp2VpLnbtdcbf3ncP6838nDbMezowxxmQk3b7QMzkknU8Rd5N6yqA+hCIR7pzyGqpKVJ1k2qaqgrsuODnryRugY5tWTLnuIqa+9xGT3l7E5vog+3fuwCVHD2JQr25Z354xxhgTk8kR+BHAHOAKVX2kuRvO1WhkDeEIb/5vORu21tGtfVsG7t3NjoKNMcaUjFwcgY8AZgJ/F5ErcQYuWYPTB4iXqurvMlhvVgX8Po7tUzw9oBljjDG5kEkC/43n+eHulIgCBUvgxhhjzK4gkwQ+MmdRmJwKNoSZ9/EXbNxaT88923Hw3l3ssoIxxpS4tBO4qs7IZSAmN578z/vc8+//IAgaGz60TRV3XnYKfXt2LnR4xhhjmij7Q3S1QOFIlP+8v5TZC5cSjUY5om8vRh62f05GOMumyXM/YMKzc6gP7Xhr3cr1DVz+p8n8vxvPY+/O7QsUnTHGmOYo7gxUBFat28jYO55i09Z6aoMNALy2cCkTJs7mbz8ZxQF77VngCBNriES457m5OyXvmPpQmHunvcmdl52S58iMMcZkQ9o9sYlIg4iE0piCuQw4n8KRKGPvfIqva7ZsS94AtcEGNm6t58q7JrGltjjf7sIlK1N2LxtVZeb7Sxrtz90YY0xxyrQjl0Tf9rsD+wEVwCJgUxbiKgpz3/+MTVvrkybChnCEqa9/yLkjB+Y5ssZtqQ/RWDO1SDRKOBpNOaqaMcaY4pRJI7ahyZaJSFvgT8Bg4LQsxFUUXntvKbX1DUmX14fCvLrg06JM4Pt0br/T2Ojx2reutuRtjDElKpPBTJJS1U3A93CO0G/PxjqLQaSRBAg0OgpaKsFQmHCKIVCbo1en9uzbZY+kw4NWBPxccHzx/fAwxhiTnqwkcABVjQCzgLOytc5CO7J/L6orko/QVRHwMbR/Zr2+qSrTZixizJUP8u0xf2TE6Alc+dPHWPD+F80Ndye/v/RkWldV4Pft+GeuDPjp02NPLjjOErgxxpSqrCVwVznQLsvrLJgRg3pTHkh+irmsrIyzhh2c9vpUlT/c+woTHniVlWs2EI0q0ajy4aer+dntz/DCq4uyEfY2e3Xcnck3X8h3hh5Mm6oKfGVCl/Ztue6MoTx43SgCfjt9bowxpSrtwUwaXZFIb2AesFpV+zVWPleDmWTb/75cy9g7n6IhHNl2S1ZFwE9ZmTDhujMYfOBeaa/rg8Ur+PGtk6kPJr6uXl7u59m/X0nbNlVZid0YY0zpyfpgJiLyQIp19ACOdZ9nZbzwYtG7R0em3vl9pr3xEa8u+IRIVDm6/96cNaw/7dpUZ7SuSVPfIRhK3ihOgJdfW8yoUwc1M2pjjDEtXSa3kX2/keVLgLtU9aFmxFOUWldVMHrEoYwecWiz1rNsxXpSnfAIhsJ8vnx9s7ZhjDFm15BJAu+dZH4UqFHVDVmIp0Xbfbdq+DJ5gvb5ymjfrlUeIzLGGFOqMrkPfGkuA9kVnHnioXyyZA11Se4t9/nKOGH4QXmOyhhjTCnKpCvVB0Tk1EbKnJziWvkub9iQ3nTv0o5AgpbtlRV+Rh7Th+5d8teI//MV65k+9yNmvfVp0XYJa4wxJrFMr4GvAJ5PUWYATocuY5sTVEvl9/v48+1juPOv05n71pJtiTwSiXLOKQO5/Pxj8hLHmnWbuPmPU/lsxTp8ZQIiRMJRRp0wgKvHHENZmY0VbowxxS7bo5GVA7npWqyFaFVdwa03nk7Nhq18svQr/P4y+h3YjcoUHcZk06Yt9Xz/F49Ts7mWaHTHFnVPv7KQUEOYH118fF5iMcYY03SZduSStA21iASAY4CvmhXRLqLd7q0YMmgfBh/SK2/JG+DZGe+zpbZ+p+QNUB8M89zMD1i/YWve4jHGGNM0KY/AReTTuFnXi8iFCYr6gD2BasCugRexqbMWEWxIfpJERJj99v84Z2TzbpkzxhiTW42dQq9m+1G3AgEgUTdhEeBTYAZwa9aiM1mXanQ1cIZItQZtxhhT/FImcFXtHnsuIlHgblW9LedRmZzp2bU9NZtqky6vLPfTq2v7PEZkjDGmKTK5Bj4S+FeuAjH5cf6pg6lKcc3d7/Nx9MB98xiRMcaYpsikI5cZuQykJQrWNzBvxmK++XoTHbrsxhHH9aE8jw3WEjl6wD4cd0RvZs7/lPpgeNv8MhHKy3387ken7zT8qDHGmOKT8W1kbmvzQUA3oCJRGVV9vJlxlbyXn36be389BRGhIRQmUO7s6ut+fTbDT81PA7E1X21kydKvKS/3cXC/HlRWBhARbrniRA7v14t/Pjef5au/we/3ceygfbnkrCHs071DXmIzxhjTPBkNJyoiFwF3Acm+5QVQVW10oOlSGU60KV5/eRF3/eRJggkajFVUBrjlLxcy+NgDdlq2emUNy5evp1V1BX36dsPnb9qRcE3NVm6/43kWLfpye2cxUWX0qMO5+IKjraMWY4wpYrkYTvTbwD+AT4A/AHcAU4AFwHDgeGAyML0J8bYYqspDv38hYfIG57T6Q3e8sEMCX71qA7+/7d8s+fQrAgEfqorf72PsD0ZwwimHZLT9uroQV1/3L9au20wkEiXkuWXsyUnzqd0a5AdXjWjamzPGGFM0MjnE+wlQAwxR1bvcee+q6m9U9VvAVcCZwEdZjrGkrF6+npp1W1KWWbV8Peu/2gTAN+u3cM3lD/Px4lWEQmG2bg1SWxti06Y6/jz+JV54bmFG239x+iI2bNhKJBLdaVkwGOa55xeyfn3q+IwxxhS/TBL4IGCKqm5KVF9V7wfmAbdkKbaSVF8bavTUt99XRn1dCICnHn+T2q3BhD2jBYNhHvjbq4RC4Z2WJTN12ns7NE6LJyLMnvNx2uszxhhTnDJJ4K2A1Z7XQaBNXJm3gCOaG1Qp69xjD8IpejoDUIWOXXYDYPq0DwiHdz5a3l4Y3n3787S3v2VzfcrloVCYLVtSlzHGGFP8Mknga4COntergPiWWG3J/gApJaW6dQXDTjmUQHnidnzlFX5Gjhq87XayutpQyvVFVdm0qS7t7XfvnroTlqqqAN26WUctxhhT6jJJ4IvZMWG/DowQkSMBRKQPMNott0u74pbT6LLXHlRU7njPd0VVgB777sllPz5p27wOHeNPYuxIgK7ddh4jfP3azcyc9gGvTH2PVV9+s23+6HMOo7Iy+b3mgnDs0P3TfCfGGGOKVSZHyy8CE0Ski6quBu4ERgFzReRrnKPzMuD27IdZWlq1ruSep6/l5clv89y/3mDj+i2069CGMy8ZysizB+3QmcvZow/n4ftnEUxy3bpN2yr69t/Woy3B+gbG3/ocr89cjN/vQ4FoOMpBh/bg53eMZsgR+3LUkfvxxptLqI9rCV9R4efnPzuN8vJd+iSJMca0CGnfBy4i5ThJep2qBt15RwO/APYFlgETVHVaOutryfeBZyIUCvOTax9j6ZKvCHmSuAhUVAS444/nc1C/btvm33z1oyx694sdygL4Az66dm/PvU9eRZmvjGkvvc/jT85nzZoNiAiDBvbi0ouG0ufArnl7b8YYYzKX7n3gGXXkkk2WwLcLBcM89cQ8np30Flu31APCkKN7c8n3h9Frn+3NDj75cCU3fv8fSe8xr6ou50fjzuTYkX23zQuHI5SVlVnnLcYYUyKy3pGLyZ3yCj8XXDKU8y8+mvr6BsoD/oS3os184X0aUtxSVlcb4sVnFuyQwP3+RjvFM8YYU4Ka0hd6X+BcoA/QSlVPdOfvBQwGZqrqhqxGuYsQEaqqypMu37SxLuH94l6bN9ktYsYYsyvIqLNtEfkl8D5wM3AWzhCjMQFgEnBB1qIzO9jvwC47tWz38vnK6N2nSx4jMsYYUyhpJ3ARGQ2MA2biHGnf4V2uqkuBd4DTsxif8Rh5+qFOLzBJ+P1lnHnukDxGZIwxplAyOQK/HlgKnKaq7wKJztUuBnpnIzCzs7a7VfPjW8+kojKAxLVJq6gMcN7YYfTcd8/CBGeMMSavMrkGfjDwSOwWsiRWA52aF5JJZdgJ/enUrR1PPDiHhfOXElXlgL7dOO/yYQw6cr9Ch2eMMSZPMkngAqTotBtw7hNPleBNFhzYrzu33nNeocMwxhhTQJmcQl8CHJlsoYiUAUOxrlSNMcaYnMskgT8FDBKR65Ms/ynO9e8nmh2VMcYYY1LK5BT6H3EGKxnvtkgXABH5PXAMMAR4G7g/20EaY4wxZkdpJ3BVrRWR4cBfgDFsP3r/KaDAROAqVU3cz6cxxhhjsiajntjcHtYuEJEbgMOBPYCNwHxVXZOD+IwxxhiTQJP6QlfVtcALWY7FGGOMMWlK2YhNRC4SkYPzFYwxxhhj0tPYEfgjON2nfhCbISIXAxer6vG5C8uUiq2b65gx6S1em/IukXCEgcMO5NSLjqF9p90KHZoxxrRoTTmF3gsYluU4TAla9vEqfnrOPTSEwtTXhgD4bPFKnrl/Fj9/4DIOO75vI2swxhjTVBmNRmZMTLghwk3f/QubN9RuS94ADcEwwboQt499mHWrbVRZY4zJFUvgpknefOkDgnWhpMujkSjP//M/eYzIGGN2LZbA86RuSz1TH5zJNceO43sDfsbvLr2XT975rNBhNdnCuZ9QtzV5t/cNoTALZlmvusYYkyvpXANPPgC1Scvald/wwxG/YcuGrQTd082rPv+aedPeY9QPT+LCm84scISZ8/ka/+2XThljjDFNk8437DgRicQm4JcA3nlxUzi3IZeeW8/9EzVfbdyWvAE0qgTrQky+50XenflhAaNrmiNG9qOqVUXS5eWVAYaeNiCPERljzK4lnQQuGU522OXx2aLlfPnJaqKRxCOxBmtDTLz7+W2v62uDvPXiQuY+O5/Vn3+VrzAzNnDYgbTbsy1lSY6yAwEfJ45JOnidMcaYZkp5Cl1VLRk308cLGr/O/em7n6OqPHrrJCb9YQo+v7Pbw6EwfYbsz82PX0/7zu1yHWpGysrKuGPSdfzfqD9Rs3bTtuvhVa0q8Ad83P7ED2jTrlWBozTGmJarSV2pmvT5Az6kTFKW8fl93H/jozx/3ysEa3dsGPbfuR9z7ZCbeXDReKrbVOUy1Ix16LI7D8y5hXdmf8QbL75PuCHCgGMO4JhTB1BeGSh0eMYY06JZAs+xQSP6EQlHki4v85Ux8PiDmPK36TTU7zyQWyQcYeO6Tbz08EzOvv6UXIbaJD5fGYeP6MvhI6zTFmOMySc7RZ5je3Rpx9AzBic9Ig2U++nWqyNlkvwoPVgb4vn7X85ViMYYY0qQJfA8uOGvlzHoW/0orwpsu75d2aqCqtaV/GridQQCPkIJjr69tmyozUeoxhhjSoSdQs+D8ooAv3r8Or74eCVznn2b2k117Nt/L4456zAqqsrZvHYjla0qqNtSn3Qd3ffvmseIjTHGFDtL4HnU88BuXHhTt53mH3nGYcjY+5LWq2xVwXd+fFouQzPGGFNi7BR6ESivCHDLxBuoqC4n/lJ4RXUFQ04bzJBTBxUmOGOMMUXJEniROOzEAYx/7TYOP3kgZb4yRKDLPp24esIl3PTYdUiKRm7GGGN2PaJamK7OBw8erAsWLCjItoudqhKNRvH5fIUOxRhjTJ6JyDuqOrixcnYEXoRExJK3McaYlCyBG2OMMSXIErgxxhhTggp2DVxE1gJfFGTj+dcBWFfoIArM9oHtA7B9ALYPwPYBpN4HPVW1Y2MrKFgC35WIyIJ0GiS0ZLYPbB+A7QOwfQC2DyA7+8BOoRtjjDElyBK4McYYU4IsgefHA4UOoAjYPrB9ALYPwPYB2D6ALOwDuwZujDHGlCA7AjfGGGNKkCVwY4wxpgRZAs8iETlRRD4RkSUi8rMEyytE5El3+XwR6ZX/KHMrjX3wIxFZLCIfiMgMEelZiDhzqbF94Cl3joioiLS422nS2QciMtr9LHwoIo/nO8ZcSuP/YC8RmSUiC93/hZMLEWcuicjDIvK1iPw3yXIRkT+5++gDERmY7xhzLY19cL773heJyBsickhGG1BVm7IwAT5gKbAPUA68DxwUV+Zq4D73+RjgyULHXYB9cBxQ7T6/alfcB265NsAcYB4wuNBxF+Bz0BtYCLRzX+9Z6Ljz/P4fAK5ynx8ELCt03DnYD8cCA4H/Jll+MvAiIMAQYH6hYy7APjjK8z9wUqb7wI7As+dwYImqfqaqIWAicEZcmTOAf7rPJwMjpGWNE9roPlDVWapa676cB3TPc4y5ls7nAODXwB1AfT6Dy5N09sHlwF9VtQZAVb/Oc4y5lM77V6Ct+3w3YFUe48sLVZ0DfJOiyBnAo+qYB+wuIl3yE11+NLYPVPWN2P8ATfg+tASePd2ALz2vV7jzEpZR1TCwEdgjL9HlRzr7wOt7OL/AW5JG94F7qrCHqr6Qz8DyKJ3Pwf7A/iLyuojME5ET8xZd7qXz/scBF4jICmAacG1+QisqmX5ftHQZfx/6cxSIMSmJyAXAYGBYoWPJJxEpA8YDlxQ4lELz45xGH45z1DFHRPqr6oaCRpU/5wKPqOrdInIk8C8R6aeq0UIHZvJPRI7DSeBDM6lnR+DZsxLo4Xnd3Z2XsIyI+HFOna3PS3T5kc4+QES+BfwcOF1Vg3mKLV8a2wdtgH7AbBFZhnPtb0oLa8iWzudgBTBFVRtU9XPgU5yE3hKk8/6/BzwFoKpvApU4g1vsStL6vmjpRORg4CHgDFXNKB9YAs+et4HeIrK3iJTjNFKbEldmCnCx+3wUMFPd1gstRKP7QEQGAPfjJO+WdN0zJuU+UNWNqtpBVXupai+c616nq+qCwoSbE+n8L/wb5+gbEemAc0r9s3wGmUPpvP/lwAgAEemDk8DX5jXKwpsCXOS2Rh8CbFTV1YUOKp9EZC/gGeBCVf000/p2Cj1LVDUsItcA03FaoT6sqh+KyG3AAlWdAvwd51TZEpyGDWMKF3H2pbkP7gJaA5Pc9nvLVfX0ggWdZWnugxYtzX0wHfi2iCwGIsCNmR59FKs03/+PgQdF5AacBm2XtLAf84jIEzg/0jq41/p/BQQAVPU+nGv/JwNLgFrg0sJEmjtp7INf4rSD+pv7fRjWDEYos65UjTHGmBJkp9CNMcaYEmQJ3BhjjClBlsCNMcaYEmQJ3BhjjClBlsCNMcaYEmQJ3Jgi4o5OpiIyPG5+L8+yXgUJzhhTVCyBG2OaTER2F5Fx7rR7oeMpBBE51P1h9WXjpY3JHuvIxZjS0AB84nleLHbH6ZwC4BFgV+nL3Cs20thzBY3C7HIsgRtTAlR1JXBgoeMwCVkCNwVhp9CNMaaJ3L6sB+AMDTy7sNGYXY0lcFOURKSHiNwpIu+JyEYRqRORpSLynIhcJCKVCer4ROQyEZkpIutEJCgiK0VkUnyjsCTbHO6WXenWXSciM0TkUhHxJakzzr3+Odt9fY6IvCwiX4tIVETGxZVvJyJ3ue+lXkRWu9sc1EhsSRuxuXGriKj7ej8ReVhEvnTfxwoReVBEEo61LCJlIjJCRP4kztjcK0QkJCLrReQ1EblSRAIJ6s0GPvfM+twT47Z9ElenXESuFpFZ7v4Nicga9+96Uor3XyUiPxGRN0WkRkQaRGStiCwWkX+KyDmp9l+C9d3rxrghWaNAEbnKLRMWkWOTrCp29P2iqja4f99at97oRmL4tVvuM3E7wjYmI6pqk01FNQEXAnU4gzwoEATW4Vz7jc07NK7ObsAsz/IwUANEPfPuSrHN8Z5yUbdu2DNvBtAmQb1x7vLZwN2e+t+49cd5yvYClsW9r42e56d7lg2P204vz7JeccuGe5YdB2x2n2+K22crgW4J3oN33erW3xA3bw5QFVfvGZwRtGJl1gJrPNMzceV7Av+N28/x27k3QXxtgPcS/H28721Zhp+xKk8sbwD+uOX92P4ZvDXFel51y3zXM+8Rd96rKer5cIZUVeDmQv/P2VSaU8EDsMkm7wScwvakOxdngPsyd1m5+/oB4KC4epM9ifBaoNqd3xlnFLjYF/2VCbZ5jWf5/UBnd34r4IeeRDExQd1xnqSnwO+Bju6yCqCn+9yHM8yk4iT378SSBnCQmyBrPHEMj9tOL8+yXnHLhnuWfYNzLfZAzz4bjZPMFXg0wXvoDjwGnAa098xvDVyCk/gVGJ+gbtK44sq1Aj5yy80ChgEV7rLdgBs8+/D6uLq3uPPXA2d76pUBXXF+8D3QhM9aP5xRsBS43TPfm9znAr4k9Xd3PxtBoK1n/hFs/6GxT5K6p7llGmKfN5tsynQqeAA22RSbcBpVfuZ+sf0HKE+zXuwLU4GxScrEEvxaoNIzv8pNDAo8nqTutZ71D4pbNs6z7O4UMY72lBuRYHk1zrCKzU3gM3F/8CR5D7XEHW2msX8Hu3W3ePddY3HFlfsF289UBJKUOcvzN/J75k9z59+Ug8/cle66I8Bx7rz73Hk1wF4p6p7nlpueYNlCd9nvktSd6i5/Ohf/SzbtGpNdAzfF5Dhgb/f5DaoaSrPed93HFcBDScr8wn3sAIz0zB8JtHefj0tS92/Aavf5eUnKRIE7UsQYG/v9dVWdEb9QVWuBO1PUT9dvVTWaYH6shXQV0DuTFarqAuBrnKPoQ5sY1/fcx/Gqmuw2uH/jnCnoAHjbBMRuTevSxG0npc6YzM/gHM0/JiJjgSvcxZer6vIU1VO1Pr/Xfbwkvv2A2xYhdr3//iYFbgzWiM0UbAVo2gAABnNJREFUl6PcxzVu0kjXYPdxVpLkhap+hHMq2Fve+/xLVf00Sd0IzpFtfF2vJar6dRoxzkxRJtWydM1PMn+V53n7+IVu47Ir3QZ4q9zGb9sapAF7ukW7ZxqQm7B6ui//7jZa22nC+ZHU2i3X07OK593Ha0TkCRE5U0Q6ZBpHCt8HluOcjo8l1IdUdXKyCiJSjpOEFZiSoMjjOJcEOuOcLve6DOeSyufAK82K3OzSLIGbYtLZffwiw3qx5LIyZSnnCN1bvrl1vVIl73S3syLFsrSo6uYk88Oel/FHhHsCC3COGkfiHOlGcRoOfuVOsR9GrZoQVlfP8w5ApxRT7Dup2hP748A9OMlyDPAssFZE/icif22sBX9jVLUG+IFn1mfA9Y1UOx6ncd07qrrT301Vt+C0KwAYG5svImVsPxvxoKpqU+M2xhK4KSal/GUWKXQAzTAB6I/TFuAyoIuqVqlqR1XtrKqd2X4E35Tbnby34PVRVUljesS7AlX9IXAAcDPwIs5p9f2Aq4EFIvLHJsTldbnneTd33amk03lL7DT6SM+tat/GObsQBv6RWYjG7MgSuCkma9zHnilL7Sx29NvY6d3Ycu/RcnPqZiJWL+G92Gksywn3+uzZ7strVPUfqromrowP58i5qbzry/Rvu42qLlHV36nqycAewJE4180BrheR05uyXhG5BucWvgiwGOfugYkiUp2kvLjlIUUCV9VFOLeoeY+6Yz8Unovfz8ZkyhK4KSZvuI+dRSTZteZEYtfLj3NPUe5ERA5ke4J8O0Hd7iKyf5K6PpwGdvF1M7EtxhRljm/iupujIxDrFGdhkjJDPWXiedscJDw6V9VlbL90EH89uElUNaqq84BRONevYcfGiWkRkf7AXe7L24CTcY7u++CcmUjkMJzLAp+5STqV2FH4ZW5bgNj7fyDTWI2JZwncFJNZONcfASa4DYXSMdF97IbTICmR29zHdTidb8S8gnPqGJK3Qr+C7ddxn0gzpnhPuo9DJUGvcCJSBdzYxHU3R+z+cIBD4heKiB+4vZH6MalGI3vQffyeiAxIFZCItI97XZGsrNvAMHa3QsIGjCm2U4Xz2anEud/7dlX9gu3XrMcm6eEtk77PJ+F8vrriNGwLYI3XTJZYAjdFw/0yjnWqMhSYISJDY0fVbkvp4SLymIgc5Kn3FvC0+/LPInJN7PSniHQWkQdxOk4B+IWq1nvq1rE9cZ8rIveJSCe3brWIXAfErq8+qarvNPHtPQ28G3suTperPnc7fXCu63Zs4rqbzG1s9br7cryIHO/Z3/1w7sEeDGxNUn8D24+uL3UTfiJ3A4twkuUs92+0R2yhOMOSniQij+L0AeA1X5xuXoeLSCtPna4i8me2X6+elubbjpmA04nOBuB89/OHqk7C6fwH4EER6RFXL+0ErqpBnJ7ZAGLdsVrjNZMdhb4R3Sab4ifgIqCe7R2E1JNeV6qzPcsbcHola2pXqt/EbW8mjXSlmsb72gfndK/3fcW6Es1KV6qNbD/ZugfhdNLijSt2ZN6A09PZMvf1JQnWe0tc3eVu+Ylx5boCb8bt5xq2dycbm/4XV29Zgjpb4urs1EtcI/vibE/dUQmWV7O957g5uL2xAfu689aRpIe2BOvaz/M5tJ7XbMraZEfgpuio6qM4Q2f+EadRURinA5IvcBotXYjz5eqtsxEYgdNYaDbOPbitcRpQPY3Ty1bSU9Sq+iOca9BP49w21dpdxyycltkjNcktWhm8r89wOkIZj3MaVXAS3mTgKFVNdD9xzqlzVuFw4CmcxFSG896fcuP6VyOr+C3ObVcLcBJUd5zGap29hVR1Fc6ZlXNx7p1ejZMoy3GS9FScrmvjBw4ZgzPm+Ayc/VaOcyr6C5xLEyPcv19a3CPqWIc/f9cE93ur07HOuTg/rI7B+ZEC24++X1D3iL0xqroEpy93sMZrJotE1c7kGGNMOkRkDk5CP0dVn0mzTmfgS5yugk9Q1ZdzGKLZhdgRuDHGpMHt/e0onLMm0zOoeiVO8l6CNV4zWZSswYkxxpgdtQd+g9PtbsJGffHc2yF/7L4cr3bK02SRnUI3xpgsE5FlOB3CxNoBLASO0OQDuRiTMUvgxhiTZe4AMOA0onwJ+JmqflXAkEwLZAncGGOMKUHWiM0YY4wpQZbAjTHGmBJkCdwYY4wpQZbAjTHGmBJkCdwYY4wpQf8f5+iMYpa8N5cAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#%% plot the distributions\n", + "\n", + "pl.close(10)\n", + "pl.figure(10, (7, 7))\n", + "\n", + "pl.subplot(2, 1, 1)\n", + "\n", + "pl.scatter(ys, xs, c=phi, s=70)\n", + "pl.ylabel('Feature value a', fontsize=20)\n", + "pl.title('$\\mu=\\sum_i \\delta_{x_i,a_i}$', fontsize=25, usetex=True, y=1)\n", + "pl.xticks(())\n", + "pl.yticks(())\n", + "pl.subplot(2, 1, 2)\n", + "pl.scatter(yt, xt, c=phi2, s=70)\n", + "pl.xlabel('coordinates x/y', fontsize=25)\n", + "pl.ylabel('Feature value b', fontsize=20)\n", + "pl.title('$\\\\nu=\\sum_j \\delta_{y_j,b_j}$', fontsize=25, usetex=True, y=1)\n", + "pl.yticks(())\n", + "pl.tight_layout()\n", + "pl.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create structure matrices and across-feature distance matrix\n", + "---------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% Structure matrices and across-features distance matrix\n", + "C1 = ot.dist(xs)\n", + "C2 = ot.dist(xt)\n", + "M = ot.dist(ys, yt)\n", + "w1 = ot.unif(C1.shape[0])\n", + "w2 = ot.unif(C2.shape[0])\n", + "Got = ot.emd([], [], M)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot matrices\n", + "---------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#%%\n", + "cmap = 'Reds'\n", + "pl.close(10)\n", + "pl.figure(10, (5, 5))\n", + "fs = 15\n", + "l_x = [0, 5, 10, 15]\n", + "l_y = [0, 5, 10, 15, 20, 25]\n", + "gs = pl.GridSpec(5, 5)\n", + "\n", + "ax1 = pl.subplot(gs[3:, :2])\n", + "\n", + "pl.imshow(C1, cmap=cmap, interpolation='nearest')\n", + "pl.title(\"$C_1$\", fontsize=fs)\n", + "pl.xlabel(\"$k$\", fontsize=fs)\n", + "pl.ylabel(\"$i$\", fontsize=fs)\n", + "pl.xticks(l_x)\n", + "pl.yticks(l_x)\n", + "\n", + "ax2 = pl.subplot(gs[:3, 2:])\n", + "\n", + "pl.imshow(C2, cmap=cmap, interpolation='nearest')\n", + "pl.title(\"$C_2$\", fontsize=fs)\n", + "pl.ylabel(\"$l$\", fontsize=fs)\n", + "#pl.ylabel(\"$l$\",fontsize=fs)\n", + "pl.xticks(())\n", + "pl.yticks(l_y)\n", + "ax2.set_aspect('auto')\n", + "\n", + "ax3 = pl.subplot(gs[3:, 2:], sharex=ax2, sharey=ax1)\n", + "pl.imshow(M, cmap=cmap, interpolation='nearest')\n", + "pl.yticks(l_x)\n", + "pl.xticks(l_y)\n", + "pl.ylabel(\"$i$\", fontsize=fs)\n", + "pl.title(\"$M_{AB}$\", fontsize=fs)\n", + "pl.xlabel(\"$j$\", fontsize=fs)\n", + "pl.tight_layout()\n", + "ax3.set_aspect('auto')\n", + "pl.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Compute FGW/GW\n", + "---------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "It. |Loss |Relative loss|Absolute loss\n", + "------------------------------------------------\n", + " 0|4.734462e+01|0.000000e+00|0.000000e+00\n", + " 1|2.508258e+01|8.875498e-01|2.226204e+01\n", + " 2|2.189329e+01|1.456747e-01|3.189297e+00\n", + " 3|2.189329e+01|0.000000e+00|0.000000e+00\n", + "Elapsed time : 0.005539894104003906 s\n", + "It. |Loss |Relative loss|Absolute loss\n", + "------------------------------------------------\n", + " 0|4.683978e+04|0.000000e+00|0.000000e+00\n", + " 1|3.860061e+04|2.134468e-01|8.239175e+03\n", + " 2|2.182948e+04|7.682787e-01|1.677113e+04\n", + " 3|2.182948e+04|0.000000e+00|0.000000e+00\n" + ] + } + ], + "source": [ + "#%% Computing FGW and GW\n", + "alpha = 1e-3\n", + "\n", + "ot.tic()\n", + "Gwg, logw = fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=alpha, verbose=True, log=True)\n", + "ot.toc()\n", + "\n", + "#%reload_ext WGW\n", + "Gg, log = gromov_wasserstein(C1, C2, p, q, loss_fun='square_loss', verbose=True, log=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Visualize transport matrices\n", + "---------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#%% visu OT matrix\n", + "cmap = 'Blues'\n", + "fs = 15\n", + "pl.figure(2, (13, 5))\n", + "pl.clf()\n", + "pl.subplot(1, 3, 1)\n", + "pl.imshow(Got, cmap=cmap, interpolation='nearest')\n", + "#pl.xlabel(\"$y$\",fontsize=fs)\n", + "pl.ylabel(\"$i$\", fontsize=fs)\n", + "pl.xticks(())\n", + "\n", + "pl.title('Wasserstein ($M$ only)')\n", + "\n", + "pl.subplot(1, 3, 2)\n", + "pl.imshow(Gg, cmap=cmap, interpolation='nearest')\n", + "pl.title('Gromov ($C_1,C_2$ only)')\n", + "pl.xticks(())\n", + "pl.subplot(1, 3, 3)\n", + "pl.imshow(Gwg, cmap=cmap, interpolation='nearest')\n", + "pl.title('FGW ($M+C_1,C_2$)')\n", + "\n", + "pl.xlabel(\"$j$\", fontsize=fs)\n", + "pl.ylabel(\"$i$\", fontsize=fs)\n", + "\n", + "pl.tight_layout()\n", + "pl.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} -- cgit v1.2.3 From 5e7c6ab04be3dc2035ca2a7f9deab3bb3bfb8faa Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 25 Jun 2019 14:43:39 +0200 Subject: doc add examples unbalanced --- docs/cache_nbrun | 2 +- .../source/auto_examples/auto_examples_jupyter.zip | Bin 139016 -> 148147 bytes docs/source/auto_examples/auto_examples_python.zip | Bin 93470 -> 99229 bytes .../images/sphx_glr_plot_UOT_1D_001.png | Bin 0 -> 21239 bytes .../images/sphx_glr_plot_UOT_1D_002.png | Bin 0 -> 22051 bytes .../images/sphx_glr_plot_UOT_1D_006.png | Bin 0 -> 21288 bytes .../images/sphx_glr_plot_UOT_barycenter_1D_001.png | Bin 0 -> 22177 bytes .../images/sphx_glr_plot_UOT_barycenter_1D_003.png | Bin 0 -> 42539 bytes .../images/sphx_glr_plot_UOT_barycenter_1D_005.png | Bin 0 -> 105997 bytes .../images/sphx_glr_plot_UOT_barycenter_1D_006.png | Bin 0 -> 103234 bytes .../images/thumb/sphx_glr_plot_UOT_1D_thumb.png | Bin 0 -> 14761 bytes .../sphx_glr_plot_UOT_barycenter_1D_thumb.png | Bin 0 -> 15099 bytes docs/source/auto_examples/index.rst | 40 ++++ docs/source/auto_examples/plot_UOT_1D.ipynb | 108 +++++++++ docs/source/auto_examples/plot_UOT_1D.py | 76 ++++++ docs/source/auto_examples/plot_UOT_1D.rst | 173 ++++++++++++++ .../auto_examples/plot_UOT_barycenter_1D.ipynb | 126 ++++++++++ .../source/auto_examples/plot_UOT_barycenter_1D.py | 164 +++++++++++++ .../auto_examples/plot_UOT_barycenter_1D.rst | 261 +++++++++++++++++++++ 19 files changed, 949 insertions(+), 1 deletion(-) create mode 100644 docs/source/auto_examples/images/sphx_glr_plot_UOT_1D_001.png create mode 100644 docs/source/auto_examples/images/sphx_glr_plot_UOT_1D_002.png create mode 100644 docs/source/auto_examples/images/sphx_glr_plot_UOT_1D_006.png create mode 100644 docs/source/auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_001.png create mode 100644 docs/source/auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_003.png create mode 100644 docs/source/auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_005.png create mode 100644 docs/source/auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_006.png create mode 100644 docs/source/auto_examples/images/thumb/sphx_glr_plot_UOT_1D_thumb.png create mode 100644 docs/source/auto_examples/images/thumb/sphx_glr_plot_UOT_barycenter_1D_thumb.png create mode 100644 docs/source/auto_examples/plot_UOT_1D.ipynb create mode 100644 docs/source/auto_examples/plot_UOT_1D.py create mode 100644 docs/source/auto_examples/plot_UOT_1D.rst create mode 100644 docs/source/auto_examples/plot_UOT_barycenter_1D.ipynb create mode 100644 docs/source/auto_examples/plot_UOT_barycenter_1D.py create mode 100644 docs/source/auto_examples/plot_UOT_barycenter_1D.rst diff --git a/docs/cache_nbrun b/docs/cache_nbrun index 04f6fce..8a95023 100644 --- a/docs/cache_nbrun +++ b/docs/cache_nbrun @@ -1 +1 @@ -{"plot_otda_color_images.ipynb": "f804d5806c7ac1a0901e4542b1eaa77b", "plot_WDA.ipynb": "27f8de4c6d7db46497076523673eedfb", "plot_OT_L1_vs_L2.ipynb": "5d565b8aaf03be4309eba731127851dc", "plot_otda_semi_supervised.ipynb": "f6dfb02ba2bbd939408ffcd22a3b007c", "plot_fgw.ipynb": "2ba3e100e92ecf4dfbeb605de20b40ab", "plot_otda_d2.ipynb": "e6feae588103f2a8fab942e5f4eff483", "plot_compute_emd.ipynb": "f5cd71cad882ec157dc8222721e9820c", "plot_barycenter_fgw.ipynb": "e14100dd276bff3ffdfdf176f1b6b070", "plot_convolutional_barycenter.ipynb": "a72bb3716a1baaffd81ae267a673f9b6", "plot_optim_OTreg.ipynb": "481801bb0d133ef350a65179cf8f739a", "plot_barycenter_lp_vs_entropic.ipynb": "51833e8c76aaedeba9599ac7a30eb357", "plot_OT_1D_smooth.ipynb": "3a059103652225a0c78ea53895cf79e5", "plot_barycenter_1D.ipynb": "5f6fb8aebd8e2e91ebc77c923cb112b3", "plot_otda_mapping.ipynb": "2f1ebbdc0f855d9e2b7adf9edec24d25", "plot_OT_1D.ipynb": "b5348bdc561c07ec168a1622e5af4b93", "plot_gromov_barycenter.ipynb": "953e5047b886ec69ec621ec52f5e21d1", "plot_otda_mapping_colors_images.ipynb": "cc8bf9a857f52e4a159fe71dfda19018", "plot_stochastic.ipynb": "e18253354c8c1d72567a4259eb1094f7", "plot_otda_linear_mapping.ipynb": "a472c767abe82020e0a58125a528785c", "plot_otda_classes.ipynb": "39087b6e98217851575f2271c22853a4", "plot_free_support_barycenter.ipynb": "246dd2feff4b233a4f1a553c5a202fdc", "plot_gromov.ipynb": "24f2aea489714d34779521f46d5e2c47", "plot_OT_2D_samples.ipynb": "912a77c5dd0fc0fafa03fac3d86f1502"} \ No newline at end of file +{"plot_otda_semi_supervised.ipynb": "f6dfb02ba2bbd939408ffcd22a3b007c", "plot_WDA.ipynb": "27f8de4c6d7db46497076523673eedfb", "plot_UOT_1D.ipynb": "fc7dd383e625597bd59fff03a8430c91", "plot_OT_L1_vs_L2.ipynb": "5d565b8aaf03be4309eba731127851dc", "plot_otda_color_images.ipynb": "f804d5806c7ac1a0901e4542b1eaa77b", "plot_fgw.ipynb": "2ba3e100e92ecf4dfbeb605de20b40ab", "plot_otda_d2.ipynb": "e6feae588103f2a8fab942e5f4eff483", "plot_compute_emd.ipynb": "f5cd71cad882ec157dc8222721e9820c", "plot_barycenter_fgw.ipynb": "e14100dd276bff3ffdfdf176f1b6b070", "plot_convolutional_barycenter.ipynb": "a72bb3716a1baaffd81ae267a673f9b6", "plot_optim_OTreg.ipynb": "481801bb0d133ef350a65179cf8f739a", "plot_barycenter_lp_vs_entropic.ipynb": "51833e8c76aaedeba9599ac7a30eb357", "plot_OT_1D_smooth.ipynb": "3a059103652225a0c78ea53895cf79e5", "plot_barycenter_1D.ipynb": "5f6fb8aebd8e2e91ebc77c923cb112b3", "plot_otda_mapping.ipynb": "2f1ebbdc0f855d9e2b7adf9edec24d25", "plot_OT_1D.ipynb": "b5348bdc561c07ec168a1622e5af4b93", "plot_gromov_barycenter.ipynb": "953e5047b886ec69ec621ec52f5e21d1", "plot_UOT_barycenter_1D.ipynb": "c72f0bfb6e1a79710dad3fef9f5c557c", "plot_otda_mapping_colors_images.ipynb": "cc8bf9a857f52e4a159fe71dfda19018", "plot_stochastic.ipynb": "e18253354c8c1d72567a4259eb1094f7", "plot_otda_linear_mapping.ipynb": "a472c767abe82020e0a58125a528785c", "plot_otda_classes.ipynb": "39087b6e98217851575f2271c22853a4", "plot_free_support_barycenter.ipynb": "246dd2feff4b233a4f1a553c5a202fdc", "plot_gromov.ipynb": "24f2aea489714d34779521f46d5e2c47", "plot_OT_2D_samples.ipynb": "912a77c5dd0fc0fafa03fac3d86f1502"} \ No newline at end of file diff --git a/docs/source/auto_examples/auto_examples_jupyter.zip b/docs/source/auto_examples/auto_examples_jupyter.zip index a3a7c29..901195a 100644 Binary files a/docs/source/auto_examples/auto_examples_jupyter.zip and b/docs/source/auto_examples/auto_examples_jupyter.zip differ diff --git a/docs/source/auto_examples/auto_examples_python.zip b/docs/source/auto_examples/auto_examples_python.zip index 86a6841..ded2613 100644 Binary files a/docs/source/auto_examples/auto_examples_python.zip and b/docs/source/auto_examples/auto_examples_python.zip differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_UOT_1D_001.png b/docs/source/auto_examples/images/sphx_glr_plot_UOT_1D_001.png new file mode 100644 index 0000000..69ef5b7 Binary files /dev/null and b/docs/source/auto_examples/images/sphx_glr_plot_UOT_1D_001.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_UOT_1D_002.png b/docs/source/auto_examples/images/sphx_glr_plot_UOT_1D_002.png new file mode 100644 index 0000000..0407e44 Binary files /dev/null and b/docs/source/auto_examples/images/sphx_glr_plot_UOT_1D_002.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_UOT_1D_006.png b/docs/source/auto_examples/images/sphx_glr_plot_UOT_1D_006.png new file mode 100644 index 0000000..f58d383 Binary files /dev/null and b/docs/source/auto_examples/images/sphx_glr_plot_UOT_1D_006.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_001.png b/docs/source/auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_001.png new file mode 100644 index 0000000..ec8c51e Binary files /dev/null and b/docs/source/auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_001.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_003.png b/docs/source/auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_003.png new file mode 100644 index 0000000..89ab265 Binary files /dev/null and b/docs/source/auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_003.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_005.png b/docs/source/auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_005.png new file mode 100644 index 0000000..c6c49cb Binary files /dev/null and b/docs/source/auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_005.png differ diff --git a/docs/source/auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_006.png b/docs/source/auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_006.png new file mode 100644 index 0000000..8870b10 Binary files /dev/null and b/docs/source/auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_006.png differ diff --git a/docs/source/auto_examples/images/thumb/sphx_glr_plot_UOT_1D_thumb.png b/docs/source/auto_examples/images/thumb/sphx_glr_plot_UOT_1D_thumb.png new file mode 100644 index 0000000..1d048f2 Binary files /dev/null and b/docs/source/auto_examples/images/thumb/sphx_glr_plot_UOT_1D_thumb.png differ diff --git a/docs/source/auto_examples/images/thumb/sphx_glr_plot_UOT_barycenter_1D_thumb.png b/docs/source/auto_examples/images/thumb/sphx_glr_plot_UOT_barycenter_1D_thumb.png new file mode 100644 index 0000000..999f175 Binary files /dev/null and b/docs/source/auto_examples/images/thumb/sphx_glr_plot_UOT_barycenter_1D_thumb.png differ diff --git a/docs/source/auto_examples/index.rst b/docs/source/auto_examples/index.rst index 9f02da4..fe6702d 100644 --- a/docs/source/auto_examples/index.rst +++ b/docs/source/auto_examples/index.rst @@ -27,6 +27,26 @@ This is a gallery of all the POT example files. /auto_examples/plot_OT_1D +.. raw:: html + +
+ +.. only:: html + + .. figure:: /auto_examples/images/thumb/sphx_glr_plot_UOT_1D_thumb.png + + :ref:`sphx_glr_auto_examples_plot_UOT_1D.py` + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /auto_examples/plot_UOT_1D + .. raw:: html
@@ -287,6 +307,26 @@ This is a gallery of all the POT example files. /auto_examples/plot_otda_mapping_colors_images +.. raw:: html + +
+ +.. only:: html + + .. figure:: /auto_examples/images/thumb/sphx_glr_plot_UOT_barycenter_1D_thumb.png + + :ref:`sphx_glr_auto_examples_plot_UOT_barycenter_1D.py` + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /auto_examples/plot_UOT_barycenter_1D + .. raw:: html
diff --git a/docs/source/auto_examples/plot_UOT_1D.ipynb b/docs/source/auto_examples/plot_UOT_1D.ipynb new file mode 100644 index 0000000..c695306 --- /dev/null +++ b/docs/source/auto_examples/plot_UOT_1D.ipynb @@ -0,0 +1,108 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# 1D Unbalanced optimal transport\n\n\nThis example illustrates the computation of Unbalanced Optimal transport\nusing a Kullback-Leibler relaxation.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Author: Hicham Janati \n#\n# License: MIT License\n\nimport numpy as np\nimport matplotlib.pylab as pl\nimport ot\nimport ot.plot\nfrom ot.datasets import make_1D_gauss as gauss" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Generate data\n-------------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% parameters\n\nn = 100 # nb bins\n\n# bin positions\nx = np.arange(n, dtype=np.float64)\n\n# Gaussian distributions\na = gauss(n, m=20, s=5) # m= mean, s= std\nb = gauss(n, m=60, s=10)\n\n# make distributions unbalanced\nb *= 5.\n\n# loss matrix\nM = ot.dist(x.reshape((n, 1)), x.reshape((n, 1)))\nM /= M.max()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot distributions and loss matrix\n----------------------------------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% plot the distributions\n\npl.figure(1, figsize=(6.4, 3))\npl.plot(x, a, 'b', label='Source distribution')\npl.plot(x, b, 'r', label='Target distribution')\npl.legend()\n\n# plot distributions and loss matrix\n\npl.figure(2, figsize=(5, 5))\not.plot.plot1D_mat(a, b, M, 'Cost matrix M')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Solve Unbalanced Sinkhorn\n--------------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Sinkhorn\n\nepsilon = 0.1 # entropy parameter\nalpha = 1. # Unbalanced KL relaxation parameter\nGs = ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, verbose=True)\n\npl.figure(4, figsize=(5, 5))\not.plot.plot1D_mat(a, b, Gs, 'UOT matrix Sinkhorn')\n\npl.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/docs/source/auto_examples/plot_UOT_1D.py b/docs/source/auto_examples/plot_UOT_1D.py new file mode 100644 index 0000000..2ea8b05 --- /dev/null +++ b/docs/source/auto_examples/plot_UOT_1D.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +""" +=============================== +1D Unbalanced optimal transport +=============================== + +This example illustrates the computation of Unbalanced Optimal transport +using a Kullback-Leibler relaxation. +""" + +# Author: Hicham Janati +# +# License: MIT License + +import numpy as np +import matplotlib.pylab as pl +import ot +import ot.plot +from ot.datasets import make_1D_gauss as gauss + +############################################################################## +# Generate data +# ------------- + + +#%% parameters + +n = 100 # nb bins + +# bin positions +x = np.arange(n, dtype=np.float64) + +# Gaussian distributions +a = gauss(n, m=20, s=5) # m= mean, s= std +b = gauss(n, m=60, s=10) + +# make distributions unbalanced +b *= 5. + +# loss matrix +M = ot.dist(x.reshape((n, 1)), x.reshape((n, 1))) +M /= M.max() + + +############################################################################## +# Plot distributions and loss matrix +# ---------------------------------- + +#%% plot the distributions + +pl.figure(1, figsize=(6.4, 3)) +pl.plot(x, a, 'b', label='Source distribution') +pl.plot(x, b, 'r', label='Target distribution') +pl.legend() + +# plot distributions and loss matrix + +pl.figure(2, figsize=(5, 5)) +ot.plot.plot1D_mat(a, b, M, 'Cost matrix M') + + +############################################################################## +# Solve Unbalanced Sinkhorn +# -------------- + + +# Sinkhorn + +epsilon = 0.1 # entropy parameter +alpha = 1. # Unbalanced KL relaxation parameter +Gs = ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, verbose=True) + +pl.figure(4, figsize=(5, 5)) +ot.plot.plot1D_mat(a, b, Gs, 'UOT matrix Sinkhorn') + +pl.show() diff --git a/docs/source/auto_examples/plot_UOT_1D.rst b/docs/source/auto_examples/plot_UOT_1D.rst new file mode 100644 index 0000000..8e618b4 --- /dev/null +++ b/docs/source/auto_examples/plot_UOT_1D.rst @@ -0,0 +1,173 @@ + + +.. _sphx_glr_auto_examples_plot_UOT_1D.py: + + +=============================== +1D Unbalanced optimal transport +=============================== + +This example illustrates the computation of Unbalanced Optimal transport +using a Kullback-Leibler relaxation. + + + +.. code-block:: python + + + # Author: Hicham Janati + # + # License: MIT License + + import numpy as np + import matplotlib.pylab as pl + import ot + import ot.plot + from ot.datasets import make_1D_gauss as gauss + + + + + + + +Generate data +------------- + + + +.. code-block:: python + + + + #%% parameters + + n = 100 # nb bins + + # bin positions + x = np.arange(n, dtype=np.float64) + + # Gaussian distributions + a = gauss(n, m=20, s=5) # m= mean, s= std + b = gauss(n, m=60, s=10) + + # make distributions unbalanced + b *= 5. + + # loss matrix + M = ot.dist(x.reshape((n, 1)), x.reshape((n, 1))) + M /= M.max() + + + + + + + + +Plot distributions and loss matrix +---------------------------------- + + + +.. code-block:: python + + + #%% plot the distributions + + pl.figure(1, figsize=(6.4, 3)) + pl.plot(x, a, 'b', label='Source distribution') + pl.plot(x, b, 'r', label='Target distribution') + pl.legend() + + # plot distributions and loss matrix + + pl.figure(2, figsize=(5, 5)) + ot.plot.plot1D_mat(a, b, M, 'Cost matrix M') + + + + + +.. rst-class:: sphx-glr-horizontal + + + * + + .. image:: /auto_examples/images/sphx_glr_plot_UOT_1D_001.png + :scale: 47 + + * + + .. image:: /auto_examples/images/sphx_glr_plot_UOT_1D_002.png + :scale: 47 + + + + +Solve Unbalanced Sinkhorn +-------------- + + + +.. code-block:: python + + + + # Sinkhorn + + epsilon = 0.1 # entropy parameter + alpha = 1. # Unbalanced KL relaxation parameter + Gs = ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, verbose=True) + + pl.figure(4, figsize=(5, 5)) + ot.plot.plot1D_mat(a, b, Gs, 'UOT matrix Sinkhorn') + + pl.show() + + + +.. image:: /auto_examples/images/sphx_glr_plot_UOT_1D_006.png + :align: center + + +.. rst-class:: sphx-glr-script-out + + Out:: + + It. |Err + ------------------- + 0|1.838786e+00| + 10|1.242379e-01| + 20|2.581314e-03| + 30|5.674552e-05| + 40|1.252959e-06| + 50|2.768136e-08| + 60|6.116090e-10| + + +**Total running time of the script:** ( 0 minutes 0.259 seconds) + + + +.. only :: html + + .. container:: sphx-glr-footer + + + .. container:: sphx-glr-download + + :download:`Download Python source code: plot_UOT_1D.py ` + + + + .. container:: sphx-glr-download + + :download:`Download Jupyter notebook: plot_UOT_1D.ipynb ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/docs/source/auto_examples/plot_UOT_barycenter_1D.ipynb b/docs/source/auto_examples/plot_UOT_barycenter_1D.ipynb new file mode 100644 index 0000000..e59cdc2 --- /dev/null +++ b/docs/source/auto_examples/plot_UOT_barycenter_1D.ipynb @@ -0,0 +1,126 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# 1D Wasserstein barycenter demo for Unbalanced distributions\n\n\nThis example illustrates the computation of regularized Wassersyein Barycenter\nas proposed in [10] for Unbalanced inputs.\n\n\n[10] Chizat, L., Peyr\u00e9, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816.\n\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Author: Hicham Janati \n#\n# License: MIT License\n\nimport numpy as np\nimport matplotlib.pylab as pl\nimport ot\n# necessary for 3d plot even if not used\nfrom mpl_toolkits.mplot3d import Axes3D # noqa\nfrom matplotlib.collections import PolyCollection" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Generate data\n-------------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# parameters\n\nn = 100 # nb bins\n\n# bin positions\nx = np.arange(n, dtype=np.float64)\n\n# Gaussian distributions\na1 = ot.datasets.make_1D_gauss(n, m=20, s=5) # m= mean, s= std\na2 = ot.datasets.make_1D_gauss(n, m=60, s=8)\n\n# make unbalanced dists\na2 *= 3.\n\n# creating matrix A containing all distributions\nA = np.vstack((a1, a2)).T\nn_distributions = A.shape[1]\n\n# loss matrix + normalization\nM = ot.utils.dist0(n)\nM /= M.max()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot data\n---------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# plot the distributions\n\npl.figure(1, figsize=(6.4, 3))\nfor i in range(n_distributions):\n pl.plot(x, A[:, i])\npl.title('Distributions')\npl.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Barycenter computation\n----------------------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# non weighted barycenter computation\n\nweight = 0.5 # 0<=weight<=1\nweights = np.array([1 - weight, weight])\n\n# l2bary\nbary_l2 = A.dot(weights)\n\n# wasserstein\nreg = 1e-3\nalpha = 1.\n\nbary_wass = ot.unbalanced.barycenter_unbalanced(A, M, reg, alpha, weights)\n\npl.figure(2)\npl.clf()\npl.subplot(2, 1, 1)\nfor i in range(n_distributions):\n pl.plot(x, A[:, i])\npl.title('Distributions')\n\npl.subplot(2, 1, 2)\npl.plot(x, bary_l2, 'r', label='l2')\npl.plot(x, bary_wass, 'g', label='Wasserstein')\npl.legend()\npl.title('Barycenters')\npl.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Barycentric interpolation\n-------------------------\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# barycenter interpolation\n\nn_weight = 11\nweight_list = np.linspace(0, 1, n_weight)\n\n\nB_l2 = np.zeros((n, n_weight))\n\nB_wass = np.copy(B_l2)\n\nfor i in range(0, n_weight):\n weight = weight_list[i]\n weights = np.array([1 - weight, weight])\n B_l2[:, i] = A.dot(weights)\n B_wass[:, i] = ot.unbalanced.barycenter_unbalanced(A, M, reg, alpha, weights)\n\n\n# plot interpolation\n\npl.figure(3)\n\ncmap = pl.cm.get_cmap('viridis')\nverts = []\nzs = weight_list\nfor i, z in enumerate(zs):\n ys = B_l2[:, i]\n verts.append(list(zip(x, ys)))\n\nax = pl.gcf().gca(projection='3d')\n\npoly = PolyCollection(verts, facecolors=[cmap(a) for a in weight_list])\npoly.set_alpha(0.7)\nax.add_collection3d(poly, zs=zs, zdir='y')\nax.set_xlabel('x')\nax.set_xlim3d(0, n)\nax.set_ylabel(r'$\\alpha$')\nax.set_ylim3d(0, 1)\nax.set_zlabel('')\nax.set_zlim3d(0, B_l2.max() * 1.01)\npl.title('Barycenter interpolation with l2')\npl.tight_layout()\n\npl.figure(4)\ncmap = pl.cm.get_cmap('viridis')\nverts = []\nzs = weight_list\nfor i, z in enumerate(zs):\n ys = B_wass[:, i]\n verts.append(list(zip(x, ys)))\n\nax = pl.gcf().gca(projection='3d')\n\npoly = PolyCollection(verts, facecolors=[cmap(a) for a in weight_list])\npoly.set_alpha(0.7)\nax.add_collection3d(poly, zs=zs, zdir='y')\nax.set_xlabel('x')\nax.set_xlim3d(0, n)\nax.set_ylabel(r'$\\alpha$')\nax.set_ylim3d(0, 1)\nax.set_zlabel('')\nax.set_zlim3d(0, B_l2.max() * 1.01)\npl.title('Barycenter interpolation with Wasserstein')\npl.tight_layout()\n\npl.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/docs/source/auto_examples/plot_UOT_barycenter_1D.py b/docs/source/auto_examples/plot_UOT_barycenter_1D.py new file mode 100644 index 0000000..c8d9d3b --- /dev/null +++ b/docs/source/auto_examples/plot_UOT_barycenter_1D.py @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- +""" +=========================================================== +1D Wasserstein barycenter demo for Unbalanced distributions +=========================================================== + +This example illustrates the computation of regularized Wassersyein Barycenter +as proposed in [10] for Unbalanced inputs. + + +[10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + +""" + +# Author: Hicham Janati +# +# License: MIT License + +import numpy as np +import matplotlib.pylab as pl +import ot +# necessary for 3d plot even if not used +from mpl_toolkits.mplot3d import Axes3D # noqa +from matplotlib.collections import PolyCollection + +############################################################################## +# Generate data +# ------------- + +# parameters + +n = 100 # nb bins + +# bin positions +x = np.arange(n, dtype=np.float64) + +# Gaussian distributions +a1 = ot.datasets.make_1D_gauss(n, m=20, s=5) # m= mean, s= std +a2 = ot.datasets.make_1D_gauss(n, m=60, s=8) + +# make unbalanced dists +a2 *= 3. + +# creating matrix A containing all distributions +A = np.vstack((a1, a2)).T +n_distributions = A.shape[1] + +# loss matrix + normalization +M = ot.utils.dist0(n) +M /= M.max() + +############################################################################## +# Plot data +# --------- + +# plot the distributions + +pl.figure(1, figsize=(6.4, 3)) +for i in range(n_distributions): + pl.plot(x, A[:, i]) +pl.title('Distributions') +pl.tight_layout() + +############################################################################## +# Barycenter computation +# ---------------------- + +# non weighted barycenter computation + +weight = 0.5 # 0<=weight<=1 +weights = np.array([1 - weight, weight]) + +# l2bary +bary_l2 = A.dot(weights) + +# wasserstein +reg = 1e-3 +alpha = 1. + +bary_wass = ot.unbalanced.barycenter_unbalanced(A, M, reg, alpha, weights) + +pl.figure(2) +pl.clf() +pl.subplot(2, 1, 1) +for i in range(n_distributions): + pl.plot(x, A[:, i]) +pl.title('Distributions') + +pl.subplot(2, 1, 2) +pl.plot(x, bary_l2, 'r', label='l2') +pl.plot(x, bary_wass, 'g', label='Wasserstein') +pl.legend() +pl.title('Barycenters') +pl.tight_layout() + +############################################################################## +# Barycentric interpolation +# ------------------------- + +# barycenter interpolation + +n_weight = 11 +weight_list = np.linspace(0, 1, n_weight) + + +B_l2 = np.zeros((n, n_weight)) + +B_wass = np.copy(B_l2) + +for i in range(0, n_weight): + weight = weight_list[i] + weights = np.array([1 - weight, weight]) + B_l2[:, i] = A.dot(weights) + B_wass[:, i] = ot.unbalanced.barycenter_unbalanced(A, M, reg, alpha, weights) + + +# plot interpolation + +pl.figure(3) + +cmap = pl.cm.get_cmap('viridis') +verts = [] +zs = weight_list +for i, z in enumerate(zs): + ys = B_l2[:, i] + verts.append(list(zip(x, ys))) + +ax = pl.gcf().gca(projection='3d') + +poly = PolyCollection(verts, facecolors=[cmap(a) for a in weight_list]) +poly.set_alpha(0.7) +ax.add_collection3d(poly, zs=zs, zdir='y') +ax.set_xlabel('x') +ax.set_xlim3d(0, n) +ax.set_ylabel(r'$\alpha$') +ax.set_ylim3d(0, 1) +ax.set_zlabel('') +ax.set_zlim3d(0, B_l2.max() * 1.01) +pl.title('Barycenter interpolation with l2') +pl.tight_layout() + +pl.figure(4) +cmap = pl.cm.get_cmap('viridis') +verts = [] +zs = weight_list +for i, z in enumerate(zs): + ys = B_wass[:, i] + verts.append(list(zip(x, ys))) + +ax = pl.gcf().gca(projection='3d') + +poly = PolyCollection(verts, facecolors=[cmap(a) for a in weight_list]) +poly.set_alpha(0.7) +ax.add_collection3d(poly, zs=zs, zdir='y') +ax.set_xlabel('x') +ax.set_xlim3d(0, n) +ax.set_ylabel(r'$\alpha$') +ax.set_ylim3d(0, 1) +ax.set_zlabel('') +ax.set_zlim3d(0, B_l2.max() * 1.01) +pl.title('Barycenter interpolation with Wasserstein') +pl.tight_layout() + +pl.show() diff --git a/docs/source/auto_examples/plot_UOT_barycenter_1D.rst b/docs/source/auto_examples/plot_UOT_barycenter_1D.rst new file mode 100644 index 0000000..ac17587 --- /dev/null +++ b/docs/source/auto_examples/plot_UOT_barycenter_1D.rst @@ -0,0 +1,261 @@ + + +.. _sphx_glr_auto_examples_plot_UOT_barycenter_1D.py: + + +=========================================================== +1D Wasserstein barycenter demo for Unbalanced distributions +=========================================================== + +This example illustrates the computation of regularized Wassersyein Barycenter +as proposed in [10] for Unbalanced inputs. + + +[10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + + + + +.. code-block:: python + + + # Author: Hicham Janati + # + # License: MIT License + + import numpy as np + import matplotlib.pylab as pl + import ot + # necessary for 3d plot even if not used + from mpl_toolkits.mplot3d import Axes3D # noqa + from matplotlib.collections import PolyCollection + + + + + + + +Generate data +------------- + + + +.. code-block:: python + + + # parameters + + n = 100 # nb bins + + # bin positions + x = np.arange(n, dtype=np.float64) + + # Gaussian distributions + a1 = ot.datasets.make_1D_gauss(n, m=20, s=5) # m= mean, s= std + a2 = ot.datasets.make_1D_gauss(n, m=60, s=8) + + # make unbalanced dists + a2 *= 3. + + # creating matrix A containing all distributions + A = np.vstack((a1, a2)).T + n_distributions = A.shape[1] + + # loss matrix + normalization + M = ot.utils.dist0(n) + M /= M.max() + + + + + + + +Plot data +--------- + + + +.. code-block:: python + + + # plot the distributions + + pl.figure(1, figsize=(6.4, 3)) + for i in range(n_distributions): + pl.plot(x, A[:, i]) + pl.title('Distributions') + pl.tight_layout() + + + + +.. image:: /auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_001.png + :align: center + + + + +Barycenter computation +---------------------- + + + +.. code-block:: python + + + # non weighted barycenter computation + + weight = 0.5 # 0<=weight<=1 + weights = np.array([1 - weight, weight]) + + # l2bary + bary_l2 = A.dot(weights) + + # wasserstein + reg = 1e-3 + alpha = 1. + + bary_wass = ot.unbalanced.barycenter_unbalanced(A, M, reg, alpha, weights) + + pl.figure(2) + pl.clf() + pl.subplot(2, 1, 1) + for i in range(n_distributions): + pl.plot(x, A[:, i]) + pl.title('Distributions') + + pl.subplot(2, 1, 2) + pl.plot(x, bary_l2, 'r', label='l2') + pl.plot(x, bary_wass, 'g', label='Wasserstein') + pl.legend() + pl.title('Barycenters') + pl.tight_layout() + + + + +.. image:: /auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_003.png + :align: center + + + + +Barycentric interpolation +------------------------- + + + +.. code-block:: python + + + # barycenter interpolation + + n_weight = 11 + weight_list = np.linspace(0, 1, n_weight) + + + B_l2 = np.zeros((n, n_weight)) + + B_wass = np.copy(B_l2) + + for i in range(0, n_weight): + weight = weight_list[i] + weights = np.array([1 - weight, weight]) + B_l2[:, i] = A.dot(weights) + B_wass[:, i] = ot.unbalanced.barycenter_unbalanced(A, M, reg, alpha, weights) + + + # plot interpolation + + pl.figure(3) + + cmap = pl.cm.get_cmap('viridis') + verts = [] + zs = weight_list + for i, z in enumerate(zs): + ys = B_l2[:, i] + verts.append(list(zip(x, ys))) + + ax = pl.gcf().gca(projection='3d') + + poly = PolyCollection(verts, facecolors=[cmap(a) for a in weight_list]) + poly.set_alpha(0.7) + ax.add_collection3d(poly, zs=zs, zdir='y') + ax.set_xlabel('x') + ax.set_xlim3d(0, n) + ax.set_ylabel(r'$\alpha$') + ax.set_ylim3d(0, 1) + ax.set_zlabel('') + ax.set_zlim3d(0, B_l2.max() * 1.01) + pl.title('Barycenter interpolation with l2') + pl.tight_layout() + + pl.figure(4) + cmap = pl.cm.get_cmap('viridis') + verts = [] + zs = weight_list + for i, z in enumerate(zs): + ys = B_wass[:, i] + verts.append(list(zip(x, ys))) + + ax = pl.gcf().gca(projection='3d') + + poly = PolyCollection(verts, facecolors=[cmap(a) for a in weight_list]) + poly.set_alpha(0.7) + ax.add_collection3d(poly, zs=zs, zdir='y') + ax.set_xlabel('x') + ax.set_xlim3d(0, n) + ax.set_ylabel(r'$\alpha$') + ax.set_ylim3d(0, 1) + ax.set_zlabel('') + ax.set_zlim3d(0, B_l2.max() * 1.01) + pl.title('Barycenter interpolation with Wasserstein') + pl.tight_layout() + + pl.show() + + + +.. rst-class:: sphx-glr-horizontal + + + * + + .. image:: /auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_005.png + :scale: 47 + + * + + .. image:: /auto_examples/images/sphx_glr_plot_UOT_barycenter_1D_006.png + :scale: 47 + + + + +**Total running time of the script:** ( 0 minutes 0.344 seconds) + + + +.. only :: html + + .. container:: sphx-glr-footer + + + .. container:: sphx-glr-download + + :download:`Download Python source code: plot_UOT_barycenter_1D.py ` + + + + .. container:: sphx-glr-download + + :download:`Download Jupyter notebook: plot_UOT_barycenter_1D.ipynb ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ -- cgit v1.2.3 From dea6d8aec8794a84bf46ee7196b0c9fe390e6afa Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 25 Jun 2019 14:44:29 +0200 Subject: add notebooks unbalanced --- notebooks/plot_UOT_1D.ipynb | 210 +++++++++++++++++++++ notebooks/plot_UOT_barycenter_1D.ipynb | 336 +++++++++++++++++++++++++++++++++ 2 files changed, 546 insertions(+) create mode 100644 notebooks/plot_UOT_1D.ipynb create mode 100644 notebooks/plot_UOT_barycenter_1D.ipynb diff --git a/notebooks/plot_UOT_1D.ipynb b/notebooks/plot_UOT_1D.ipynb new file mode 100644 index 0000000..2354d4f --- /dev/null +++ b/notebooks/plot_UOT_1D.ipynb @@ -0,0 +1,210 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# 1D Unbalanced optimal transport\n", + "\n", + "\n", + "This example illustrates the computation of Unbalanced Optimal transport\n", + "using a Kullback-Leibler relaxation.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Author: Hicham Janati \n", + "#\n", + "# License: MIT License\n", + "\n", + "import numpy as np\n", + "import matplotlib.pylab as pl\n", + "import ot\n", + "import ot.plot\n", + "from ot.datasets import make_1D_gauss as gauss" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Generate data\n", + "-------------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#%% parameters\n", + "\n", + "n = 100 # nb bins\n", + "\n", + "# bin positions\n", + "x = np.arange(n, dtype=np.float64)\n", + "\n", + "# Gaussian distributions\n", + "a = gauss(n, m=20, s=5) # m= mean, s= std\n", + "b = gauss(n, m=60, s=10)\n", + "\n", + "# make distributions unbalanced\n", + "b *= 5.\n", + "\n", + "# loss matrix\n", + "M = ot.dist(x.reshape((n, 1)), x.reshape((n, 1)))\n", + "M /= M.max()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot distributions and loss matrix\n", + "----------------------------------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#%% plot the distributions\n", + "\n", + "pl.figure(1, figsize=(6.4, 3))\n", + "pl.plot(x, a, 'b', label='Source distribution')\n", + "pl.plot(x, b, 'r', label='Target distribution')\n", + "pl.legend()\n", + "\n", + "# plot distributions and loss matrix\n", + "\n", + "pl.figure(2, figsize=(5, 5))\n", + "ot.plot.plot1D_mat(a, b, M, 'Cost matrix M')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Solve Unbalanced Sinkhorn\n", + "--------------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "It. |Err \n", + "-------------------\n", + " 0|1.838786e+00|\n", + " 10|1.242379e-01|\n", + " 20|2.581314e-03|\n", + " 30|5.674552e-05|\n", + " 40|1.252959e-06|\n", + " 50|2.768136e-08|\n", + " 60|6.116090e-10|\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Sinkhorn\n", + "\n", + "epsilon = 0.1 # entropy parameter\n", + "alpha = 1. # Unbalanced KL relaxation parameter\n", + "Gs = ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, verbose=True)\n", + "\n", + "pl.figure(4, figsize=(5, 5))\n", + "ot.plot.plot1D_mat(a, b, Gs, 'UOT matrix Sinkhorn')\n", + "\n", + "pl.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/notebooks/plot_UOT_barycenter_1D.ipynb b/notebooks/plot_UOT_barycenter_1D.ipynb new file mode 100644 index 0000000..43c8105 --- /dev/null +++ b/notebooks/plot_UOT_barycenter_1D.ipynb @@ -0,0 +1,336 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# 1D Wasserstein barycenter demo for Unbalanced distributions\n", + "\n", + "\n", + "This example illustrates the computation of regularized Wassersyein Barycenter\n", + "as proposed in [10] for Unbalanced inputs.\n", + "\n", + "\n", + "[10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Author: Hicham Janati \n", + "#\n", + "# License: MIT License\n", + "\n", + "import numpy as np\n", + "import matplotlib.pylab as pl\n", + "import ot\n", + "# necessary for 3d plot even if not used\n", + "from mpl_toolkits.mplot3d import Axes3D # noqa\n", + "from matplotlib.collections import PolyCollection" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Generate data\n", + "-------------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# parameters\n", + "\n", + "n = 100 # nb bins\n", + "\n", + "# bin positions\n", + "x = np.arange(n, dtype=np.float64)\n", + "\n", + "# Gaussian distributions\n", + "a1 = ot.datasets.make_1D_gauss(n, m=20, s=5) # m= mean, s= std\n", + "a2 = ot.datasets.make_1D_gauss(n, m=60, s=8)\n", + "\n", + "# make unbalanced dists\n", + "a2 *= 3.\n", + "\n", + "# creating matrix A containing all distributions\n", + "A = np.vstack((a1, a2)).T\n", + "n_distributions = A.shape[1]\n", + "\n", + "# loss matrix + normalization\n", + "M = ot.utils.dist0(n)\n", + "M /= M.max()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot data\n", + "---------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot the distributions\n", + "\n", + "pl.figure(1, figsize=(6.4, 3))\n", + "for i in range(n_distributions):\n", + " pl.plot(x, A[:, i])\n", + "pl.title('Distributions')\n", + "pl.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Barycenter computation\n", + "----------------------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/rflamary/PYTHON/POT/ot/unbalanced.py:501: RuntimeWarning: overflow encountered in square\n", + " np.sum((v - vprev) ** 2) / np.sum((v) ** 2)\n", + "/home/rflamary/PYTHON/POT/ot/unbalanced.py:501: RuntimeWarning: invalid value encountered in double_scalars\n", + " np.sum((v - vprev) ** 2) / np.sum((v) ** 2)\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# non weighted barycenter computation\n", + "\n", + "weight = 0.5 # 0<=weight<=1\n", + "weights = np.array([1 - weight, weight])\n", + "\n", + "# l2bary\n", + "bary_l2 = A.dot(weights)\n", + "\n", + "# wasserstein\n", + "reg = 1e-3\n", + "alpha = 1.\n", + "\n", + "bary_wass = ot.unbalanced.barycenter_unbalanced(A, M, reg, alpha, weights)\n", + "\n", + "pl.figure(2)\n", + "pl.clf()\n", + "pl.subplot(2, 1, 1)\n", + "for i in range(n_distributions):\n", + " pl.plot(x, A[:, i])\n", + "pl.title('Distributions')\n", + "\n", + "pl.subplot(2, 1, 2)\n", + "pl.plot(x, bary_l2, 'r', label='l2')\n", + "pl.plot(x, bary_wass, 'g', label='Wasserstein')\n", + "pl.legend()\n", + "pl.title('Barycenters')\n", + "pl.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Barycentric interpolation\n", + "-------------------------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/rflamary/PYTHON/POT/ot/unbalanced.py:500: RuntimeWarning: overflow encountered in square\n", + " err = np.sum((u - uprev) ** 2) / np.sum((u) ** 2) + \\\n", + "/home/rflamary/PYTHON/POT/ot/unbalanced.py:500: RuntimeWarning: invalid value encountered in double_scalars\n", + " err = np.sum((u - uprev) ** 2) / np.sum((u) ** 2) + \\\n", + "/home/rflamary/PYTHON/POT/ot/unbalanced.py:501: RuntimeWarning: overflow encountered in square\n", + " np.sum((v - vprev) ** 2) / np.sum((v) ** 2)\n", + "/home/rflamary/PYTHON/POT/ot/unbalanced.py:501: RuntimeWarning: invalid value encountered in double_scalars\n", + " np.sum((v - vprev) ** 2) / np.sum((v) ** 2)\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzsvXlwI+Wd///uQ7IlX+NjPD7G4xnbA8zJwDDDDAsMtUBIkYSFLQhJliMBKhs2uwW7VG0OriRfskltUrupVJbapJINkEDIQnaXYvmRhBwMYTmG4ZgTmLEsy7ctX7pbfT2/P+Sn3ZK6pZbUsmW7X5QLj47uliz1u5/n+Xzeb4YQAgcHBwcHh0qDXe4DcHBwcHBwMMIRKAcHBweHisQRKAcHBweHisQRKAcHBweHisQRKAcHBweHisQRKAcHBweHisQRKAcHBweHisQRKAcHBweHisQRKAcHBweHioQv8PGO7YSDg4ODQ6kwVh7kjKAcHBwcHCoSR6AcHBwcHCoSR6AcHBwcHCoSR6AcHBwcHCoSR6Ac1hT/9E//hLvuumu5D8MSX/va13DLLbcU/fwdO3bg5Zdftu+AbN7/FVdcgR//+MeWtvXyyy9j48aNNh2Zw0rBEahVyubNm+HxeFBbW4vGxkZ87GMfw/Dw8HIfVkGUeoI24qtf/arlk2I59l8uPvvZz+KBBx5Iu+3UqVO44oorlueAMvZv53uZTCZx5513oru7G3V1ddizZw9efPFFW7btUFk4ArWKef755xGNRjE+Po4NGzbg7/7u74rajizLNh/Z0rDcx73c+1+tyLKMrq4uHD58GKFQCI888gg++clPYnBwcLkPzcFuCCGF/DisELq7u8lLL72k/fuFF14gW7du1f79v//7v2TPnj2krq6ObNy4kTz88MPafX6/nwAgP/7xj0lXVxe57LLLyLXXXku+//3vp+1j165d5L/+678IIYScPHmSXHXVVaSxsZG0traSb37zm4QQQhRFId/61rdIT08PaWpqIjfddBOZmZlJ289jjz1Gurq6SHNzM3nkkUcIIYS8+OKLxOVyEZ7nSU1NDdm9ezchhJD5+Xlyxx13kLa2NtLR0UHuv/9+IssyIYSQn/70p+SSSy4h9957L2lqaiL3339/1vvy8MMPk7/6q79asv3T2774xS+S+vp6cu6555Lf/e532vGMjo6ST3ziE6SxsZH09vaSH/3oR4bHSgghN954I9mwYQOpr68nl112GTl58iQhhJAf/vCHhOd54nK5SE1NDfn4xz+e9RkQBIHcc889pL29nbS3t5N77rmHCIJACCHkj3/8I+ns7CTf/e53yfr160lbWxv5j//4D4NPFSF/+MMfyM6dO7V/X3XVVeSiiy7S/n3ppZeS//7v/07bv9l7eejQIfLAAw+QSy65hNTW1pKrr76aBINBw/3SYzRj165d5NlnnzW936HisKQ5jkCtUvQnp1gsRm677TZy6623avf/8Y9/JMePHyeKopBjx46R1tZW7cRCT9y33noriUajJB6Pk1/+8pdk//792vPfe+890tTURJLJJAmHw6StrY1897vfJYlEgoTDYfLGG28QQgj53ve+Ry6++GIyPDxMBEEgn//858mnPvWptP3cddddJB6Pk/fee4+43W5y+vRpQkj2CZoQQq6//nry+c9/nkSjUTI5OUn27dtH/v3f/50QkhIIjuPI97//fSJJEonH41nvi5FAlXP/9LZ/+Zd/IaIokqeffprU19drIn3ZZZeRu+++myQSCfLuu++SlpYW8vvf/95w/z/5yU9IOBzWxOb888/X7rv99tuzBFn/GXjwwQfJxRdfTCYnJ8nU1BQ5ePAgeeCBB7TPAsdx5MEHHySiKJIXXniBeDweMjs7m/X+xeNxUlVVRYLBIBFFkbS2tpKOjg4SDodJPB4n1dXVZHp6Omv/Ru/loUOHSE9PD/nwww9JPB4nhw4dIl/60pey9kmP0UygJiYmSFVVFXn//fcN73eoSByBWst0d3eTmpoa0tDQQHieJ+3t7eT48eOmj7/nnnvIvffeSwhZPHH7fD7t/kQiQdatW0fOnDlDCCHkvvvuI3fffTchhJCnnnqK7Nmzx3C75513XtqIYWxsjPA8TyRJ0vYzPDys3b9v3z7yi1/8ghCSfVKbmJggbrc7TXieeuopcsUVVxBCUgLR1dWV830xEqhy7v+nP/0paW9vJ6qqpu3jiSeeIENDQ4RlWRIOh7X7vvzlL5Pbb7/dcP965ubmCAAyPz9PCMkvUD09PeSFF17Q7vv1r39Nuru7CSGpk391dTWRJEm7f/369eT111833Pell15KfvWrX5HXX3+dXH311eSmm24iL774IvnDH/5Adu3aZbh/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cR5P5PHHH+ecc86Z0mMyObKYAmUyLZEkiffff5+f/exnrF69mnXr1nHfffcl3cbMzpo4J5xwAm+//bZhv6PPZ/3gBz9Iefvp1i79+9//ni1btvDGG28c6UMxmUKmh4eKickwZs2axaxZs1i9ejUAF198Me+//76RnQWY2VmHgO5IMZ0oKyujpaXF+Pto83cvv/wy9957Ly+88ILZWXqMYwqUybSkpKSE2bNnG/WlV155hUWLFhnZWYCZnXWMsWrVKhobG9m7dy/RaJRnnnlmhJnrv/71L6677jpeeOEF8+LkOMBskjCZtnzwwQdGB9/8+fP57W9/i6IoZnbWMczGjRv55je/aTiP33HHHUnO45/97GfZtm2bUYecM2cOL7zwwhE+apMJYHbxmUwNDQ0NXH311WzevBlZljnhhBP405/+xJIlS470oR0WHnnkEX79618jCAJLly7lt7/9LR0dHWZ+lolJ+pgCZTJ1fPe73yUcDhMKhZg1a9aorcDHGm1tbZxyyils374dp9PJl770Jc4991w2btzIhRdeaFhDLV++3MzPMjEZnbQEyqxBmUyIO++8k3/84x9s2bKFW2655UgfzmFFkiRCoRCSJBEMBiktLeXVV1/l4osvBrQB47/+9a9H+ChNTI5+TIEymRB9fX34/X58Ph/hcPhIH85ho6ysjO985zvMmTOH0tJScnJyqKurM/OzTEymAFOgTCbEddddxw9+8AMuv/xybr311iN9OIeNgYEBnn/+efbu3Ut7ezuBQIAXX3zxSB+WickxiTmoazJufve732Gz2fj3f/93ZFnmU5/6FK+++iqf+cxnjvShTTkvv/wy8+bNM5y+L7zwQt555x0zP8vEZAowV1Am4+aKK67gueeeAzSHgU2bNh0X4gRaW/N7771HMBhEVVVjPuvTn/40f/7zn4HjZz7rxRdfpLq6moqKihEuHwCRSIRLL72UiooKVq9ezb59+w7/QZoc1ZgCZWIyDlavXs3FF19MbW0tS5cuRVEUrr32Wu6//34efvhhKioq6Ovr4+qrrz7ShzqlyLLMf/7nf/L3v/+d7du38/TTT7N9+/ak2zz++OPk5eXR1NTEt771reNqK9hkcjDbzE1MTMZNOs7jZ599NnfffTcnnXQSkiRRUlJCT0+P6Z9oAmabuYnJ8cFVV11FUVFR0qB0f38/Z555JpWVlZx55pkMDAwAWuTGTTfdREVFBcuWLeP999+f0GOmch4f3rmYeBur1UpOTg59fX0TejyT4xNToExMjnK+8pWvjOgkvO+++1izZg2NjY2sWbPGqBH9/e9/p7GxkcbGRh577DFzmNhkWjPeLT4TE5NpiCAIc4ENqqouif99F3CGqqodgiCUAq+rqlotCMIv439+evjtxvl4JwF3q6p6dvzvtwOoqvqjhNu8FL/Nu4IgWIFOoFA1TzomaWKuoExMjk2KE0SnE9Az28uAloTbtcb/bbw0AJWCIMwTBMEOrAWGu7a+AFwZ//PFwKumOJmMB3MOysTkGEdVVVUQhEkVBlVVJUEQbgReAizAb1RV/UQQhP8Gtqiq+gLwOPCUIAhNQD+aiJmYpI0pUCYmxyZdgiCUJmzxdcf/vQ2YnXC7WfF/Gzeqqm4ENg77tzsT/hwGLpnIfZuYgLnFZ2JyrJK4vXYl8HzCv18haJwIeMZbfzIxOVyYTRImJkc5giA8DZwBzAC6gLuAvwLPAnOA/cCXVFXtF7QhpPXA54Ag8FVVVbccieM2MRkLU6BMTExMTKYl5hafiYmJicm0xBQoExMTE5NpiSlQJiYmJibTElOgTExMTEymJf8/OoWkQhC4wJcAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzsvXeQHPWZ///u7pnZ2Ry1Uatd7a5QlmWEhCRLSLZJBzYHLjCYI9gYB853BS7qCky0fdhwhcvncvmwz2WOYEw4fLb1w3yJJgiMkIhCAYF2dzan2d3ZnTydnt8fs59WT049G/tVpYKd0N3TM/159/P5PM/74YgIJiYmJiYm8w1+rg/AxMTExMQkHqZAmZiYmJjMS0yBMjExMTGZl5gCZWJiYmIyLzEFysTExMRkXmIKlImJiYnJvMQUKBMTExOTeYkpUCYmJiYm8xJToExMTExM5iWWDF9v2k6YmJiYmOQKl86LzAjKxMTExGReYgqUiYmJicm8xBQoExMTE5N5iSlQJiYmJibzElOgTGaVn/70p7j++uvn+jDS4oc//CGuuuqqrN+/fv16vPbaa8YdkMH737t3L373u9/N3gEtUN544w2sXr16rg9jSWIKVJ5obW1FYWEhSkpKUFlZiQsvvBD9/f1zfVgZkesAHY/bbrst7UExH/vPF1//+tdxxx13RDx27Ngx7N27d24OKGr/uZ7L1atX46mnntL+/vvf/w6O42IeKy0thSzLWe9nNnj44Yexa9eutF+/e/dufPLJJ3k8IpNEmAKVR5555hl4vV4MDw+jrq4O//qv/5rVdub7BZ+IuT7uud7/YuKss87C/v37tb/379+PNWvWxDy2Y8cOWCyZVq8YCxFBVdU5PQYTgyCiTP6ZpElLSwu99NJL2t/PPvssrVq1Svv7r3/9K23evJlKS0tp+fLldPfdd2vPORwOAkC/+93vqLm5mXbv3k0XXHAB/fKXv4zYx8aNG+lPf/oTEREdPXqUzj77bKqsrKTa2lr6yU9+QkREiqLQvffeS21tbVRVVUWXXXYZTUxMROzn4YcfpubmZqqurqZ77rmHiIiee+45slqtZLFYqLi4mDZt2kRERFNTU3TddddRfX09NTY20u23306yLBMR0UMPPUQ7d+6km266iaqqquj222+POS933303/dM//dOs7Z899r3vfY/Kyspo9erV9PLLL2vHMzg4SF/+8pepsrKS2tvb6be//W3cYyUiuvTSS6muro7Kyspo9+7ddPToUSIi+u///m+yWCxktVqpuLiYvvSlL8X8BoLBIN14443U0NBADQ0NdOONN1IwGCQioldffZWamproZz/7GS1btozq6+vpf/7nf+L8qoheeeUV2rBhg/b32WefTWeccYb2965du+jPf/5zxP4Tncs9e/bQHXfcQTt37qSSkhI655xzyOl0xt3vo48+GrHff/iHf6CHHnoo5rF///d/JyKizs5O+vznP09VVVVUXV1NV155JblcLu219913HzU2NlJJSQmddtpp2ndy8OBB2rJlC5WWllJtbS19//vf195z4MAB2rFjB5WXl9OmTZvo1Vdf1Z7bs2cP3XbbbbRz506y2+108uRJeuihh2jlypVUUlJCra2t9Nhjj9Hx48epoKCAeJ6n4uJiKi8v176fm2++mZqbm6m2tpa+853vkN/vj/h+GC0tLXT//ffTxo0bqaysjL761a9SIBCIe95MEpKW5pgClSf0g5PP56NrrrmGrr76au35V199lT766CNSFIUOHz5MtbW12sDCBu6rr76avF4v+f1+euqpp2jbtm3a+z/88EOqqqqiUChEbreb6uvr6Wc/+xkFAgFyu9309ttvExHRL37xCzrzzDOpv7+fgsEgffvb36YrrrgiYj/XX389+f1++vDDD8lms9Hx48eJKHaAJiK6+OKL6dvf/jZ5vV4aHR2lrVu30m9+8xsiCguEIAj0y1/+kiRJ0i5wPfEEKp/7Z4/9/Oc/J1EU6cknn6SysjJNpHfv3k033HADBQIB+uCDD6impob+9re/xd3/gw8+SG63WxObz3zmM9pz1157bYwg638Dd955J5155pk0OjpKY2NjtGPHDrrjjju034IgCHTnnXeSKIr07LPPUmFhIU1OTsacP7/fTwUFBeR0OkkURaqtraXGxkZyu93k9/vJbrfT+Ph4zP7jncs9e/ZQW1sbffLJJ+T3+2nPnj10yy23xOyTiKinp4c4jqOJiQlSFIWWLVtGfr+fli9frj1WVlZGr7/+OhERnTx5kl588UUKBoM0NjZGu3fvphtvvJGIiE6cOEHLly+nwcFB7XfQ2dlJRETbt2+nRx99lIiIPB4PHThwgIiIBgYGqKqqip599llSFIVefPFFqqqqorGxMe2zNDc309GjR0mSJJqamqLS0lI6ceIEERENDQ1pNxQPPfQQfe5zn4v4fDfddBN9+ctfpomJCXK73fSlL32Jbr31Vu37iRaorVu30uDgIE1MTNCaNWvo17/+ddzzZpIQU6DmkpaWFu0OzWKxUENDA3300UcJX3/jjTfSTTfdRESnBu6uri7t+UAgQBUVFfTpp58SEdHNN99MN9xwAxERPf7447R58+a4212zZk1ExDA0NEQWi4UkSdL209/frz2/detWeuKJJ4godlAbGRkhm80WITyPP/447d27l4jCF35zc3PS8xJPoPK5/4ceeogaGhpIVdWIfTz66KPU19dHPM+T2+3Wnrv11lvp2muvjbt/PS6XiwDQ1NQUEaUWqLa2Nnr22We1555//nlqaWkhovAAaLfbSZIk7flly5Zpg3M0u3btov/7v/+jAwcO0DnnnEOXXXYZPffcc/TKK6/Qxo0b4+4/kUCxiIeI6L/+67/ovPPOi7tPtr2//OUv9P7779POnTuJiOjyyy/XHrPb7VpUGM2f//xn7Td68uRJWrZsGb300kskimLE63bv3k133XVXTCR333330VVXXRXx2LnnnksPP/yw9lnuvPNO7Tmv10vl5eX0xz/+MeZGKVqgVFWloqIiTSSJiN566y1qbW0lovgC9fvf/177+9/+7d/oO9/5TtzPbZKQtDTHXIPKI3/5y18wNTWFYDCIX/3qV9izZw9GRkYAAAcPHsTnP/95LFu2DOXl5fjNb36D8fHxiPc3Nzdr/2+323H55Zfjscceg6qqeOKJJ3D11VcDAPr7+9He3h73GHp7e3HJJZegoqICFRUVWLt2LQRBwOjoqPaa+vp67f+Liorg9XoTbkuSJDQ0NGjb+853voOxsbG4x5wu+d5/U1MTOO6Us0pLSwuGhoYwNDSEqqoqlJaWRjw3ODgYsw1FUXDrrbeivb0dZWVlaG1tBYCY7ywRQ0NDaGlpiTkGRnV1dcTaTbLzsGfPHrz22mvYv38/9uzZg7179+L111/H66+/jj179qR1PIx0zz1wah1q//792L17NwBg165d2mPbtm1DQUEBAGB0dBRXXHEFmpqaUFZWhquuuko7Vx0dHfjFL36BH/7wh6itrcUVV1yhnYsHH3wQn376KdasWYOtW7fir3/9K4Dwd//0009r33tF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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# barycenter interpolation\n", + "\n", + "n_weight = 11\n", + "weight_list = np.linspace(0, 1, n_weight)\n", + "\n", + "\n", + "B_l2 = np.zeros((n, n_weight))\n", + "\n", + "B_wass = np.copy(B_l2)\n", + "\n", + "for i in range(0, n_weight):\n", + " weight = weight_list[i]\n", + " weights = np.array([1 - weight, weight])\n", + " B_l2[:, i] = A.dot(weights)\n", + " B_wass[:, i] = ot.unbalanced.barycenter_unbalanced(A, M, reg, alpha, weights)\n", + "\n", + "\n", + "# plot interpolation\n", + "\n", + "pl.figure(3)\n", + "\n", + "cmap = pl.cm.get_cmap('viridis')\n", + "verts = []\n", + "zs = weight_list\n", + "for i, z in enumerate(zs):\n", + " ys = B_l2[:, i]\n", + " verts.append(list(zip(x, ys)))\n", + "\n", + "ax = pl.gcf().gca(projection='3d')\n", + "\n", + "poly = PolyCollection(verts, facecolors=[cmap(a) for a in weight_list])\n", + "poly.set_alpha(0.7)\n", + "ax.add_collection3d(poly, zs=zs, zdir='y')\n", + "ax.set_xlabel('x')\n", + "ax.set_xlim3d(0, n)\n", + "ax.set_ylabel(r'$\\alpha$')\n", + "ax.set_ylim3d(0, 1)\n", + "ax.set_zlabel('')\n", + "ax.set_zlim3d(0, B_l2.max() * 1.01)\n", + "pl.title('Barycenter interpolation with l2')\n", + "pl.tight_layout()\n", + "\n", + "pl.figure(4)\n", + "cmap = pl.cm.get_cmap('viridis')\n", + "verts = []\n", + "zs = weight_list\n", + "for i, z in enumerate(zs):\n", + " ys = B_wass[:, i]\n", + " verts.append(list(zip(x, ys)))\n", + "\n", + "ax = pl.gcf().gca(projection='3d')\n", + "\n", + "poly = PolyCollection(verts, facecolors=[cmap(a) for a in weight_list])\n", + "poly.set_alpha(0.7)\n", + "ax.add_collection3d(poly, zs=zs, zdir='y')\n", + "ax.set_xlabel('x')\n", + "ax.set_xlim3d(0, n)\n", + "ax.set_ylabel(r'$\\alpha$')\n", + "ax.set_ylim3d(0, 1)\n", + "ax.set_zlabel('')\n", + "ax.set_zlim3d(0, B_l2.max() * 1.01)\n", + "pl.title('Barycenter interpolation with Wasserstein')\n", + "pl.tight_layout()\n", + "\n", + "pl.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} -- cgit v1.2.3 From 8ae85fd6b3649058da07b16c9ea139864c7f94a1 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 25 Jun 2019 14:57:26 +0200 Subject: alpha for documentation --- ot/gromov.py | 4 ++-- ot/unbalanced.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ot/gromov.py b/ot/gromov.py index cd961b0..3a7e24c 100644 --- a/ot/gromov.py +++ b/ot/gromov.py @@ -357,7 +357,7 @@ def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, Computes the FGW transport between two graphs see [24] .. math:: - \gamma = arg\min_\gamma (1-\alpha)*<\gamma,M>_F + \alpha* \sum_{i,j,k,l} + \gamma = arg\min_\gamma (1-\\alpha)*<\gamma,M>_F + \\alpha* \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} s.t. \gamma 1 = p @@ -440,7 +440,7 @@ def fused_gromov_wasserstein2(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5 Computes the FGW distance between two graphs see [24] .. math:: - \min_\gamma (1-\alpha)*<\gamma,M>_F + \alpha* \sum_{i,j,k,l} + \min_\gamma (1-\\alpha)*<\gamma,M>_F + \\alpha* \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} diff --git a/ot/unbalanced.py b/ot/unbalanced.py index 484ce95..bad12d6 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -19,7 +19,7 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, The function solves the following optimization problem: .. math:: - W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \alpha KL(\gamma 1, a) + \alpha KL(\gamma^T 1, b) + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\alpha KL(\gamma 1, a) + \\alpha KL(\gamma^T 1, b) s.t. \gamma\geq 0 @@ -128,7 +128,7 @@ def sinkhorn_unbalanced2(a, b, M, reg, alpha, method='sinkhorn', The function solves the following optimization problem: .. math:: - W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \alpha KL(\gamma 1, a) + \alpha KL(\gamma^T 1, b) + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\alpha KL(\gamma 1, a) + \\alpha KL(\gamma^T 1, b) s.t. \gamma\geq 0 @@ -239,7 +239,7 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, The function solves the following optimization problem: .. math:: - W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \alpha KL(\gamma 1, a) + \alpha KL(\gamma^T 1, b) + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\alpha KL(\gamma 1, a) + \\alpha KL(\gamma^T 1, b) s.t. \gamma\geq 0 -- cgit v1.2.3 From 1140141938c678d267f688dbb9106d3422d633c5 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Thu, 27 Jun 2019 10:04:35 +0200 Subject: Added minkowski variants and wasserstein_1d functions --- ot/lp/__init__.py | 203 ++++++++++++++++++++++++++++++++++++++++++++++++++--- ot/lp/emd_wrap.pyx | 10 ++- 2 files changed, 203 insertions(+), 10 deletions(-) diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index bf218d3..719032b 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -21,7 +21,7 @@ from .cvx import barycenter from ..utils import dist __all__=['emd', 'emd2', 'barycenter', 'free_support_barycenter', 'cvx', - 'emd_1d', 'emd2_1d'] + 'emd_1d', 'emd2_1d', 'wasserstein_1d', 'wasserstein2_1d'] def emd(a, b, M, numItermax=100000, log=False): @@ -313,7 +313,8 @@ def free_support_barycenter(measures_locations, measures_weights, X_init, b=None return X -def emd_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', dense=True, log=False): +def emd_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', p=1., dense=True, + log=False): """Solves the Earth Movers distance problem between 1d measures and returns the OT matrix @@ -330,6 +331,8 @@ def emd_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', dense=True, log=False - x_a and x_b are the samples - a and b are the sample weights + When 'minkowski' is used as a metric, :math:`d(x, y) = |x - y|^p`. + Uses the algorithm detailed in [1]_ Parameters @@ -346,11 +349,14 @@ def emd_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', dense=True, log=False Metric to be used. Only strings listed in :func:`ot.dist` are accepted. Due to implementation details, this function runs faster when `'sqeuclidean'`, `'cityblock'`, or `'euclidean'` metrics are used. + p: float, optional (default=1.0) + The p-norm to apply for if metric='minkowski' dense: boolean, optional (default=True) If True, returns math:`\gamma` as a dense ndarray of shape (ns, nt). Otherwise returns a sparse representation using scipy's `coo_matrix` format. Due to implementation details, this function runs faster when - dense is set to False. + `'sqeuclidean'`, `'minkowski'`, `'cityblock'`, or `'euclidean'` metrics + are used. log: boolean, optional (default=False) If True, returns a dictionary containing the cost. Otherwise returns only the optimal transportation matrix. @@ -416,7 +422,7 @@ def emd_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', dense=True, log=False G_sorted, indices, cost = emd_1d_sorted(a, b, x_a_1d[perm_a], x_b_1d[perm_b], - metric=metric) + metric=metric, p=p) G = coo_matrix((G_sorted, (perm_a[indices[:, 0]], perm_b[indices[:, 1]])), shape=(a.shape[0], b.shape[0])) if dense: @@ -427,7 +433,8 @@ def emd_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', dense=True, log=False return G -def emd2_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', dense=True, log=False): +def emd2_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', p=1., dense=True, + log=False): """Solves the Earth Movers distance problem between 1d measures and returns the loss @@ -444,6 +451,8 @@ def emd2_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', dense=True, log=Fals - x_a and x_b are the samples - a and b are the sample weights + When 'minkowski' is used as a metric, :math:`d(x, y) = |x - y|^p`. + Uses the algorithm detailed in [1]_ Parameters @@ -459,7 +468,10 @@ def emd2_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', dense=True, log=Fals metric: str, optional (default='sqeuclidean') Metric to be used. Only strings listed in :func:`ot.dist` are accepted. Due to implementation details, this function runs faster when - `'sqeuclidean'`, `'cityblock'`, or `'euclidean'` metrics are used. + `'sqeuclidean'`, `'minkowski'`, `'cityblock'`, or `'euclidean'` metrics + are used. + p: float, optional (default=1.0) + The p-norm to apply for if metric='minkowski' dense: boolean, optional (default=True) If True, returns math:`\gamma` as a dense ndarray of shape (ns, nt). Otherwise returns a sparse representation using scipy's `coo_matrix` @@ -508,10 +520,185 @@ def emd2_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', dense=True, log=Fals """ # If we do not return G (log==False), then we should not to cast it to dense # (useless overhead) - G, log_emd = emd_1d(x_a=x_a, x_b=x_b, a=a, b=b, metric=metric, + G, log_emd = emd_1d(x_a=x_a, x_b=x_b, a=a, b=b, metric=metric, p=p, dense=dense and log, log=True) cost = log_emd['cost'] if log: log_emd = {'G': G} return cost, log_emd - return cost \ No newline at end of file + return cost + + +def wasserstein_1d(x_a, x_b, a=None, b=None, p=1., dense=True, log=False): + """Solves the Wasserstein distance problem between 1d measures and returns + the OT matrix + + + .. math:: + \gamma = arg\min_\gamma \left(\sum_i \sum_j \gamma_{ij} + |x_a[i] - x_b[j]|^p \right)^{1/p} + + s.t. \gamma 1 = a, + \gamma^T 1= b, + \gamma\geq 0 + where : + + - x_a and x_b are the samples + - a and b are the sample weights + + Uses the algorithm detailed in [1]_ + + Parameters + ---------- + x_a : (ns,) or (ns, 1) ndarray, float64 + Source dirac locations (on the real line) + x_b : (nt,) or (ns, 1) ndarray, float64 + Target dirac locations (on the real line) + a : (ns,) ndarray, float64, optional + Source histogram (default is uniform weight) + b : (nt,) ndarray, float64, optional + Target histogram (default is uniform weight) + p: float, optional (default=1.0) + The order of the p-Wasserstein distance to be computed + dense: boolean, optional (default=True) + If True, returns math:`\gamma` as a dense ndarray of shape (ns, nt). + Otherwise returns a sparse representation using scipy's `coo_matrix` + format. Due to implementation details, this function runs faster when + `'sqeuclidean'`, `'minkowski'`, `'cityblock'`, or `'euclidean'` metrics + are used. + log: boolean, optional (default=False) + If True, returns a dictionary containing the cost. + Otherwise returns only the optimal transportation matrix. + + Returns + ------- + gamma: (ns, nt) ndarray + Optimal transportation matrix for the given parameters + log: dict + If input log is True, a dictionary containing the cost + + + Examples + -------- + + Simple example with obvious solution. The function wasserstein_1d accepts + lists and performs automatic conversion to numpy arrays + + >>> import ot + >>> a=[.5, .5] + >>> b=[.5, .5] + >>> x_a = [2., 0.] + >>> x_b = [0., 3.] + >>> ot.wasserstein_1d(x_a, x_b, a, b) + array([[0. , 0.5], + [0.5, 0. ]]) + >>> ot.wasserstein_1d(x_a, x_b) + array([[0. , 0.5], + [0.5, 0. ]]) + + References + ---------- + + .. [1] Peyré, G., & Cuturi, M. (2017). "Computational Optimal + Transport", 2018. + + See Also + -------- + ot.lp.emd_1d : EMD for 1d distributions + ot.lp.wasserstein2_1d : Wasserstein for 1d distributions (returns the cost + instead of the transportation matrix) + """ + if log: + G, log = emd_1d(x_a=x_a, x_b=x_b, a=a, b=b, metric='minkowski', p=p, + dense=dense, log=log) + log['cost'] = np.power(log['cost'], 1. / p) + return G, log + return emd_1d(x_a=x_a, x_b=x_b, a=a, b=b, metric='minkowski', p=p, + dense=dense, log=log) + + +def wasserstein2_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', p=1., + dense=True, log=False): + """Solves the Wasserstein distance problem between 1d measures and returns + the loss + + + .. math:: + \gamma = arg\min_\gamma \left( \sum_i \sum_j \gamma_{ij} + |x_a[i] - x_b[j]|^p \right)^{1/p} + + s.t. \gamma 1 = a, + \gamma^T 1= b, + \gamma\geq 0 + where : + + - x_a and x_b are the samples + - a and b are the sample weights + + Uses the algorithm detailed in [1]_ + + Parameters + ---------- + x_a : (ns,) or (ns, 1) ndarray, float64 + Source dirac locations (on the real line) + x_b : (nt,) or (ns, 1) ndarray, float64 + Target dirac locations (on the real line) + a : (ns,) ndarray, float64, optional + Source histogram (default is uniform weight) + b : (nt,) ndarray, float64, optional + Target histogram (default is uniform weight) + p: float, optional (default=1.0) + The order of the p-Wasserstein distance to be computed + dense: boolean, optional (default=True) + If True, returns math:`\gamma` as a dense ndarray of shape (ns, nt). + Otherwise returns a sparse representation using scipy's `coo_matrix` + format. Only used if log is set to True. Due to implementation details, + this function runs faster when dense is set to False. + log: boolean, optional (default=False) + If True, returns a dictionary containing the transportation matrix. + Otherwise returns only the loss. + + Returns + ------- + loss: float + Cost associated to the optimal transportation + log: dict + If input log is True, a dictionary containing the Optimal transportation + matrix for the given parameters + + + Examples + -------- + + Simple example with obvious solution. The function wasserstein2_1d accepts + lists and performs automatic conversion to numpy arrays + + >>> import ot + >>> a=[.5, .5] + >>> b=[.5, .5] + >>> x_a = [2., 0.] + >>> x_b = [0., 3.] + >>> ot.wasserstein2_1d(x_a, x_b, a, b) + 0.5 + >>> ot.wasserstein2_1d(x_a, x_b) + 0.5 + + References + ---------- + + .. [1] Peyré, G., & Cuturi, M. (2017). "Computational Optimal + Transport", 2018. + + See Also + -------- + ot.lp.emd2_1d : EMD for 1d distributions + ot.lp.wasserstein_1d : Wasserstein for 1d distributions (returns the + transportation matrix instead of the cost) + """ + if log: + cost, log = emd2_1d(x_a=x_a, x_b=x_b, a=a, b=b, metric='minkowski', p=p, + dense=dense, log=log) + cost = np.power(cost, 1. / p) + return cost, log + return np.power(emd2_1d(x_a=x_a, x_b=x_b, a=a, b=b, metric='minkowski', p=p, + dense=dense, log=log), 1. / p) \ No newline at end of file diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index 2825ba2..7134136 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -103,7 +103,8 @@ def emd_1d_sorted(np.ndarray[double, ndim=1, mode="c"] u_weights, np.ndarray[double, ndim=1, mode="c"] v_weights, np.ndarray[double, ndim=1, mode="c"] u, np.ndarray[double, ndim=1, mode="c"] v, - str metric='sqeuclidean'): + str metric='sqeuclidean', + double p=1.): r""" Solves the Earth Movers distance problem between sorted 1d measures and returns the OT matrix and the associated cost @@ -121,7 +122,10 @@ def emd_1d_sorted(np.ndarray[double, ndim=1, mode="c"] u_weights, metric: str, optional (default='sqeuclidean') Metric to be used. Only strings listed in :func:`ot.dist` are accepted. Due to implementation details, this function runs faster when - `'sqeuclidean'`, `'cityblock'`, or `'euclidean'` metrics are used. + `'sqeuclidean'`, `'minkowski'`, `'cityblock'`, or `'euclidean'` metrics + are used. + p: float, optional (default=1.0) + The p-norm to apply for if metric='minkowski' Returns ------- @@ -154,6 +158,8 @@ def emd_1d_sorted(np.ndarray[double, ndim=1, mode="c"] u_weights, m_ij = (u[i] - v[j]) ** 2 elif metric == 'cityblock' or metric == 'euclidean': m_ij = abs(u[i] - v[j]) + elif metric == 'minkowski': + m_ij = abs(u[i] - v[j]) ** p else: m_ij = dist(u[i].reshape((1, 1)), v[j].reshape((1, 1)), metric=metric)[0, 0] -- cgit v1.2.3 From 0d333e004636f5d25edea6bb195e8e4d9a95ba98 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Thu, 27 Jun 2019 10:23:32 +0200 Subject: Improved tests and docs for wasserstein_1d --- ot/__init__.py | 5 +++-- ot/lp/__init__.py | 13 ++++++------- ot/lp/emd_wrap.pyx | 3 ++- test/test_ot.py | 23 +++++++++++++++++++++++ 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/ot/__init__.py b/ot/__init__.py index f0e526c..5bd9bb3 100644 --- a/ot/__init__.py +++ b/ot/__init__.py @@ -22,7 +22,7 @@ from . import smooth from . import stochastic # OT functions -from .lp import emd, emd2, emd_1d, emd2_1d +from .lp import emd, emd2, emd_1d, emd2_1d, wasserstein_1d, wasserstein2_1d from .bregman import sinkhorn, sinkhorn2, barycenter from .da import sinkhorn_lpl1_mm @@ -32,5 +32,6 @@ from .utils import dist, unif, tic, toc, toq __version__ = "0.5.1" __all__ = ["emd", "emd2", 'emd_1d', "sinkhorn", "sinkhorn2", "utils", 'datasets', - 'bregman', 'lp', 'tic', 'toc', 'toq', 'gromov', 'emd_1d', 'emd2_1d', + 'bregman', 'lp', 'tic', 'toc', 'toq', 'gromov', + 'emd_1d', 'emd2_1d', 'wasserstein_1d', 'wasserstein2_1d', 'dist', 'unif', 'barycenter', 'sinkhorn_lpl1_mm', 'da', 'optim'] diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index 719032b..76c9ec0 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -530,13 +530,13 @@ def emd2_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', p=1., dense=True, def wasserstein_1d(x_a, x_b, a=None, b=None, p=1., dense=True, log=False): - """Solves the Wasserstein distance problem between 1d measures and returns + """Solves the p-Wasserstein distance problem between 1d measures and returns the OT matrix .. math:: - \gamma = arg\min_\gamma \left(\sum_i \sum_j \gamma_{ij} - |x_a[i] - x_b[j]|^p \right)^{1/p} + \gamma = arg\min_\gamma \left( \sum_i \sum_j \gamma_{ij} + |x_a[i] - x_b[j]|^p \\right)^{1/p} s.t. \gamma 1 = a, \gamma^T 1= b, @@ -617,15 +617,14 @@ def wasserstein_1d(x_a, x_b, a=None, b=None, p=1., dense=True, log=False): dense=dense, log=log) -def wasserstein2_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', p=1., - dense=True, log=False): - """Solves the Wasserstein distance problem between 1d measures and returns +def wasserstein2_1d(x_a, x_b, a=None, b=None, p=1., dense=True, log=False): + """Solves the p-Wasserstein distance problem between 1d measures and returns the loss .. math:: \gamma = arg\min_\gamma \left( \sum_i \sum_j \gamma_{ij} - |x_a[i] - x_b[j]|^p \right)^{1/p} + |x_a[i] - x_b[j]|^p \\right)^{1/p} s.t. \gamma 1 = a, \gamma^T 1= b, diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index 7134136..42b848f 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -13,6 +13,7 @@ cimport numpy as np from ..utils import dist cimport cython +cimport libc.math as math import warnings @@ -159,7 +160,7 @@ def emd_1d_sorted(np.ndarray[double, ndim=1, mode="c"] u_weights, elif metric == 'cityblock' or metric == 'euclidean': m_ij = abs(u[i] - v[j]) elif metric == 'minkowski': - m_ij = abs(u[i] - v[j]) ** p + m_ij = math.pow(abs(u[i] - v[j]), p) else: m_ij = dist(u[i].reshape((1, 1)), v[j].reshape((1, 1)), metric=metric)[0, 0] diff --git a/test/test_ot.py b/test/test_ot.py index 6d6ea26..48423e7 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -85,6 +85,29 @@ def test_emd_1d_emd2_1d(): np.testing.assert_raises(AssertionError, ot.emd_1d, u, v, [], []) +def test_wass_1d(): + # test emd1d gives similar results as emd + n = 20 + m = 30 + rng = np.random.RandomState(0) + u = rng.randn(n, 1) + v = rng.randn(m, 1) + + M = ot.dist(u, v, metric='sqeuclidean') + + G, log = ot.emd([], [], M, log=True) + wass = log["cost"] + + G_1d, log = ot.wasserstein_1d(u, v, [], [], p=2., log=True) + wass1d = log["cost"] + + # check loss is similar + np.testing.assert_allclose(np.sqrt(wass), wass1d) + + # check G is similar + np.testing.assert_allclose(G, G_1d) + + def test_emd_empty(): # test emd and emd2 for simple identity n = 100 -- cgit v1.2.3 From c92e595009ad5e2ae6d4b2c040556cffb6316847 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Thu, 27 Jun 2019 11:08:15 +0200 Subject: Wasserstein defined as the cost itself (do not return transportation matrix) --- ot/__init__.py | 4 +- ot/lp/__init__.py | 125 +++++------------------------------------------------- test/test_ot.py | 6 +-- 3 files changed, 13 insertions(+), 122 deletions(-) diff --git a/ot/__init__.py b/ot/__init__.py index 730aa4f..1b3c2fb 100644 --- a/ot/__init__.py +++ b/ot/__init__.py @@ -23,7 +23,7 @@ from . import stochastic from . import unbalanced # OT functions -from .lp import emd, emd2, emd_1d, emd2_1d, wasserstein_1d, wasserstein2_1d +from .lp import emd, emd2, emd_1d, emd2_1d, wasserstein_1d from .bregman import sinkhorn, sinkhorn2, barycenter from .unbalanced import sinkhorn_unbalanced, barycenter_unbalanced from .da import sinkhorn_lpl1_mm @@ -35,6 +35,6 @@ __version__ = "0.5.1" __all__ = ["emd", "emd2", 'emd_1d', "sinkhorn", "sinkhorn2", "utils", 'datasets', 'bregman', 'lp', 'tic', 'toc', 'toq', 'gromov', - 'emd_1d', 'emd2_1d', 'wasserstein_1d', 'wasserstein2_1d', + 'emd_1d', 'emd2_1d', 'wasserstein_1d', 'dist', 'unif', 'barycenter', 'sinkhorn_lpl1_mm', 'da', 'optim', 'sinkhorn_unbalanced', "barycenter_unbalanced"] diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index 76c9ec0..a3f5b8d 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -21,7 +21,7 @@ from .cvx import barycenter from ..utils import dist __all__=['emd', 'emd2', 'barycenter', 'free_support_barycenter', 'cvx', - 'emd_1d', 'emd2_1d', 'wasserstein_1d', 'wasserstein2_1d'] + 'emd_1d', 'emd2_1d', 'wasserstein_1d'] def emd(a, b, M, numItermax=100000, log=False): @@ -529,9 +529,9 @@ def emd2_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', p=1., dense=True, return cost -def wasserstein_1d(x_a, x_b, a=None, b=None, p=1., dense=True, log=False): +def wasserstein_1d(x_a, x_b, a=None, b=None, p=1.): """Solves the p-Wasserstein distance problem between 1d measures and returns - the OT matrix + the distance .. math:: @@ -560,22 +560,11 @@ def wasserstein_1d(x_a, x_b, a=None, b=None, p=1., dense=True, log=False): Target histogram (default is uniform weight) p: float, optional (default=1.0) The order of the p-Wasserstein distance to be computed - dense: boolean, optional (default=True) - If True, returns math:`\gamma` as a dense ndarray of shape (ns, nt). - Otherwise returns a sparse representation using scipy's `coo_matrix` - format. Due to implementation details, this function runs faster when - `'sqeuclidean'`, `'minkowski'`, `'cityblock'`, or `'euclidean'` metrics - are used. - log: boolean, optional (default=False) - If True, returns a dictionary containing the cost. - Otherwise returns only the optimal transportation matrix. Returns ------- - gamma: (ns, nt) ndarray - Optimal transportation matrix for the given parameters - log: dict - If input log is True, a dictionary containing the cost + dist: float + p-Wasserstein distance Examples @@ -590,96 +579,8 @@ def wasserstein_1d(x_a, x_b, a=None, b=None, p=1., dense=True, log=False): >>> x_a = [2., 0.] >>> x_b = [0., 3.] >>> ot.wasserstein_1d(x_a, x_b, a, b) - array([[0. , 0.5], - [0.5, 0. ]]) - >>> ot.wasserstein_1d(x_a, x_b) - array([[0. , 0.5], - [0.5, 0. ]]) - - References - ---------- - - .. [1] Peyré, G., & Cuturi, M. (2017). "Computational Optimal - Transport", 2018. - - See Also - -------- - ot.lp.emd_1d : EMD for 1d distributions - ot.lp.wasserstein2_1d : Wasserstein for 1d distributions (returns the cost - instead of the transportation matrix) - """ - if log: - G, log = emd_1d(x_a=x_a, x_b=x_b, a=a, b=b, metric='minkowski', p=p, - dense=dense, log=log) - log['cost'] = np.power(log['cost'], 1. / p) - return G, log - return emd_1d(x_a=x_a, x_b=x_b, a=a, b=b, metric='minkowski', p=p, - dense=dense, log=log) - - -def wasserstein2_1d(x_a, x_b, a=None, b=None, p=1., dense=True, log=False): - """Solves the p-Wasserstein distance problem between 1d measures and returns - the loss - - - .. math:: - \gamma = arg\min_\gamma \left( \sum_i \sum_j \gamma_{ij} - |x_a[i] - x_b[j]|^p \\right)^{1/p} - - s.t. \gamma 1 = a, - \gamma^T 1= b, - \gamma\geq 0 - where : - - - x_a and x_b are the samples - - a and b are the sample weights - - Uses the algorithm detailed in [1]_ - - Parameters - ---------- - x_a : (ns,) or (ns, 1) ndarray, float64 - Source dirac locations (on the real line) - x_b : (nt,) or (ns, 1) ndarray, float64 - Target dirac locations (on the real line) - a : (ns,) ndarray, float64, optional - Source histogram (default is uniform weight) - b : (nt,) ndarray, float64, optional - Target histogram (default is uniform weight) - p: float, optional (default=1.0) - The order of the p-Wasserstein distance to be computed - dense: boolean, optional (default=True) - If True, returns math:`\gamma` as a dense ndarray of shape (ns, nt). - Otherwise returns a sparse representation using scipy's `coo_matrix` - format. Only used if log is set to True. Due to implementation details, - this function runs faster when dense is set to False. - log: boolean, optional (default=False) - If True, returns a dictionary containing the transportation matrix. - Otherwise returns only the loss. - - Returns - ------- - loss: float - Cost associated to the optimal transportation - log: dict - If input log is True, a dictionary containing the Optimal transportation - matrix for the given parameters - - - Examples - -------- - - Simple example with obvious solution. The function wasserstein2_1d accepts - lists and performs automatic conversion to numpy arrays - - >>> import ot - >>> a=[.5, .5] - >>> b=[.5, .5] - >>> x_a = [2., 0.] - >>> x_b = [0., 3.] - >>> ot.wasserstein2_1d(x_a, x_b, a, b) 0.5 - >>> ot.wasserstein2_1d(x_a, x_b) + >>> ot.wasserstein_1d(x_a, x_b) 0.5 References @@ -690,14 +591,8 @@ def wasserstein2_1d(x_a, x_b, a=None, b=None, p=1., dense=True, log=False): See Also -------- - ot.lp.emd2_1d : EMD for 1d distributions - ot.lp.wasserstein_1d : Wasserstein for 1d distributions (returns the - transportation matrix instead of the cost) + ot.lp.emd_1d : EMD for 1d distributions """ - if log: - cost, log = emd2_1d(x_a=x_a, x_b=x_b, a=a, b=b, metric='minkowski', p=p, - dense=dense, log=log) - cost = np.power(cost, 1. / p) - return cost, log - return np.power(emd2_1d(x_a=x_a, x_b=x_b, a=a, b=b, metric='minkowski', p=p, - dense=dense, log=log), 1. / p) \ No newline at end of file + cost_emd = emd2_1d(x_a=x_a, x_b=x_b, a=a, b=b, metric='minkowski', p=p, + dense=False, log=False) + return np.power(cost_emd, 1. / p) diff --git a/test/test_ot.py b/test/test_ot.py index 48423e7..3c4ac11 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -98,15 +98,11 @@ def test_wass_1d(): G, log = ot.emd([], [], M, log=True) wass = log["cost"] - G_1d, log = ot.wasserstein_1d(u, v, [], [], p=2., log=True) - wass1d = log["cost"] + wass1d = ot.wasserstein_1d(u, v, [], [], p=2.) # check loss is similar np.testing.assert_allclose(np.sqrt(wass), wass1d) - # check G is similar - np.testing.assert_allclose(G, G_1d) - def test_emd_empty(): # test emd and emd2 for simple identity -- cgit v1.2.3 From 362a7f8fa20cf7ae6f2e36d7e47c7ca9f81d3c51 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Thu, 27 Jun 2019 13:29:19 +0200 Subject: Added RT as a contributor + "optimized" Cython math operations --- README.md | 1 + ot/lp/emd_wrap.pyx | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d24d8b9..84148f8 100644 --- a/README.md +++ b/README.md @@ -167,6 +167,7 @@ The contributors to this library are: * [Alain Rakotomamonjy](https://sites.google.com/site/alainrakotomamonjy/home) * [Vayer Titouan](https://tvayer.github.io/) * [Hicham Janati](https://hichamjanati.github.io/) (Unbalanced OT) +* [Romain Tavenard](https://rtavenar.github.io/) (1d Wasserstein) This toolbox benefit a lot from open source research and we would like to thank the following persons for providing some code (in various languages): diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index 42b848f..8a4aec9 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -156,11 +156,11 @@ def emd_1d_sorted(np.ndarray[double, ndim=1, mode="c"] u_weights, cdef int cur_idx = 0 while i < n and j < m: if metric == 'sqeuclidean': - m_ij = (u[i] - v[j]) ** 2 + m_ij = (u[i] - v[j]) * (u[i] - v[j]) elif metric == 'cityblock' or metric == 'euclidean': - m_ij = abs(u[i] - v[j]) + m_ij = math.fabs(u[i] - v[j]) elif metric == 'minkowski': - m_ij = math.pow(abs(u[i] - v[j]), p) + m_ij = math.pow(math.fabs(u[i] - v[j]), p) else: m_ij = dist(u[i].reshape((1, 1)), v[j].reshape((1, 1)), metric=metric)[0, 0] -- cgit v1.2.3 From d20d471a1806bde43c23e67c1f805aa3c8908ec3 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Thu, 27 Jun 2019 14:34:23 +0200 Subject: update part 1 --- docs/source/quickstart.rst | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index d8d4838..a14358c 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -83,6 +83,29 @@ properties. It can computed from an already estimated OT matrix with Regularized Optimal Transport ----------------------------- +Recent developments have shown the interest of regularized OT both in terms of +computational and statistical properties. + +We address in this section the regularized OT problem that can be expressed as + +.. math:: + \gamma^* = arg\min_\gamma <\gamma,M>_F + reg*\Omega(\gamma) + + s.t. \gamma 1 = a + + \gamma^T 1= b + + \gamma\geq 0 +where : + +- :math:`M\in\mathbb{R}_+^{m\times n}` is the metric cost matrix defining the cost to move mass from bin :math:`a_i` to bin :math:`b_j`. +- :math:`a` and :math:`b` are histograms (positive, sum to 1) that represent the weights of each samples in the source an target distributions. +- :math:`\Omega` is the regularization term. + +We disvuss in the following specific algorithms + + + Entropic regularized OT ^^^^^^^^^^^^^^^^^^^^^^^ -- cgit v1.2.3 From 2d7db0ed112b9349dc0b0c4cc7a9f3ea8da4ebed Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Thu, 27 Jun 2019 15:01:13 +0200 Subject: update readme --- docs/source/readme.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/source/readme.rst b/docs/source/readme.rst index b7828d3..320ddd5 100644 --- a/docs/source/readme.rst +++ b/docs/source/readme.rst @@ -35,6 +35,7 @@ It provides the following solvers: - Stochastic Optimization for Large-scale Optimal Transport (semi-dual problem [18] and dual problem [19]) - Non regularized free support Wasserstein barycenters [20]. +- Unbalanced OT with KL relaxation distance and barycenter [10, 25]. Some demonstrations (both in Python and Jupyter Notebook format) are available in the examples folder. @@ -69,6 +70,13 @@ modules: Pip installation ^^^^^^^^^^^^^^^^ +Note that due to a limitation of pip, ``cython`` and ``numpy`` need to +be installed prior to installing POT. This can be done easily with + +:: + + pip install numpy cython + You can install the toolbox through PyPI with: :: @@ -229,6 +237,8 @@ The contributors to this library are - `Alain Rakotomamonjy `__ - `Vayer Titouan `__ +- `Hicham Janati `__ (Unbalanced OT) +- `Romain Tavenard `__ (1d Wasserstein) This toolbox benefit a lot from open source research and we would like to thank the following persons for providing some code (in various @@ -379,6 +389,10 @@ and Statistics, (AISTATS) 21, 2018 graphs `__ Proceedings of the 36th International Conference on Machine Learning (ICML). +[25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. (2019). +`Learning with a Wasserstein Loss `__ +Advances in Neural Information Processing Systems (NIPS). + .. |PyPI version| image:: https://badge.fury.io/py/POT.svg :target: https://badge.fury.io/py/POT .. |Anaconda Cloud| image:: https://anaconda.org/conda-forge/pot/badges/version.svg -- cgit v1.2.3 From 982ee8345d491d76ac9ba49c6b9a7f5418ed966d Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Thu, 27 Jun 2019 16:40:38 +0200 Subject: start section entropic --- docs/source/quickstart.rst | 90 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 77 insertions(+), 13 deletions(-) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index a14358c..c122d17 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -21,7 +21,7 @@ Solving optimal transport The optimal transport problem between discrete distributions is often expressed as .. math:: - \gamma^* = arg\min_\gamma \sum_{i,j}\gamma_{i,j}M_{i,j} + \gamma^* = arg\min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j} s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 @@ -56,15 +56,12 @@ Computing Wasserstein distance The value of the OT solution is often more of interest that the OT matrix : .. math:: - W(a,b)=\min_\gamma \sum_{i,j}\gamma_{i,j}M_{i,j} + OT(a,b)=\min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j} s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 -where :math:`W(a,b)` is the `Wasserstein distance -`_ between distributions a and b -It is a metrix that has nice statistical -properties. It can computed from an already estimated OT matrix with +It can computed from an already estimated OT matrix with :code:`np.sum(T*M)` or directly with the function :any:`ot.emd2`. .. code:: python @@ -73,6 +70,25 @@ properties. It can computed from an already estimated OT matrix with # M is the ground cost matrix W=ot.emd2(a,b,M) # Wasserstein distance / EMD value +Note that the well known `Wasserstein distance +`_ between distributions a and +b is defined as + + + .. math:: + + W_p(a,b)=(\min_\gamma \sum_{i,j}\gamma_{i,j}\|x_i-y_j\|_p)^\frac{1}{p} + + s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 + +This means that if you want to compute the :math:`W_2` you need to compute the +square root of :any:`ot.emd2` when providing +:code:`M=ot.dist(xs,xt)` that use the squared euclidean distance by default. Computing +the :math:`W_1` wasserstein distance can be done directly with :any:`ot.emd2` +when providing :code:`M=ot.dist(xs,xt, metric='euclidean')` to use the euclidean +distance. + + .. hint:: Examples of use for :any:`ot.emd2` are available in the following examples: @@ -80,6 +96,32 @@ properties. It can computed from an already estimated OT matrix with - :any:`auto_examples/plot_compute_emd` +Special cases +^^^^^^^^^^^^^ + +Note that the OT problem and the corresponding Wasserstein distance can in some +special cases be computed very efficiently. + +For instance when the samples are in 1D, then the OT problem can be solved in +:math:`O(n\log(n))` by using a simple sorting. In this case we provide the +function :any:`ot.emd_1d` and :any:`ot.emd2_1d` to return respectively the OT +matrix and value. Note that since the solution is very sparse the :code:`sparse` +parameter of :any:`ot.emd_1d` allows for solving and returning the solution for +very large problems. Note that in order to computed directly the :math:`W_p` +Wasserstein distance in 1D we provide the function :any:`ot.wasserstein_1d` that +takes :code:`p` as a parameter. + +Another specials for estimating OT and Monge mapping is between Gaussian +distributions. In this case there exists a close form solution given in Remark +2.29 in [15]_ and the Monge mapping is an affine function and can be +also computed from the covariances and means of the source and target +distributions. In this case when the finite sample dataset is supposed gaussian, we provide +:any:`ot.da.OT_mapping_linear` that returns the parameters for the Monge +mapping. + + + + Regularized Optimal Transport ----------------------------- @@ -89,31 +131,53 @@ computational and statistical properties. We address in this section the regularized OT problem that can be expressed as .. math:: - \gamma^* = arg\min_\gamma <\gamma,M>_F + reg*\Omega(\gamma) + \gamma^* = arg\min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j} + \lambda\Omega(\gamma) - s.t. \gamma 1 = a + s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 - \gamma^T 1= b - \gamma\geq 0 where : - :math:`M\in\mathbb{R}_+^{m\times n}` is the metric cost matrix defining the cost to move mass from bin :math:`a_i` to bin :math:`b_j`. - :math:`a` and :math:`b` are histograms (positive, sum to 1) that represent the weights of each samples in the source an target distributions. - :math:`\Omega` is the regularization term. -We disvuss in the following specific algorithms - +We discuss in the following specific algorithms that can be used depending on +the regularization term. Entropic regularized OT ^^^^^^^^^^^^^^^^^^^^^^^ +This is the most common regularization used for optimal transport. It has been +proposed in the ML community by Marco Cuturi in his seminal paper [2]_. This +regularization has the following expression + +.. math:: + \Omega(\gamma)=\sum_{i,j}\gamma_{i,j}\log(\gamma_{i,j}) + + +The use of the regularization term above in the optimization problem has a very +strong impact. First it makes the problem smooth which leads to new optimization +procedures such as L-BFGS (see :any:`ot.smooth` ). Next it makes the problem +strictly convex meaning that there will be a unique solution. Finally the +solution of the resulting optimization problem can be expressed as: + +.. math:: + + \gamma_\lambda^*=\text{diag}(u)K\text{diag}(v) + +where :math:`u` and :math:`v` are vectors and :math:`K=\exp(-M/\lambda)` where +the :math:`\exp` is taken component-wise. + + + + Other regularization ^^^^^^^^^^^^^^^^^^^^ -Stochastic gradient decsent +Stochastic gradient descent ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Wasserstein Barycenters -- cgit v1.2.3 From 7dcfebbef19e1f94928fc71face612a2f71372b4 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 28 Jun 2019 08:33:36 +0200 Subject: entropic mostly done, starting general regularization --- docs/source/quickstart.rst | 144 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 133 insertions(+), 11 deletions(-) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index c122d17..4f2d9bb 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -5,6 +5,9 @@ Quick start guide In the following we provide some pointers about which functions and classes to use for different problems related to optimal transport (OT). +This document is not a tutorial on numerical optimal transport. For this we strongly +recommend to read the very nice book [15]_ . + Optimal transport and Wasserstein distance ------------------------------------------ @@ -20,10 +23,11 @@ Solving optimal transport The optimal transport problem between discrete distributions is often expressed as - .. math:: - \gamma^* = arg\min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j} - s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 +.. math:: + \gamma^* = arg\min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j} + + s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 where : @@ -120,8 +124,6 @@ distributions. In this case when the finite sample dataset is supposed gaussian, mapping. - - Regularized Optimal Transport ----------------------------- @@ -146,6 +148,7 @@ We discuss in the following specific algorithms that can be used depending on the regularization term. + Entropic regularized OT ^^^^^^^^^^^^^^^^^^^^^^^ @@ -168,23 +171,107 @@ solution of the resulting optimization problem can be expressed as: \gamma_\lambda^*=\text{diag}(u)K\text{diag}(v) where :math:`u` and :math:`v` are vectors and :math:`K=\exp(-M/\lambda)` where -the :math:`\exp` is taken component-wise. +the :math:`\exp` is taken component-wise. In order to solve the optimization +problem, on can use an alternative projection algorithm that can be very +efficient for large values if regularization. + +The main function is POT are :any:`ot.sinkhorn` and +:any:`ot.sinkhorn2` that return respectively the OT matrix and the value of the +linear term. Note that the regularization parameter :math:`\lambda` in the +equation above is given to those function with the parameter :code:`reg`. + >>> import ot + >>> a=[.5,.5] + >>> b=[.5,.5] + >>> M=[[0.,1.],[1.,0.]] + >>> ot.sinkhorn(a,b,M,1) + array([[ 0.36552929, 0.13447071], + [ 0.13447071, 0.36552929]]) +More details about the algorithm used is given in the following note. + + +.. note:: + The main function to solve entropic regularized OT is :any:`ot.sinkhorn`. + This function is a wrapper and the parameter :code:`method` help you select + the actual algorithm used to solve the problem: + + + :code:`method='sinkhorn'` calls :any:`ot.bregman.sinkhorn_knopp` the + classic algorithm [2]_. + + :code:`method='sinkhorn_stabilized'` calls :any:`ot.bregman.sinkhorn_stabilized` the + log stabilized version of the algorithm [9]_. + + :code:`method='sinkhorn_epsilon_scaling'` calls + :any:`ot.bregman.sinkhorn_epsilon_scaling` the epsilon scaling version + of the algorithm [9]_. + + :code:`method='greenkhorn'` calls :any:`ot.bregman.greenkhorn` the + greedy sinkhorn verison of the algorithm [22]_. + + In addition to all those variants of sinkhorn, we have another + implementation solving the problem in the smooth dual or semi-dual in + :any:`ot.smooth`. This solver use the :any:`scipy.optimize.minimize` + function to solve the smooth problem with :code:`L-BFGS` algorithm. Tu use + this solver, use functions :any:`ot.smooth.smooth_ot_dual` or + :any:`ot.smooth.smooth_ot_semi_dual` with parameter :code:`reg_type='kl'` to + choose entropic/Kullbach Leibler regularization. + +.. hint:: + Examples of use for :any:`ot.sinkhorn` are available in the following examples: + + - :any:`auto_examples/plot_OT_2D_samples` + - :any:`auto_examples/plot_OT_1D` + - :any:`auto_examples/plot_OT_1D_smooth` + - :any:`auto_examples/plot_stochastic` + +Finally note that we also provide in :any:`ot.stochastic` several implementation +of stochastic solvers for entropic regularized OT [18]_ [19]_. Other regularization ^^^^^^^^^^^^^^^^^^^^ -Stochastic gradient descent -^^^^^^^^^^^^^^^^^^^^^^^^^^^ +While entropic OT is the most common and favored in practice, there exist other +kind of regularization. We provide in POT two specific solvers for other +regularization terms: namely quadratic regularization and group lasso +regularization. But we also provide in :any:`ot.optim` two generic solvers that allows solving any +smooth regularization in practice. + +The first general regularization term we can solve is the quadratic +regularization of the form + +.. math:: + \Omega(\gamma)=\sum_{i,j} \gamma_{i,j}^2 + +this regularization term has a similar effect to entropic regularization in +densifying the OT matrix but it keeps some sort of sparsity that is lost with +entropic regularization as soon as :math:`\lambda>0` [17]_. This problem cen be +solved with POT using solvers from :any:`ot.smooth`, more specifically +functions :any:`ot.smooth.smooth_ot_dual` or +:any:`ot.smooth.smooth_ot_semi_dual` with parameter :code:`reg_type='l2'` to +choose the quadratic regularization. + +Another regularization that has been used in recent years is the group lasso +regularization + +.. math:: + \Omega(\gamma)=\sum_{j,G\in\mathcal{G}} \|\gamma_{G,j}\|_p^q + +where :math:`\mathcal{G}` contains non overlapping groups of lines in the OT +matrix. This regularization proposed in [5]_ will promote sparsity at the group level and for +instance will force target samples to get mass from a small number of groups. +Note that the exact OT solution is already sparse so this regularization does +not make sens if it is not combined with others such as entropic. + + + + + Wasserstein Barycenters ----------------------- Monge mapping and Domain adaptation with Optimal transport ----------------------------------------- +---------------------------------------------------------- Other applications @@ -207,7 +294,6 @@ FAQ the OT transport matrix. If you want to solve a regularized OT you can use :py:mod:`ot.sinkhorn`. - Here is a simple use case: @@ -222,7 +308,43 @@ FAQ :doc:`auto_examples/plot_OT_2D_samples` -2. **Compute a Wasserstein distance** +2. **pip install POT fails with error : ImportError: No module named Cython.Build** + + As discussed shortly in the README file. POT requires to have :code:`numpy` + and :code:`cython` installed to build. This corner case is not yet handled + by :code:`pip` and for now you need to install both library prior to + installing POT. + + Note that this problem do not occur when using conda-forge since the packages + there are pre-compiled. + + See `Issue #59 `__ for more + details. + +3. **Why is Sinkhorn slower than EMD ?** + + This might come from the choice of the regularization term. The speed of + convergence of sinkhorn depends directly on this term [22]_ and when the + regularization gets very small the problem try and approximate the exact OT + which leads to slow convergence in addition to numerical problems. In other + words, for large regularization sinkhorn will be very fast to converge, for + small regularization (when you need an OT matrix close to the true OT), it + might be quicker to use the EMD solver. + + Also note that the numpy implementation of the sinkhorn can use parallel + computation depending on the configuration of your system but very important + speedup can be obtained by using a GPU implementation since all operations + are matrix/vector products. + +4. **Using GPU fails with error: module 'ot' has no attribute 'gpu'** + + In order to limit import time and hard dependencies in POT. we do not import + some sub-modules automatically with :code:`import ot`. In order to use the + acceleration in :any:`ot.gpu` you need first to import is with + :code:`import ot.gpu`. + + See `Issue #85 `__ and :any:`ot.gpu` + for more details. References -- cgit v1.2.3 From 56deee6e1a69a087022bf81279419305452f5177 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 28 Jun 2019 09:39:23 +0200 Subject: update reg OT --- docs/source/quickstart.rst | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 4f2d9bb..62688bc 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -210,7 +210,7 @@ More details about the algorithm used is given in the following note. In addition to all those variants of sinkhorn, we have another implementation solving the problem in the smooth dual or semi-dual in - :any:`ot.smooth`. This solver use the :any:`scipy.optimize.minimize` + :any:`ot.smooth`. This solver uses the :any:`scipy.optimize.minimize` function to solve the smooth problem with :code:`L-BFGS` algorithm. Tu use this solver, use functions :any:`ot.smooth.smooth_ot_dual` or :any:`ot.smooth.smooth_ot_semi_dual` with parameter :code:`reg_type='kl'` to @@ -224,6 +224,13 @@ More details about the algorithm used is given in the following note. - :any:`auto_examples/plot_OT_1D_smooth` - :any:`auto_examples/plot_stochastic` + +Recently [23]_ introduced the sinkhorn divergence that build from entropic +regularization to compute fast and differentiable geometric diveregnce between +empirical distributions. + + + Finally note that we also provide in :any:`ot.stochastic` several implementation of stochastic solvers for entropic regularized OT [18]_ [19]_. @@ -254,33 +261,50 @@ Another regularization that has been used in recent years is the group lasso regularization .. math:: - \Omega(\gamma)=\sum_{j,G\in\mathcal{G}} \|\gamma_{G,j}\|_p^q + \Omega(\gamma)=\sum_{j,G\in\mathcal{G}} \|\gamma_{G,j}\|_q^p where :math:`\mathcal{G}` contains non overlapping groups of lines in the OT matrix. This regularization proposed in [5]_ will promote sparsity at the group level and for instance will force target samples to get mass from a small number of groups. Note that the exact OT solution is already sparse so this regularization does -not make sens if it is not combined with others such as entropic. +not make sens if it is not combined with others such as entropic. Depending on +the choice of :code:`p` and :code:`q`, the problem can be solved with different +approaches. When :code:`q=1` and :code:`p<1` the problem is non convex but can +be solved using an efficient majoration minimization approach with +:any:`ot.sinkhorn_lpl1_mm`. When :code:`q=2` and :code:`p=1` we recover the +convex gourp lasso and we provide a solver using generalized conditional +gradient algorithm [7]_ in function +:any:`ot.da.sinkhorn_l1l2_gl`. +Wasserstein Barycenters +----------------------- -Wasserstein Barycenters ------------------------ -Monge mapping and Domain adaptation with Optimal transport ----------------------------------------------------------- +Monge mapping and Domain adaptation +----------------------------------- Other applications ------------------ +Wasserstein Discriminant Analysis +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +Gromov-Wasserstein +^^^^^^^^^^^^^^^^^^ + GPU acceleration ---------------- +We provide several implementation of our OT solvers in :any:`ot.gpu`. Those +implementation use the :code:`cupy` toolbox. + FAQ -- cgit v1.2.3 From 93a74fe4d477e1735e9ce21ee4113281f58b4dcf Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Mon, 1 Jul 2019 11:02:11 +0200 Subject: Explicit doctest call in travis + removed uneffective doctest in test_ot --- .travis.yml | 2 +- test/test_ot.py | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 50ff22c..d6b4232 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,5 +32,5 @@ install: script: - python setup.py develop - flake8 examples/ ot/ test/ - - python -m pytest -v test/ --cov=ot + - python -m pytest -v test/ ot/ --doctest-modules --cov=ot # - py.test ot test diff --git a/test/test_ot.py b/test/test_ot.py index 3c4ac11..ac86602 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -14,16 +14,6 @@ from ot.datasets import make_1D_gauss as gauss import pytest -def test_doctest(): - import doctest - - # test lp solver - doctest.testmod(ot.lp, verbose=True) - - # test bregman solver - doctest.testmod(ot.bregman, verbose=True) - - def test_emd_emd2(): # test emd and emd2 for simple identity n = 100 -- cgit v1.2.3 From b05d315b0994d328029d4a4fc082f6994e7f06d1 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Mon, 1 Jul 2019 11:06:26 +0200 Subject: Moved GPU doctests to test_gpu for tests not to fail if no GPU available --- ot/gpu/bregman.py | 11 ----------- test/test_gpu.py | 10 ++++++++++ 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/ot/gpu/bregman.py b/ot/gpu/bregman.py index 978b307..2e2df83 100644 --- a/ot/gpu/bregman.py +++ b/ot/gpu/bregman.py @@ -70,17 +70,6 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, stopThr=1e-9, log : dict log dictionary return only if log==True in parameters - Examples - -------- - - >>> import ot - >>> a=[.5,.5] - >>> b=[.5,.5] - >>> M=[[0.,1.],[1.,0.]] - >>> ot.sinkhorn(a,b,M,1) - array([[ 0.36552929, 0.13447071], - [ 0.13447071, 0.36552929]]) - References ---------- diff --git a/test/test_gpu.py b/test/test_gpu.py index 6b7fdd4..47b8b6d 100644 --- a/test/test_gpu.py +++ b/test/test_gpu.py @@ -15,6 +15,16 @@ except ImportError: nogpu = True +@pytest.mark.skipif(nogpu, reason="No GPU available") +def test_gpu_old_doctests(): + a = [.5, .5] + b = [.5, .5] + M = [[0., 1.], [1., 0.]] + G = ot.sinkhorn(a, b, M, 1) + np.testing.assert_allclose(G, np.array([[0.36552929, 0.13447071], + [0.13447071, 0.36552929]])) + + @pytest.mark.skipif(nogpu, reason="No GPU available") def test_gpu_dist(): -- cgit v1.2.3 From 1fe13ed9cdda363c95c84f95fc70dcd95ac276f1 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Mon, 1 Jul 2019 12:16:04 +0200 Subject: Fixed doctests --- .travis.yml | 2 +- ot/bregman.py | 17 +++++++--------- ot/stochastic.py | 59 +++++++++++++++++++++++--------------------------------- ot/utils.py | 6 +++--- 4 files changed, 35 insertions(+), 49 deletions(-) diff --git a/.travis.yml b/.travis.yml index d6b4232..da68c96 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,5 +32,5 @@ install: script: - python setup.py develop - flake8 examples/ ot/ test/ - - python -m pytest -v test/ ot/ --doctest-modules --cov=ot + - python -m pytest -v test/ ot/ --doctest-modules --ignore ot/gpu/ --cov=ot # - py.test ot test diff --git a/ot/bregman.py b/ot/bregman.py index 09716e6..8225967 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1360,10 +1360,9 @@ def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numI >>> reg = 0.1 >>> X_s = np.reshape(np.arange(n_s), (n_s, 1)) >>> X_t = np.reshape(np.arange(0, n_t), (n_t, 1)) - >>> emp_sinkhorn = empirical_sinkhorn(X_s, X_t, reg, verbose=False) - >>> print(emp_sinkhorn) - >>> [[4.99977301e-01 2.26989344e-05] - [2.26989344e-05 4.99977301e-01]] + >>> empirical_sinkhorn(X_s, X_t, reg, verbose=False) # doctest: +NORMALIZE_WHITESPACE + array([[4.99977301e-01, 2.26989344e-05], + [2.26989344e-05, 4.99977301e-01]]) References @@ -1451,9 +1450,8 @@ def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', num >>> reg = 0.1 >>> X_s = np.reshape(np.arange(n_s), (n_s, 1)) >>> X_t = np.reshape(np.arange(0, n_t), (n_t, 1)) - >>> loss_sinkhorn = empirical_sinkhorn2(X_s, X_t, reg, verbose=False) - >>> print(loss_sinkhorn) - >>> [4.53978687e-05] + >>> empirical_sinkhorn2(X_s, X_t, reg, verbose=False) + array([4.53978687e-05]) References @@ -1560,9 +1558,8 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli >>> reg = 0.1 >>> X_s = np.reshape(np.arange(n_s), (n_s, 1)) >>> X_t = np.reshape(np.arange(0, n_t), (n_t, 1)) - >>> emp_sinkhorn_div = empirical_sinkhorn_divergence(X_s, X_t, reg) - >>> print(emp_sinkhorn_div) - >>> [2.99977435] + >>> empirical_sinkhorn_divergence(X_s, X_t, reg) + array([2.99977435]) References diff --git a/ot/stochastic.py b/ot/stochastic.py index 85c4230..762eb3e 100644 --- a/ot/stochastic.py +++ b/ot/stochastic.py @@ -11,7 +11,7 @@ import numpy as np def coordinate_grad_semi_dual(b, M, reg, beta, i): - ''' + r''' Compute the coordinate gradient update for regularized discrete distributions for (i, :) The function computes the gradient of the semi dual problem: @@ -51,7 +51,7 @@ def coordinate_grad_semi_dual(b, M, reg, beta, i): Examples -------- - + >>> import ot >>> n_source = 7 >>> n_target = 4 >>> reg = 1 @@ -63,8 +63,7 @@ def coordinate_grad_semi_dual(b, M, reg, beta, i): >>> Y_target = rng.randn(n_target, 2) >>> M = ot.dist(X_source, Y_target) >>> method = "ASGD" - >>> asgd_pi = stochastic.solve_semi_dual_entropic(a, b, M, reg, - method, numItermax) + >>> asgd_pi = ot.stochastic.solve_semi_dual_entropic(a, b, M, reg, method, numItermax) >>> print(asgd_pi) References @@ -84,7 +83,7 @@ def coordinate_grad_semi_dual(b, M, reg, beta, i): def sag_entropic_transport(a, b, M, reg, numItermax=10000, lr=None): - ''' + r''' Compute the SAG algorithm to solve the regularized discrete measures optimal transport max problem @@ -133,7 +132,7 @@ def sag_entropic_transport(a, b, M, reg, numItermax=10000, lr=None): Examples -------- - + >>> import ot >>> n_source = 7 >>> n_target = 4 >>> reg = 1 @@ -145,8 +144,7 @@ def sag_entropic_transport(a, b, M, reg, numItermax=10000, lr=None): >>> Y_target = rng.randn(n_target, 2) >>> M = ot.dist(X_source, Y_target) >>> method = "ASGD" - >>> asgd_pi = stochastic.solve_semi_dual_entropic(a, b, M, reg, - method, numItermax) + >>> asgd_pi = ot.stochastic.solve_semi_dual_entropic(a, b, M, reg, method, numItermax) >>> print(asgd_pi) References @@ -176,7 +174,7 @@ def sag_entropic_transport(a, b, M, reg, numItermax=10000, lr=None): def averaged_sgd_entropic_transport(a, b, M, reg, numItermax=300000, lr=None): - ''' + r''' Compute the ASGD algorithm to solve the regularized semi continous measures optimal transport max problem The function solves the following optimization problem: @@ -223,7 +221,7 @@ def averaged_sgd_entropic_transport(a, b, M, reg, numItermax=300000, lr=None): Examples -------- - + >>> import ot >>> n_source = 7 >>> n_target = 4 >>> reg = 1 @@ -235,8 +233,7 @@ def averaged_sgd_entropic_transport(a, b, M, reg, numItermax=300000, lr=None): >>> Y_target = rng.randn(n_target, 2) >>> M = ot.dist(X_source, Y_target) >>> method = "ASGD" - >>> asgd_pi = stochastic.solve_semi_dual_entropic(a, b, M, reg, - method, numItermax) + >>> asgd_pi = ot.stochastic.solve_semi_dual_entropic(a, b, M, reg, method, numItermax) >>> print(asgd_pi) References @@ -264,7 +261,7 @@ def averaged_sgd_entropic_transport(a, b, M, reg, numItermax=300000, lr=None): def c_transform_entropic(b, M, reg, beta): - ''' + r''' The goal is to recover u from the c-transform. The function computes the c_transform of a dual variable from the other @@ -303,7 +300,7 @@ def c_transform_entropic(b, M, reg, beta): Examples -------- - + >>> import ot >>> n_source = 7 >>> n_target = 4 >>> reg = 1 @@ -315,8 +312,7 @@ def c_transform_entropic(b, M, reg, beta): >>> Y_target = rng.randn(n_target, 2) >>> M = ot.dist(X_source, Y_target) >>> method = "ASGD" - >>> asgd_pi = stochastic.solve_semi_dual_entropic(a, b, M, reg, - method, numItermax) + >>> asgd_pi = ot.stochastic.solve_semi_dual_entropic(a, b, M, reg, method, numItermax) >>> print(asgd_pi) References @@ -340,7 +336,7 @@ def c_transform_entropic(b, M, reg, beta): def solve_semi_dual_entropic(a, b, M, reg, method, numItermax=10000, lr=None, log=False): - ''' + r''' Compute the transportation matrix to solve the regularized discrete measures optimal transport max problem @@ -398,7 +394,7 @@ def solve_semi_dual_entropic(a, b, M, reg, method, numItermax=10000, lr=None, Examples -------- - + >>> import ot >>> n_source = 7 >>> n_target = 4 >>> reg = 1 @@ -410,8 +406,7 @@ def solve_semi_dual_entropic(a, b, M, reg, method, numItermax=10000, lr=None, >>> Y_target = rng.randn(n_target, 2) >>> M = ot.dist(X_source, Y_target) >>> method = "ASGD" - >>> asgd_pi = stochastic.solve_semi_dual_entropic(a, b, M, reg, - method, numItermax) + >>> asgd_pi = ot.stochastic.solve_semi_dual_entropic(a, b, M, reg, method, numItermax) >>> print(asgd_pi) References @@ -451,7 +446,7 @@ def solve_semi_dual_entropic(a, b, M, reg, method, numItermax=10000, lr=None, def batch_grad_dual(a, b, M, reg, alpha, beta, batch_size, batch_alpha, batch_beta): - ''' + r''' Computes the partial gradient of the dual optimal transport problem. For each (i,j) in a batch of coordinates, the partial gradients are : @@ -506,7 +501,7 @@ def batch_grad_dual(a, b, M, reg, alpha, beta, batch_size, batch_alpha, Examples -------- - + >>> import ot >>> n_source = 7 >>> n_target = 4 >>> reg = 1 @@ -520,9 +515,7 @@ def batch_grad_dual(a, b, M, reg, alpha, beta, batch_size, batch_alpha, >>> X_source = rng.randn(n_source, 2) >>> Y_target = rng.randn(n_target, 2) >>> M = ot.dist(X_source, Y_target) - >>> sgd_dual_pi, log = stochastic.solve_dual_entropic(a, b, M, reg, - batch_size, - numItermax, lr, log) + >>> sgd_dual_pi, log = ot.stochastic.solve_dual_entropic(a, b, M, reg, batch_size, numItermax, lr, log) >>> print(log['alpha'], log['beta']) >>> print(sgd_dual_pi) @@ -548,7 +541,7 @@ def batch_grad_dual(a, b, M, reg, alpha, beta, batch_size, batch_alpha, def sgd_entropic_regularization(a, b, M, reg, batch_size, numItermax, lr): - ''' + r''' Compute the sgd algorithm to solve the regularized discrete measures optimal transport dual problem @@ -597,7 +590,7 @@ def sgd_entropic_regularization(a, b, M, reg, batch_size, numItermax, lr): Examples -------- - + >>> import ot >>> n_source = 7 >>> n_target = 4 >>> reg = 1 @@ -611,9 +604,7 @@ def sgd_entropic_regularization(a, b, M, reg, batch_size, numItermax, lr): >>> X_source = rng.randn(n_source, 2) >>> Y_target = rng.randn(n_target, 2) >>> M = ot.dist(X_source, Y_target) - >>> sgd_dual_pi, log = stochastic.solve_dual_entropic(a, b, M, reg, - batch_size, - numItermax, lr, log) + >>> sgd_dual_pi, log = ot.stochastic.solve_dual_entropic(a, b, M, reg, batch_size, numItermax, lr, log) >>> print(log['alpha'], log['beta']) >>> print(sgd_dual_pi) @@ -644,7 +635,7 @@ def sgd_entropic_regularization(a, b, M, reg, batch_size, numItermax, lr): def solve_dual_entropic(a, b, M, reg, batch_size, numItermax=10000, lr=1, log=False): - ''' + r''' Compute the transportation matrix to solve the regularized discrete measures optimal transport dual problem @@ -695,7 +686,7 @@ def solve_dual_entropic(a, b, M, reg, batch_size, numItermax=10000, lr=1, Examples -------- - + >>> import ot >>> n_source = 7 >>> n_target = 4 >>> reg = 1 @@ -709,9 +700,7 @@ def solve_dual_entropic(a, b, M, reg, batch_size, numItermax=10000, lr=1, >>> X_source = rng.randn(n_source, 2) >>> Y_target = rng.randn(n_target, 2) >>> M = ot.dist(X_source, Y_target) - >>> sgd_dual_pi, log = stochastic.solve_dual_entropic(a, b, M, reg, - batch_size, - numItermax, lr, log) + >>> sgd_dual_pi, log = ot.stochastic.solve_dual_entropic(a, b, M, reg, batch_size, numItermax, lr, log) >>> print(log['alpha'], log['beta']) >>> print(sgd_dual_pi) diff --git a/ot/utils.py b/ot/utils.py index efd1288..f21ceb9 100644 --- a/ot/utils.py +++ b/ot/utils.py @@ -285,9 +285,9 @@ class deprecated(object): The optional extra argument will be appended to the deprecation message and the docstring. Note: to use this with the default value for extra, put in an empty of parentheses: - >>> from ot.deprecation import deprecated - >>> @deprecated() - ... def some_function(): pass + >>> from ot.deprecation import deprecated # doctest: +SKIP + >>> @deprecated() # doctest: +SKIP + ... def some_function(): pass # doctest: +SKIP Parameters ---------- -- cgit v1.2.3 From 3a84263ffe4bbf2ac055dfd5a84e1b65c14f9cda Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Mon, 1 Jul 2019 14:23:14 +0200 Subject: Set numpy array formatting version to post-1.13 --- .travis.yml | 2 ++ ot/bregman.py | 86 +++++++++++++++++++++++++++---------------------------- ot/lp/__init__.py | 22 +++++++------- ot/unbalanced.py | 10 +++---- 4 files changed, 61 insertions(+), 59 deletions(-) diff --git a/.travis.yml b/.travis.yml index da68c96..f004a32 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,6 +26,8 @@ before_script: # configure a headless display to test plot generation # command to install dependencies install: - pip install -r requirements.txt + - pip install numpy>=1.14 # for numpy array formatting in doctests + - pip install scipy<1.3 # otherwise, pymanopt fails, cf - pip install flake8 pytest "pytest-cov<2.6" - pip install . # command to run tests + check syntax style diff --git a/ot/bregman.py b/ot/bregman.py index 8225967..caf4024 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -16,7 +16,7 @@ from .utils import unif, dist def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, stopThr=1e-9, verbose=False, log=False, **kwargs): - u""" + r""" Solve the entropic regularization optimal transport problem and return the OT matrix The function solves the following optimization problem: @@ -73,12 +73,12 @@ def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, -------- >>> import ot - >>> a=[.5,.5] - >>> b=[.5,.5] - >>> M=[[0.,1.],[1.,0.]] - >>> ot.sinkhorn(a,b,M,1) - array([[ 0.36552929, 0.13447071], - [ 0.13447071, 0.36552929]]) + >>> a=[.5, .5] + >>> b=[.5, .5] + >>> M=[[0., 1.], [1., 0.]] + >>> ot.sinkhorn(a, b, M, 1) + array([[0.36552929, 0.13447071], + [0.13447071, 0.36552929]]) References @@ -131,7 +131,7 @@ def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, def sinkhorn2(a, b, M, reg, method='sinkhorn', numItermax=1000, stopThr=1e-9, verbose=False, log=False, **kwargs): - u""" + r""" Solve the entropic regularization optimal transport problem and return the loss The function solves the following optimization problem: @@ -188,11 +188,11 @@ def sinkhorn2(a, b, M, reg, method='sinkhorn', numItermax=1000, -------- >>> import ot - >>> a=[.5,.5] - >>> b=[.5,.5] - >>> M=[[0.,1.],[1.,0.]] - >>> ot.sinkhorn2(a,b,M,1) - array([ 0.26894142]) + >>> a=[.5, .5] + >>> b=[.5, .5] + >>> M=[[0., 1.], [1., 0.]] + >>> ot.sinkhorn2(a, b, M, 1) + array([0.26894142]) @@ -248,7 +248,7 @@ def sinkhorn2(a, b, M, reg, method='sinkhorn', numItermax=1000, def sinkhorn_knopp(a, b, M, reg, numItermax=1000, stopThr=1e-9, verbose=False, log=False, **kwargs): - """ + r""" Solve the entropic regularization optimal transport problem and return the OT matrix The function solves the following optimization problem: @@ -302,12 +302,12 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, -------- >>> import ot - >>> a=[.5,.5] - >>> b=[.5,.5] - >>> M=[[0.,1.],[1.,0.]] - >>> ot.sinkhorn(a,b,M,1) - array([[ 0.36552929, 0.13447071], - [ 0.13447071, 0.36552929]]) + >>> a=[.5, .5] + >>> b=[.5, .5] + >>> M=[[0., 1.], [1., 0.]] + >>> ot.sinkhorn(a, b, M, 1) + array([[0.36552929, 0.13447071], + [0.13447071, 0.36552929]]) References @@ -422,7 +422,7 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log=False): - """ + r""" Solve the entropic regularization optimal transport problem and return the OT matrix The algorithm used is based on the paper @@ -481,12 +481,12 @@ def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log= -------- >>> import ot - >>> a=[.5,.5] - >>> b=[.5,.5] - >>> M=[[0.,1.],[1.,0.]] - >>> ot.bregman.greenkhorn(a,b,M,1) - array([[ 0.36552929, 0.13447071], - [ 0.13447071, 0.36552929]]) + >>> a=[.5, .5] + >>> b=[.5, .5] + >>> M=[[0., 1.], [1., 0.]] + >>> ot.bregman.greenkhorn(a, b, M, 1) + array([[0.36552929, 0.13447071], + [0.13447071, 0.36552929]]) References @@ -576,7 +576,7 @@ def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log= def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, warmstart=None, verbose=False, print_period=20, log=False, **kwargs): - """ + r""" Solve the entropic regularization OT problem with log stabilization The function solves the following optimization problem: @@ -639,8 +639,8 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, >>> b=[.5,.5] >>> M=[[0.,1.],[1.,0.]] >>> ot.bregman.sinkhorn_stabilized(a,b,M,1) - array([[ 0.36552929, 0.13447071], - [ 0.13447071, 0.36552929]]) + array([[0.36552929, 0.13447071], + [0.13447071, 0.36552929]]) References @@ -796,7 +796,7 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, numInnerItermax=100, tau=1e3, stopThr=1e-9, warmstart=None, verbose=False, print_period=10, log=False, **kwargs): - """ + r""" Solve the entropic regularization optimal transport problem with log stabilization and epsilon scaling. @@ -862,12 +862,12 @@ def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, numInne -------- >>> import ot - >>> a=[.5,.5] - >>> b=[.5,.5] - >>> M=[[0.,1.],[1.,0.]] - >>> ot.bregman.sinkhorn_epsilon_scaling(a,b,M,1) - array([[ 0.36552929, 0.13447071], - [ 0.13447071, 0.36552929]]) + >>> a=[.5, .5] + >>> b=[.5, .5] + >>> M=[[0., 1.], [1., 0.]] + >>> ot.bregman.sinkhorn_epsilon_scaling(a, b, M, 1) + array([[0.36552929, 0.13447071], + [0.13447071, 0.36552929]]) References @@ -989,7 +989,7 @@ def projC(gamma, q): def barycenter(A, M, reg, weights=None, numItermax=1000, stopThr=1e-4, verbose=False, log=False): - """Compute the entropic regularized wasserstein barycenter of distributions A + r"""Compute the entropic regularized wasserstein barycenter of distributions A The function solves the following optimization problem: @@ -1084,7 +1084,7 @@ def barycenter(A, M, reg, weights=None, numItermax=1000, def convolutional_barycenter2d(A, reg, weights=None, numItermax=10000, stopThr=1e-9, stabThr=1e-30, verbose=False, log=False): - """Compute the entropic regularized wasserstein barycenter of distributions A + r"""Compute the entropic regularized wasserstein barycenter of distributions A where A is a collection of 2D images. The function solves the following optimization problem: @@ -1195,7 +1195,7 @@ def convolutional_barycenter2d(A, reg, weights=None, numItermax=10000, stopThr=1 def unmix(a, D, M, M0, h0, reg, reg0, alpha, numItermax=1000, stopThr=1e-3, verbose=False, log=False): - """ + r""" Compute the unmixing of an observation with a given dictionary using Wasserstein distance The function solve the following optimization problem: @@ -1302,7 +1302,7 @@ def unmix(a, D, M, M0, h0, reg, reg0, alpha, numItermax=1000, def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numIterMax=10000, stopThr=1e-9, verbose=False, log=False, **kwargs): - ''' + r''' Solve the entropic regularization optimal transport problem and return the OT matrix from empirical data @@ -1391,7 +1391,7 @@ def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numI def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numIterMax=10000, stopThr=1e-9, verbose=False, log=False, **kwargs): - ''' + r''' Solve the entropic regularization optimal transport problem from empirical data and return the OT loss @@ -1480,7 +1480,7 @@ def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', num def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numIterMax=10000, stopThr=1e-9, verbose=False, log=False, **kwargs): - ''' + r''' Compute the sinkhorn divergence loss from empirical data The function solves the following optimization problems and return the diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index a3f5b8d..8ec286b 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -25,7 +25,7 @@ __all__=['emd', 'emd2', 'barycenter', 'free_support_barycenter', 'cvx', def emd(a, b, M, numItermax=100000, log=False): - """Solves the Earth Movers distance problem and returns the OT matrix + r"""Solves the Earth Movers distance problem and returns the OT matrix .. math:: @@ -76,8 +76,8 @@ def emd(a, b, M, numItermax=100000, log=False): >>> b=[.5,.5] >>> M=[[0.,1.],[1.,0.]] >>> ot.emd(a,b,M) - array([[ 0.5, 0. ], - [ 0. , 0.5]]) + array([[0.5, 0. ], + [0. , 0.5]]) References ---------- @@ -117,7 +117,7 @@ def emd(a, b, M, numItermax=100000, log=False): def emd2(a, b, M, processes=multiprocessing.cpu_count(), numItermax=100000, log=False, return_matrix=False): - """Solves the Earth Movers distance problem and returns the loss + r"""Solves the Earth Movers distance problem and returns the loss .. math:: \gamma = arg\min_\gamma <\gamma,M>_F @@ -315,7 +315,7 @@ def free_support_barycenter(measures_locations, measures_weights, X_init, b=None def emd_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', p=1., dense=True, log=False): - """Solves the Earth Movers distance problem between 1d measures and returns + r"""Solves the Earth Movers distance problem between 1d measures and returns the OT matrix @@ -381,11 +381,11 @@ def emd_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', p=1., dense=True, >>> x_a = [2., 0.] >>> x_b = [0., 3.] >>> ot.emd_1d(x_a, x_b, a, b) - array([[0. , 0.5], - [0.5, 0. ]]) + array([[0. , 0.5], + [0.5, 0. ]]) >>> ot.emd_1d(x_a, x_b) - array([[0. , 0.5], - [0.5, 0. ]]) + array([[0. , 0.5], + [0.5, 0. ]]) References ---------- @@ -435,7 +435,7 @@ def emd_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', p=1., dense=True, def emd2_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', p=1., dense=True, log=False): - """Solves the Earth Movers distance problem between 1d measures and returns + r"""Solves the Earth Movers distance problem between 1d measures and returns the loss @@ -530,7 +530,7 @@ def emd2_1d(x_a, x_b, a=None, b=None, metric='sqeuclidean', p=1., dense=True, def wasserstein_1d(x_a, x_b, a=None, b=None, p=1.): - """Solves the p-Wasserstein distance problem between 1d measures and returns + r"""Solves the p-Wasserstein distance problem between 1d measures and returns the distance diff --git a/ot/unbalanced.py b/ot/unbalanced.py index 484ce95..b2b7b10 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -13,7 +13,7 @@ import numpy as np def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, stopThr=1e-9, verbose=False, log=False, **kwargs): - u""" + r""" Solve the unbalanced entropic regularization optimal transport problem and return the loss The function solves the following optimization problem: @@ -75,7 +75,7 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, >>> M=[[0., 1.], [1., 0.]] >>> ot.sinkhorn_unbalanced(a, b, M, 1, 1) array([[0.51122823, 0.18807035], - [0.18807035, 0.51122823]]) + [0.18807035, 0.51122823]]) References @@ -122,7 +122,7 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, def sinkhorn_unbalanced2(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, stopThr=1e-9, verbose=False, log=False, **kwargs): - u""" + r""" Solve the entropic regularization unbalanced optimal transport problem and return the loss The function solves the following optimization problem: @@ -233,7 +233,7 @@ def sinkhorn_unbalanced2(a, b, M, reg, alpha, method='sinkhorn', def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, stopThr=1e-9, verbose=False, log=False, **kwargs): - """ + r""" Solve the entropic regularization unbalanced optimal transport problem and return the loss The function solves the following optimization problem: @@ -401,7 +401,7 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, stopThr=1e-4, verbose=False, log=False): - """Compute the entropic regularized unbalanced wasserstein barycenter of distributions A + r"""Compute the entropic regularized unbalanced wasserstein barycenter of distributions A The function solves the following optimization problem: -- cgit v1.2.3 From 385d4a543898a7ddb842b983b5f174f8c80636fc Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Mon, 1 Jul 2019 14:28:11 +0200 Subject: Bug in syntax for old scipy version --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f004a32..275109c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,7 @@ before_script: # configure a headless display to test plot generation install: - pip install -r requirements.txt - pip install numpy>=1.14 # for numpy array formatting in doctests - - pip install scipy<1.3 # otherwise, pymanopt fails, cf + - pip install "scipy<1.3" # otherwise, pymanopt fails, cf - pip install flake8 pytest "pytest-cov<2.6" - pip install . # command to run tests + check syntax style -- cgit v1.2.3 From 64dba525bb5e0ac7952871df859df59fecf19a65 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Mon, 1 Jul 2019 14:56:55 +0200 Subject: Formatting --- test/test_gpu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_gpu.py b/test/test_gpu.py index 47b8b6d..8e62a74 100644 --- a/test/test_gpu.py +++ b/test/test_gpu.py @@ -22,7 +22,7 @@ def test_gpu_old_doctests(): M = [[0., 1.], [1., 0.]] G = ot.sinkhorn(a, b, M, 1) np.testing.assert_allclose(G, np.array([[0.36552929, 0.13447071], - [0.13447071, 0.36552929]])) + [0.13447071, 0.36552929]])) @pytest.mark.skipif(nogpu, reason="No GPU available") -- cgit v1.2.3 From a08375c8dc7594e247e586fcc4d65a96771d25c7 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Mon, 1 Jul 2019 15:36:55 +0200 Subject: Fixed all doctests assuming functions are working properly (actually tested in tests/) --- .travis.yml | 5 +- ot/bregman.py | 2 +- ot/stochastic.py | 155 +++++++++++++++++++++++++++++++++++-------------------- ot/unbalanced.py | 2 +- 4 files changed, 104 insertions(+), 60 deletions(-) diff --git a/.travis.yml b/.travis.yml index 275109c..2c6a5c8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,8 +26,9 @@ before_script: # configure a headless display to test plot generation # command to install dependencies install: - pip install -r requirements.txt - - pip install numpy>=1.14 # for numpy array formatting in doctests - - pip install "scipy<1.3" # otherwise, pymanopt fails, cf + - pip install numpy>=1.14 "scipy<1.3" # for numpy array formatting in doctests + # ^ scipy version: otherwise, pymanopt fails, cf + - python -c "import numpy; import scipy; print('numpy: ', numpy.__version__); print('scipy: ', scipy.__version__)" - pip install flake8 pytest "pytest-cov<2.6" - pip install . # command to run tests + check syntax style diff --git a/ot/bregman.py b/ot/bregman.py index caf4024..50f8389 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1559,7 +1559,7 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli >>> X_s = np.reshape(np.arange(n_s), (n_s, 1)) >>> X_t = np.reshape(np.arange(0, n_t), (n_t, 1)) >>> empirical_sinkhorn_divergence(X_s, X_t, reg) - array([2.99977435]) + array([1.49988718]) References diff --git a/ot/stochastic.py b/ot/stochastic.py index 762eb3e..bf3e7a7 100644 --- a/ot/stochastic.py +++ b/ot/stochastic.py @@ -52,19 +52,23 @@ def coordinate_grad_semi_dual(b, M, reg, beta, i): Examples -------- >>> import ot + >>> np.random.seed(0) >>> n_source = 7 >>> n_target = 4 - >>> reg = 1 - >>> numItermax = 300000 >>> a = ot.utils.unif(n_source) >>> b = ot.utils.unif(n_target) - >>> rng = np.random.RandomState(0) - >>> X_source = rng.randn(n_source, 2) - >>> Y_target = rng.randn(n_target, 2) + >>> X_source = np.random.randn(n_source, 2) + >>> Y_target = np.random.randn(n_target, 2) >>> M = ot.dist(X_source, Y_target) - >>> method = "ASGD" - >>> asgd_pi = ot.stochastic.solve_semi_dual_entropic(a, b, M, reg, method, numItermax) - >>> print(asgd_pi) + >>> ot.stochastic.solve_semi_dual_entropic(a, b, M, reg=1, method="ASGD", numItermax=300000) + array([[2.53942342e-02, 9.98640673e-02, 1.75945647e-02, 4.27664307e-06], + [1.21556999e-01, 1.26350515e-02, 1.30491795e-03, 7.36017394e-03], + [3.54070702e-03, 7.63581358e-02, 6.29581672e-02, 1.32812798e-07], + [2.60578198e-02, 3.35916645e-02, 8.28023223e-02, 4.05336238e-04], + [9.86808864e-03, 7.59774324e-04, 1.08702729e-02, 1.21359007e-01], + [2.17218856e-02, 9.12931802e-04, 1.87962526e-03, 1.18342700e-01], + [4.14237512e-02, 2.67487857e-02, 7.23016955e-02, 2.38291052e-03]]) + References ---------- @@ -133,19 +137,22 @@ def sag_entropic_transport(a, b, M, reg, numItermax=10000, lr=None): Examples -------- >>> import ot + >>> np.random.seed(0) >>> n_source = 7 >>> n_target = 4 - >>> reg = 1 - >>> numItermax = 300000 >>> a = ot.utils.unif(n_source) >>> b = ot.utils.unif(n_target) - >>> rng = np.random.RandomState(0) - >>> X_source = rng.randn(n_source, 2) - >>> Y_target = rng.randn(n_target, 2) + >>> X_source = np.random.randn(n_source, 2) + >>> Y_target = np.random.randn(n_target, 2) >>> M = ot.dist(X_source, Y_target) - >>> method = "ASGD" - >>> asgd_pi = ot.stochastic.solve_semi_dual_entropic(a, b, M, reg, method, numItermax) - >>> print(asgd_pi) + >>> ot.stochastic.solve_semi_dual_entropic(a, b, M, reg=1, method="ASGD", numItermax=300000) + array([[2.53942342e-02, 9.98640673e-02, 1.75945647e-02, 4.27664307e-06], + [1.21556999e-01, 1.26350515e-02, 1.30491795e-03, 7.36017394e-03], + [3.54070702e-03, 7.63581358e-02, 6.29581672e-02, 1.32812798e-07], + [2.60578198e-02, 3.35916645e-02, 8.28023223e-02, 4.05336238e-04], + [9.86808864e-03, 7.59774324e-04, 1.08702729e-02, 1.21359007e-01], + [2.17218856e-02, 9.12931802e-04, 1.87962526e-03, 1.18342700e-01], + [4.14237512e-02, 2.67487857e-02, 7.23016955e-02, 2.38291052e-03]]) References ---------- @@ -222,19 +229,22 @@ def averaged_sgd_entropic_transport(a, b, M, reg, numItermax=300000, lr=None): Examples -------- >>> import ot + >>> np.random.seed(0) >>> n_source = 7 >>> n_target = 4 - >>> reg = 1 - >>> numItermax = 300000 >>> a = ot.utils.unif(n_source) >>> b = ot.utils.unif(n_target) - >>> rng = np.random.RandomState(0) - >>> X_source = rng.randn(n_source, 2) - >>> Y_target = rng.randn(n_target, 2) + >>> X_source = np.random.randn(n_source, 2) + >>> Y_target = np.random.randn(n_target, 2) >>> M = ot.dist(X_source, Y_target) - >>> method = "ASGD" - >>> asgd_pi = ot.stochastic.solve_semi_dual_entropic(a, b, M, reg, method, numItermax) - >>> print(asgd_pi) + >>> ot.stochastic.solve_semi_dual_entropic(a, b, M, reg=1, method="ASGD", numItermax=300000) + array([[2.53942342e-02, 9.98640673e-02, 1.75945647e-02, 4.27664307e-06], + [1.21556999e-01, 1.26350515e-02, 1.30491795e-03, 7.36017394e-03], + [3.54070702e-03, 7.63581358e-02, 6.29581672e-02, 1.32812798e-07], + [2.60578198e-02, 3.35916645e-02, 8.28023223e-02, 4.05336238e-04], + [9.86808864e-03, 7.59774324e-04, 1.08702729e-02, 1.21359007e-01], + [2.17218856e-02, 9.12931802e-04, 1.87962526e-03, 1.18342700e-01], + [4.14237512e-02, 2.67487857e-02, 7.23016955e-02, 2.38291052e-03]]) References ---------- @@ -301,19 +311,22 @@ def c_transform_entropic(b, M, reg, beta): Examples -------- >>> import ot + >>> np.random.seed(0) >>> n_source = 7 >>> n_target = 4 - >>> reg = 1 - >>> numItermax = 300000 >>> a = ot.utils.unif(n_source) >>> b = ot.utils.unif(n_target) - >>> rng = np.random.RandomState(0) - >>> X_source = rng.randn(n_source, 2) - >>> Y_target = rng.randn(n_target, 2) + >>> X_source = np.random.randn(n_source, 2) + >>> Y_target = np.random.randn(n_target, 2) >>> M = ot.dist(X_source, Y_target) - >>> method = "ASGD" - >>> asgd_pi = ot.stochastic.solve_semi_dual_entropic(a, b, M, reg, method, numItermax) - >>> print(asgd_pi) + >>> ot.stochastic.solve_semi_dual_entropic(a, b, M, reg=1, method="ASGD", numItermax=300000) + array([[2.53942342e-02, 9.98640673e-02, 1.75945647e-02, 4.27664307e-06], + [1.21556999e-01, 1.26350515e-02, 1.30491795e-03, 7.36017394e-03], + [3.54070702e-03, 7.63581358e-02, 6.29581672e-02, 1.32812798e-07], + [2.60578198e-02, 3.35916645e-02, 8.28023223e-02, 4.05336238e-04], + [9.86808864e-03, 7.59774324e-04, 1.08702729e-02, 1.21359007e-01], + [2.17218856e-02, 9.12931802e-04, 1.87962526e-03, 1.18342700e-01], + [4.14237512e-02, 2.67487857e-02, 7.23016955e-02, 2.38291052e-03]]) References ---------- @@ -395,19 +408,22 @@ def solve_semi_dual_entropic(a, b, M, reg, method, numItermax=10000, lr=None, Examples -------- >>> import ot + >>> np.random.seed(0) >>> n_source = 7 >>> n_target = 4 - >>> reg = 1 - >>> numItermax = 300000 >>> a = ot.utils.unif(n_source) >>> b = ot.utils.unif(n_target) - >>> rng = np.random.RandomState(0) - >>> X_source = rng.randn(n_source, 2) - >>> Y_target = rng.randn(n_target, 2) + >>> X_source = np.random.randn(n_source, 2) + >>> Y_target = np.random.randn(n_target, 2) >>> M = ot.dist(X_source, Y_target) - >>> method = "ASGD" - >>> asgd_pi = ot.stochastic.solve_semi_dual_entropic(a, b, M, reg, method, numItermax) - >>> print(asgd_pi) + >>> ot.stochastic.solve_semi_dual_entropic(a, b, M, reg=1, method="ASGD", numItermax=300000) + array([[2.53942342e-02, 9.98640673e-02, 1.75945647e-02, 4.27664307e-06], + [1.21556999e-01, 1.26350515e-02, 1.30491795e-03, 7.36017394e-03], + [3.54070702e-03, 7.63581358e-02, 6.29581672e-02, 1.32812798e-07], + [2.60578198e-02, 3.35916645e-02, 8.28023223e-02, 4.05336238e-04], + [9.86808864e-03, 7.59774324e-04, 1.08702729e-02, 1.21359007e-01], + [2.17218856e-02, 9.12931802e-04, 1.87962526e-03, 1.18342700e-01], + [4.14237512e-02, 2.67487857e-02, 7.23016955e-02, 2.38291052e-03]]) References ---------- @@ -502,22 +518,28 @@ def batch_grad_dual(a, b, M, reg, alpha, beta, batch_size, batch_alpha, Examples -------- >>> import ot + >>> np.random.seed(0) >>> n_source = 7 >>> n_target = 4 - >>> reg = 1 - >>> numItermax = 20000 - >>> lr = 0.1 - >>> batch_size = 3 - >>> log = True >>> a = ot.utils.unif(n_source) >>> b = ot.utils.unif(n_target) - >>> rng = np.random.RandomState(0) - >>> X_source = rng.randn(n_source, 2) - >>> Y_target = rng.randn(n_target, 2) + >>> X_source = np.random.randn(n_source, 2) + >>> Y_target = np.random.randn(n_target, 2) >>> M = ot.dist(X_source, Y_target) - >>> sgd_dual_pi, log = ot.stochastic.solve_dual_entropic(a, b, M, reg, batch_size, numItermax, lr, log) - >>> print(log['alpha'], log['beta']) - >>> print(sgd_dual_pi) + >>> sgd_dual_pi, log = ot.stochastic.solve_dual_entropic(a, b, M, reg=1, batch_size=3, numItermax=30000, lr=0.1, log=True) + >>> log['alpha'] + array([0.71759102, 1.57057384, 0.85576566, 0.1208211 , 0.59190466, + 1.197148 , 0.17805133]) + >>> log['beta'] + array([0.49741367, 0.57478564, 1.40075528, 2.75890102]) + >>> sgd_dual_pi + array([[2.09730063e-02, 8.38169324e-02, 7.50365455e-03, 8.72731415e-09], + [5.58432437e-03, 5.89881299e-04, 3.09558411e-05, 8.35469849e-07], + [3.26489515e-03, 7.15536035e-02, 2.99778211e-02, 3.02601593e-10], + [4.05390622e-02, 5.31085068e-02, 6.65191787e-02, 1.55812785e-06], + [7.82299812e-02, 6.12099102e-03, 4.44989098e-02, 2.37719187e-03], + [5.06266486e-02, 2.16230494e-03, 2.26215141e-03, 6.81514609e-04], + [6.06713990e-02, 3.98139808e-02, 5.46829338e-02, 8.62371424e-06]]) References ---------- @@ -526,7 +548,6 @@ def batch_grad_dual(a, b, M, reg, alpha, beta, batch_size, batch_alpha, International Conference on Learning Representation (2018), arXiv preprint arxiv:1711.02283. ''' - G = - (np.exp((alpha[batch_alpha, None] + beta[None, batch_beta] - M[batch_alpha, :][:, batch_beta]) / reg) * a[batch_alpha, None] * b[None, batch_beta]) @@ -605,8 +626,19 @@ def sgd_entropic_regularization(a, b, M, reg, batch_size, numItermax, lr): >>> Y_target = rng.randn(n_target, 2) >>> M = ot.dist(X_source, Y_target) >>> sgd_dual_pi, log = ot.stochastic.solve_dual_entropic(a, b, M, reg, batch_size, numItermax, lr, log) - >>> print(log['alpha'], log['beta']) - >>> print(sgd_dual_pi) + >>> log['alpha'] + array([0.64171798, 1.27932201, 0.78132257, 0.15638935, 0.54888354, + 1.03663469, 0.20595781]) + >>> log['beta'] + array([0.51207194, 0.58033189, 1.28922676, 2.26859736]) + >>> sgd_dual_pi + array([[1.97276541e-02, 7.81248547e-02, 6.22136048e-03, 4.95442423e-09], + [4.23494310e-03, 4.43286263e-04, 2.06927079e-05, 3.82389139e-07], + [3.07542414e-03, 6.67897769e-02, 2.48904999e-02, 1.72030247e-10], + [4.26271990e-02, 5.53375455e-02, 6.16535024e-02, 9.88812650e-07], + [7.60423265e-02, 5.89585256e-03, 3.81267087e-02, 1.39458256e-03], + [4.37557504e-02, 1.85189176e-03, 1.72335760e-03, 3.55491279e-04], + [6.33096109e-02, 4.11683954e-02, 5.02962051e-02, 5.43097516e-06]]) References ---------- @@ -701,8 +733,19 @@ def solve_dual_entropic(a, b, M, reg, batch_size, numItermax=10000, lr=1, >>> Y_target = rng.randn(n_target, 2) >>> M = ot.dist(X_source, Y_target) >>> sgd_dual_pi, log = ot.stochastic.solve_dual_entropic(a, b, M, reg, batch_size, numItermax, lr, log) - >>> print(log['alpha'], log['beta']) - >>> print(sgd_dual_pi) + >>> log['alpha'] + array([0.64057733, 1.2683513 , 0.75610161, 0.16024284, 0.54926534, + 1.0514201 , 0.19958936]) + >>> log['beta'] + array([0.51372571, 0.58843489, 1.27993921, 2.24344807]) + >>> sgd_dual_pi + array([[1.97377795e-02, 7.86706853e-02, 6.15682001e-03, 4.82586997e-09], + [4.19566963e-03, 4.42016865e-04, 2.02777272e-05, 3.68823708e-07], + [3.00379244e-03, 6.56562018e-02, 2.40462171e-02, 1.63579656e-10], + [4.28626062e-02, 5.60031599e-02, 6.13193826e-02, 9.67977735e-07], + [7.61972739e-02, 5.94609051e-03, 3.77886693e-02, 1.36046648e-03], + [4.44810042e-02, 1.89476742e-03, 1.73285847e-03, 3.51826036e-04], + [6.30118293e-02, 4.12398660e-02, 4.95148998e-02, 5.26247246e-06]]) References ---------- diff --git a/ot/unbalanced.py b/ot/unbalanced.py index b2b7b10..4a2af8a 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -290,7 +290,7 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, >>> a=[.5, .15] >>> b=[.5, .5] >>> M=[[0., 1.],[1., 0.]] - >>> ot.sinkhorn_knopp_unbalanced(a, b, M, 1., 1.) + >>> ot.unbalanced.sinkhorn_knopp_unbalanced(a, b, M, 1., 1.) array([[0.52761554, 0.22392482], [0.10286295, 0.32257641]]) -- cgit v1.2.3 From d85f61683cbb94ca6c6cb91bbd7d82ea295dec3a Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Tue, 2 Jul 2019 09:26:32 +0200 Subject: Bug in syntax for new numpy version --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2c6a5c8..e61b577 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,7 +26,7 @@ before_script: # configure a headless display to test plot generation # command to install dependencies install: - pip install -r requirements.txt - - pip install numpy>=1.14 "scipy<1.3" # for numpy array formatting in doctests + - pip install "numpy>=1.14" "scipy<1.3" # for numpy array formatting in doctests # ^ scipy version: otherwise, pymanopt fails, cf - python -c "import numpy; import scipy; print('numpy: ', numpy.__version__); print('scipy: ', scipy.__version__)" - pip install flake8 pytest "pytest-cov<2.6" -- cgit v1.2.3 From cb919a30de5ebcbfcd8b15e0a5e7f90b36f4f7b3 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Tue, 2 Jul 2019 09:29:06 +0200 Subject: Bug in syntax for new numpy version (cont'd) --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e61b577..8eaa202 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,7 @@ install: - pip install -r requirements.txt - pip install "numpy>=1.14" "scipy<1.3" # for numpy array formatting in doctests # ^ scipy version: otherwise, pymanopt fails, cf - - python -c "import numpy; import scipy; print('numpy: ', numpy.__version__); print('scipy: ', scipy.__version__)" + - python -c "import numpy; import scipy; print(\"numpy: \", numpy.__version__); print(\"scipy: \", scipy.__version__)" - pip install flake8 pytest "pytest-cov<2.6" - pip install . # command to run tests + check syntax style -- cgit v1.2.3 From 36e9d8d8ada28e86833d9c7c0b441e3000800a31 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Tue, 2 Jul 2019 09:29:48 +0200 Subject: Bug in syntax for new numpy version (cont'd) --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8eaa202..3ed0e72 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,8 +26,7 @@ before_script: # configure a headless display to test plot generation # command to install dependencies install: - pip install -r requirements.txt - - pip install "numpy>=1.14" "scipy<1.3" # for numpy array formatting in doctests - # ^ scipy version: otherwise, pymanopt fails, cf + - pip install "numpy>=1.14" "scipy<1.3" # for numpy array formatting in doctests + scipy version: otherwise, pymanopt fails, cf - python -c "import numpy; import scipy; print(\"numpy: \", numpy.__version__); print(\"scipy: \", scipy.__version__)" - pip install flake8 pytest "pytest-cov<2.6" - pip install . -- cgit v1.2.3 From f7fbb57a96bc6c7fe7d6237292aa39516c2f614e Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Tue, 2 Jul 2019 09:30:54 +0200 Subject: Bug in syntax for new numpy version (cont'd) --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3ed0e72..5e5694b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,8 +26,7 @@ before_script: # configure a headless display to test plot generation # command to install dependencies install: - pip install -r requirements.txt - - pip install "numpy>=1.14" "scipy<1.3" # for numpy array formatting in doctests + scipy version: otherwise, pymanopt fails, cf - - python -c "import numpy; import scipy; print(\"numpy: \", numpy.__version__); print(\"scipy: \", scipy.__version__)" + - pip install -U "numpy>=1.14" "scipy<1.3" # for numpy array formatting in doctests + scipy version: otherwise, pymanopt fails, cf - pip install flake8 pytest "pytest-cov<2.6" - pip install . # command to run tests + check syntax style -- cgit v1.2.3 From bed755904e0fd1d66004877c96127a56aa7e0983 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 2 Jul 2019 09:42:52 +0200 Subject: regularized OT done --- docs/source/quickstart.rst | 58 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 62688bc..a005c64 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -243,6 +243,9 @@ regularization terms: namely quadratic regularization and group lasso regularization. But we also provide in :any:`ot.optim` two generic solvers that allows solving any smooth regularization in practice. +Quadratic regularization +"""""""""""""""""""""""" + The first general regularization term we can solve is the quadratic regularization of the form @@ -257,6 +260,17 @@ functions :any:`ot.smooth.smooth_ot_dual` or :any:`ot.smooth.smooth_ot_semi_dual` with parameter :code:`reg_type='l2'` to choose the quadratic regularization. +.. hint:: + Examples of quadratic regularization are available in the following examples: + + - :any:`auto_examples/plot_OT_1D_smooth` + - :any:`auto_examples/plot_optim_OTreg` + + + +Group Lasso regularization +"""""""""""""""""""""""""" + Another regularization that has been used in recent years is the group lasso regularization @@ -276,6 +290,50 @@ convex gourp lasso and we provide a solver using generalized conditional gradient algorithm [7]_ in function :any:`ot.da.sinkhorn_l1l2_gl`. +.. hint:: + Examples of group Lasso regularization are available in the following examples: + + - :any:`auto_examples/plot_otda_classes` + - :any:`auto_examples/plot_otda_d2` + + +Generic solvers +""""""""""""""" + +Finally we propose in POT generic solvers that can be used to solve any +regularization as long as you can provide a function computing the +regularization and a function computing its gradient. + +In order to solve + +.. math:: + \gamma^* = arg\min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j} + \lambda\Omega(\gamma) + + s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 + +you can use function :any:`ot.optim.cg` that will use a conditional gradient as +proposed in [6]_ . you need to provide the regularization function as parameter +``f`` and its gradient as parameter ``df``. Note that the conditional gradient relies on +iterative solving of a linearization of the problem using the exact +:any:`ot.emd` so it can be slow in practice. Still it always returns a +transport matrix that does not violates the marginals. + +Another solver is proposed to solve the problem + +.. math:: + \gamma^* = arg\min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j}+ \lambda_e\Omega_e(\gamma) + \lambda\Omega(\gamma) + + s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 + +where :math:`\Omega_e` is the entropic regularization. In this case we use a +generalized conditional gradient [7]_ implemented in :any:`ot.opim.gcg` that does not linearize the entropic term and +relies on :any:`ot.sinkhorn` for its iterations. + +.. hint:: + Example of generic solvers are available in the following example: + + - :any:`auto_examples/plot_optim_OTreg` + Wasserstein Barycenters -- cgit v1.2.3 From 8d47d32713a6e2d448fae6db7420e93b4395d5e6 Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Tue, 2 Jul 2019 09:44:02 +0200 Subject: Bugfix (python2 in unbalanced) --- ot/unbalanced.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ot/unbalanced.py b/ot/unbalanced.py index 4a2af8a..44ab411 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -6,6 +6,7 @@ Regularized Unbalanced OT # Author: Hicham Janati # License: MIT License +from __future__ import division import warnings import numpy as np # from .utils import unif, dist @@ -287,12 +288,12 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, -------- >>> import ot - >>> a=[.5, .15] + >>> a=[.5, .5] >>> b=[.5, .5] >>> M=[[0., 1.],[1., 0.]] >>> ot.unbalanced.sinkhorn_knopp_unbalanced(a, b, M, 1., 1.) - array([[0.52761554, 0.22392482], - [0.10286295, 0.32257641]]) + array([[0.51122823, 0.18807035], + [0.18807035, 0.51122823]]) References ---------- -- cgit v1.2.3 From 5b6eb56f2d4bfdaeaa45970c386c42c21d7d1caf Mon Sep 17 00:00:00 2001 From: Romain Tavenard Date: Tue, 2 Jul 2019 09:53:15 +0200 Subject: Fix tolerance in doctest --- ot/bregman.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index 50f8389..13dfa3b 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1558,8 +1558,8 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli >>> reg = 0.1 >>> X_s = np.reshape(np.arange(n_s), (n_s, 1)) >>> X_t = np.reshape(np.arange(0, n_t), (n_t, 1)) - >>> empirical_sinkhorn_divergence(X_s, X_t, reg) - array([1.49988718]) + >>> empirical_sinkhorn_divergence(X_s, X_t, reg) # doctest: +ELLIPSIS + array([1.499...]) References -- cgit v1.2.3 From 82d10f780fc296b9f5548e1fe1da9b20349b1e10 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 2 Jul 2019 10:55:05 +0200 Subject: wasserstein barycenetr with fixed support --- docs/source/quickstart.rst | 86 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 79 insertions(+), 7 deletions(-) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index a005c64..94bc8cd 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -216,13 +216,7 @@ More details about the algorithm used is given in the following note. :any:`ot.smooth.smooth_ot_semi_dual` with parameter :code:`reg_type='kl'` to choose entropic/Kullbach Leibler regularization. -.. hint:: - Examples of use for :any:`ot.sinkhorn` are available in the following examples: - - :any:`auto_examples/plot_OT_2D_samples` - - :any:`auto_examples/plot_OT_1D` - - :any:`auto_examples/plot_OT_1D_smooth` - - :any:`auto_examples/plot_stochastic` Recently [23]_ introduced the sinkhorn divergence that build from entropic @@ -234,6 +228,15 @@ empirical distributions. Finally note that we also provide in :any:`ot.stochastic` several implementation of stochastic solvers for entropic regularized OT [18]_ [19]_. +.. hint:: + Examples of use for :any:`ot.sinkhorn` are available in the following examples: + + - :any:`auto_examples/plot_OT_2D_samples` + - :any:`auto_examples/plot_OT_1D` + - :any:`auto_examples/plot_OT_1D_smooth` + - :any:`auto_examples/plot_stochastic` + + Other regularization ^^^^^^^^^^^^^^^^^^^^ @@ -335,10 +338,79 @@ relies on :any:`ot.sinkhorn` for its iterations. - :any:`auto_examples/plot_optim_OTreg` - Wasserstein Barycenters ----------------------- +A Wasserstein barycenter is a distribution that minimize its Wasserstein +distance with respect to other distributions [16]_. It corresponds to minimizing the +following problem by seaching a distribution :math:`\mu` + +.. math:: + \min_\mu \quad \sum_{k} w_kW(\mu,\mu_k) + + +In practice we model a distribution with a finite number of support position: + +.. math:: + \mu=\sum_{i=1}^n a_i\delta_{x_i} + +where :math:`a` is an histogram on the simplex and the :math:`\{x_i\}` are the +position of the support. We can clearly see here that optimizing :math:`\mu` can +be done by searching for optimal weights :math:`a` or optimal support +:math:`\{x_i\}` (optimizing both is also an option). +We provide in POT solvers to estimate a discrete +Wasserstein barycenter in both cases. + +Barycenters with fixed support +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When optimizing a barycenter with a fixed support, the optimization problem can +be expressed as + + +.. math:: + \min_a \quad \sum_{k} w_k W(a,b_k) + +where :math:`b_k` are also weights in the simplex. In the non-regularized case, +the problem above is a classical linear program. In this case we propose a +solver :any:`ot.lp.barycenter` that rely on generic LP solvers. By default the +function uses :any:`scipy.optimize.linprog`, but more efficient LP solvers from +cvxopt can be also used by changing parameter :code:`solver`. Note that these +solver require to solve a very large linear program and can be very slow in +practice. + +Similarly to the OT problem, OT barycenters can be computed in the regularized +case. When using entropic regularization the problem can be solved with a +generalization of the sinkhorn algorithm based on bregman projections [3]_. This +algorithm is provided in function :any:`ot.bregman.barycenter` also available as +:any:`ot.barycenter`. In this case, the algorithm scales better to large +distributions and rely only on matrix multiplications that can be performed in +parallel. + +In addition to teh speedup brought by regularization, one can also greatly +accelerate the estimation of Wasserstein barycenter when the support has a +separable structure [21]_. In teh case of 2D images for instance one can replace +the matrix vector production in teh bregman projections by convolution +operators. We provide an implementation of this algorithm in function +:any:`ot.bregman.convolutional_barycenter2d`. + +.. hint:: + Example of Wasserstein (:any:`ot.lp.barycenter`) and regularized wassrestein + barycenter (:any:`ot.bregman.barycenter`) computation are available in the following examples: + + - :any:`auto_examples/plot_barycenter_1D` + - :any:`auto_examples/plot_barycenter_lp_vs_entropic` + + Example of convolutional barycenter (:any:`ot.bregman.convolutional_barycenter2d`) computation for 2D images is available + in the following example: + + - :any:`auto_examples/plot_convolutional_barycenter` + + + +Barycenters with free support +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + -- cgit v1.2.3 From b250212448ed3c1d023a6412abf4a3395d5585fb Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 2 Jul 2019 11:01:53 +0200 Subject: wasserstein barycenetr with fixed support --- docs/source/quickstart.rst | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 94bc8cd..7cbc962 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -220,8 +220,14 @@ More details about the algorithm used is given in the following note. Recently [23]_ introduced the sinkhorn divergence that build from entropic -regularization to compute fast and differentiable geometric diveregnce between -empirical distributions. +regularization to compute fast and differentiable geometric divergence between +empirical distributions. Note that we provide a function that compute directly +(with no need to pre compute the :code:`M` matrix) +the sinkhorn divergence for empirical distributions in +:any:`ot.bregman.empirical_sinkhorn_divergence`. Similarly one can compute the +OT matrix and loss for empirical distributions with respectively +:any:`ot.bregman.empirical_sinkhorn` and :any:`ot.bregman.empirical_sinkhorn2`. + @@ -389,19 +395,21 @@ parallel. In addition to teh speedup brought by regularization, one can also greatly accelerate the estimation of Wasserstein barycenter when the support has a -separable structure [21]_. In teh case of 2D images for instance one can replace +separable structure [21]_. In the case of 2D images for instance one can replace the matrix vector production in teh bregman projections by convolution operators. We provide an implementation of this algorithm in function :any:`ot.bregman.convolutional_barycenter2d`. .. hint:: - Example of Wasserstein (:any:`ot.lp.barycenter`) and regularized wassrestein + Example of Wasserstein (:any:`ot.lp.barycenter`) and regularized Wasserstein barycenter (:any:`ot.bregman.barycenter`) computation are available in the following examples: - :any:`auto_examples/plot_barycenter_1D` - :any:`auto_examples/plot_barycenter_lp_vs_entropic` - Example of convolutional barycenter (:any:`ot.bregman.convolutional_barycenter2d`) computation for 2D images is available + Example of convolutional barycenter + (:any:`ot.bregman.convolutional_barycenter2d`) computation + for 2D images is available in the following example: - :any:`auto_examples/plot_convolutional_barycenter` -- cgit v1.2.3 From 64693f98c22775048222f61f5e495849844e0135 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 2 Jul 2019 11:09:50 +0200 Subject: quickstart wasserstein barycenter done --- docs/source/quickstart.rst | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 7cbc962..8cce1c9 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -217,8 +217,6 @@ More details about the algorithm used is given in the following note. choose entropic/Kullbach Leibler regularization. - - Recently [23]_ introduced the sinkhorn divergence that build from entropic regularization to compute fast and differentiable geometric divergence between empirical distributions. Note that we provide a function that compute directly @@ -417,7 +415,27 @@ operators. We provide an implementation of this algorithm in function Barycenters with free support -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Estimating the Wassresein barycenter with free support but fixed weights +corresponds to solving the following optimization problem: + +.. math:: + \min_\{x_i\} \quad \sum_{k} w_kW(\mu,\mu_k) + + s.t. \quad \mu=\sum_{i=1}^n a_i\delta_{x_i} + +WE provide an alternating solver based on [20]_ in +:any:`ot.lp.free_support_barycenter`. This function minimize the problem and +return an optimal support :math:`\{x_i\}` for uniform or given weights +:math:`a`. + + .. hint:: + + Example of the fee support barycenter estimation is available + in the following example: + + - :any:`auto_examples/plot_free_support_barycenter` @@ -438,7 +456,7 @@ Gromov-Wasserstein GPU acceleration ----------------- +^^^^^^^^^^^^^^^^ We provide several implementation of our OT solvers in :any:`ot.gpu`. Those implementation use the :code:`cupy` toolbox. -- cgit v1.2.3 From 6fdce8f75000ec6e609371ae39484f7edbb19b2c Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 2 Jul 2019 13:38:20 +0200 Subject: quickstart wda + start unbalanced --- docs/source/quickstart.rst | 148 +++++++++++++++++++++++++++++++++++++++++++-- docs/source/readme.rst | 2 - 2 files changed, 144 insertions(+), 6 deletions(-) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 8cce1c9..8f4a24e 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -278,7 +278,7 @@ choose the quadratic regularization. Group Lasso regularization """""""""""""""""""""""""" -Another regularization that has been used in recent years is the group lasso +Another regularization that has been used in recent years [5]_ is the group lasso regularization .. math:: @@ -333,7 +333,7 @@ Another solver is proposed to solve the problem s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 where :math:`\Omega_e` is the entropic regularization. In this case we use a -generalized conditional gradient [7]_ implemented in :any:`ot.opim.gcg` that does not linearize the entropic term and +generalized conditional gradient [7]_ implemented in :any:`ot.optim.gcg` that does not linearize the entropic term and relies on :any:`ot.sinkhorn` for its iterations. .. hint:: @@ -421,11 +421,11 @@ Estimating the Wassresein barycenter with free support but fixed weights corresponds to solving the following optimization problem: .. math:: - \min_\{x_i\} \quad \sum_{k} w_kW(\mu,\mu_k) + \min_{\{x_i\}} \quad \sum_{k} w_kW(\mu,\mu_k) s.t. \quad \mu=\sum_{i=1}^n a_i\delta_{x_i} -WE provide an alternating solver based on [20]_ in +We provide an alternating solver based on [20]_ in :any:`ot.lp.free_support_barycenter`. This function minimize the problem and return an optimal support :math:`\{x_i\}` for uniform or given weights :math:`a`. @@ -443,13 +443,149 @@ return an optimal support :math:`\{x_i\}` for uniform or given weights Monge mapping and Domain adaptation ----------------------------------- +The original transport problem investigated by Gaspard Monge was seeking for a +mapping function that maps (or transports) between a source and target +distribution but that minimizes the transport loss. The existence and uniqueness of this +optimal mapping is still an open problem in the general case but has been proven +for smooth distributions by Brenier in his eponym `theorem +`__. We provide in +:any:`ot.da` several solvers for Monge mapping estimation and domain adaptation. + +Monge Mapping estimation +^^^^^^^^^^^^^^^^^^^^^^^^ + +We now discuss several approaches that are implemented in POT to estimate or +approximate a Monge mapping from finite distributions. + +First note that when the source and target distributions are supposed to be Gaussian +distributions, there exists a close form solution for the mapping and its an +affine function [14]_ of the form :math:`T(x)=Ax+b` . In this case we provide the function +:any:`ot.da.OT_mapping_linear` that return the operator :math:`A` and vector +:math:`b`. Note that if the number of samples is too small there is a parameter +:code:`reg` that provide a regularization for the covariance matrix estimation. + +For a more general mapping estimation we also provide the barycentric mapping +proposed in [6]_ . It is implemented in the class :any:`ot.da.EMDTransport` and +other transport based classes in :any:`ot.da` . Those classes are discussed more +in the following but follow an interface similar to sklearn classes. Finally a +method proposed in [8]_ that estimate a continuous mapping approximating the +barycentric mapping is provided in :any:`ot.da.joint_OT_mapping_linear` for +linear mapping and :any:`ot.da.joint_OT_mapping_kernel` for non linear mapping. + + .. hint:: + + Example of the linear Monge mapping estimation is available + in the following example: + + - :any:`auto_examples/plot_otda_linear_mapping` + +Domain adaptation classes +^^^^^^^^^^^^^^^^^^^^^^^^^ + +The use of OT for domain adaptation (OTDA) has been first proposed in [5]_ that also +introduced the group Lasso regularization. The main idea of OTDA is to estimate +a mapping of the samples between source and target distributions which allows to +transport labeled source samples onto the target distribution with no labels. + +We provide several classes based on :any:`ot.da.BaseTransport` that provide +several OT and mapping estimations. The interface of those classes is similar to +classifiers in sklearn toolbox. At initialization several parameters (for +instance regularization parameter) can be set. Then one needs to estimate the +mapping with function :any:`ot.da.BaseTransport.fit`. Finally one can map the +samples from source to target with :any:`ot.da.BaseTransport.transform` and +from target to source with :any:`ot.da.BaseTransport.inverse_transform`. Here is +an example for class :any:`ot.da.EMDTransport` + +.. code:: + + ot_emd = ot.da.EMDTransport() + ot_emd.fit(Xs=Xs, Xt=Xt) + + Mapped_Xs= ot_emd.transform(Xs=Xs) + +A list +of the provided implementation is given in the following note. + +.. note:: + + Here is a list of the mapping classes inheriting from + :any:`ot.da.BaseTransport` + + * :any:`ot.da.EMDTransport` : Barycentric mapping with EMD transport + * :any:`ot.da.SinkhornTransport` : Barycentric mapping with Sinkhorn transport + * :any:`ot.da.SinkhornL1l2Transport` : Barycentric mapping with Sinkhorn + + group Lasso regularization [5]_ + * :any:`ot.da.SinkhornLpl1Transport` : Barycentric mapping with Sinkhorn + + non convex group Lasso regularization [5]_ + * :any:`ot.da.LinearTransport` : Linear mapping estimation between Gaussians + [14]_ + * :any:`ot.da.MappingTransport` : Nonlinear mapping estimation [8]_ + +.. hint:: + + Example of the use of OTDA classes are available in the following exmaples: + + - :any:`auto_examples/plot_otda_color_images` + - :any:`auto_examples/plot_otda_mapping` + - :any:`auto_examples/plot_otda_mapping_colors_images` + - :any:`auto_examples/plot_otda_semi_supervised` Other applications ------------------ +We discuss in the following several implementations that has been used and +proposed in the OT and machine learning community. + Wasserstein Discriminant Analysis ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Wasserstein Discriminant Analysis [11]_ is a generalization of `Fisher Linear Discriminant +Analysis `__ that +allows discrimination between classes that are not linearly separable. It +consist in finding a linear projector optimizing the following criterion + +.. math:: + P = \text{arg}\min_P \frac{\sum_i OT_e(\mu_i\#P,\mu_i\#P)}{\sum_{i,j\neq i} + OT_e(\mu_i\#P,\mu_j\#P)} + +where :math:`\#` is the push-forward operator, :math:`OT_e` is the entropic OT +loss and :math:`\mu_i` is the +distribution of samples from class :math:`i`. :math:`P` is also constrained to +be in the Stiefel manifold. WDA can be solved in pot using function +:any:`ot.dr.wda`. It requires to have installed :code:`pymanopt` and +:code:`autograd` for manifold optimization and automatic differentiation +respectively. Note that we also provide the Fisher discriminant estimator in +:any:`ot.dr.wda` for easy comparison. + +.. warning:: + Note that due to the hard dependency on :code:`pymanopt` and + :code:`autograd`, :any:`ot.dr` is not imported by default. If you want to + use it you have to specifically import it with :code:`import ot.dr` . + +.. hint:: + + An example of the use of WDA is available in the following example: + + - :any:`auto_examples/plot_WDA` + + +Unbalanced optimal transport +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Unbalanced OT is a relaxation of the original OT problem where the violation of +the constraint on the marginals is added to the objective of the optimization +problem: + +.. math:: + \min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j} + reg\cdot\Omega(\gamma) + \alpha KL(\gamma 1, a) + \alpha KL(\gamma^T 1, b) + + s.t. \quad \gamma\geq 0 + + +where KL is the Kullback-Leibler divergence. This formulation allwos for +computing approximate mapping between distributions that do not have the same +amount of mass. Interestingly the problem can be solved with a generalization of +the Bregman projections algorithm [10]_. Gromov-Wasserstein ^^^^^^^^^^^^^^^^^^ @@ -461,6 +597,10 @@ GPU acceleration We provide several implementation of our OT solvers in :any:`ot.gpu`. Those implementation use the :code:`cupy` toolbox. +.. warning:: + Note that due to the hard dependency on :code:`cupy`, :any:`ot.gpu` is not + imported by default. If you want to + use it you have to specifically import it with :code:`import ot.gpu` . FAQ diff --git a/docs/source/readme.rst b/docs/source/readme.rst index 320ddd5..0871779 100644 --- a/docs/source/readme.rst +++ b/docs/source/readme.rst @@ -221,8 +221,6 @@ This toolbox has been created and is maintained by The contributors to this library are -- `Rémi Flamary `__ -- `Nicolas Courty `__ - `Alexandre Gramfort `__ - `Laetitia Chapel `__ - `Michael Perrot `__ -- cgit v1.2.3 From 85cc12bc7731077846bb77346797165c098fc4ec Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 2 Jul 2019 16:05:31 +0200 Subject: quickstart gfirst shot done! --- docs/source/quickstart.rst | 97 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 92 insertions(+), 5 deletions(-) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 8f4a24e..0dcd7ff 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -417,7 +417,7 @@ operators. We provide an implementation of this algorithm in function Barycenters with free support ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Estimating the Wassresein barycenter with free support but fixed weights +Estimating the Wasserstein barycenter with free support but fixed weights corresponds to solving the following optimization problem: .. math:: @@ -555,7 +555,7 @@ be in the Stiefel manifold. WDA can be solved in pot using function :any:`ot.dr.wda`. It requires to have installed :code:`pymanopt` and :code:`autograd` for manifold optimization and automatic differentiation respectively. Note that we also provide the Fisher discriminant estimator in -:any:`ot.dr.wda` for easy comparison. +:any:`ot.dr.fda` for easy comparison. .. warning:: Note that due to the hard dependency on :code:`pymanopt` and @@ -585,17 +585,104 @@ problem: where KL is the Kullback-Leibler divergence. This formulation allwos for computing approximate mapping between distributions that do not have the same amount of mass. Interestingly the problem can be solved with a generalization of -the Bregman projections algorithm [10]_. +the Bregman projections algorithm [10]_. We provide a solver for unbalanced OT +in :any:`ot.unbalanced` and more specifically +in function :any:`ot.sinkhorn_unbalanced`. A solver for unbalanced OT barycenter +is available in :any:`ot.barycenter_unbalanced`. + + +.. hint:: + + Examples of the use of :any:`ot.sinkhorn_unbalanced` and + :any:`ot.barycenter_unbalanced` are available in: + + - :any:`auto_examples/plot_UOT_1D` + - :any:`auto_examples/plot_UOT_barycenter_1D` + Gromov-Wasserstein ^^^^^^^^^^^^^^^^^^ +Gromov Wasserstein (GW) is a generalization of OT to distributions that do not lie in +the same space [13]_. In this case one cannot compute distance between samples +from the two distributions. [13]_ proposed instead to realign the metric spaces +by computing a transport between distance matrices. The Gromow Wasserstein +alignement between two distributions can be expressed as the one minimizing: + + +.. math:: + GW = \min_\gamma \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*\gamma_{i,j}*\gamma_{k,l} + + s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 + +where ::math:`C1` is the distance matrix between samples in the source +distribution and :math:`C2` the one between samples in the target, :math:`L(C1_{i,k},C2_{j,l})` is a measure of similarity between +:math:`C1_{i,k}` and :math:`C2_{j,l}` often chosen as +:math:`L(C1_{i,k},C2_{j,l})=\|C1_{i,k}-C2_{j,l}\|^2`. The optimization problem +above is a non-convex quadratic program but we provide a solver that finds a +local minimum using conditional gradient in :any:`ot.gromov.gromov_wasserstein`. +There also exist an entropic regularized variant of GW that has been proposed in +[12]_ and we provide an implementation of their algorithm in +:any:`ot.gromov.entropic_gromov_wasserstein`. + +Note that similarly to Wasserstein distance GW allows for the definition of GW +barycenters that cen be expressed as + +.. math:: + \min_{C\geq 0} \quad \sum_{k} w_k GW(C,Ck) + +where :math:`Ck` is the distance matrix between samples in distribution +:math:`k`. Note that interestingly the barycenter is defined a a symmetric +positive matrix. We provide a block coordinate optimization procedure in +:any:`ot.gromov.gromov_barycenters` and +:any:`ot.gromov.entropic_gromov_barycenters` for non-regularized and regularized +barycenters respectively. + +Finally note that recently a fusion between Wasserstein and GW, coined Fused +Groimov-Wasserstein (FGW) has been proposed +in [24]_. It allows to compute a similarity between objects that are only partly in +the same space. As such it can be used to measure similarity between labeled +graphs for instance and also provide computable barycenters. +The implementations of FGW is provided in functions +:any:`ot.gromov.fused_gromov_wasserstein` and :any:`ot.gromov.fgw_barycenters`. + +.. hint:: + + Examples of computation of GW, regularized G and FGW are provided in : + + - :any:`auto_examples/plot_gromov` + - :any:`auto_examples/plot_fgw` + + Examples of GW, regularized GW and FGW barycenters are available in : + + - :any:`auto_examples/plot_gromov_barycenter` + - :any:`auto_examples/plot_barycenter_fgw` + GPU acceleration ^^^^^^^^^^^^^^^^ We provide several implementation of our OT solvers in :any:`ot.gpu`. Those -implementation use the :code:`cupy` toolbox. +implementation use the :code:`cupy` toolbox that obviously need to be installed. + + +.. note:: + + Several implementations of POT functions (mainly those relying on linear + algebra) have been implemented in :any:`ot.gpu`. Here is a short list on the + main entries: + + - :any:`ot.gpu.dist` : computation of distance matrix + - :any:`ot.gpu.sinkhorn` : computation of sinkhorn + - :any:`ot.gpu.sinkhorn_lpl1_mm` : computation of sinkhorn + group lasso + +Note that while the :any:`ot.gpu` module has been designed to be compatible with +POT, calling its function with numpy array will incur a large overhead due to +the memory copy of the array on GPU prior to computation and conversion of the +array after computation. To avoid this overhead, we provide functions +:any:`ot.gpu.to_gpu` and :any:`ot.gpu.to_np` that perform the conversion +explicitly. + .. warning:: Note that due to the hard dependency on :code:`cupy`, :any:`ot.gpu` is not @@ -735,7 +822,7 @@ References matching `__. Foundations of computational mathematics 11.4 : 417-487. -.. [14] Knott, M. and Smith, C. S. (1984).`On the optimal mapping of +.. [14] Knott, M. and Smith, C. S. (1984). `On the optimal mapping of distributions `__, Journal of Optimization Theory and Applications Vol 43. -- cgit v1.2.3 From ef00ce42616fe7adf747c23a5590a83b62171a36 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 2 Jul 2019 16:40:30 +0200 Subject: quickstart proof reading --- docs/source/quickstart.rst | 173 +++++++++++++++++++++++---------------------- 1 file changed, 88 insertions(+), 85 deletions(-) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 0dcd7ff..b726149 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -3,7 +3,9 @@ Quick start guide ================= In the following we provide some pointers about which functions and classes -to use for different problems related to optimal transport (OT). +to use for different problems related to optimal transport (OT) and machine +learning. We refer when we can to concrete examples in the documentation that +are also available as notebooks on the POT Github. This document is not a tutorial on numerical optimal transport. For this we strongly recommend to read the very nice book [15]_ . @@ -16,7 +18,8 @@ Optimal transport and Wasserstein distance In POT, most functions that solve OT or regularized OT problems have two versions that return the OT matrix or the value of the optimal solution. For instance :any:`ot.emd` return the OT matrix and :any:`ot.emd2` return the - Wassertsein distance. + Wassertsein distance. This approach has been implemented in practice for all + solvers that return an OT matrix (even Gromov-Wasserstsein) Solving optimal transport ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -32,7 +35,8 @@ as where : - :math:`M\in\mathbb{R}_+^{m\times n}` is the metric cost matrix defining the cost to move mass from bin :math:`a_i` to bin :math:`b_j`. -- :math:`a` and :math:`b` are histograms (positive, sum to 1) that represent the weights of each samples in the source an target distributions. +- :math:`a` and :math:`b` are histograms on the simplex (positive, sum to 1) that represent the +weights of each samples in the source an target distributions. Solving the linear program above can be done using the function :any:`ot.emd` that will return the optimal transport matrix :math:`\gamma^*`: @@ -43,7 +47,7 @@ that will return the optimal transport matrix :math:`\gamma^*`: # M is the ground cost matrix T=ot.emd(a,b,M) # exact linear program -The method used for solving the OT problem is the network simplex, it is +The method implemented for solving the OT problem is the network simplex, it is implemented in C from [1]_. It has a complexity of :math:`O(n^3)` but the solver is quite efficient and uses sparsity of the solution. @@ -54,15 +58,16 @@ solver is quite efficient and uses sparsity of the solution. - :any:`auto_examples/plot_OT_1D` - :any:`auto_examples/plot_OT_L1_vs_L2` + Computing Wasserstein distance ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The value of the OT solution is often more of interest that the OT matrix : +The value of the OT solution is often more of interest than the OT matrix : - .. math:: - OT(a,b)=\min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j} +.. math:: + OT(a,b)=\min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j} - s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 + s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 It can computed from an already estimated OT matrix with @@ -92,7 +97,6 @@ the :math:`W_1` wasserstein distance can be done directly with :any:`ot.emd2` when providing :code:`M=ot.dist(xs,xt, metric='euclidean')` to use the euclidean distance. - .. hint:: Examples of use for :any:`ot.emd2` are available in the following examples: @@ -111,15 +115,15 @@ For instance when the samples are in 1D, then the OT problem can be solved in function :any:`ot.emd_1d` and :any:`ot.emd2_1d` to return respectively the OT matrix and value. Note that since the solution is very sparse the :code:`sparse` parameter of :any:`ot.emd_1d` allows for solving and returning the solution for -very large problems. Note that in order to computed directly the :math:`W_p` +very large problems. Note that in order to compute directly the :math:`W_p` Wasserstein distance in 1D we provide the function :any:`ot.wasserstein_1d` that takes :code:`p` as a parameter. -Another specials for estimating OT and Monge mapping is between Gaussian +Another special case for estimating OT and Monge mapping is between Gaussian distributions. In this case there exists a close form solution given in Remark 2.29 in [15]_ and the Monge mapping is an affine function and can be also computed from the covariances and means of the source and target -distributions. In this case when the finite sample dataset is supposed gaussian, we provide +distributions. In the case when the finite sample dataset is supposed gaussian, we provide :any:`ot.da.OT_mapping_linear` that returns the parameters for the Monge mapping. @@ -129,8 +133,7 @@ Regularized Optimal Transport Recent developments have shown the interest of regularized OT both in terms of computational and statistical properties. - -We address in this section the regularized OT problem that can be expressed as +We address in this section the regularized OT problems that can be expressed as .. math:: \gamma^* = arg\min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j} + \lambda\Omega(\gamma) @@ -148,7 +151,6 @@ We discuss in the following specific algorithms that can be used depending on the regularization term. - Entropic regularized OT ^^^^^^^^^^^^^^^^^^^^^^^ @@ -162,7 +164,8 @@ regularization has the following expression The use of the regularization term above in the optimization problem has a very strong impact. First it makes the problem smooth which leads to new optimization -procedures such as L-BFGS (see :any:`ot.smooth` ). Next it makes the problem +procedures such as the well known Sinkhorn algorithm [2]_ or L-BFGS (see +:any:`ot.smooth` ). Next it makes the problem strictly convex meaning that there will be a unique solution. Finally the solution of the resulting optimization problem can be expressed as: @@ -172,13 +175,13 @@ solution of the resulting optimization problem can be expressed as: where :math:`u` and :math:`v` are vectors and :math:`K=\exp(-M/\lambda)` where the :math:`\exp` is taken component-wise. In order to solve the optimization -problem, on can use an alternative projection algorithm that can be very +problem, on can use an alternative projection algorithm called Sinkhorn-Knopp that can be very efficient for large values if regularization. -The main function is POT are :any:`ot.sinkhorn` and +The Sinkhorn-Knopp algorithm is implemented in :any:`ot.sinkhorn` and :any:`ot.sinkhorn2` that return respectively the OT matrix and the value of the linear term. Note that the regularization parameter :math:`\lambda` in the -equation above is given to those function with the parameter :code:`reg`. +equation above is given to those functions with the parameter :code:`reg`. >>> import ot >>> a=[.5,.5] @@ -188,10 +191,7 @@ equation above is given to those function with the parameter :code:`reg`. array([[ 0.36552929, 0.13447071], [ 0.13447071, 0.36552929]]) - - -More details about the algorithm used is given in the following note. - +More details about the algorithms used are given in the following note. .. note:: The main function to solve entropic regularized OT is :any:`ot.sinkhorn`. @@ -211,7 +211,7 @@ More details about the algorithm used is given in the following note. In addition to all those variants of sinkhorn, we have another implementation solving the problem in the smooth dual or semi-dual in :any:`ot.smooth`. This solver uses the :any:`scipy.optimize.minimize` - function to solve the smooth problem with :code:`L-BFGS` algorithm. Tu use + function to solve the smooth problem with :code:`L-BFGS-B` algorithm. Tu use this solver, use functions :any:`ot.smooth.smooth_ot_dual` or :any:`ot.smooth.smooth_ot_semi_dual` with parameter :code:`reg_type='kl'` to choose entropic/Kullbach Leibler regularization. @@ -227,13 +227,13 @@ OT matrix and loss for empirical distributions with respectively :any:`ot.bregman.empirical_sinkhorn` and :any:`ot.bregman.empirical_sinkhorn2`. - - Finally note that we also provide in :any:`ot.stochastic` several implementation -of stochastic solvers for entropic regularized OT [18]_ [19]_. +of stochastic solvers for entropic regularized OT [18]_ [19]_. Those pure Python +implementations are not optimized for speed but provide a roust implementation +of algorithms in [18]_ [19]_. .. hint:: - Examples of use for :any:`ot.sinkhorn` are available in the following examples: + Examples of use for :any:`ot.sinkhorn` are available in : - :any:`auto_examples/plot_OT_2D_samples` - :any:`auto_examples/plot_OT_1D` @@ -246,7 +246,7 @@ Other regularization While entropic OT is the most common and favored in practice, there exist other kind of regularization. We provide in POT two specific solvers for other -regularization terms: namely quadratic regularization and group lasso +regularization terms, namely quadratic regularization and group lasso regularization. But we also provide in :any:`ot.optim` two generic solvers that allows solving any smooth regularization in practice. @@ -261,14 +261,14 @@ regularization of the form this regularization term has a similar effect to entropic regularization in densifying the OT matrix but it keeps some sort of sparsity that is lost with -entropic regularization as soon as :math:`\lambda>0` [17]_. This problem cen be +entropic regularization as soon as :math:`\lambda>0` [17]_. This problem can be solved with POT using solvers from :any:`ot.smooth`, more specifically functions :any:`ot.smooth.smooth_ot_dual` or :any:`ot.smooth.smooth_ot_semi_dual` with parameter :code:`reg_type='l2'` to choose the quadratic regularization. .. hint:: - Examples of quadratic regularization are available in the following examples: + Examples of quadratic regularization are available in : - :any:`auto_examples/plot_OT_1D_smooth` - :any:`auto_examples/plot_optim_OTreg` @@ -288,17 +288,17 @@ where :math:`\mathcal{G}` contains non overlapping groups of lines in the OT matrix. This regularization proposed in [5]_ will promote sparsity at the group level and for instance will force target samples to get mass from a small number of groups. Note that the exact OT solution is already sparse so this regularization does -not make sens if it is not combined with others such as entropic. Depending on +not make sens if it is not combined with entropic regularization. Depending on the choice of :code:`p` and :code:`q`, the problem can be solved with different approaches. When :code:`q=1` and :code:`p<1` the problem is non convex but can -be solved using an efficient majoration minimization approach with +be solved using an efficient majoration minimization approach with :any:`ot.sinkhorn_lpl1_mm`. When :code:`q=2` and :code:`p=1` we recover the -convex gourp lasso and we provide a solver using generalized conditional +convex group lasso and we provide a solver using generalized conditional gradient algorithm [7]_ in function :any:`ot.da.sinkhorn_l1l2_gl`. .. hint:: - Examples of group Lasso regularization are available in the following examples: + Examples of group Lasso regularization are available in : - :any:`auto_examples/plot_otda_classes` - :any:`auto_examples/plot_otda_d2` @@ -309,7 +309,7 @@ Generic solvers Finally we propose in POT generic solvers that can be used to solve any regularization as long as you can provide a function computing the -regularization and a function computing its gradient. +regularization and a function computing its gradient (or sub-gradient). In order to solve @@ -319,13 +319,14 @@ In order to solve s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 you can use function :any:`ot.optim.cg` that will use a conditional gradient as -proposed in [6]_ . you need to provide the regularization function as parameter +proposed in [6]_ . You need to provide the regularization function as parameter ``f`` and its gradient as parameter ``df``. Note that the conditional gradient relies on iterative solving of a linearization of the problem using the exact -:any:`ot.emd` so it can be slow in practice. Still it always returns a +:any:`ot.emd` so it can be slow in practice. But, being an interior point +algorithm, it always returns a transport matrix that does not violates the marginals. -Another solver is proposed to solve the problem +Another generic solver is proposed to solve the problem .. math:: \gamma^* = arg\min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j}+ \lambda_e\Omega_e(\gamma) + \lambda\Omega(\gamma) @@ -333,11 +334,12 @@ Another solver is proposed to solve the problem s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 where :math:`\Omega_e` is the entropic regularization. In this case we use a -generalized conditional gradient [7]_ implemented in :any:`ot.optim.gcg` that does not linearize the entropic term and +generalized conditional gradient [7]_ implemented in :any:`ot.optim.gcg` that +does not linearize the entropic term but relies on :any:`ot.sinkhorn` for its iterations. .. hint:: - Example of generic solvers are available in the following example: + An example of generic solvers are available in : - :any:`auto_examples/plot_optim_OTreg` @@ -347,7 +349,7 @@ Wasserstein Barycenters A Wasserstein barycenter is a distribution that minimize its Wasserstein distance with respect to other distributions [16]_. It corresponds to minimizing the -following problem by seaching a distribution :math:`\mu` +following problem by searching a distribution :math:`\mu` such that .. math:: \min_\mu \quad \sum_{k} w_kW(\mu,\mu_k) @@ -371,7 +373,6 @@ Barycenters with fixed support When optimizing a barycenter with a fixed support, the optimization problem can be expressed as - .. math:: \min_a \quad \sum_{k} w_k W(a,b_k) @@ -379,36 +380,36 @@ where :math:`b_k` are also weights in the simplex. In the non-regularized case, the problem above is a classical linear program. In this case we propose a solver :any:`ot.lp.barycenter` that rely on generic LP solvers. By default the function uses :any:`scipy.optimize.linprog`, but more efficient LP solvers from -cvxopt can be also used by changing parameter :code:`solver`. Note that these -solver require to solve a very large linear program and can be very slow in +cvxopt can be also used by changing parameter :code:`solver`. Note that this problem +requires to solve a very large linear program and can be very slow in practice. Similarly to the OT problem, OT barycenters can be computed in the regularized -case. When using entropic regularization the problem can be solved with a +case. When using entropic regularization is used, the problem can be solved with a generalization of the sinkhorn algorithm based on bregman projections [3]_. This algorithm is provided in function :any:`ot.bregman.barycenter` also available as :any:`ot.barycenter`. In this case, the algorithm scales better to large distributions and rely only on matrix multiplications that can be performed in parallel. -In addition to teh speedup brought by regularization, one can also greatly +In addition to the speedup brought by regularization, one can also greatly accelerate the estimation of Wasserstein barycenter when the support has a separable structure [21]_. In the case of 2D images for instance one can replace -the matrix vector production in teh bregman projections by convolution +the matrix vector production in the Bregman projections by convolution operators. We provide an implementation of this algorithm in function :any:`ot.bregman.convolutional_barycenter2d`. .. hint:: - Example of Wasserstein (:any:`ot.lp.barycenter`) and regularized Wasserstein - barycenter (:any:`ot.bregman.barycenter`) computation are available in the following examples: + Examples of Wasserstein (:any:`ot.lp.barycenter`) and regularized Wasserstein + barycenter (:any:`ot.bregman.barycenter`) computation are available in : - :any:`auto_examples/plot_barycenter_1D` - :any:`auto_examples/plot_barycenter_lp_vs_entropic` - Example of convolutional barycenter + An example of convolutional barycenter (:any:`ot.bregman.convolutional_barycenter2d`) computation for 2D images is available - in the following example: + in : - :any:`auto_examples/plot_convolutional_barycenter` @@ -425,15 +426,15 @@ corresponds to solving the following optimization problem: s.t. \quad \mu=\sum_{i=1}^n a_i\delta_{x_i} -We provide an alternating solver based on [20]_ in +We provide a solver based on [20]_ in :any:`ot.lp.free_support_barycenter`. This function minimize the problem and -return an optimal support :math:`\{x_i\}` for uniform or given weights +return a locally optimal support :math:`\{x_i\}` for uniform or given weights :math:`a`. .. hint:: - Example of the fee support barycenter estimation is available - in the following example: + An example of the free support barycenter estimation is available + in : - :any:`auto_examples/plot_free_support_barycenter` @@ -449,7 +450,8 @@ distribution but that minimizes the transport loss. The existence and uniqueness optimal mapping is still an open problem in the general case but has been proven for smooth distributions by Brenier in his eponym `theorem `__. We provide in -:any:`ot.da` several solvers for Monge mapping estimation and domain adaptation. +:any:`ot.da` several solvers for smooth Monge mapping estimation and domain +adaptation from discrete distributions. Monge Mapping estimation ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -468,14 +470,14 @@ For a more general mapping estimation we also provide the barycentric mapping proposed in [6]_ . It is implemented in the class :any:`ot.da.EMDTransport` and other transport based classes in :any:`ot.da` . Those classes are discussed more in the following but follow an interface similar to sklearn classes. Finally a -method proposed in [8]_ that estimate a continuous mapping approximating the +method proposed in [8]_ that estimates a continuous mapping approximating the barycentric mapping is provided in :any:`ot.da.joint_OT_mapping_linear` for linear mapping and :any:`ot.da.joint_OT_mapping_kernel` for non linear mapping. .. hint:: - Example of the linear Monge mapping estimation is available - in the following example: + An example of the linear Monge mapping estimation is available + in : - :any:`auto_examples/plot_otda_linear_mapping` @@ -489,12 +491,14 @@ transport labeled source samples onto the target distribution with no labels. We provide several classes based on :any:`ot.da.BaseTransport` that provide several OT and mapping estimations. The interface of those classes is similar to -classifiers in sklearn toolbox. At initialization several parameters (for -instance regularization parameter) can be set. Then one needs to estimate the +classifiers in sklearn toolbox. At initialization, several parameters such as + regularization parameter value can be set. Then one needs to estimate the mapping with function :any:`ot.da.BaseTransport.fit`. Finally one can map the samples from source to target with :any:`ot.da.BaseTransport.transform` and -from target to source with :any:`ot.da.BaseTransport.inverse_transform`. Here is -an example for class :any:`ot.da.EMDTransport` +from target to source with :any:`ot.da.BaseTransport.inverse_transform`. + +Here is +an example for class :any:`ot.da.EMDTransport` : .. code:: @@ -503,12 +507,11 @@ an example for class :any:`ot.da.EMDTransport` Mapped_Xs= ot_emd.transform(Xs=Xs) -A list -of the provided implementation is given in the following note. +A list of the provided implementation is given in the following note. .. note:: - Here is a list of the mapping classes inheriting from + Here is a list of the OT mapping classes inheriting from :any:`ot.da.BaseTransport` * :any:`ot.da.EMDTransport` : Barycentric mapping with EMD transport @@ -523,7 +526,7 @@ of the provided implementation is given in the following note. .. hint:: - Example of the use of OTDA classes are available in the following exmaples: + Example of the use of OTDA classes are available in : - :any:`auto_examples/plot_otda_color_images` - :any:`auto_examples/plot_otda_mapping` @@ -533,7 +536,7 @@ of the provided implementation is given in the following note. Other applications ------------------ -We discuss in the following several implementations that has been used and +We discuss in the following several OT related problems and tools that has been proposed in the OT and machine learning community. Wasserstein Discriminant Analysis @@ -551,7 +554,7 @@ consist in finding a linear projector optimizing the following criterion where :math:`\#` is the push-forward operator, :math:`OT_e` is the entropic OT loss and :math:`\mu_i` is the distribution of samples from class :math:`i`. :math:`P` is also constrained to -be in the Stiefel manifold. WDA can be solved in pot using function +be in the Stiefel manifold. WDA can be solved in POT using function :any:`ot.dr.wda`. It requires to have installed :code:`pymanopt` and :code:`autograd` for manifold optimization and automatic differentiation respectively. Note that we also provide the Fisher discriminant estimator in @@ -564,7 +567,7 @@ respectively. Note that we also provide the Fisher discriminant estimator in .. hint:: - An example of the use of WDA is available in the following example: + An example of the use of WDA is available in : - :any:`auto_examples/plot_WDA` @@ -582,7 +585,7 @@ problem: s.t. \quad \gamma\geq 0 -where KL is the Kullback-Leibler divergence. This formulation allwos for +where KL is the Kullback-Leibler divergence. This formulation allows for computing approximate mapping between distributions that do not have the same amount of mass. Interestingly the problem can be solved with a generalization of the Bregman projections algorithm [10]_. We provide a solver for unbalanced OT @@ -594,7 +597,7 @@ is available in :any:`ot.barycenter_unbalanced`. .. hint:: Examples of the use of :any:`ot.sinkhorn_unbalanced` and - :any:`ot.barycenter_unbalanced` are available in: + :any:`ot.barycenter_unbalanced` are available in : - :any:`auto_examples/plot_UOT_1D` - :any:`auto_examples/plot_UOT_barycenter_1D` @@ -609,46 +612,46 @@ from the two distributions. [13]_ proposed instead to realign the metric spaces by computing a transport between distance matrices. The Gromow Wasserstein alignement between two distributions can be expressed as the one minimizing: - .. math:: GW = \min_\gamma \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*\gamma_{i,j}*\gamma_{k,l} s.t. \gamma 1 = a; \gamma^T 1= b; \gamma\geq 0 where ::math:`C1` is the distance matrix between samples in the source -distribution and :math:`C2` the one between samples in the target, :math:`L(C1_{i,k},C2_{j,l})` is a measure of similarity between +distribution and :math:`C2` the one between samples in the target, +:math:`L(C1_{i,k},C2_{j,l})` is a measure of similarity between :math:`C1_{i,k}` and :math:`C2_{j,l}` often chosen as :math:`L(C1_{i,k},C2_{j,l})=\|C1_{i,k}-C2_{j,l}\|^2`. The optimization problem above is a non-convex quadratic program but we provide a solver that finds a local minimum using conditional gradient in :any:`ot.gromov.gromov_wasserstein`. -There also exist an entropic regularized variant of GW that has been proposed in +There also exists an entropic regularized variant of GW that has been proposed in [12]_ and we provide an implementation of their algorithm in :any:`ot.gromov.entropic_gromov_wasserstein`. Note that similarly to Wasserstein distance GW allows for the definition of GW -barycenters that cen be expressed as +barycenters that can be expressed as .. math:: \min_{C\geq 0} \quad \sum_{k} w_k GW(C,Ck) where :math:`Ck` is the distance matrix between samples in distribution -:math:`k`. Note that interestingly the barycenter is defined a a symmetric +:math:`k`. Note that interestingly the barycenter is defined as a symmetric positive matrix. We provide a block coordinate optimization procedure in :any:`ot.gromov.gromov_barycenters` and :any:`ot.gromov.entropic_gromov_barycenters` for non-regularized and regularized barycenters respectively. Finally note that recently a fusion between Wasserstein and GW, coined Fused -Groimov-Wasserstein (FGW) has been proposed +Gromov-Wasserstein (FGW) has been proposed in [24]_. It allows to compute a similarity between objects that are only partly in the same space. As such it can be used to measure similarity between labeled graphs for instance and also provide computable barycenters. -The implementations of FGW is provided in functions +The implementations of FGW and FGW barycenter is provided in functions :any:`ot.gromov.fused_gromov_wasserstein` and :any:`ot.gromov.fgw_barycenters`. .. hint:: - Examples of computation of GW, regularized G and FGW are provided in : + Examples of computation of GW, regularized G and FGW are available in : - :any:`auto_examples/plot_gromov` - :any:`auto_examples/plot_fgw` @@ -663,7 +666,7 @@ GPU acceleration ^^^^^^^^^^^^^^^^ We provide several implementation of our OT solvers in :any:`ot.gpu`. Those -implementation use the :code:`cupy` toolbox that obviously need to be installed. +implementations use the :code:`cupy` toolbox that obviously need to be installed. .. note:: @@ -677,7 +680,7 @@ implementation use the :code:`cupy` toolbox that obviously need to be installed. - :any:`ot.gpu.sinkhorn_lpl1_mm` : computation of sinkhorn + group lasso Note that while the :any:`ot.gpu` module has been designed to be compatible with -POT, calling its function with numpy array will incur a large overhead due to +POT, calling its function with :any:`numpy` arrays will incur a large overhead due to the memory copy of the array on GPU prior to computation and conversion of the array after computation. To avoid this overhead, we provide functions :any:`ot.gpu.to_gpu` and :any:`ot.gpu.to_np` that perform the conversion @@ -697,7 +700,7 @@ FAQ 1. **How to solve a discrete optimal transport problem ?** - The solver for discrete is the function :py:mod:`ot.emd` that returns + The solver for discrete OT is the function :py:mod:`ot.emd` that returns the OT transport matrix. If you want to solve a regularized OT you can use :py:mod:`ot.sinkhorn`. @@ -711,7 +714,7 @@ FAQ T=ot.emd(a,b,M) # exact linear program T_reg=ot.sinkhorn(a,b,M,reg) # entropic regularized OT - More detailed examples can be seen on this + More detailed examples can be seen on this example: :doc:`auto_examples/plot_OT_2D_samples` -- cgit v1.2.3 From e26aa8ee4498f19248f8dcc9868ec55b62eb35e5 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 2 Jul 2019 16:52:24 +0200 Subject: typo exmaples --- docs/source/quickstart.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index b726149..1640d6a 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -52,7 +52,7 @@ implemented in C from [1]_. It has a complexity of :math:`O(n^3)` but the solver is quite efficient and uses sparsity of the solution. .. hint:: - Examples of use for :any:`ot.emd` are available in the following examples: + Examples of use for :any:`ot.emd` are available in : - :any:`auto_examples/plot_OT_2D_samples` - :any:`auto_examples/plot_OT_1D` @@ -99,7 +99,7 @@ distance. .. hint:: - Examples of use for :any:`ot.emd2` are available in the following examples: + An example of use for :any:`ot.emd2` is available in : - :any:`auto_examples/plot_compute_emd` -- cgit v1.2.3 From d3236cf0cab000b5604f8ede9ebcbdc19d8c213f Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Wed, 3 Jul 2019 13:31:55 +0200 Subject: test raise with pytets in test_emd_1d_emd2_1d --- Makefile | 4 ++-- ot/__init__.py | 5 ++++- test/test_ot.py | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 84a644b..4cdb7d1 100644 --- a/Makefile +++ b/Makefile @@ -42,10 +42,10 @@ pep8 : flake8 examples/ ot/ test/ test : FORCE pep8 - $(PYTHON) -m pytest -v test/ --cov=ot --cov-report html:cov_html + $(PYTHON) -m pytest -v test/ --doctest-modules --ignore ot/gpu/ --cov=ot --cov-report html:cov_html pytest : FORCE - $(PYTHON) -m pytest -v test/ --cov=ot + $(PYTHON) -m pytest -v test/ --doctest-modules --ignore ot/gpu/ --cov=ot uploadpypi : #python setup.py register diff --git a/ot/__init__.py b/ot/__init__.py index ad7b982..35d2ddd 100644 --- a/ot/__init__.py +++ b/ot/__init__.py @@ -10,7 +10,10 @@ a number of functions described below. :py:mod:`ot.gromov`, :py:mod:`ot.smooth` :py:mod:`ot.stochastic` - The other sub-modules are not imported due to additional dependencies. + The following sub-modules are not imported due to additional dependencies: + + - :any:`ot.dr` : depends on :code:`pymanopt` and :code:`autograd`. + - :any:`ot.gpu` : depends on :code:`cupy` and a CUDA GPU. """ diff --git a/test/test_ot.py b/test/test_ot.py index ac86602..dacae0a 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -72,7 +72,8 @@ def test_emd_1d_emd2_1d(): # check AssertionError is raised if called on non 1d arrays u = np.random.randn(n, 2) v = np.random.randn(m, 2) - np.testing.assert_raises(AssertionError, ot.emd_1d, u, v, [], []) + with pytest.raises(AssertionError): + ot.emd_1d(u, v, [], []) def test_wass_1d(): -- cgit v1.2.3 From 7402d344240ce94e33c53daff419d4356278d48f Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Wed, 3 Jul 2019 14:11:16 +0200 Subject: doc in modules --- ot/__init__.py | 29 ++++++++++++++++++++++++++++- ot/dr.py | 6 ++++++ ot/gpu/__init__.py | 4 ++-- ot/lp/__init__.py | 5 ++--- ot/plot.py | 6 ++++++ ot/stochastic.py | 6 ++++++ ot/utils.py | 2 +- 7 files changed, 51 insertions(+), 7 deletions(-) diff --git a/ot/__init__.py b/ot/__init__.py index 35d2ddd..35ae6fc 100644 --- a/ot/__init__.py +++ b/ot/__init__.py @@ -1,7 +1,33 @@ """ This is the main module of the POT toolbox. It provides easy access to -a number of functions described below. +a number of sub-modules and functions described below. + +.. note:: + + + Here is a list of the submodules and short description of what they contain. + + - :any:`ot.lp` contains OT solvers for the exact (Linear Program) OT problems. + - :any:`ot.bregman` contains OT solvers for the entropic OT problems using + Bregman projections. + - :any:`ot.lp` contains OT solvers for the exact (Linear Program) OT problems. + - :any:`ot.smooth` contains OT solvers for the regularized (l2 and kl) smooth OT + problems. + - :any:`ot.gromov` contains solvers for Gromov-Wasserstein and Fused Gromov + Wasserstein problems. + - :any:`ot.optim` contains generic solvers OT based optimization problems + - :any:`ot.da` contains classes and function related to Monge mapping + estimation and Domain Adaptation (DA). + - :any:`ot.gpu` contains GPU (cupy) implementation of some OT solvers + - :any:`ot.dr` contains Dimension Reduction (DR) methods such as Wasserstein + Discriminant Analysis. + - :any:`ot.utils` contains utility functions such as distance computation and + timing. + - :any:`ot.datasets` contains toy dataset generation functions. + - :any:`ot.plot` contains visualization functions + - :any:`ot.stochastic` contains stochastic solvers for regularized OT. + - :any:`ot.unbalanced` contains solvers for regularized unbalanced OT. .. warning:: The list of automatically imported sub-modules is as follows: @@ -14,6 +40,7 @@ a number of functions described below. - :any:`ot.dr` : depends on :code:`pymanopt` and :code:`autograd`. - :any:`ot.gpu` : depends on :code:`cupy` and a CUDA GPU. + - :any:`ot.plot` : depends on :code:`matplotlib` """ diff --git a/ot/dr.py b/ot/dr.py index d30ab30..d2bf6e2 100644 --- a/ot/dr.py +++ b/ot/dr.py @@ -1,6 +1,12 @@ # -*- coding: utf-8 -*- """ Dimension reduction with optimal transport + + +.. warning:: + Note that by default the module is not import in :mod:`ot`. In order to + use it you need to explicitely import :mod:`ot.dr` + """ # Author: Remi Flamary diff --git a/ot/gpu/__init__.py b/ot/gpu/__init__.py index 6a2afcf..1ab95bb 100644 --- a/ot/gpu/__init__.py +++ b/ot/gpu/__init__.py @@ -6,8 +6,8 @@ functions. The GPU backend in handled by `cupy `_. .. warning:: - Note that by default the module is not import in :mod:`ot`. in order to - use it you need to import :mod:`ot.gpu` . + Note that by default the module is not import in :mod:`ot`. In order to + use it you need to explicitely import :mod:`ot.gpu` . By default, the functions in this module accept and return numpy arrays in order to proide drop-in replacement for the other POT function but diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index aed29f8..17f1731 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -544,14 +544,13 @@ def wasserstein_1d(x_a, x_b, a=None, b=None, p=1.): r"""Solves the p-Wasserstein distance problem between 1d measures and returns the distance - .. math:: - \gamma = arg\min_\gamma \left( \sum_i \sum_j \gamma_{ij} - |x_a[i] - x_b[j]|^p \\right)^{1/p} + \min_\gamma \left( \sum_i \sum_j \gamma_{ij} \|x_a[i] - x_b[j]\|^p \right)^{1/p} s.t. \gamma 1 = a, \gamma^T 1= b, \gamma\geq 0 + where : - x_a and x_b are the samples diff --git a/ot/plot.py b/ot/plot.py index 784a372..a409d4a 100644 --- a/ot/plot.py +++ b/ot/plot.py @@ -1,5 +1,11 @@ """ Functions for plotting OT matrices + +.. warning:: + Note that by default the module is not import in :mod:`ot`. In order to + use it you need to explicitely import :mod:`ot.plot` + + """ # Author: Remi Flamary diff --git a/ot/stochastic.py b/ot/stochastic.py index bf3e7a7..5754968 100644 --- a/ot/stochastic.py +++ b/ot/stochastic.py @@ -1,3 +1,9 @@ +""" +Stochastic solvers for regularized OT. + + +""" + # Author: Kilian Fatras # # License: MIT License diff --git a/ot/utils.py b/ot/utils.py index f21ceb9..e8249ef 100644 --- a/ot/utils.py +++ b/ot/utils.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -Various function that can be usefull +Various useful functions """ # Author: Remi Flamary -- cgit v1.2.3 From 852e330bfca616e033fa4453fcd77bd4f1af1a06 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 5 Jul 2019 09:43:37 +0200 Subject: prepare for version 1.0 --- Makefile | 5 +++++ ot/__init__.py | 15 ++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 4cdb7d1..bd3c1b4 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,8 @@ PYTHON=python3 branch := $(shell git symbolic-ref --short -q HEAD) +CIBW_BEFORE_BUILD="pip install numpy cython" + help : @echo "The following make targets are available:" @@ -73,5 +75,8 @@ autopep8 : aautopep8 : autopep8 -air test ot examples --jobs -1 + +wheels: + cibuildwheel --platform linux --output-dir dist FORCE : diff --git a/ot/__init__.py b/ot/__init__.py index 35ae6fc..571f235 100644 --- a/ot/__init__.py +++ b/ot/__init__.py @@ -71,10 +71,11 @@ from .da import sinkhorn_lpl1_mm # utils functions from .utils import dist, unif, tic, toc, toq -__version__ = "0.5.1" - -__all__ = ["emd", "emd2", 'emd_1d', "sinkhorn", "sinkhorn2", "utils", 'datasets', - 'bregman', 'lp', 'tic', 'toc', 'toq', 'gromov', - 'emd_1d', 'emd2_1d', 'wasserstein_1d', - 'dist', 'unif', 'barycenter', 'sinkhorn_lpl1_mm', 'da', 'optim', - 'sinkhorn_unbalanced', "barycenter_unbalanced"] +__version__ = "1.0.0" + +__all__ = ["emd", "emd2", 'emd_1d','emd2_1d', 'wasserstein_1d', + "sinkhorn", "sinkhorn2", 'barycenter', + 'sinkhorn_lpl1_mm', + 'sinkhorn_unbalanced', "barycenter_unbalanced", + 'dist', 'unif', 'tic', 'toc', 'toq', + "utils", 'datasets', 'bregman', 'lp', 'gromov', 'da', 'optim'] -- cgit v1.2.3 From 17ba10e33a3eeb3a5a03af4dfb2cddc900bc1f2e Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 5 Jul 2019 10:27:40 +0200 Subject: clean manifest and add wheels build in Makefile --- MANIFEST.in | 2 +- Makefile | 20 +++++++++++++------- README.md | 2 -- setup.py | 4 ++-- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index e0acb7a..df4e139 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,5 @@ -graft ot/lp/ include README.md +include RELEASES.md include LICENSE include ot/lp/core.h include ot/lp/EMD.h diff --git a/Makefile b/Makefile index bd3c1b4..729fd8c 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ PYTHON=python3 branch := $(shell git symbolic-ref --short -q HEAD) -CIBW_BEFORE_BUILD="pip install numpy cython" + help : @@ -15,6 +15,7 @@ help : @echo " sremove - remove the package (system with sudo)" @echo " clean - remove any temporary files" @echo " notebook - launch ipython notebook" + build : $(PYTHON) setup.py build @@ -49,14 +50,15 @@ test : FORCE pep8 pytest : FORCE $(PYTHON) -m pytest -v test/ --doctest-modules --ignore ot/gpu/ --cov=ot -uploadpypi : - #python setup.py register - $(PYTHON) setup.py sdist upload -r pypi +release : + twine upload dist/* + +release_test : + twine upload --repository-url https://test.pypi.org/legacy/ dist/* rdoc : pandoc --from=markdown --to=rst --output=docs/source/readme.rst README.md - notebook : ipython notebook --matplotlib=inline --notebook-dir=notebooks/ @@ -76,7 +78,11 @@ autopep8 : aautopep8 : autopep8 -air test ot examples --jobs -1 -wheels: - cibuildwheel --platform linux --output-dir dist +wheels : + CIBW_BEFORE_BUILD="pip install numpy cython" cibuildwheel --platform linux --output-dir dist + +dist : wheels + $(PYTHON) setup.py sdist + FORCE : diff --git a/README.md b/README.md index 8cf798f..69a826a 100644 --- a/README.md +++ b/README.md @@ -166,8 +166,6 @@ This toolbox has been created and is maintained by The contributors to this library are -* [Rémi Flamary](http://remi.flamary.com/) -* [Nicolas Courty](http://people.irisa.fr/Nicolas.Courty/) * [Alexandre Gramfort](http://alexandre.gramfort.net/) * [Laetitia Chapel](http://people.irisa.fr/Laetitia.Chapel/) * [Michael Perrot](http://perso.univ-st-etienne.fr/pem82055/) (Mapping estimation) diff --git a/setup.py b/setup.py index bbcaf04..89b43d9 100755 --- a/setup.py +++ b/setup.py @@ -53,8 +53,8 @@ setup(name='POT', license = 'MIT', scripts=[], data_files=[], - requires=["numpy","scipy","cython","matplotlib"], - install_requires=["numpy","scipy","cython","matplotlib"], + requires=["numpy","scipy","cython"], + install_requires=["numpy","scipy","cython"], classifiers=[ 'Development Status :: 4 - Beta', 'Intended Audience :: Developers', -- cgit v1.2.3 From 384237683ae51e6842f484b546a090ca66d8ec4e Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 5 Jul 2019 11:20:16 +0200 Subject: update classifier + release text --- RELEASES.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ setup.py | 13 +++++++++++-- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index a617441..bb0b778 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,6 +1,61 @@ # POT Releases +## 1.0.0 Out of beta +*July 2019* + +This is the first official stable release of POT this means a jump to 1.0.0! +The library has been used in +the wild for a while now and we have reached a state where a lot of fundamental +OT solvers are available and tested. It has been quite stable in the last months +but kept the beta flag in its Pypi classifiers until now. + +The features are never complete in a toolbox designed for solving mathematical +problems but with the new contributions we now implement algorithms and solvers +from 24 scientific papers (listed in the README.md file). New features include a +direct implementation of the [empirical Sinkhorn divergence](https://pot.readthedocs.io/en/latest/all.html#ot.bregman.empirical_sinkhorn_divergence) +, a new efficient (Cython implementation) solver for [EMD in 1D](https://pot.readthedocs.io/en/latest/all.html#ot.lp.emd_1d) +and corresponding [Wasserstein +1D](https://pot.readthedocs.io/en/latest/all.html#ot.lp.wasserstein_1d). We now also +have implementations for [Unbalanced OT](https://github.com/rflamary/POT/blob/master/notebooks/plot_UOT_1D.ipynb) +and a solver for [Unbalanced OT barycenters](https://github.com/rflamary/POT/blob/master/notebooks/plot_UOT_barycenter_1D.ipynb). +A new variant of Gromov-Wasserstein divergence called [Fused +Gromov-Wasserstein](https://pot.readthedocs.io/en/latest/all.html?highlight=fused_#ot.gromov.fused_gromov_wasserstein) +with exemples of use on [tructured data](https://github.com/rflamary/POT/blob/master/notebooks/plot_fgw.ipynb) +and computing [barycenters of labeld graphs](https://github.com/rflamary/POT/blob/master/notebooks/plot_barycenter_fgw.ipynb). + + +Finally a lot of work has been done on the documentation with several new +examples corresponding to the new features and a lot of corrections for the +docstrings. But the most visible change is a new +[quick start guide](https://pot.readthedocs.io/en/latest/quickstart.html) for +POT that gives several pointers about which function or classes allow to solve a +specific OT problem. When possible a link is provided to relevant examples. + +TODO contributors + +#### Features + +* Add compiled manylinux 64bits wheels to pip releases (PR #91) +* Add quick start guide (PR #88) +* Make doctest work on travis (PR #90) +* Update documentation (PR #79, PR #84) +* Solver for EMD in 1D (PR #89) +* Solvers for regularized unbalanced OT (PR #87) +* Solver for Fused Gromov-Wasserstein (PR #86) +* Add empirical Sinkhorn and empirical Sinkhorn divergences (PR #80) + + +#### Closed issues + +- Issue #59 fail when using "pip install POT" (new details in doc+ hopefully + wheels) +- Issue #85 Cannot run gpu modules +- Issue #75 Greenkhorn do not return log (solved in PR #76) +- Issue #82 Gromov-Wasserstein fails when the cost matrices are slightly different +- Issue #72 Macosx build problem + + ## 0.5.0 Year 2 *Sep 2018* diff --git a/setup.py b/setup.py index 89b43d9..ee32510 100755 --- a/setup.py +++ b/setup.py @@ -56,15 +56,24 @@ setup(name='POT', requires=["numpy","scipy","cython"], install_requires=["numpy","scipy","cython"], classifiers=[ - 'Development Status :: 4 - Beta', + 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', + 'Intended Audience :: Education', + 'Intended Audience :: Science/Research', + 'License :: OSI Approved :: MIT License', 'Environment :: Console', 'Operating System :: OS Independent', 'Operating System :: MacOS', 'Operating System :: POSIX', 'Programming Language :: Python', + 'Programming Language :: C++', + 'Programming Language :: C', + 'Programming Language :: Cython', 'Topic :: Utilities', - 'Programming Language :: Python :: 2', + 'Topic :: Scientific/Engineering :: Artificial Intelligence', + 'Topic :: Scientific/Engineering :: Mathematics', + 'Topic :: Scientific/Engineering :: Information Analysis', + 'Programming Language :: Python :: 2',' 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.4', -- cgit v1.2.3 From c749279ae3c712e70d4e59647f535448168dbb26 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 5 Jul 2019 11:26:05 +0200 Subject: corresp bug setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ee32510..c08e3e0 100755 --- a/setup.py +++ b/setup.py @@ -73,7 +73,7 @@ setup(name='POT', 'Topic :: Scientific/Engineering :: Artificial Intelligence', 'Topic :: Scientific/Engineering :: Mathematics', 'Topic :: Scientific/Engineering :: Information Analysis', - 'Programming Language :: Python :: 2',' + 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.4', -- cgit v1.2.3 From a6545c4a306c8cbbb5556983533d809808f480a3 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 5 Jul 2019 11:43:13 +0200 Subject: update release text --- RELEASES.md | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index bb0b778..e5a20c8 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -4,14 +4,19 @@ ## 1.0.0 Out of beta *July 2019* -This is the first official stable release of POT this means a jump to 1.0.0! +This is the first official stable release of POT and this means a jump to 1.0.0! The library has been used in the wild for a while now and we have reached a state where a lot of fundamental OT solvers are available and tested. It has been quite stable in the last months -but kept the beta flag in its Pypi classifiers until now. +but kept the beta flag in its Pypi classifiers until now. + +Note that this major +release will be the last one supporting officially Python 2.7 (See +https://python3statement.org/ for more reasons). For next release we will keep +the travis tests for Python 2 but will make them non necessary for merge in 2020. The features are never complete in a toolbox designed for solving mathematical -problems but with the new contributions we now implement algorithms and solvers +problems and research but with the new contributions we now implement algorithms and solvers from 24 scientific papers (listed in the README.md file). New features include a direct implementation of the [empirical Sinkhorn divergence](https://pot.readthedocs.io/en/latest/all.html#ot.bregman.empirical_sinkhorn_divergence) , a new efficient (Cython implementation) solver for [EMD in 1D](https://pot.readthedocs.io/en/latest/all.html#ot.lp.emd_1d) @@ -21,18 +26,27 @@ have implementations for [Unbalanced OT](https://github.com/rflamary/POT/blob/ma and a solver for [Unbalanced OT barycenters](https://github.com/rflamary/POT/blob/master/notebooks/plot_UOT_barycenter_1D.ipynb). A new variant of Gromov-Wasserstein divergence called [Fused Gromov-Wasserstein](https://pot.readthedocs.io/en/latest/all.html?highlight=fused_#ot.gromov.fused_gromov_wasserstein) -with exemples of use on [tructured data](https://github.com/rflamary/POT/blob/master/notebooks/plot_fgw.ipynb) + has been also contributed with exemples of use on [tructured data](https://github.com/rflamary/POT/blob/master/notebooks/plot_fgw.ipynb) and computing [barycenters of labeld graphs](https://github.com/rflamary/POT/blob/master/notebooks/plot_barycenter_fgw.ipynb). -Finally a lot of work has been done on the documentation with several new +A lot of work has been done on the documentation with several new examples corresponding to the new features and a lot of corrections for the docstrings. But the most visible change is a new [quick start guide](https://pot.readthedocs.io/en/latest/quickstart.html) for POT that gives several pointers about which function or classes allow to solve a specific OT problem. When possible a link is provided to relevant examples. -TODO contributors +We will also provide with this release some pre-compiled Python wheels for Linux +64bit on +github and pip. This will simplify the install process that before requires a C +compiler and numpy/cython already installed. + +Finally we would like to acknowledge and thank the numerous contributors of POT +that has helped in the past build the foundation and are still contributing to +bring new features and solvers to the library. + + #### Features -- cgit v1.2.3 From 3a09a0ace10c184dc27a2fcc1f982208e4d9eb67 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 5 Jul 2019 11:44:02 +0200 Subject: add python 3.7 on travis --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5e5694b..932f610 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,10 @@ matrix: python: 3.5 - os: linux sudo: required - python: 3.6 + python: 3.6 + - os: linux + sudo: required + python: 3.7 - os: linux sudo: required python: 2.7 -- cgit v1.2.3 From bfc84efcd94c03bebb80330aa1f2a92a4efb0ff9 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 5 Jul 2019 13:01:12 +0200 Subject: add xenial in travis pfor python 3.7 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 932f610..68b8ef1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ +dist: xenial # required for Python >= 3.7 language: python matrix: # allow_failures: -- cgit v1.2.3 From 0bc936f62430c98ecbb0f39c9508f29c6054a327 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 5 Jul 2019 13:06:07 +0200 Subject: travis xenial new --- .travis.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 68b8ef1..67f0c43 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,12 +21,13 @@ matrix: - os: linux sudo: required python: 2.7 + - name: "Python 3.7.3 on Windows" + os: windows # Windows 10.0.17134 N/A Build 17134 + language: shell # 'language: python' is an error on Travis CI Windows + before_install: choco install python + env: PATH=/c/Python37:/c/Python37/Scripts:$PATH before_install: - ./.travis/before_install.sh -before_script: # configure a headless display to test plot generation - - "export DISPLAY=:99.0" - - "sh -e /etc/init.d/xvfb start" - - sleep 3 # give xvfb some time to start # command to install dependencies install: - pip install -r requirements.txt -- cgit v1.2.3 From 7ac1b462d23ae0a396742bba4773e146e60e7502 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 5 Jul 2019 13:47:43 +0200 Subject: cleanup parmap on windows --- .travis.yml | 51 ++++++++++++++++++++++++++------------------------- ot/lp/__init__.py | 14 ++++++++++++-- ot/utils.py | 31 ++++++++++++++++++------------- requirements.txt | 1 + 4 files changed, 57 insertions(+), 40 deletions(-) diff --git a/.travis.yml b/.travis.yml index 67f0c43..cddf0e0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,31 +1,32 @@ dist: xenial # required for Python >= 3.7 language: python matrix: -# allow_failures: -# - os: osx - include: -# - os: osx -# language: generic - - os: linux - sudo: required - python: 3.4 - - os: linux - sudo: required - python: 3.5 - - os: linux - sudo: required - python: 3.6 - - os: linux - sudo: required - python: 3.7 - - os: linux - sudo: required - python: 2.7 - - name: "Python 3.7.3 on Windows" - os: windows # Windows 10.0.17134 N/A Build 17134 - language: shell # 'language: python' is an error on Travis CI Windows - before_install: choco install python - env: PATH=/c/Python37:/c/Python37/Scripts:$PATH + allow_failures: + - os: osx + - os: windows + include: + - os: osx + language: generic + - os: linux + sudo: required + python: 3.4 + - os: linux + sudo: required + python: 3.5 + - os: linux + sudo: required + python: 3.6 + - os: linux + sudo: required + python: 3.7 + - os: linux + sudo: required + python: 2.7 + - name: "Python 3.7.3 on Windows" + os: windows # Windows 10.0.17134 N/A Build 17134 + language: shell # 'language: python' is an error on Travis CI Windows + before_install: choco install python + env: PATH=/c/Python37:/c/Python37/Scripts:$PATH before_install: - ./.travis/before_install.sh # command to install dependencies diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index 17f1731..0c92810 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -11,7 +11,7 @@ Solvers for the original linear program OT problem # License: MIT License import multiprocessing - +import sys import numpy as np from scipy.sparse import coo_matrix @@ -151,6 +151,8 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), Target histogram (uniform weight if empty list) M : (ns,nt) numpy.ndarray, float64 Loss matrix (c-order array with type float64) + processes : int, optional (default=nb cpu) + Nb of processes used for multiple emd computation (not used on windows) numItermax : int, optional (default=100000) The maximum number of iterations before stopping the optimization algorithm if it has not converged. @@ -200,6 +202,10 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), b = np.asarray(b, dtype=np.float64) M = np.asarray(M, dtype=np.float64) + # problem with pikling Forks + if sys.platform.endswith('win32'): + processes=1 + # if empty array given then use uniform distributions if len(a) == 0: a = np.ones((M.shape[0],), dtype=np.float64) / M.shape[0] @@ -228,7 +234,11 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), return f(b) nb = b.shape[1] - res = parmap(f, [b[:, i] for i in range(nb)], processes) + if processes>1: + res = parmap(f, [b[:, i] for i in range(nb)], processes) + else: + res = list(map(f, [b[:, i].copy() for i in range(nb)])) + return res diff --git a/ot/utils.py b/ot/utils.py index e8249ef..5707d9b 100644 --- a/ot/utils.py +++ b/ot/utils.py @@ -214,23 +214,28 @@ def fun(f, q_in, q_out): def parmap(f, X, nprocs=multiprocessing.cpu_count()): - """ paralell map for multiprocessing """ - q_in = multiprocessing.Queue(1) - q_out = multiprocessing.Queue() + """ paralell map for multiprocessing (only map on windows)""" - proc = [multiprocessing.Process(target=fun, args=(f, q_in, q_out)) - for _ in range(nprocs)] - for p in proc: - p.daemon = True - p.start() + if not sys.platform.endswith('win32'): - sent = [q_in.put((i, x)) for i, x in enumerate(X)] - [q_in.put((None, None)) for _ in range(nprocs)] - res = [q_out.get() for _ in range(len(sent))] + q_in = multiprocessing.Queue(1) + q_out = multiprocessing.Queue() - [p.join() for p in proc] + proc = [multiprocessing.Process(target=fun, args=(f, q_in, q_out)) + for _ in range(nprocs)] + for p in proc: + p.daemon = True + p.start() - return [x for i, x in sorted(res)] + sent = [q_in.put((i, x)) for i, x in enumerate(X)] + [q_in.put((None, None)) for _ in range(nprocs)] + res = [q_out.get() for _ in range(len(sent))] + + [p.join() for p in proc] + + return [x for i, x in sorted(res)] + else: + return list(map(f, X)) def check_params(**kwargs): diff --git a/requirements.txt b/requirements.txt index 97d165b..5a3432b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,5 @@ matplotlib sphinx-gallery autograd pymanopt +cvxopt pytest -- cgit v1.2.3 From 41706d1c35bfe5f55f36041f511e2a42e36f6ab7 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 5 Jul 2019 14:03:15 +0200 Subject: remove test for python 3.4 --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index cddf0e0..57b961b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,10 +6,8 @@ matrix: - os: windows include: - os: osx - language: generic - - os: linux sudo: required - python: 3.4 + language: generic - os: linux sudo: required python: 3.5 -- cgit v1.2.3 From 2873ba559bb6d3ccceeee326848d7216a139ed88 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 5 Jul 2019 14:14:52 +0200 Subject: remove windows and macosx tests, will add to master after release --- .travis.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 57b961b..0dfb0d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,10 @@ dist: xenial # required for Python >= 3.7 language: python matrix: - allow_failures: - - os: osx - - os: windows + # allow_failures: + # - os: osx + # - os: windows include: - - os: osx - sudo: required - language: generic - os: linux sudo: required python: 3.5 @@ -20,11 +17,14 @@ matrix: - os: linux sudo: required python: 2.7 - - name: "Python 3.7.3 on Windows" - os: windows # Windows 10.0.17134 N/A Build 17134 - language: shell # 'language: python' is an error on Travis CI Windows - before_install: choco install python - env: PATH=/c/Python37:/c/Python37/Scripts:$PATH + # - os: osx + # sudo: required + # language: generic + # - name: "Python 3.7.3 on Windows" + # os: windows # Windows 10.0.17134 N/A Build 17134 + # language: shell # 'language: python' is an error on Travis CI Windows + # before_install: choco install python + # env: PATH=/c/Python37:/c/Python37/Scripts:$PATH before_install: - ./.travis/before_install.sh # command to install dependencies -- cgit v1.2.3 From cc37dd9729460fdd0766ffc71be78683d6a1e408 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 8 Jul 2019 10:02:10 +0200 Subject: small change in redame --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 69a826a..bba27ff 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ year={2017} ## Installation -The library has been tested on Linux, MacOSX and Windows. It requires a C++ compiler for using the EMD solver and relies on the following Python modules: +The library has been tested on Linux, MacOSX and Windows. It requires a C++ compiler for building/installing the EMD solver and relies on the following Python modules: - Numpy (>=1.11) - Scipy (>=1.0) -- cgit v1.2.3 From 371a8354a69fd5f0dfc035f4f3554fe11ef42bb2 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 8 Jul 2019 10:06:17 +0200 Subject: tupos in RELEASES.md --- RELEASES.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index e5a20c8..112e4ab 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -26,7 +26,7 @@ have implementations for [Unbalanced OT](https://github.com/rflamary/POT/blob/ma and a solver for [Unbalanced OT barycenters](https://github.com/rflamary/POT/blob/master/notebooks/plot_UOT_barycenter_1D.ipynb). A new variant of Gromov-Wasserstein divergence called [Fused Gromov-Wasserstein](https://pot.readthedocs.io/en/latest/all.html?highlight=fused_#ot.gromov.fused_gromov_wasserstein) - has been also contributed with exemples of use on [tructured data](https://github.com/rflamary/POT/blob/master/notebooks/plot_fgw.ipynb) + has been also contributed with exemples of use on [structured data](https://github.com/rflamary/POT/blob/master/notebooks/plot_fgw.ipynb) and computing [barycenters of labeld graphs](https://github.com/rflamary/POT/blob/master/notebooks/plot_barycenter_fgw.ipynb). @@ -34,12 +34,12 @@ A lot of work has been done on the documentation with several new examples corresponding to the new features and a lot of corrections for the docstrings. But the most visible change is a new [quick start guide](https://pot.readthedocs.io/en/latest/quickstart.html) for -POT that gives several pointers about which function or classes allow to solve a +POT that gives several pointers about which function or classes allow to solve which specific OT problem. When possible a link is provided to relevant examples. We will also provide with this release some pre-compiled Python wheels for Linux 64bit on -github and pip. This will simplify the install process that before requires a C +github and pip. This will simplify the install process that before required a C compiler and numpy/cython already installed. Finally we would like to acknowledge and thank the numerous contributors of POT -- cgit v1.2.3 From 1b00740a39f90f1e0bc7dc3a35723560c9ab4e97 Mon Sep 17 00:00:00 2001 From: Alexandre Gramfort Date: Tue, 9 Jul 2019 16:48:36 +0200 Subject: first pass with adding pydocstyle in makefile --- Makefile | 3 + ot/dr.py | 57 ++++------ ot/gromov.py | 360 +++++++++++++++++++++++++++++------------------------------ setup.cfg | 18 +++ 4 files changed, 221 insertions(+), 217 deletions(-) diff --git a/Makefile b/Makefile index 4cdb7d1..89c30c3 100644 --- a/Makefile +++ b/Makefile @@ -74,4 +74,7 @@ autopep8 : aautopep8 : autopep8 -air test ot examples --jobs -1 +pydocstyle : + pydocstyle ot + FORCE : diff --git a/ot/dr.py b/ot/dr.py index d2bf6e2..680dabf 100644 --- a/ot/dr.py +++ b/ot/dr.py @@ -49,30 +49,25 @@ def split_classes(X, y): def fda(X, y, p=2, reg=1e-16): - """ - Fisher Discriminant Analysis - + """Fisher Discriminant Analysis Parameters ---------- - X : numpy.ndarray (n,d) - Training samples - y : np.ndarray (n,) - labels for training samples + X : ndarray, shape (n, d) + Training samples. + y : ndarray, shape (n,) + Labels for training samples. p : int, optional - size of dimensionnality reduction + Size of dimensionnality reduction. reg : float, optional Regularization term >0 (ridge regularization) - Returns ------- - P : (d x p) ndarray + P : ndarray, shape (d, p) Optimal transportation matrix for the given parameters - proj : fun + proj : callable projection function including mean centering - - """ mx = np.mean(X) @@ -130,37 +125,33 @@ def wda(X, y, p=2, reg=1, k=10, solver=None, maxiter=100, verbose=0, P0=None): Parameters ---------- - X : numpy.ndarray (n,d) - Training samples - y : np.ndarray (n,) - labels for training samples + X : ndarray, shape (n, d) + Training samples. + y : ndarray, shape (n,) + Labels for training samples. p : int, optional - size of dimensionnality reduction + Size of dimensionnality reduction. reg : float, optional Regularization term >0 (entropic regularization) - solver : str, optional - None for steepest decsent or 'TrustRegions' for trust regions algorithm - else shoudl be a pymanopt.solvers - P0 : numpy.ndarray (d,p) - Initial starting point for projection + solver : None | str, optional + None for steepest descent or 'TrustRegions' for trust regions algorithm + else should be a pymanopt.solvers + P0 : ndarray, shape (d, p) + Initial starting point for projection. verbose : int, optional - Print information along iterations - - + Print information along iterations. Returns ------- - P : (d x p) ndarray + P : ndarray, shape (d, p) Optimal transportation matrix for the given parameters - proj : fun - projection function including mean centering - + proj : callable + Projection function including mean centering. References ---------- - - .. [11] Flamary, R., Cuturi, M., Courty, N., & Rakotomamonjy, A. (2016). Wasserstein Discriminant Analysis. arXiv preprint arXiv:1608.08063. - + .. [11] Flamary, R., Cuturi, M., Courty, N., & Rakotomamonjy, A. (2016). + Wasserstein Discriminant Analysis. arXiv preprint arXiv:1608.08063. """ # noqa mx = np.mean(X) diff --git a/ot/gromov.py b/ot/gromov.py index 3a7e24c..699ae4c 100644 --- a/ot/gromov.py +++ b/ot/gromov.py @@ -1,9 +1,6 @@ - # -*- coding: utf-8 -*- """ Gromov-Wasserstein transport method - - """ # Author: Erwan Vautier @@ -22,7 +19,7 @@ from .optim import cg def init_matrix(C1, C2, p, q, loss_fun='square_loss'): - """ Return loss matrices and tensors for Gromov-Wasserstein fast computation + """Return loss matrices and tensors for Gromov-Wasserstein fast computation Returns the value of \mathcal{L}(C1,C2) \otimes T with the selected loss function as the loss function of Gromow-Wasserstein discrepancy. @@ -51,23 +48,21 @@ def init_matrix(C1, C2, p, q, loss_fun='square_loss'): Parameters ---------- C1 : ndarray, shape (ns, ns) - Metric cost matrix in the source space + Metric cost matrix in the source space C2 : ndarray, shape (nt, nt) - Metric costfr matrix in the target space + Metric costfr matrix in the target space T : ndarray, shape (ns, nt) - Coupling between source and target spaces + Coupling between source and target spaces p : ndarray, shape (ns,) - Returns ------- - constC : ndarray, shape (ns, nt) - Constant C matrix in Eq. (6) + Constant C matrix in Eq. (6) hC1 : ndarray, shape (ns, ns) - h1(C1) matrix in Eq. (6) + h1(C1) matrix in Eq. (6) hC2 : ndarray, shape (nt, nt) - h2(C) matrix in Eq. (6) + h2(C) matrix in Eq. (6) References ---------- @@ -114,25 +109,23 @@ def init_matrix(C1, C2, p, q, loss_fun='square_loss'): def tensor_product(constC, hC1, hC2, T): - """ Return the tensor for Gromov-Wasserstein fast computation + """Return the tensor for Gromov-Wasserstein fast computation The tensor is computed as described in Proposition 1 Eq. (6) in [12]. Parameters ---------- constC : ndarray, shape (ns, nt) - Constant C matrix in Eq. (6) + Constant C matrix in Eq. (6) hC1 : ndarray, shape (ns, ns) - h1(C1) matrix in Eq. (6) + h1(C1) matrix in Eq. (6) hC2 : ndarray, shape (nt, nt) - h2(C) matrix in Eq. (6) - + h2(C) matrix in Eq. (6) Returns ------- - tens : ndarray, shape (ns, nt) - \mathcal{L}(C1,C2) \otimes T tensor-matrix multiplication result + \mathcal{L}(C1,C2) \otimes T tensor-matrix multiplication result References ---------- @@ -148,26 +141,25 @@ def tensor_product(constC, hC1, hC2, T): def gwloss(constC, hC1, hC2, T): - """ Return the Loss for Gromov-Wasserstein + """Return the Loss for Gromov-Wasserstein The loss is computed as described in Proposition 1 Eq. (6) in [12]. Parameters ---------- constC : ndarray, shape (ns, nt) - Constant C matrix in Eq. (6) + Constant C matrix in Eq. (6) hC1 : ndarray, shape (ns, ns) - h1(C1) matrix in Eq. (6) + h1(C1) matrix in Eq. (6) hC2 : ndarray, shape (nt, nt) - h2(C) matrix in Eq. (6) + h2(C) matrix in Eq. (6) T : ndarray, shape (ns, nt) - Current value of transport matrix T + Current value of transport matrix T Returns ------- - loss : float - Gromov Wasserstein loss + Gromov Wasserstein loss References ---------- @@ -183,24 +175,23 @@ def gwloss(constC, hC1, hC2, T): def gwggrad(constC, hC1, hC2, T): - """ Return the gradient for Gromov-Wasserstein + """Return the gradient for Gromov-Wasserstein The gradient is computed as described in Proposition 2 in [12]. Parameters ---------- constC : ndarray, shape (ns, nt) - Constant C matrix in Eq. (6) + Constant C matrix in Eq. (6) hC1 : ndarray, shape (ns, ns) - h1(C1) matrix in Eq. (6) + h1(C1) matrix in Eq. (6) hC2 : ndarray, shape (nt, nt) - h2(C) matrix in Eq. (6) + h2(C) matrix in Eq. (6) T : ndarray, shape (ns, nt) - Current value of transport matrix T + Current value of transport matrix T Returns ------- - grad : ndarray, shape (ns, nt) Gromov Wasserstein gradient @@ -222,19 +213,19 @@ def update_square_loss(p, lambdas, T, Cs): Parameters ---------- - p : ndarray, shape (N,) - masses in the targeted barycenter + p : ndarray, shape (N,) + Masses in the targeted barycenter. lambdas : list of float - list of the S spaces' weights - T : list of S np.ndarray(ns,N) - the S Ts couplings calculated at each iteration + List of the S spaces' weights. + T : list of S np.ndarray of shape (ns,N) + The S Ts couplings calculated at each iteration. Cs : list of S ndarray, shape(ns,ns) - Metric cost matrices + Metric cost matrices. Returns ---------- - C : ndarray, shape (nt,nt) - updated C matrix + C : ndarray, shape (nt, nt) + Updated C matrix. """ tmpsum = sum([lambdas[s] * np.dot(T[s].T, Cs[s]).dot(T[s]) for s in range(len(T))]) @@ -251,12 +242,12 @@ def update_kl_loss(p, lambdas, T, Cs): Parameters ---------- p : ndarray, shape (N,) - weights in the targeted barycenter + Weights in the targeted barycenter. lambdas : list of the S spaces' weights - T : list of S np.ndarray(ns,N) - the S Ts couplings calculated at each iteration + T : list of S np.ndarray of shape (ns,N) + The S Ts couplings calculated at each iteration. Cs : list of S ndarray, shape(ns,ns) - Metric cost matrices + Metric cost matrices. Returns ---------- @@ -290,14 +281,14 @@ def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, armijo=False, **kwargs Parameters ---------- C1 : ndarray, shape (ns, ns) - Metric cost matrix in the source space + Metric cost matrix in the source space C2 : ndarray, shape (nt, nt) - Metric costfr matrix in the target space - p : ndarray, shape (ns,) - distribution in the source space - q : ndarray, shape (nt,) - distribution in the target space - loss_fun : string + Metric costfr matrix in the target space + p : ndarray, shape (ns,) + Distribution in the source space + q : ndarray, shape (nt,) + Distribution in the target space + loss_fun : str loss function used for the solver either 'square_loss' or 'kl_loss' max_iter : int, optional @@ -317,10 +308,10 @@ def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, armijo=False, **kwargs Returns ------- T : ndarray, shape (ns, nt) - coupling between the two spaces that minimizes : + Doupling between the two spaces that minimizes: \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} log : dict - convergence information and loss + Convergence information and loss. References ---------- @@ -374,18 +365,18 @@ def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, Parameters ---------- - M : ndarray, shape (ns, nt) - Metric cost matrix between features across domains + M : ndarray, shape (ns, nt) + Metric cost matrix between features across domains C1 : ndarray, shape (ns, ns) - Metric cost matrix representative of the structure in the source space + Metric cost matrix representative of the structure in the source space C2 : ndarray, shape (nt, nt) - Metric cost matrix representative of the structure in the target space - p : ndarray, shape (ns,) - distribution in the source space - q : ndarray, shape (nt,) - distribution in the target space - loss_fun : string,optional - loss function used for the solver + Metric cost matrix representative of the structure in the target space + p : ndarray, shape (ns,) + Distribution in the source space + q : ndarray, shape (nt,) + Distribution in the target space + loss_fun : str, optional + Loss function used for the solver max_iter : int, optional Max number of iterations tol : float, optional @@ -402,11 +393,10 @@ def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, Returns ------- - gamma : (ns x nt) ndarray - Optimal transportation matrix for the given parameters + gamma : ndarray, shape (ns, nt) + Optimal transportation matrix for the given parameters. log : dict - log dictionary return only if log==True in parameters - + Log dictionary return only if log==True in parameters. References ---------- @@ -414,7 +404,6 @@ def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, and Courty Nicolas "Optimal Transport for structured data with application on graphs", International Conference on Machine Learning (ICML). 2019. - """ constC, hC1, hC2 = init_matrix(C1, C2, p, q, loss_fun) @@ -457,18 +446,18 @@ def fused_gromov_wasserstein2(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5 Parameters ---------- - M : ndarray, shape (ns, nt) - Metric cost matrix between features across domains + M : ndarray, shape (ns, nt) + Metric cost matrix between features across domains C1 : ndarray, shape (ns, ns) - Metric cost matrix respresentative of the structure in the source space + Metric cost matrix respresentative of the structure in the source space. C2 : ndarray, shape (nt, nt) - Metric cost matrix espresentative of the structure in the target space + Metric cost matrix espresentative of the structure in the target space. p : ndarray, shape (ns,) - distribution in the source space + Distribution in the source space. q : ndarray, shape (nt,) - distribution in the target space - loss_fun : string,optional - loss function used for the solver + Distribution in the target space. + loss_fun : str, optional + Loss function used for the solver. max_iter : int, optional Max number of iterations tol : float, optional @@ -476,19 +465,19 @@ def fused_gromov_wasserstein2(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5 verbose : bool, optional Print information along iterations log : bool, optional - record log if True + Record log if True. armijo : bool, optional - If True the steps of the line-search is found via an armijo research. Else closed form is used. - If there is convergence issues use False. + If True the steps of the line-search is found via an armijo research. + Else closed form is used. If there is convergence issues use False. **kwargs : dict - parameters can be directly pased to the ot.optim.cg solver + Parameters can be directly pased to the ot.optim.cg solver. Returns ------- - gamma : (ns x nt) ndarray - Optimal transportation matrix for the given parameters + gamma : ndarray, shape (ns, nt) + Optimal transportation matrix for the given parameters. log : dict - log dictionary return only if log==True in parameters + Log dictionary return only if log==True in parameters. References ---------- @@ -537,16 +526,15 @@ def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False, armijo=False, **kwarg Parameters ---------- C1 : ndarray, shape (ns, ns) - Metric cost matrix in the source space + Metric cost matrix in the source space C2 : ndarray, shape (nt, nt) - Metric cost matrix in the target space - p : ndarray, shape (ns,) - distribution in the source space + Metric cost matrix in the target space + p : ndarray, shape (ns,) + Distribution in the source space. q : ndarray, shape (nt,) - distribution in the target space - loss_fun : string + Distribution in the target space. + loss_fun : str loss function used for the solver either 'square_loss' or 'kl_loss' - max_iter : int, optional Max number of iterations tol : float, optional @@ -558,6 +546,7 @@ def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False, armijo=False, **kwarg armijo : bool, optional If True the steps of the line-search is found via an armijo research. Else closed form is used. If there is convergence issues use False. + Returns ------- gw_dist : float @@ -624,25 +613,25 @@ def entropic_gromov_wasserstein(C1, C2, p, q, loss_fun, epsilon, Parameters ---------- C1 : ndarray, shape (ns, ns) - Metric cost matrix in the source space + Metric cost matrix in the source space C2 : ndarray, shape (nt, nt) - Metric costfr matrix in the target space + Metric costfr matrix in the target space p : ndarray, shape (ns,) - distribution in the source space + Distribution in the source space q : ndarray, shape (nt,) - distribution in the target space + Distribution in the target space loss_fun : string - loss function used for the solver either 'square_loss' or 'kl_loss' + Loss function used for the solver either 'square_loss' or 'kl_loss' epsilon : float Regularization term >0 max_iter : int, optional - Max number of iterations + Max number of iterations tol : float, optional Stop threshold on error (>0) verbose : bool, optional Print information along iterations log : bool, optional - record log if True + Record log if True. Returns ------- @@ -725,15 +714,15 @@ def entropic_gromov_wasserstein2(C1, C2, p, q, loss_fun, epsilon, Parameters ---------- C1 : ndarray, shape (ns, ns) - Metric cost matrix in the source space + Metric cost matrix in the source space C2 : ndarray, shape (nt, nt) - Metric costfr matrix in the target space + Metric costfr matrix in the target space p : ndarray, shape (ns,) - distribution in the source space + Distribution in the source space q : ndarray, shape (nt,) - distribution in the target space - loss_fun : string - loss function used for the solver either 'square_loss' or 'kl_loss' + Distribution in the target space + loss_fun : str + Loss function used for the solver either 'square_loss' or 'kl_loss' epsilon : float Regularization term >0 max_iter : int, optional @@ -743,7 +732,7 @@ def entropic_gromov_wasserstein2(C1, C2, p, q, loss_fun, epsilon, verbose : bool, optional Print information along iterations log : bool, optional - record log if True + Record log if True. Returns ------- @@ -757,7 +746,6 @@ def entropic_gromov_wasserstein2(C1, C2, p, q, loss_fun, epsilon, International Conference on Machine Learning (ICML). 2016. """ - gw, logv = entropic_gromov_wasserstein( C1, C2, p, q, loss_fun, epsilon, max_iter, tol, verbose, log=True) @@ -789,19 +777,21 @@ def entropic_gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, epsilon, Parameters ---------- - N : Integer - Size of the targeted barycenter - Cs : list of S np.ndarray(ns,ns) - Metric cost matrices - ps : list of S np.ndarray(ns,) - sample weights in the S spaces - p : ndarray, shape(N,) - weights in the targeted barycenter + N : int + Size of the targeted barycenter + Cs : list of S np.ndarray of shape (ns,ns) + Metric cost matrices + ps : list of S np.ndarray of shape (ns,) + Sample weights in the S spaces + p : ndarray, shape(N,) + Weights in the targeted barycenter lambdas : list of float - list of the S spaces' weights - loss_fun : tensor-matrix multiplication function based on specific loss function - update : function(p,lambdas,T,Cs) that updates C according to a specific Kernel - with the S Ts couplings calculated at each iteration + List of the S spaces' weights. + loss_fun : callable + Tensor-matrix multiplication function based on specific loss function. + update : callable + function(p,lambdas,T,Cs) that updates C according to a specific Kernel + with the S Ts couplings calculated at each iteration epsilon : float Regularization term >0 max_iter : int, optional @@ -809,11 +799,11 @@ def entropic_gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, epsilon, tol : float, optional Stop threshol on error (>0) verbose : bool, optional - Print information along iterations + Print information along iterations. log : bool, optional - record log if True - init_C : bool, ndarray, shape(N,N) - random initial value for the C matrix provided by user + Record log if True. + init_C : bool | ndarray, shape (N, N) + Random initial value for the C matrix provided by user. Returns ------- @@ -825,7 +815,6 @@ def entropic_gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, epsilon, .. [12] Peyré, Gabriel, Marco Cuturi, and Justin Solomon, "Gromov-Wasserstein averaging of kernel and distance matrices." International Conference on Machine Learning (ICML). 2016. - """ S = len(Cs) @@ -835,6 +824,7 @@ def entropic_gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, epsilon, # Initialization of C : random SPD matrix (if not provided by user) if init_C is None: + # XXX use random state xalea = np.random.randn(N, 2) C = dist(xalea, xalea) C /= C.max() @@ -846,7 +836,7 @@ def entropic_gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, epsilon, error = [] - while(err > tol and cpt < max_iter): + while (err > tol) and (cpt < max_iter): Cprev = C T = [entropic_gromov_wasserstein(Cs[s], C, ps[s], p, loss_fun, epsilon, @@ -890,7 +880,6 @@ def gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, .. math:: C = argmin_C\in R^NxN \sum_s \lambda_s GW(C,Cs,p,ps) - Where : - Cs : metric cost matrix @@ -898,29 +887,29 @@ def gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, Parameters ---------- - N : Integer - Size of the targeted barycenter - Cs : list of S np.ndarray(ns,ns) - Metric cost matrices - ps : list of S np.ndarray(ns,) - sample weights in the S spaces - p : ndarray, shape(N,) - weights in the targeted barycenter + N : int + Size of the targeted barycenter + Cs : list of S np.ndarray of shape (ns, ns) + Metric cost matrices + ps : list of S np.ndarray of shape (ns,) + Sample weights in the S spaces + p : ndarray, shape (N,) + Weights in the targeted barycenter lambdas : list of float - list of the S spaces' weights + List of the S spaces' weights loss_fun : tensor-matrix multiplication function based on specific loss function update : function(p,lambdas,T,Cs) that updates C according to a specific Kernel with the S Ts couplings calculated at each iteration max_iter : int, optional Max number of iterations tol : float, optional - Stop threshol on error (>0) + Stop threshol on error (>0). verbose : bool, optional - Print information along iterations + Print information along iterations. log : bool, optional - record log if True - init_C : bool, ndarray, shape(N,N) - random initial value for the C matrix provided by user + Record log if True. + init_C : bool | ndarray, shape(N,N) + Random initial value for the C matrix provided by user. Returns ------- @@ -934,7 +923,6 @@ def gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, International Conference on Machine Learning (ICML). 2016. """ - S = len(Cs) Cs = [np.asarray(Cs[s], dtype=np.float64) for s in range(S)] @@ -942,6 +930,7 @@ def gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, # Initialization of C : random SPD matrix (if not provided by user) if init_C is None: + # XXX : should use a random state and not use the global seed xalea = np.random.randn(N, 2) C = dist(xalea, xalea) C /= C.max() @@ -987,8 +976,7 @@ def gromov_barycenters(N, Cs, ps, p, lambdas, loss_fun, def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_features=False, p=None, loss_fun='square_loss', max_iter=100, tol=1e-9, verbose=False, log=False, init_C=None, init_X=None): - """ - Compute the fgw barycenter as presented eq (5) in [24]. + """Compute the fgw barycenter as presented eq (5) in [24]. Parameters ---------- @@ -997,30 +985,32 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ Ys: list of ndarray, each element has shape (ns,d) Features of all samples Cs : list of ndarray, each element has shape (ns,ns) - Structure matrices of all samples + Structure matrices of all samples ps : list of ndarray, each element has shape (ns,) - masses of all samples + Masses of all samples. lambdas : list of float - list of the S spaces' weights + List of the S spaces' weights alpha : float - Alpha parameter for the fgw distance - fixed_structure : bool - Wether to fix the structure of the barycenter during the updates - fixed_features : bool - Wether to fix the feature of the barycenter during the updates - init_C : ndarray, shape (N,N), optional - initialization for the barycenters' structure matrix. If not set random init - init_X : ndarray, shape (N,d), optional - initialization for the barycenters' features. If not set random init + Alpha parameter for the fgw distance + fixed_structure : bool + Whether to fix the structure of the barycenter during the updates + fixed_features : bool + Whether to fix the feature of the barycenter during the updates + init_C : ndarray, shape (N,N), optional + Initialization for the barycenters' structure matrix. If not set + a random init is used. + init_X : ndarray, shape (N,d), optional + Initialization for the barycenters' features. If not set a + random init is used. Returns ------- - X : ndarray, shape (N,d) + X : ndarray, shape (N, d) Barycenters' features - C : ndarray, shape (N,N) + C : ndarray, shape (N, N) Barycenters' structure matrix - log_: dictionary - Only returned when log=True + log_: dict + Only returned when log=True. It contains the keys: T : list of (N,ns) transport matrices Ms : all distance matrices between the feature of the barycenter and the other features dist(X,Ys) shape (N,ns) @@ -1032,7 +1022,6 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ "Optimal Transport for structured data with application on graphs" International Conference on Machine Learning (ICML). 2019. """ - S = len(Cs) d = Ys[0].shape[1] # dimension on the node features if p is None: @@ -1095,7 +1084,8 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ T_temp = [t.T for t in T] C = update_sructure_matrix(p, lambdas, T_temp, Cs) - T = [fused_gromov_wasserstein((1 - alpha) * Ms[s], C, Cs[s], p, ps[s], loss_fun, alpha, numItermax=max_iter, stopThr=1e-5, verbose=verbose) for s in range(S)] + T = [fused_gromov_wasserstein((1 - alpha) * Ms[s], C, Cs[s], p, ps[s], loss_fun, alpha, + numItermax=max_iter, stopThr=1e-5, verbose=verbose) for s in range(S)] # T is N,ns err_feature = np.linalg.norm(X - Xprev.reshape(N, d)) @@ -1114,6 +1104,7 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ print('{:5d}|{:8e}|'.format(cpt, err_feature)) cpt += 1 + if log: log_['T'] = T # from target to Ys log_['p'] = p @@ -1126,25 +1117,25 @@ def fgw_barycenters(N, Ys, Cs, ps, lambdas, alpha, fixed_structure=False, fixed_ def update_sructure_matrix(p, lambdas, T, Cs): - """ - Updates C according to the L2 Loss kernel with the S Ts couplings - calculated at each iteration + """Updates C according to the L2 Loss kernel with the S Ts couplings. + + It is calculated at each iteration Parameters ---------- - p : ndarray, shape (N,) - masses in the targeted barycenter + p : ndarray, shape (N,) + Masses in the targeted barycenter. lambdas : list of float - list of the S spaces' weights - T : list of S np.ndarray(ns,N) - the S Ts couplings calculated at each iteration - Cs : list of S ndarray, shape(ns,ns) - Metric cost matrices + List of the S spaces' weights. + T : list of S ndarray of shape (ns, N) + The S Ts couplings calculated at each iteration. + Cs : list of S ndarray, shape (ns, ns) + Metric cost matrices. Returns - ---------- - C : ndarray, shape (nt,nt) - updated C matrix + ------- + C : ndarray, shape (nt, nt) + Updated C matrix. """ tmpsum = sum([lambdas[s] * np.dot(T[s].T, Cs[s]).dot(T[s]) for s in range(len(T))]) ppt = np.outer(p, p) @@ -1153,24 +1144,26 @@ def update_sructure_matrix(p, lambdas, T, Cs): def update_feature_matrix(lambdas, Ys, Ts, p): - """ - Updates the feature with respect to the S Ts couplings. See "Solving the barycenter problem with Block Coordinate Descent (BCD)" in [24] - calculated at each iteration + """Updates the feature with respect to the S Ts couplings. + + + See "Solving the barycenter problem with Block Coordinate Descent (BCD)" + in [24] calculated at each iteration Parameters ---------- - p : ndarray, shape (N,) - masses in the targeted barycenter + p : ndarray, shape (N,) + masses in the targeted barycenter lambdas : list of float - list of the S spaces' weights + List of the S spaces' weights Ts : list of S np.ndarray(ns,N) the S Ts couplings calculated at each iteration Ys : list of S ndarray, shape(d,ns) - The features + The features. Returns - ---------- - X : ndarray, shape (d,N) + ------- + X : ndarray, shape (d, N) References ---------- @@ -1179,9 +1172,8 @@ def update_feature_matrix(lambdas, Ys, Ts, p): "Optimal Transport for structured data with application on graphs" International Conference on Machine Learning (ICML). 2019. """ + p = np.array(1. / p).reshape(-1,) - p = np.diag(np.array(1 / p).reshape(-1,)) - - tmpsum = sum([lambdas[s] * np.dot(Ys[s], Ts[s].T).dot(p) for s in range(len(Ts))]) + tmpsum = sum([lambdas[s] * np.dot(Ys[s], Ts[s].T) * p[None, :] for s in range(len(Ts))]) return tmpsum diff --git a/setup.cfg b/setup.cfg index aa0ff62..6be91fe 100644 --- a/setup.cfg +++ b/setup.cfg @@ -4,3 +4,21 @@ description-file = README.md [flake8] exclude = __init__.py ignore = E265,E501,W605,W503,W504 + +[tool:pytest] +addopts = + --showlocals --durations=20 --doctest-modules -ra --cov-report= --cov=ot + --doctest-ignore-import-errors --junit-xml=junit-results.xml + --ignore=docs --ignore=examples --ignore=notebooks + +[pycodestyle] +exclude = __init__.py,*externals*,constants.py,fixes.py +ignore = E241,E305,W504 + +[pydocstyle] +convention = pep257 +match_dir = ^(?!\.|docs|examples).*$ +match = (?!tests/__init__\.py|fixes).*\.py +add-ignore = D100,D104,D107,D413 +add-select = D214,D215,D404,D405,D406,D407,D408,D409,D410,D411 +ignore-decorators = ^(copy_.*_doc_to_|on_trait_change|cached_property|deprecated|property|.*setter).* -- cgit v1.2.3 From b6fb14861accd20a323bfc5ef96c20883e4f6ce1 Mon Sep 17 00:00:00 2001 From: Alexandre Gramfort Date: Tue, 9 Jul 2019 17:08:58 +0200 Subject: more --- ot/stochastic.py | 199 +++++++++++++++++++++++++------------------------------ ot/unbalanced.py | 3 +- ot/utils.py | 47 ++++++------- 3 files changed, 111 insertions(+), 138 deletions(-) diff --git a/ot/stochastic.py b/ot/stochastic.py index 5754968..13ed9cc 100644 --- a/ot/stochastic.py +++ b/ot/stochastic.py @@ -38,22 +38,20 @@ def coordinate_grad_semi_dual(b, M, reg, beta, i): Parameters ---------- - - b : np.ndarray(nt,) - target measure - M : np.ndarray(ns, nt) - cost matrix - reg : float nu - Regularization term > 0 - v : np.ndarray(nt,) - dual variable - i : number int - picked number i + b : ndarray, shape (nt,) + Target measure. + M : ndarray, shape (ns, nt) + Cost matrix. + reg : float + Regularization term > 0. + v : ndarray, shape (nt,) + Dual variable. + i : int + Picked number i. Returns ------- - - coordinate gradient : np.ndarray(nt,) + coordinate gradient : ndarray, shape (nt,) Examples -------- @@ -78,14 +76,11 @@ def coordinate_grad_semi_dual(b, M, reg, beta, i): References ---------- - [Genevay et al., 2016] : - Stochastic Optimization for Large-scale Optimal Transport, - Advances in Neural Information Processing Systems (2016), - arXiv preprint arxiv:1605.08527. - + Stochastic Optimization for Large-scale Optimal Transport, + Advances in Neural Information Processing Systems (2016), + arXiv preprint arxiv:1605.08527. ''' - r = M[i, :] - beta exp_beta = np.exp(-r / reg) * b khi = exp_beta / (np.sum(exp_beta)) @@ -121,24 +116,23 @@ def sag_entropic_transport(a, b, M, reg, numItermax=10000, lr=None): Parameters ---------- - a : np.ndarray(ns,), - source measure - b : np.ndarray(nt,), - target measure - M : np.ndarray(ns, nt), - cost matrix - reg : float number, + a : ndarray, shape (ns,), + Source measure. + b : ndarray, shape (nt,), + Target measure. + M : ndarray, shape (ns, nt), + Cost matrix. + reg : float Regularization term > 0 - numItermax : int number - number of iteration - lr : float number - learning rate + numItermax : int + Number of iteration. + lr : float + Learning rate. Returns ------- - - v : np.ndarray(nt,) - dual variable + v : ndarray, shape (nt,) + Dual variable. Examples -------- @@ -213,23 +207,20 @@ def averaged_sgd_entropic_transport(a, b, M, reg, numItermax=300000, lr=None): Parameters ---------- - - b : np.ndarray(nt,) + b : ndarray, shape (nt,) target measure - M : np.ndarray(ns, nt) + M : ndarray, shape (ns, nt) cost matrix - reg : float number + reg : float Regularization term > 0 - numItermax : int number - number of iteration - lr : float number - learning rate - + numItermax : int + Number of iteration. + lr : float + Learning rate. Returns ------- - - ave_v : np.ndarray(nt,) + ave_v : ndarray, shape (nt,) dual variable Examples @@ -256,9 +247,9 @@ def averaged_sgd_entropic_transport(a, b, M, reg, numItermax=300000, lr=None): ---------- [Genevay et al., 2016] : - Stochastic Optimization for Large-scale Optimal Transport, - Advances in Neural Information Processing Systems (2016), - arXiv preprint arxiv:1605.08527. + Stochastic Optimization for Large-scale Optimal Transport, + Advances in Neural Information Processing Systems (2016), + arXiv preprint arxiv:1605.08527. ''' if lr is None: @@ -298,21 +289,19 @@ def c_transform_entropic(b, M, reg, beta): Parameters ---------- - - b : np.ndarray(nt,) - target measure - M : np.ndarray(ns, nt) - cost matrix + b : ndarray, shape (nt,) + Target measure + M : ndarray, shape (ns, nt) + Cost matrix reg : float - regularization term > 0 - v : np.ndarray(nt,) - dual variable + Regularization term > 0 + v : ndarray, shape (nt,) + Dual variable. Returns ------- - - u : np.ndarray(ns,) - dual variable + u : ndarray, shape (ns,) + Dual variable. Examples -------- @@ -338,9 +327,9 @@ def c_transform_entropic(b, M, reg, beta): ---------- [Genevay et al., 2016] : - Stochastic Optimization for Large-scale Optimal Transport, - Advances in Neural Information Processing Systems (2016), - arXiv preprint arxiv:1605.08527. + Stochastic Optimization for Large-scale Optimal Transport, + Advances in Neural Information Processing Systems (2016), + arXiv preprint arxiv:1605.08527. ''' n_source = np.shape(M)[0] @@ -382,31 +371,30 @@ def solve_semi_dual_entropic(a, b, M, reg, method, numItermax=10000, lr=None, Parameters ---------- - a : np.ndarray(ns,) + a : ndarray, shape (ns,) source measure - b : np.ndarray(nt,) + b : ndarray, shape (nt,) target measure - M : np.ndarray(ns, nt) + M : ndarray, shape (ns, nt) cost matrix - reg : float number + reg : float Regularization term > 0 methode : str used method (SAG or ASGD) - numItermax : int number + numItermax : int number of iteration - lr : float number + lr : float learning rate - n_source : int number + n_source : int size of the source measure - n_target : int number + n_target : int size of the target measure log : bool, optional record log if True Returns ------- - - pi : np.ndarray(ns, nt) + pi : ndarray, shape (ns, nt) transportation matrix log : dict log dictionary return only if log==True in parameters @@ -495,30 +483,28 @@ def batch_grad_dual(a, b, M, reg, alpha, beta, batch_size, batch_alpha, Parameters ---------- - - a : np.ndarray(ns,) + a : ndarray, shape (ns,) source measure - b : np.ndarray(nt,) + b : ndarray, shape (nt,) target measure - M : np.ndarray(ns, nt) + M : ndarray, shape (ns, nt) cost matrix - reg : float number + reg : float Regularization term > 0 - alpha : np.ndarray(ns,) + alpha : ndarray, shape (ns,) dual variable - beta : np.ndarray(nt,) + beta : ndarray, shape (nt,) dual variable - batch_size : int number + batch_size : int size of the batch - batch_alpha : np.ndarray(bs,) + batch_alpha : ndarray, shape (bs,) batch of index of alpha - batch_beta : np.ndarray(bs,) + batch_beta : ndarray, shape (bs,) batch of index of beta Returns ------- - - grad : np.ndarray(ns,) + grad : ndarray, shape (ns,) partial grad F Examples @@ -591,28 +577,26 @@ def sgd_entropic_regularization(a, b, M, reg, batch_size, numItermax, lr): Parameters ---------- - - a : np.ndarray(ns,) + a : ndarray, shape (ns,) source measure - b : np.ndarray(nt,) + b : ndarray, shape (nt,) target measure - M : np.ndarray(ns, nt) + M : ndarray, shape (ns, nt) cost matrix - reg : float number + reg : float Regularization term > 0 - batch_size : int number + batch_size : int size of the batch - numItermax : int number + numItermax : int number of iteration - lr : float number + lr : float learning rate Returns ------- - - alpha : np.ndarray(ns,) + alpha : ndarray, shape (ns,) dual variable - beta : np.ndarray(nt,) + beta : ndarray, shape (nt,) dual variable Examples @@ -648,10 +632,9 @@ def sgd_entropic_regularization(a, b, M, reg, batch_size, numItermax, lr): References ---------- - [Seguy et al., 2018] : - International Conference on Learning Representation (2018), - arXiv preprint arxiv:1711.02283. + International Conference on Learning Representation (2018), + arXiv preprint arxiv:1711.02283. ''' n_source = np.shape(M)[0] @@ -696,28 +679,26 @@ def solve_dual_entropic(a, b, M, reg, batch_size, numItermax=10000, lr=1, Parameters ---------- - - a : np.ndarray(ns,) + a : ndarray, shape (ns,) source measure - b : np.ndarray(nt,) + b : ndarray, shape (nt,) target measure - M : np.ndarray(ns, nt) + M : ndarray, shape (ns, nt) cost matrix - reg : float number + reg : float Regularization term > 0 - batch_size : int number + batch_size : int size of the batch - numItermax : int number + numItermax : int number of iteration - lr : float number + lr : float learning rate log : bool, optional record log if True Returns ------- - - pi : np.ndarray(ns, nt) + pi : ndarray, shape (ns, nt) transportation matrix log : dict log dictionary return only if log==True in parameters @@ -757,8 +738,8 @@ def solve_dual_entropic(a, b, M, reg, batch_size, numItermax=10000, lr=1, ---------- [Seguy et al., 2018] : - International Conference on Learning Representation (2018), - arXiv preprint arxiv:1711.02283. + International Conference on Learning Representation (2018), + arXiv preprint arxiv:1711.02283. ''' opt_alpha, opt_beta = sgd_entropic_regularization(a, b, M, reg, batch_size, diff --git a/ot/unbalanced.py b/ot/unbalanced.py index 50ec03c..467fda2 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -380,7 +380,8 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, print( '{:5s}|{:12s}'.format('It.', 'Err') + '\n' + '-' * 19) print('{:5d}|{:8e}|'.format(cpt, err)) - cpt = cpt + 1 + cpt += 1 + if log: log['u'] = u log['v'] = v diff --git a/ot/utils.py b/ot/utils.py index e8249ef..8419c83 100644 --- a/ot/utils.py +++ b/ot/utils.py @@ -111,12 +111,12 @@ def dist(x1, x2=None, metric='sqeuclidean'): Parameters ---------- - x1 : np.array (n1,d) + x1 : ndarray, shape (n1,d) matrix with n1 samples of size d - x2 : np.array (n2,d), optional + x2 : array, shape (n2,d), optional matrix with n2 samples of size d (if None then x2=x1) - metric : str, fun, optional - name of the metric to be computed (full list in the doc of scipy), If a string, + metric : str | callable, optional + Name of the metric to be computed (full list in the doc of scipy), If a string, the distance function can be 'braycurtis', 'canberra', 'chebyshev', 'cityblock', 'correlation', 'cosine', 'dice', 'euclidean', 'hamming', 'jaccard', 'kulsinski', 'mahalanobis', 'matching', 'minkowski', 'rogerstanimoto', 'russellrao', 'seuclidean', @@ -138,26 +138,21 @@ def dist(x1, x2=None, metric='sqeuclidean'): def dist0(n, method='lin_square'): - """Compute standard cost matrices of size (n,n) for OT problems + """Compute standard cost matrices of size (n, n) for OT problems Parameters ---------- - n : int - size of the cost matrix + Size of the cost matrix. method : str, optional Type of loss matrix chosen from: * 'lin_square' : linear sampling between 0 and n-1, quadratic loss - Returns ------- - - M : np.array (n1,n2) - distance matrix computed with given metric - - + M : ndarray, shape (n1,n2) + Distance matrix computed with given metric. """ res = 0 if method == 'lin_square': @@ -169,22 +164,18 @@ def dist0(n, method='lin_square'): def cost_normalization(C, norm=None): """ Apply normalization to the loss matrix - Parameters ---------- - C : np.array (n1, n2) + C : ndarray, shape (n1, n2) The cost matrix to normalize. norm : str - type of normalization from 'median','max','log','loglog'. Any other - value do not normalize. - + Type of normalization from 'median', 'max', 'log', 'loglog'. Any + other value do not normalize. Returns ------- - - C : np.array (n1, n2) + C : ndarray, shape (n1, n2) The input cost matrix normalized according to given norm. - """ if norm == "median": @@ -194,7 +185,7 @@ def cost_normalization(C, norm=None): elif norm == "log": C = np.log(1 + C) elif norm == "loglog": - C = np.log(1 + np.log(1 + C)) + C = np.log1p(np.log1p(C)) return C @@ -256,6 +247,7 @@ def check_params(**kwargs): def check_random_state(seed): """Turn seed into a np.random.RandomState instance + Parameters ---------- seed : None | int | instance of RandomState @@ -275,7 +267,6 @@ def check_random_state(seed): class deprecated(object): - """Decorator to mark a function or class as deprecated. deprecated class from scikit-learn package @@ -291,8 +282,8 @@ class deprecated(object): Parameters ---------- - extra : string - to be added to the deprecation messages + extra : str + To be added to the deprecation messages. """ # Adapted from http://wiki.python.org/moin/PythonDecoratorLibrary, @@ -373,9 +364,9 @@ def _is_deprecated(func): class BaseEstimator(object): - """Base class for most objects in POT - adapted from sklearn BaseEstimator class + + Code adapted from sklearn BaseEstimator class Notes ----- @@ -417,7 +408,7 @@ class BaseEstimator(object): Parameters ---------- - deep : boolean, optional + deep : bool, optional If True, will return the parameters for this estimator and contained subobjects that are estimators. -- cgit v1.2.3 From 06fab4c1e5efbe79f91589917fba01c3fb300a87 Mon Sep 17 00:00:00 2001 From: Alexandre Gramfort Date: Tue, 9 Jul 2019 17:20:02 +0200 Subject: more --- ot/bregman.py | 112 ++++++++++++++++++++++++++------------------------------- ot/datasets.py | 32 +++++++---------- ot/optim.py | 32 ++++++++--------- ot/plot.py | 6 ++-- 4 files changed, 80 insertions(+), 102 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index 13dfa3b..b67074f 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -40,12 +40,12 @@ def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, Parameters ---------- - a : np.ndarray (ns,) + a : ndarray, shape (ns,) samples weights in the source domain - b : np.ndarray (nt,) or np.ndarray (nt,nbb) + b : ndarray, shape (nt,) or ndarray, shape (nt, nbb) samples in the target domain, compute sinkhorn with multiple targets and fixed M if b is a matrix (return OT loss + dual variables in log) - M : np.ndarray (ns,nt) + M : ndarray, shape (ns, nt) loss matrix reg : float Regularization term >0 @@ -64,7 +64,7 @@ def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, Returns ------- - gamma : (ns x nt) ndarray + gamma : ndarray, shape (ns, nt) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -155,12 +155,12 @@ def sinkhorn2(a, b, M, reg, method='sinkhorn', numItermax=1000, Parameters ---------- - a : np.ndarray (ns,) + a : ndarray, shape (ns,) samples weights in the source domain - b : np.ndarray (nt,) or np.ndarray (nt,nbb) + b : ndarray, shape (nt,) or ndarray, shape (nt, nbb) samples in the target domain, compute sinkhorn with multiple targets and fixed M if b is a matrix (return OT loss + dual variables in log) - M : np.ndarray (ns,nt) + M : ndarray, shape (ns, nt) loss matrix reg : float Regularization term >0 @@ -176,7 +176,6 @@ def sinkhorn2(a, b, M, reg, method='sinkhorn', numItermax=1000, log : bool, optional record log if True - Returns ------- W : (nt) ndarray or float @@ -272,12 +271,12 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, Parameters ---------- - a : np.ndarray (ns,) + a : ndarray, shape (ns,) samples weights in the source domain - b : np.ndarray (nt,) or np.ndarray (nt,nbb) + b : ndarray, shape (nt,) or ndarray, shape (nt, nbb) samples in the target domain, compute sinkhorn with multiple targets and fixed M if b is a matrix (return OT loss + dual variables in log) - M : np.ndarray (ns,nt) + M : ndarray, shape (ns, nt) loss matrix reg : float Regularization term >0 @@ -290,10 +289,9 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, log : bool, optional record log if True - Returns ------- - gamma : (ns x nt) ndarray + gamma : ndarray, shape (ns, nt) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -453,12 +451,12 @@ def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log= Parameters ---------- - a : np.ndarray (ns,) + a : ndarray, shape (ns,) samples weights in the source domain - b : np.ndarray (nt,) or np.ndarray (nt,nbb) + b : ndarray, shape (nt,) or ndarray, shape (nt, nbb) samples in the target domain, compute sinkhorn with multiple targets and fixed M if b is a matrix (return OT loss + dual variables in log) - M : np.ndarray (ns,nt) + M : ndarray, shape (ns, nt) loss matrix reg : float Regularization term >0 @@ -469,10 +467,9 @@ def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log= log : bool, optional record log if True - Returns ------- - gamma : (ns x nt) ndarray + gamma : ndarray, shape (ns, nt) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -602,11 +599,11 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, Parameters ---------- - a : np.ndarray (ns,) + a : ndarray, shape (ns,) samples weights in the source domain - b : np.ndarray (nt,) + b : ndarray, shape (nt,) samples in the target domain - M : np.ndarray (ns,nt) + M : ndarray, shape (ns, nt) loss matrix reg : float Regularization term >0 @@ -623,10 +620,9 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, log : bool, optional record log if True - Returns ------- - gamma : (ns x nt) ndarray + gamma : ndarray, shape (ns, nt) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -823,11 +819,11 @@ def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, numInne Parameters ---------- - a : np.ndarray (ns,) + a : ndarray, shape (ns,) samples weights in the source domain - b : np.ndarray (nt,) + b : ndarray, shape (nt,) samples in the target domain - M : np.ndarray (ns,nt) + M : ndarray, shape (ns, nt) loss matrix reg : float Regularization term >0 @@ -835,7 +831,7 @@ def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, numInne thershold for max value in u or v for log scaling tau : float thershold for max value in u or v for log scaling - warmstart : tible of vectors + warmstart : tuple of vectors if given then sarting values for alpha an beta log scalings numItermax : int, optional Max number of iterations @@ -850,10 +846,9 @@ def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, numInne log : bool, optional record log if True - Returns ------- - gamma : (ns x nt) ndarray + gamma : ndarray, shape (ns, nt) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -1006,13 +1001,13 @@ def barycenter(A, M, reg, weights=None, numItermax=1000, Parameters ---------- - A : np.ndarray (d,n) + A : ndarray, shape (d,n) n training distributions a_i of size d - M : np.ndarray (d,d) + M : ndarray, shape (d,d) loss matrix for OT reg : float Regularization term >0 - weights : np.ndarray (n,) + weights : ndarray, shape (n,) Weights of each histogram a_i on the simplex (barycentric coodinates) numItermax : int, optional Max number of iterations @@ -1102,11 +1097,11 @@ def convolutional_barycenter2d(A, reg, weights=None, numItermax=10000, stopThr=1 Parameters ---------- - A : np.ndarray (n,w,h) + A : ndarray, shape (n, w, h) n distributions (2D images) of size w x h reg : float Regularization term >0 - weights : np.ndarray (n,) + weights : ndarray, shape (n,) Weights of each image on the simplex (barycentric coodinates) numItermax : int, optional Max number of iterations @@ -1119,15 +1114,13 @@ def convolutional_barycenter2d(A, reg, weights=None, numItermax=10000, stopThr=1 log : bool, optional record log if True - Returns ------- - a : (w,h) ndarray + a : ndarray, shape (w, h) 2D Wasserstein barycenter log : dict log dictionary return only if log==True in parameters - References ---------- @@ -1217,15 +1210,15 @@ def unmix(a, D, M, M0, h0, reg, reg0, alpha, numItermax=1000, Parameters ---------- - a : np.ndarray (d) + a : ndarray, shape (d) observed distribution - D : np.ndarray (d,n) + D : ndarray, shape (d, n) dictionary matrix - M : np.ndarray (d,d) + M : ndarray, shape (d, d) loss matrix - M0 : np.ndarray (n,n) + M0 : ndarray, shape (n, n) loss matrix - h0 : np.ndarray (n,) + h0 : ndarray, shape (n,) prior on h reg : float Regularization term >0 (Wasserstein data fitting) @@ -1245,7 +1238,7 @@ def unmix(a, D, M, M0, h0, reg, reg0, alpha, numItermax=1000, Returns ------- - a : (d,) ndarray + a : ndarray, shape (d,) Wasserstein barycenter log : dict log dictionary return only if log==True in parameters @@ -1325,15 +1318,15 @@ def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numI Parameters ---------- - X_s : np.ndarray (ns, d) + X_s : ndarray, shape (ns, d) samples in the source domain - X_t : np.ndarray (nt, d) + X_t : ndarray, shape (nt, d) samples in the target domain reg : float Regularization term >0 - a : np.ndarray (ns,) + a : ndarray, shape (ns,) samples weights in the source domain - b : np.ndarray (nt,) + b : ndarray, shape (nt,) samples weights in the target domain numItermax : int, optional Max number of iterations @@ -1347,7 +1340,7 @@ def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numI Returns ------- - gamma : (ns x nt) ndarray + gamma : ndarray, shape (ns, nt) Regularized optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -1415,15 +1408,15 @@ def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', num Parameters ---------- - X_s : np.ndarray (ns, d) + X_s : ndarray, shape (ns, d) samples in the source domain - X_t : np.ndarray (nt, d) + X_t : ndarray, shape (nt, d) samples in the target domain reg : float Regularization term >0 - a : np.ndarray (ns,) + a : ndarray, shape (ns,) samples weights in the source domain - b : np.ndarray (nt,) + b : ndarray, shape (nt,) samples weights in the target domain numItermax : int, optional Max number of iterations @@ -1437,7 +1430,7 @@ def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', num Returns ------- - gamma : (ns x nt) ndarray + gamma : ndarray, shape (ns, nt) Regularized optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -1523,15 +1516,15 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli Parameters ---------- - X_s : np.ndarray (ns, d) + X_s : ndarray, shape (ns, d) samples in the source domain - X_t : np.ndarray (nt, d) + X_t : ndarray, shape (nt, d) samples in the target domain reg : float Regularization term >0 - a : np.ndarray (ns,) + a : ndarray, shape (ns,) samples weights in the source domain - b : np.ndarray (nt,) + b : ndarray, shape (nt,) samples weights in the target domain numItermax : int, optional Max number of iterations @@ -1542,17 +1535,15 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli log : bool, optional record log if True - Returns ------- - gamma : (ns x nt) ndarray + gamma : ndarray, shape (ns, nt) Regularized optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters Examples -------- - >>> n_s = 2 >>> n_t = 4 >>> reg = 0.1 @@ -1564,7 +1555,6 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli References ---------- - .. [23] Aude Genevay, Gabriel Peyré, Marco Cuturi, Learning Generative Models with Sinkhorn Divergences, Proceedings of the Twenty-First International Conference on Artficial Intelligence and Statistics, (AISTATS) 21, 2018 ''' if log: diff --git a/ot/datasets.py b/ot/datasets.py index e76e75d..ba0cfd9 100644 --- a/ot/datasets.py +++ b/ot/datasets.py @@ -17,7 +17,6 @@ def make_1D_gauss(n, m, s): Parameters ---------- - n : int number of bins in the histogram m : float @@ -25,12 +24,10 @@ def make_1D_gauss(n, m, s): s : float standard deviaton of the gaussian distribution - Returns ------- - h : np.array (n,) - 1D histogram for a gaussian distribution - + h : ndarray (n,) + 1D histogram for a gaussian distribution """ x = np.arange(n, dtype=np.float64) h = np.exp(-(x - m)**2 / (2 * s**2)) @@ -44,16 +41,15 @@ def get_1D_gauss(n, m, sigma): def make_2D_samples_gauss(n, m, sigma, random_state=None): - """return n samples drawn from 2D gaussian N(m,sigma) + """Return n samples drawn from 2D gaussian N(m,sigma) Parameters ---------- - n : int number of samples to make - m : np.array (2,) + m : ndarray, shape (2,) mean value of the gaussian distribution - sigma : np.array (2,2) + sigma : ndarray, shape (2, 2) covariance matrix of the gaussian distribution random_state : int, RandomState instance or None, optional (default=None) If int, random_state is the seed used by the random number generator; @@ -63,9 +59,8 @@ def make_2D_samples_gauss(n, m, sigma, random_state=None): Returns ------- - X : np.array (n,2) - n samples drawn from N(m,sigma) - + X : ndarray, shape (n, 2) + n samples drawn from N(m, sigma). """ generator = check_random_state(random_state) @@ -86,11 +81,10 @@ def get_2D_samples_gauss(n, m, sigma, random_state=None): def make_data_classif(dataset, n, nz=.5, theta=0, random_state=None, **kwargs): - """ dataset generation for classification problems + """Dataset generation for classification problems Parameters ---------- - dataset : str type of classification problem (see code) n : int @@ -105,13 +99,11 @@ def make_data_classif(dataset, n, nz=.5, theta=0, random_state=None, **kwargs): Returns ------- - X : np.array (n,d) - n observation of size d - y : np.array (n,) - labels of the samples - + X : ndarray, shape (n, d) + n observation of size d + y : ndarray, shape (n,) + labels of the samples. """ - generator = check_random_state(random_state) if dataset.lower() == '3gauss': diff --git a/ot/optim.py b/ot/optim.py index f94aceb..65baf9d 100644 --- a/ot/optim.py +++ b/ot/optim.py @@ -26,14 +26,13 @@ def line_search_armijo(f, xk, pk, gfk, old_fval, Parameters ---------- - - f : function + f : callable loss function - xk : np.ndarray + xk : ndarray initial position - pk : np.ndarray + pk : ndarray descent direction - gfk : np.ndarray + gfk : ndarray gradient of f at xk old_fval : float loss value at xk @@ -161,15 +160,15 @@ def cg(a, b, M, reg, f, df, G0=None, numItermax=200, Parameters ---------- - a : np.ndarray (ns,) + a : ndarray, shape (ns,) samples weights in the source domain - b : np.ndarray (nt,) + b : ndarray, shape (nt,) samples in the target domain - M : np.ndarray (ns,nt) + M : ndarray, shape (ns, nt) loss matrix reg : float Regularization term >0 - G0 : np.ndarray (ns,nt), optional + G0 : ndarray, shape (ns,nt), optional initial guess (default is indep joint density) numItermax : int, optional Max number of iterations @@ -299,17 +298,17 @@ def gcg(a, b, M, reg1, reg2, f, df, G0=None, numItermax=10, Parameters ---------- - a : np.ndarray (ns,) + a : ndarray, shape (ns,) samples weights in the source domain - b : np.ndarray (nt,) + b : ndarrayv (nt,) samples in the target domain - M : np.ndarray (ns,nt) + M : ndarray, shape (ns, nt) loss matrix reg1 : float Entropic Regularization term >0 reg2 : float Second Regularization term >0 - G0 : np.ndarray (ns,nt), optional + G0 : ndarray, shape (ns, nt), optional initial guess (default is indep joint density) numItermax : int, optional Max number of iterations @@ -326,15 +325,13 @@ def gcg(a, b, M, reg1, reg2, f, df, G0=None, numItermax=10, Returns ------- - gamma : (ns x nt) ndarray + gamma : ndarray, shape (ns, nt) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters - References ---------- - .. [5] N. Courty; R. Flamary; D. Tuia; A. Rakotomamonjy, "Optimal Transport for Domain Adaptation," in IEEE Transactions on Pattern Analysis and Machine Intelligence , vol.PP, no.99, pp.1-1 .. [7] Rakotomamonjy, A., Flamary, R., & Courty, N. (2015). Generalized conditional gradient: analysis of convergence and applications. arXiv preprint arXiv:1510.06567. @@ -422,13 +419,12 @@ def solve_1d_linesearch_quad(a, b, c): Parameters ---------- a,b,c : float - The coefficients of the quadratic function + The coefficients of the quadratic function Returns ------- x : float The optimal value which leads to the minimal cost - """ f0 = c df0 = b diff --git a/ot/plot.py b/ot/plot.py index a409d4a..f403e98 100644 --- a/ot/plot.py +++ b/ot/plot.py @@ -26,11 +26,11 @@ def plot1D_mat(a, b, M, title=''): Parameters ---------- - a : np.array, shape (na,) + a : ndarray, shape (na,) Source distribution - b : np.array, shape (nb,) + b : ndarray, shape (nb,) Target distribution - M : np.array, shape (na,nb) + M : ndarray, shape (na, nb) Matrix to plot """ na, nb = M.shape -- cgit v1.2.3 From 0d9c65d39f7bf6a9c692ad8d5421ddb087ddcafc Mon Sep 17 00:00:00 2001 From: Alexandre Gramfort Date: Tue, 9 Jul 2019 18:09:30 +0200 Subject: trailing spaces --- ot/bregman.py | 14 +++++++------- ot/optim.py | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index b67074f..f39145d 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -291,7 +291,7 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, Returns ------- - gamma : ndarray, shape (ns, nt) + gamma : ndarray, shape (ns, nt) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -469,7 +469,7 @@ def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log= Returns ------- - gamma : ndarray, shape (ns, nt) + gamma : ndarray, shape (ns, nt) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -622,7 +622,7 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, Returns ------- - gamma : ndarray, shape (ns, nt) + gamma : ndarray, shape (ns, nt) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -848,7 +848,7 @@ def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, numInne Returns ------- - gamma : ndarray, shape (ns, nt) + gamma : ndarray, shape (ns, nt) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -1340,7 +1340,7 @@ def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numI Returns ------- - gamma : ndarray, shape (ns, nt) + gamma : ndarray, shape (ns, nt) Regularized optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -1430,7 +1430,7 @@ def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', num Returns ------- - gamma : ndarray, shape (ns, nt) + gamma : ndarray, shape (ns, nt) Regularized optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -1537,7 +1537,7 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli Returns ------- - gamma : ndarray, shape (ns, nt) + gamma : ndarray, shape (ns, nt) Regularized optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters diff --git a/ot/optim.py b/ot/optim.py index 65baf9d..0abd9e9 100644 --- a/ot/optim.py +++ b/ot/optim.py @@ -325,7 +325,7 @@ def gcg(a, b, M, reg1, reg2, f, df, G0=None, numItermax=10, Returns ------- - gamma : ndarray, shape (ns, nt) + gamma : ndarray, shape (ns, nt) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters -- cgit v1.2.3 From c698e0aa20d28e36d25f87082855a490283f3c88 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Thu, 11 Jul 2019 15:24:39 +0200 Subject: update readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bba27ff..d8bb051 100644 --- a/README.md +++ b/README.md @@ -152,7 +152,8 @@ Here is a list of the Python notebooks available [here](https://github.com/rflam * [Wasserstein Discriminant Analysis](https://github.com/rflamary/POT/blob/master/notebooks/plot_WDA.ipynb) * [Gromov Wasserstein](https://github.com/rflamary/POT/blob/master/notebooks/plot_gromov.ipynb) * [Gromov Wasserstein Barycenter](https://github.com/rflamary/POT/blob/master/notebooks/plot_gromov_barycenter.ipynb) - +* [Fused Gromov Wasserstein](https://github.com/rflamary/POT/blob/master/notebooks/plot_fgw.ipynb) +* [Fused Gromov Wasserstein Barycenter](https://github.com/rflamary/POT/blob/master/notebooks/plot_barycenter_fgw.ipynb) You can also see the notebooks with [Jupyter nbviewer](https://nbviewer.jupyter.org/github/rflamary/POT/tree/master/notebooks/). -- cgit v1.2.3 From 0d23718409b1f0ac41b9302d98ca3d1ab9577855 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Fri, 19 Jul 2019 17:04:14 +0200 Subject: remove square in convergence check --- ot/unbalanced.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ot/unbalanced.py b/ot/unbalanced.py index 50ec03c..f6c2d5f 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -371,8 +371,9 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, if cpt % 10 == 0: # we can speed up the process by checking for the error only all # the 10th iterations - err = np.sum((u - uprev)**2) / np.sum((u)**2) + \ - np.sum((v - vprev)**2) / np.sum((v)**2) + err_u = abs(u - uprev).max() / max(abs(u), abs(uprev), 1.) + err_v = abs(v - vprev).max() / max(abs(v), abs(vprev), 1.) + err = 0.5 * (err_u + err_v) if log: log['err'].append(err) if verbose: @@ -498,8 +499,9 @@ def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, if cpt % 10 == 0: # we can speed up the process by checking for the error only all # the 10th iterations - err = np.sum((u - uprev) ** 2) / np.sum((u) ** 2) + \ - np.sum((v - vprev) ** 2) / np.sum((v) ** 2) + err_u = abs(u - uprev).max() / max(abs(u), abs(uprev), 1.) + err_v = abs(v - vprev).max() / max(abs(v), abs(vprev), 1.) + err = 0.5 * (err_u + err_v) if log: log['err'].append(err) if verbose: -- cgit v1.2.3 From 10accb13c2f22c946b65b249d7aae6e4f6af7579 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Mon, 22 Jul 2019 14:53:45 +0200 Subject: add unbalanced with stabilization --- ot/unbalanced.py | 279 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 245 insertions(+), 34 deletions(-) diff --git a/ot/unbalanced.py b/ot/unbalanced.py index f6c2d5f..ca24e8b 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -9,10 +9,12 @@ Regularized Unbalanced OT from __future__ import division import warnings import numpy as np +from scipy.misc import logsumexp + # from .utils import unif, dist -def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, +def sinkhorn_unbalanced(a, b, M, reg, mu, method='sinkhorn', numItermax=1000, stopThr=1e-9, verbose=False, log=False, **kwargs): r""" Solve the unbalanced entropic regularization optimal transport problem and return the loss @@ -20,7 +22,7 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, The function solves the following optimization problem: .. math:: - W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\alpha KL(\gamma 1, a) + \\alpha KL(\gamma^T 1, b) + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\mu KL(\gamma 1, a) + \\mu KL(\gamma^T 1, b) s.t. \gamma\geq 0 @@ -45,11 +47,11 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, loss matrix reg : float Entropy regularization term > 0 - alpha : float + mu : float Marginal relaxation term > 0 method : str method used for the solver either 'sinkhorn', 'sinkhorn_stabilized' or - 'sinkhorn_epsilon_scaling', see those function for specific parameters + 'sinkhorn_reg_scaling', see those function for specific parameters numItermax : int, optional Max number of iterations stopThr : float, optional @@ -95,22 +97,29 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, -------- ot.unbalanced.sinkhorn_knopp_unbalanced : Unbalanced Classic Sinkhorn [10] ot.unbalanced.sinkhorn_stabilized_unbalanced: Unbalanced Stabilized sinkhorn [9][10] - ot.unbalanced.sinkhorn_epsilon_scaling_unbalanced: Unbalanced Sinkhorn with epslilon scaling [9][10] + ot.unbalanced.sinkhorn_reg_scaling_unbalanced: Unbalanced Sinkhorn with epslilon scaling [9][10] """ if method.lower() == 'sinkhorn': def sink(): - return sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, + return sinkhorn_knopp_unbalanced(a, b, M, reg, mu, numItermax=numItermax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) - elif method.lower() in ['sinkhorn_stabilized', 'sinkhorn_epsilon_scaling']: + elif method.lower() == 'sinkhorn_stabilized': + def sink(): + return sinkhorn_stabilized_unbalanced(a, b, M, reg, mu, + numItermax=numItermax, + stopThr=stopThr, + verbose=verbose, + log=log, **kwargs) + elif method.lower() in ['sinkhorn_reg_scaling']: warnings.warn('Method not implemented yet. Using classic Sinkhorn Knopp') def sink(): - return sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, + return sinkhorn_knopp_unbalanced(a, b, M, reg, mu, numItermax=numItermax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) @@ -120,7 +129,7 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, return sink() -def sinkhorn_unbalanced2(a, b, M, reg, alpha, method='sinkhorn', +def sinkhorn_unbalanced2(a, b, M, reg, mu, method='sinkhorn', numItermax=1000, stopThr=1e-9, verbose=False, log=False, **kwargs): r""" @@ -129,7 +138,7 @@ def sinkhorn_unbalanced2(a, b, M, reg, alpha, method='sinkhorn', The function solves the following optimization problem: .. math:: - W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\alpha KL(\gamma 1, a) + \\alpha KL(\gamma^T 1, b) + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\mu KL(\gamma 1, a) + \\mu KL(\gamma^T 1, b) s.t. \gamma\geq 0 @@ -154,11 +163,11 @@ def sinkhorn_unbalanced2(a, b, M, reg, alpha, method='sinkhorn', loss matrix reg : float Entropy regularization term > 0 - alpha : float + mu : float Marginal relaxation term > 0 method : str method used for the solver either 'sinkhorn', 'sinkhorn_stabilized' or - 'sinkhorn_epsilon_scaling', see those function for specific parameters + 'sinkhorn_reg_scaling', see those function for specific parameters numItermax : int, optional Max number of iterations stopThr : float, optional @@ -203,22 +212,29 @@ def sinkhorn_unbalanced2(a, b, M, reg, alpha, method='sinkhorn', -------- ot.unbalanced.sinkhorn_knopp : Unbalanced Classic Sinkhorn [10] ot.unbalanced.sinkhorn_stabilized: Unbalanced Stabilized sinkhorn [9][10] - ot.unbalanced.sinkhorn_epsilon_scaling: Unbalanced Sinkhorn with epslilon scaling [9][10] + ot.unbalanced.sinkhorn_reg_scaling: Unbalanced Sinkhorn with epslilon scaling [9][10] """ if method.lower() == 'sinkhorn': def sink(): - return sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, + return sinkhorn_knopp_unbalanced(a, b, M, reg, mu, numItermax=numItermax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) - elif method.lower() in ['sinkhorn_stabilized', 'sinkhorn_epsilon_scaling']: + elif method.lower() == 'sinkhorn_stabilized': + def sink(): + return sinkhorn_stabilized_unbalanced(a, b, M, reg, mu, + numItermax=numItermax, + stopThr=stopThr, + verbose=verbose, + log=log, **kwargs) + elif method.lower() in ['sinkhorn_reg_scaling']: warnings.warn('Method not implemented yet. Using classic Sinkhorn Knopp') def sink(): - return sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, + return sinkhorn_knopp_unbalanced(a, b, M, reg, mu, numItermax=numItermax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) @@ -232,7 +248,7 @@ def sinkhorn_unbalanced2(a, b, M, reg, alpha, method='sinkhorn', return sink() -def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, +def sinkhorn_knopp_unbalanced(a, b, M, reg, mu, numItermax=1000, stopThr=1e-9, verbose=False, log=False, **kwargs): r""" Solve the entropic regularization unbalanced optimal transport problem and return the loss @@ -240,7 +256,7 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, The function solves the following optimization problem: .. math:: - W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\alpha KL(\gamma 1, a) + \\alpha KL(\gamma^T 1, b) + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\mu KL(\gamma 1, a) + \\mu KL(\gamma^T 1, b) s.t. \gamma\geq 0 @@ -265,7 +281,7 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, loss matrix reg : float Entropy regularization term > 0 - alpha : float + mu : float Marginal relaxation term > 0 numItermax : int, optional Max number of iterations @@ -338,14 +354,12 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, u = np.ones(n_a) / n_a v = np.ones(n_b) / n_b - # print(reg) # Next 3 lines equivalent to K= np.exp(-M/reg), but faster to compute K = np.empty(M.shape, dtype=M.dtype) np.divide(M, -reg, out=K) np.exp(K, out=K) - # print(np.min(K)) - fi = alpha / (alpha + reg) + fi = mu / (mu + reg) cpt = 0 err = 1. @@ -371,8 +385,8 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, if cpt % 10 == 0: # we can speed up the process by checking for the error only all # the 10th iterations - err_u = abs(u - uprev).max() / max(abs(u), abs(uprev), 1.) - err_v = abs(v - vprev).max() / max(abs(v), abs(vprev), 1.) + err_u = abs(u - uprev).max() / max(abs(u).max(), abs(uprev).max(), 1.) + err_v = abs(v - vprev).max() / max(abs(v).max(), abs(vprev).max(), 1.) err = 0.5 * (err_u + err_v) if log: log['err'].append(err) @@ -383,8 +397,8 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, print('{:5d}|{:8e}|'.format(cpt, err)) cpt = cpt + 1 if log: - log['u'] = u - log['v'] = v + log['logu'] = np.log(u + 1e-16) + log['logv'] = np.log(v + 1e-16) if n_hists: # return only loss res = np.einsum('ik,ij,jk,ij->k', u, K, v, M) @@ -401,7 +415,204 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, return u[:, None] * K * v[None, :] -def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, +def sinkhorn_stabilized_unbalanced(a, b, M, reg, mu, tau=1e5, numItermax=1000, + stopThr=1e-9, verbose=False, log=False, + **kwargs): + r""" + Solve the entropic regularization unbalanced optimal transport problem and return the loss + + The function solves the following optimization problem using log-domain + stabilization as proposed in [10]: + + .. math:: + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\mu KL(\gamma 1, a) + \\mu KL(\gamma^T 1, b) + + s.t. + \gamma\geq 0 + where : + + - M is the (ns, nt) metric cost matrix + - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` + - a and b are source and target weights + - KL is the Kullback-Leibler divergence + + The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10, 23]_ + + + Parameters + ---------- + a : np.ndarray (ns,) + samples weights in the source domain + b : np.ndarray (nt,) or np.ndarray (nt, n_hists) + samples in the target domain, compute sinkhorn with multiple targets + and fixed M if b is a matrix (return OT loss + dual variables in log) + M : np.ndarray (ns,nt) + loss matrix + reg : float + Entropy regularization term > 0 + mu : float + Marginal relaxation term > 0 + tau : float + thershold for max value in u or v for log scaling + numItermax : int, optional + Max number of iterations + stopThr : float, optional + Stop threshol on error (>0) + verbose : bool, optional + Print information along iterations + log : bool, optional + record log if True + + + Returns + ------- + gamma : (ns x nt) ndarray + Optimal transportation matrix for the given parameters + log : dict + log dictionary return only if log==True in parameters + + Examples + -------- + + >>> import ot + >>> a=[.5, .5] + >>> b=[.5, .5] + >>> M=[[0., 1.],[1., 0.]] + >>> ot.unbalanced.sinkhorn_stabilized_unbalanced(a, b, M, 1., 1.) + array([[0.51122823, 0.18807035], + [0.18807035, 0.51122823]]) + + References + ---------- + + .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + + .. [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : Learning with a Wasserstein Loss, Advances in Neural Information Processing Systems (NIPS) 2015 + + See Also + -------- + ot.lp.emd : Unregularized OT + ot.optim.cg : General regularized OT + + """ + + a = np.asarray(a, dtype=np.float64) + b = np.asarray(b, dtype=np.float64) + M = np.asarray(M, dtype=np.float64) + + n_a, n_b = M.shape + + if len(a) == 0: + a = np.ones(n_a, dtype=np.float64) / n_a + if len(b) == 0: + b = np.ones(n_b, dtype=np.float64) / n_b + + if len(b.shape) > 1: + n_hists = b.shape[1] + else: + n_hists = 0 + + if log: + log = {'err': []} + + # we assume that no distances are null except those of the diagonal of + # distances + if n_hists: + u = np.ones((n_a, n_hists)) / n_a + v = np.ones((n_b, n_hists)) / n_b + a = a.reshape(n_a, 1) + else: + u = np.ones(n_a) / n_a + v = np.ones(n_b) / n_b + + # print(reg) + # Next 3 lines equivalent to K= np.exp(-M/reg), but faster to compute + K = np.empty(M.shape, dtype=M.dtype) + np.divide(M, -reg, out=K) + np.exp(K, out=K) + + fi = mu / (mu + reg) + + cpt = 0 + err = 1. + alpha = np.zeros(n_a) + beta = np.zeros(n_b) + while (err > stopThr and cpt < numItermax): + uprev = u + vprev = v + + Kv = K.dot(v) + f_alpha = np.exp(- alpha / (reg + mu)) + f_beta = np.exp(- beta / (reg + mu)) + + if n_hists: + f_alpha = f_alpha[:, None] + f_beta = f_beta[:, None] + u = ((a / (Kv + 1e-16)) ** fi) * f_alpha + Ktu = K.T.dot(u) + v = ((b / (Ktu + 1e-16)) ** fi) * f_beta + if (u > tau).any() or (v > tau).any(): + if n_hists: + alpha = alpha + reg * np.log(np.max(u, 1)) + beta = beta + reg * np.log(np.max(v, 1)) + else: + alpha = alpha + reg * np.log(np.max(u)) + beta = beta + reg * np.log(np.max(v)) + K = np.exp((alpha[:, None] + beta[None, :] - + M) / reg) + v = np.ones_like(v) + Kv = K.dot(v) + + if (np.any(Ktu == 0.) + or np.any(np.isnan(u)) or np.any(np.isnan(v)) + or np.any(np.isinf(u)) or np.any(np.isinf(v))): + # we have reached the machine precision + # come back to previous solution and quit loop + warnings.warn('Numerical errors at iteration %d' % cpt) + u = uprev + v = vprev + break + if cpt % 10 == 0: + # we can speed up the process by checking for the error only all + # the 10th iterations + err = abs(u - uprev).max() / max(abs(u).max(), abs(uprev).max(), + 1.) + if log: + log['err'].append(err) + if verbose: + if cpt % 200 == 0: + print( + '{:5s}|{:12s}'.format('It.', 'Err') + '\n' + '-' * 19) + print('{:5d}|{:8e}|'.format(cpt, err)) + cpt = cpt + 1 + + if n_hists: + logu = alpha[:, None] / reg + np.log(u) + logv = beta[:, None] / reg + np.log(v) + else: + logu = alpha / reg + np.log(u) + logv = beta / reg + np.log(v) + if log: + log['logu'] = logu + log['logv'] = logv + if n_hists: # return only loss + res = logsumexp(np.log(M + 1e-100)[:, :, None] + logu[:, None, :] + + logv[None, :, :] - M[:, :, None] / reg, axis=(0, 1)) + res = np.exp(res) + if log: + return res, log + else: + return res + + else: # return OT matrix + ot_matrix = np.exp(logu[:, None] + logv[None, :] - M / reg) + if log: + return ot_matrix, log + else: + return ot_matrix + + +def barycenter_unbalanced(A, M, reg, mu, weights=None, numItermax=1000, stopThr=1e-4, verbose=False, log=False): r"""Compute the entropic regularized unbalanced wasserstein barycenter of distributions A @@ -415,7 +626,7 @@ def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, - :math:`Wu_{reg}(\cdot,\cdot)` is the unbalanced entropic regularized Wasserstein distance (see ot.unbalanced.sinkhorn_unbalanced) - :math:`\mathbf{a}_i` are training distributions in the columns of matrix :math:`\mathbf{A}` - reg and :math:`\mathbf{M}` are respectively the regularization term and the cost matrix for OT - - alpha is the marginal relaxation hyperparameter + - mu is the marginal relaxation hyperparameter The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10]_ Parameters @@ -426,7 +637,7 @@ def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, loss matrix for OT reg : float Entropy regularization term > 0 - alpha : float + mu : float Marginal relaxation term > 0 weights : np.ndarray (n,) Weights of each histogram a_i on the simplex (barycentric coodinates) @@ -467,7 +678,7 @@ def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, K = np.exp(- M / reg) - fi = alpha / (alpha + reg) + fi = mu / (mu + reg) v = np.ones((p, n_hists)) / p u = np.ones((p, 1)) / p @@ -499,8 +710,8 @@ def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, if cpt % 10 == 0: # we can speed up the process by checking for the error only all # the 10th iterations - err_u = abs(u - uprev).max() / max(abs(u), abs(uprev), 1.) - err_v = abs(v - vprev).max() / max(abs(v), abs(vprev), 1.) + err_u = abs(u - uprev).max() / max(abs(u).max(), abs(uprev).max(), 1.) + err_v = abs(v - vprev).max() / max(abs(v).max(), abs(vprev).max(), 1.) err = 0.5 * (err_u + err_v) if log: log['err'].append(err) @@ -513,8 +724,8 @@ def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, cpt += 1 if log: log['niter'] = cpt - log['u'] = u - log['v'] = v + log['logu'] = np.log(u + 1e-16) + log['logv'] = np.log(v + 1e-16) return q, log else: return q -- cgit v1.2.3 From 5c0ed104b2890c609bdadfe0fcb0e836ba7a6ef1 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Mon, 22 Jul 2019 14:54:01 +0200 Subject: add unbalanced tests with stabilization --- test/test_unbalanced.py | 116 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 77 insertions(+), 39 deletions(-) diff --git a/test/test_unbalanced.py b/test/test_unbalanced.py index 1395fe1..fc7aa5e 100644 --- a/test/test_unbalanced.py +++ b/test/test_unbalanced.py @@ -8,8 +8,10 @@ import numpy as np import ot import pytest +from scipy.misc import logsumexp -@pytest.mark.parametrize("method", ["sinkhorn"]) + +@pytest.mark.parametrize("method", ["sinkhorn", "sinkhorn_stabilized"]) def test_unbalanced_convergence(method): # test generalized sinkhorn for unbalanced OT n = 100 @@ -23,29 +25,34 @@ def test_unbalanced_convergence(method): M = ot.dist(x, x) epsilon = 1. - alpha = 1. - K = np.exp(- M / epsilon) + mu = 1. - G, log = ot.unbalanced.sinkhorn_unbalanced(a, b, M, reg=epsilon, alpha=alpha, + G, log = ot.unbalanced.sinkhorn_unbalanced(a, b, M, reg=epsilon, mu=mu, stopThr=1e-10, method=method, log=True) - loss = ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, alpha, + loss = ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, mu, method=method) # check fixed point equations - fi = alpha / (alpha + epsilon) - v_final = (b / K.T.dot(log["u"])) ** fi - u_final = (a / K.dot(log["v"])) ** fi + # in log-domain + fi = mu / (mu + epsilon) + logb = np.log(b + 1e-16) + loga = np.log(a + 1e-16) + logKtu = logsumexp(log["logu"][None, :] - M.T / epsilon, axis=1) + logKv = logsumexp(log["logv"][None, :] - M / epsilon, axis=1) + + v_final = fi * (logb - logKtu) + u_final = fi * (loga - logKv) np.testing.assert_allclose( - u_final, log["u"], atol=1e-05) + u_final, log["logu"], atol=1e-05) np.testing.assert_allclose( - v_final, log["v"], atol=1e-05) + v_final, log["logv"], atol=1e-05) # check if sinkhorn_unbalanced2 returns the correct loss np.testing.assert_allclose((G * M).sum(), loss, atol=1e-5) -@pytest.mark.parametrize("method", ["sinkhorn"]) +@pytest.mark.parametrize("method", ["sinkhorn", "sinkhorn_stabilized"]) def test_unbalanced_multiple_inputs(method): # test generalized sinkhorn for unbalanced OT n = 100 @@ -59,27 +66,55 @@ def test_unbalanced_multiple_inputs(method): M = ot.dist(x, x) epsilon = 1. - alpha = 1. - K = np.exp(- M / epsilon) + mu = 1. - loss, log = ot.unbalanced.sinkhorn_unbalanced(a, b, M, reg=epsilon, - alpha=alpha, + loss, log = ot.unbalanced.sinkhorn_unbalanced(a, b, M, reg=epsilon, mu=mu, stopThr=1e-10, method=method, log=True) # check fixed point equations - fi = alpha / (alpha + epsilon) - v_final = (b / K.T.dot(log["u"])) ** fi - - u_final = (a[:, None] / K.dot(log["v"])) ** fi + # in log-domain + fi = mu / (mu + epsilon) + logb = np.log(b + 1e-16) + loga = np.log(a + 1e-16)[:, None] + logKtu = logsumexp(log["logu"][:, None, :] - M[:, :, None] / epsilon, + axis=0) + logKv = logsumexp(log["logv"][None, :] - M[:, :, None] / epsilon, axis=1) + v_final = fi * (logb - logKtu) + u_final = fi * (loga - logKv) np.testing.assert_allclose( - u_final, log["u"], atol=1e-05) + u_final, log["logu"], atol=1e-05) np.testing.assert_allclose( - v_final, log["v"], atol=1e-05) + v_final, log["logv"], atol=1e-05) assert len(loss) == b.shape[1] +def test_stabilized_vs_sinkhorn(): + # test if stable version matches sinkhorn + n = 100 + + # Gaussian distributions + a = ot.datasets.make_1D_gauss(n, m=20, s=5) # m= mean, s= std + b1 = ot.datasets.make_1D_gauss(n, m=60, s=8) + b2 = ot.datasets.make_1D_gauss(n, m=30, s=4) + + # creating matrix A containing all distributions + b = np.vstack((b1, b2)).T + + M = ot.utils.dist0(n) + M /= np.median(M) + epsilon = 0.1 + mu = 1. + G, log = ot.unbalanced.sinkhorn_stabilized_unbalanced(a, b, M, reg=epsilon, + mu=mu, + log=True) + G2, log2 = ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, mu, + method="sinkhorn", log=True) + + np.testing.assert_allclose(G, G2) + + def test_unbalanced_barycenter(): # test generalized sinkhorn for unbalanced OT barycenter n = 100 @@ -92,27 +127,30 @@ def test_unbalanced_barycenter(): A = A * np.array([1, 2])[None, :] M = ot.dist(x, x) epsilon = 1. - alpha = 1. - K = np.exp(- M / epsilon) + mu = 1. - q, log = ot.unbalanced.barycenter_unbalanced(A, M, reg=epsilon, alpha=alpha, + q, log = ot.unbalanced.barycenter_unbalanced(A, M, reg=epsilon, mu=mu, stopThr=1e-10, log=True) # check fixed point equations - fi = alpha / (alpha + epsilon) - v_final = (q[:, None] / K.T.dot(log["u"])) ** fi - u_final = (A / K.dot(log["v"])) ** fi + fi = mu / (mu + epsilon) + logA = np.log(A + 1e-16) + logq = np.log(q + 1e-16)[:, None] + logKtu = logsumexp(log["logu"][:, None, :] - M[:, :, None] / epsilon, + axis=0) + logKv = logsumexp(log["logv"][None, :] - M[:, :, None] / epsilon, axis=1) + v_final = fi * (logq - logKtu) + u_final = fi * (logA - logKv) np.testing.assert_allclose( - u_final, log["u"], atol=1e-05) + u_final, log["logu"], atol=1e-05) np.testing.assert_allclose( - v_final, log["v"], atol=1e-05) + v_final, log["logv"], atol=1e-05) def test_implemented_methods(): - IMPLEMENTED_METHODS = ['sinkhorn'] - TO_BE_IMPLEMENTED_METHODS = ['sinkhorn_stabilized', - 'sinkhorn_epsilon_scaling'] + IMPLEMENTED_METHODS = ['sinkhorn', 'sinkhorn_stabilized'] + TO_BE_IMPLEMENTED_METHODS = ['sinkhorn_reg_scaling'] NOT_VALID_TOKENS = ['foo'] # test generalized sinkhorn for unbalanced OT barycenter n = 3 @@ -126,21 +164,21 @@ def test_implemented_methods(): M = ot.dist(x, x) epsilon = 1. - alpha = 1. + mu = 1. for method in IMPLEMENTED_METHODS: - ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, + ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, mu, method=method) - ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, alpha, + ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, mu, method=method) with pytest.warns(UserWarning, match='not implemented'): for method in set(TO_BE_IMPLEMENTED_METHODS): - ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, + ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, mu, method=method) - ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, alpha, + ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, mu, method=method) with pytest.raises(ValueError): for method in set(NOT_VALID_TOKENS): - ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, + ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, mu, method=method) - ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, alpha, + ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, mu, method=method) -- cgit v1.2.3 From 50a5a4111ada5e8c208da1acf731608930d0a278 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Mon, 22 Jul 2019 15:28:59 +0200 Subject: fix doctest examples --- ot/unbalanced.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ot/unbalanced.py b/ot/unbalanced.py index ca24e8b..1453b31 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -77,8 +77,8 @@ def sinkhorn_unbalanced(a, b, M, reg, mu, method='sinkhorn', numItermax=1000, >>> b=[.5, .5] >>> M=[[0., 1.], [1., 0.]] >>> ot.sinkhorn_unbalanced(a, b, M, 1, 1) - array([[0.51122823, 0.18807035], - [0.18807035, 0.51122823]]) + array([[0.51122818, 0.18807034], + [0.18807034, 0.51122818]]) References @@ -193,7 +193,7 @@ def sinkhorn_unbalanced2(a, b, M, reg, mu, method='sinkhorn', >>> b=[.5, .5] >>> M=[[0., 1.],[1., 0.]] >>> ot.unbalanced.sinkhorn_unbalanced2(a, b, M, 1., 1.) - array([0.31912866]) + array([0.31912862]) @@ -308,8 +308,8 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, mu, numItermax=1000, >>> b=[.5, .5] >>> M=[[0., 1.],[1., 0.]] >>> ot.unbalanced.sinkhorn_knopp_unbalanced(a, b, M, 1., 1.) - array([[0.51122823, 0.18807035], - [0.18807035, 0.51122823]]) + array([[0.51122818, 0.18807034], + [0.18807034, 0.51122818]]) References ---------- @@ -479,8 +479,8 @@ def sinkhorn_stabilized_unbalanced(a, b, M, reg, mu, tau=1e5, numItermax=1000, >>> b=[.5, .5] >>> M=[[0., 1.],[1., 0.]] >>> ot.unbalanced.sinkhorn_stabilized_unbalanced(a, b, M, 1., 1.) - array([[0.51122823, 0.18807035], - [0.18807035, 0.51122823]]) + array([[0.51122818, 0.18807034], + [0.18807034, 0.51122818]]) References ---------- -- cgit v1.2.3 From 09f3f640fc46ba4905d5508b704f2e5a90dda295 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Tue, 23 Jul 2019 21:28:30 +0200 Subject: fix issue 94 + add test --- ot/bregman.py | 10 +++++++--- test/test_bregman.py | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index f39145d..70e4208 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -765,10 +765,14 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, cpt = cpt + 1 - # print('err=',err,' cpt=',cpt) if log: - log['logu'] = alpha / reg + np.log(u) - log['logv'] = beta / reg + np.log(v) + if nbb: + alpha = alpha[:, None] + beta = beta[:, None] + logu = alpha / reg + np.log(u) + logv = beta / reg + np.log(v) + log['logu'] = logu + log['logv'] = logv log['alpha'] = alpha + reg * np.log(u) log['beta'] = beta + reg * np.log(v) log['warmstart'] = (log['alpha'], log['beta']) diff --git a/test/test_bregman.py b/test/test_bregman.py index 7f4972c..83ebba8 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -254,3 +254,28 @@ def test_empirical_sinkhorn_divergence(): emp_sinkhorn_div, sinkhorn_div, atol=1e-05) # cf conv emp sinkhorn np.testing.assert_allclose( emp_sinkhorn_div_log, sink_div_log, atol=1e-05) # cf conv emp sinkhorn + + +def test_stabilized_vs_sinkhorn_multidim(): + # test if stable version matches sinkhorn + # for multidimensional inputs + n = 100 + + # Gaussian distributions + a = ot.datasets.make_1D_gauss(n, m=20, s=5) # m= mean, s= std + b1 = ot.datasets.make_1D_gauss(n, m=60, s=8) + b2 = ot.datasets.make_1D_gauss(n, m=30, s=4) + + # creating matrix A containing all distributions + b = np.vstack((b1, b2)).T + + M = ot.utils.dist0(n) + M /= np.median(M) + epsilon = 0.1 + G, log = ot.bregman.sinkhorn(a, b, M, reg=epsilon, + method="sinkhorn_stabilized", + log=True) + G2, log2 = ot.bregman.sinkhorn(a, b, M, epsilon, + method="sinkhorn", log=True) + + np.testing.assert_allclose(G, G2) -- cgit v1.2.3 From a725f1dc0ac63ac919461ab8f2a23b111a410c00 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Tue, 23 Jul 2019 21:51:10 +0200 Subject: rebase unbalanced --- ot/unbalanced.py | 291 ++++++++----------------------------------------------- 1 file changed, 39 insertions(+), 252 deletions(-) diff --git a/ot/unbalanced.py b/ot/unbalanced.py index 14e9e36..467fda2 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -9,12 +9,10 @@ Regularized Unbalanced OT from __future__ import division import warnings import numpy as np -from scipy.misc import logsumexp - # from .utils import unif, dist -def sinkhorn_unbalanced(a, b, M, reg, mu, method='sinkhorn', numItermax=1000, +def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, stopThr=1e-9, verbose=False, log=False, **kwargs): r""" Solve the unbalanced entropic regularization optimal transport problem and return the loss @@ -22,7 +20,7 @@ def sinkhorn_unbalanced(a, b, M, reg, mu, method='sinkhorn', numItermax=1000, The function solves the following optimization problem: .. math:: - W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\mu KL(\gamma 1, a) + \\mu KL(\gamma^T 1, b) + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\alpha KL(\gamma 1, a) + \\alpha KL(\gamma^T 1, b) s.t. \gamma\geq 0 @@ -47,11 +45,11 @@ def sinkhorn_unbalanced(a, b, M, reg, mu, method='sinkhorn', numItermax=1000, loss matrix reg : float Entropy regularization term > 0 - mu : float + alpha : float Marginal relaxation term > 0 method : str method used for the solver either 'sinkhorn', 'sinkhorn_stabilized' or - 'sinkhorn_reg_scaling', see those function for specific parameters + 'sinkhorn_epsilon_scaling', see those function for specific parameters numItermax : int, optional Max number of iterations stopThr : float, optional @@ -77,8 +75,8 @@ def sinkhorn_unbalanced(a, b, M, reg, mu, method='sinkhorn', numItermax=1000, >>> b=[.5, .5] >>> M=[[0., 1.], [1., 0.]] >>> ot.sinkhorn_unbalanced(a, b, M, 1, 1) - array([[0.51122818, 0.18807034], - [0.18807034, 0.51122818]]) + array([[0.51122823, 0.18807035], + [0.18807035, 0.51122823]]) References @@ -97,29 +95,22 @@ def sinkhorn_unbalanced(a, b, M, reg, mu, method='sinkhorn', numItermax=1000, -------- ot.unbalanced.sinkhorn_knopp_unbalanced : Unbalanced Classic Sinkhorn [10] ot.unbalanced.sinkhorn_stabilized_unbalanced: Unbalanced Stabilized sinkhorn [9][10] - ot.unbalanced.sinkhorn_reg_scaling_unbalanced: Unbalanced Sinkhorn with epslilon scaling [9][10] + ot.unbalanced.sinkhorn_epsilon_scaling_unbalanced: Unbalanced Sinkhorn with epslilon scaling [9][10] """ if method.lower() == 'sinkhorn': def sink(): - return sinkhorn_knopp_unbalanced(a, b, M, reg, mu, + return sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=numItermax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) - elif method.lower() == 'sinkhorn_stabilized': - def sink(): - return sinkhorn_stabilized_unbalanced(a, b, M, reg, mu, - numItermax=numItermax, - stopThr=stopThr, - verbose=verbose, - log=log, **kwargs) - elif method.lower() in ['sinkhorn_reg_scaling']: + elif method.lower() in ['sinkhorn_stabilized', 'sinkhorn_epsilon_scaling']: warnings.warn('Method not implemented yet. Using classic Sinkhorn Knopp') def sink(): - return sinkhorn_knopp_unbalanced(a, b, M, reg, mu, + return sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=numItermax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) @@ -129,7 +120,7 @@ def sinkhorn_unbalanced(a, b, M, reg, mu, method='sinkhorn', numItermax=1000, return sink() -def sinkhorn_unbalanced2(a, b, M, reg, mu, method='sinkhorn', +def sinkhorn_unbalanced2(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, stopThr=1e-9, verbose=False, log=False, **kwargs): r""" @@ -138,7 +129,7 @@ def sinkhorn_unbalanced2(a, b, M, reg, mu, method='sinkhorn', The function solves the following optimization problem: .. math:: - W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\mu KL(\gamma 1, a) + \\mu KL(\gamma^T 1, b) + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\alpha KL(\gamma 1, a) + \\alpha KL(\gamma^T 1, b) s.t. \gamma\geq 0 @@ -163,11 +154,11 @@ def sinkhorn_unbalanced2(a, b, M, reg, mu, method='sinkhorn', loss matrix reg : float Entropy regularization term > 0 - mu : float + alpha : float Marginal relaxation term > 0 method : str method used for the solver either 'sinkhorn', 'sinkhorn_stabilized' or - 'sinkhorn_reg_scaling', see those function for specific parameters + 'sinkhorn_epsilon_scaling', see those function for specific parameters numItermax : int, optional Max number of iterations stopThr : float, optional @@ -193,7 +184,7 @@ def sinkhorn_unbalanced2(a, b, M, reg, mu, method='sinkhorn', >>> b=[.5, .5] >>> M=[[0., 1.],[1., 0.]] >>> ot.unbalanced.sinkhorn_unbalanced2(a, b, M, 1., 1.) - array([0.31912862]) + array([0.31912866]) @@ -212,29 +203,22 @@ def sinkhorn_unbalanced2(a, b, M, reg, mu, method='sinkhorn', -------- ot.unbalanced.sinkhorn_knopp : Unbalanced Classic Sinkhorn [10] ot.unbalanced.sinkhorn_stabilized: Unbalanced Stabilized sinkhorn [9][10] - ot.unbalanced.sinkhorn_reg_scaling: Unbalanced Sinkhorn with epslilon scaling [9][10] + ot.unbalanced.sinkhorn_epsilon_scaling: Unbalanced Sinkhorn with epslilon scaling [9][10] """ if method.lower() == 'sinkhorn': def sink(): - return sinkhorn_knopp_unbalanced(a, b, M, reg, mu, + return sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=numItermax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) - elif method.lower() == 'sinkhorn_stabilized': - def sink(): - return sinkhorn_stabilized_unbalanced(a, b, M, reg, mu, - numItermax=numItermax, - stopThr=stopThr, - verbose=verbose, - log=log, **kwargs) - elif method.lower() in ['sinkhorn_reg_scaling']: + elif method.lower() in ['sinkhorn_stabilized', 'sinkhorn_epsilon_scaling']: warnings.warn('Method not implemented yet. Using classic Sinkhorn Knopp') def sink(): - return sinkhorn_knopp_unbalanced(a, b, M, reg, mu, + return sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=numItermax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) @@ -248,7 +232,7 @@ def sinkhorn_unbalanced2(a, b, M, reg, mu, method='sinkhorn', return sink() -def sinkhorn_knopp_unbalanced(a, b, M, reg, mu, numItermax=1000, +def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, stopThr=1e-9, verbose=False, log=False, **kwargs): r""" Solve the entropic regularization unbalanced optimal transport problem and return the loss @@ -256,7 +240,7 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, mu, numItermax=1000, The function solves the following optimization problem: .. math:: - W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\mu KL(\gamma 1, a) + \\mu KL(\gamma^T 1, b) + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\alpha KL(\gamma 1, a) + \\alpha KL(\gamma^T 1, b) s.t. \gamma\geq 0 @@ -281,7 +265,7 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, mu, numItermax=1000, loss matrix reg : float Entropy regularization term > 0 - mu : float + alpha : float Marginal relaxation term > 0 numItermax : int, optional Max number of iterations @@ -308,8 +292,8 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, mu, numItermax=1000, >>> b=[.5, .5] >>> M=[[0., 1.],[1., 0.]] >>> ot.unbalanced.sinkhorn_knopp_unbalanced(a, b, M, 1., 1.) - array([[0.51122818, 0.18807034], - [0.18807034, 0.51122818]]) + array([[0.51122823, 0.18807035], + [0.18807035, 0.51122823]]) References ---------- @@ -354,12 +338,14 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, mu, numItermax=1000, u = np.ones(n_a) / n_a v = np.ones(n_b) / n_b + # print(reg) # Next 3 lines equivalent to K= np.exp(-M/reg), but faster to compute K = np.empty(M.shape, dtype=M.dtype) np.divide(M, -reg, out=K) np.exp(K, out=K) - fi = mu / (mu + reg) + # print(np.min(K)) + fi = alpha / (alpha + reg) cpt = 0 err = 1. @@ -385,9 +371,8 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, mu, numItermax=1000, if cpt % 10 == 0: # we can speed up the process by checking for the error only all # the 10th iterations - err_u = abs(u - uprev).max() / max(abs(u).max(), abs(uprev).max(), 1.) - err_v = abs(v - vprev).max() / max(abs(v).max(), abs(vprev).max(), 1.) - err = 0.5 * (err_u + err_v) + err = np.sum((u - uprev)**2) / np.sum((u)**2) + \ + np.sum((v - vprev)**2) / np.sum((v)**2) if log: log['err'].append(err) if verbose: @@ -398,8 +383,8 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, mu, numItermax=1000, cpt += 1 if log: - log['logu'] = np.log(u + 1e-16) - log['logv'] = np.log(v + 1e-16) + log['u'] = u + log['v'] = v if n_hists: # return only loss res = np.einsum('ik,ij,jk,ij->k', u, K, v, M) @@ -416,204 +401,7 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, mu, numItermax=1000, return u[:, None] * K * v[None, :] -def sinkhorn_stabilized_unbalanced(a, b, M, reg, mu, tau=1e5, numItermax=1000, - stopThr=1e-9, verbose=False, log=False, - **kwargs): - r""" - Solve the entropic regularization unbalanced optimal transport problem and return the loss - - The function solves the following optimization problem using log-domain - stabilization as proposed in [10]: - - .. math:: - W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\mu KL(\gamma 1, a) + \\mu KL(\gamma^T 1, b) - - s.t. - \gamma\geq 0 - where : - - - M is the (ns, nt) metric cost matrix - - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - - a and b are source and target weights - - KL is the Kullback-Leibler divergence - - The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10, 23]_ - - - Parameters - ---------- - a : np.ndarray (ns,) - samples weights in the source domain - b : np.ndarray (nt,) or np.ndarray (nt, n_hists) - samples in the target domain, compute sinkhorn with multiple targets - and fixed M if b is a matrix (return OT loss + dual variables in log) - M : np.ndarray (ns,nt) - loss matrix - reg : float - Entropy regularization term > 0 - mu : float - Marginal relaxation term > 0 - tau : float - thershold for max value in u or v for log scaling - numItermax : int, optional - Max number of iterations - stopThr : float, optional - Stop threshol on error (>0) - verbose : bool, optional - Print information along iterations - log : bool, optional - record log if True - - - Returns - ------- - gamma : (ns x nt) ndarray - Optimal transportation matrix for the given parameters - log : dict - log dictionary return only if log==True in parameters - - Examples - -------- - - >>> import ot - >>> a=[.5, .5] - >>> b=[.5, .5] - >>> M=[[0., 1.],[1., 0.]] - >>> ot.unbalanced.sinkhorn_stabilized_unbalanced(a, b, M, 1., 1.) - array([[0.51122818, 0.18807034], - [0.18807034, 0.51122818]]) - - References - ---------- - - .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. - - .. [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : Learning with a Wasserstein Loss, Advances in Neural Information Processing Systems (NIPS) 2015 - - See Also - -------- - ot.lp.emd : Unregularized OT - ot.optim.cg : General regularized OT - - """ - - a = np.asarray(a, dtype=np.float64) - b = np.asarray(b, dtype=np.float64) - M = np.asarray(M, dtype=np.float64) - - n_a, n_b = M.shape - - if len(a) == 0: - a = np.ones(n_a, dtype=np.float64) / n_a - if len(b) == 0: - b = np.ones(n_b, dtype=np.float64) / n_b - - if len(b.shape) > 1: - n_hists = b.shape[1] - else: - n_hists = 0 - - if log: - log = {'err': []} - - # we assume that no distances are null except those of the diagonal of - # distances - if n_hists: - u = np.ones((n_a, n_hists)) / n_a - v = np.ones((n_b, n_hists)) / n_b - a = a.reshape(n_a, 1) - else: - u = np.ones(n_a) / n_a - v = np.ones(n_b) / n_b - - # print(reg) - # Next 3 lines equivalent to K= np.exp(-M/reg), but faster to compute - K = np.empty(M.shape, dtype=M.dtype) - np.divide(M, -reg, out=K) - np.exp(K, out=K) - - fi = mu / (mu + reg) - - cpt = 0 - err = 1. - alpha = np.zeros(n_a) - beta = np.zeros(n_b) - while (err > stopThr and cpt < numItermax): - uprev = u - vprev = v - - Kv = K.dot(v) - f_alpha = np.exp(- alpha / (reg + mu)) - f_beta = np.exp(- beta / (reg + mu)) - - if n_hists: - f_alpha = f_alpha[:, None] - f_beta = f_beta[:, None] - u = ((a / (Kv + 1e-16)) ** fi) * f_alpha - Ktu = K.T.dot(u) - v = ((b / (Ktu + 1e-16)) ** fi) * f_beta - if (u > tau).any() or (v > tau).any(): - if n_hists: - alpha = alpha + reg * np.log(np.max(u, 1)) - beta = beta + reg * np.log(np.max(v, 1)) - else: - alpha = alpha + reg * np.log(np.max(u)) - beta = beta + reg * np.log(np.max(v)) - K = np.exp((alpha[:, None] + beta[None, :] - - M) / reg) - v = np.ones_like(v) - Kv = K.dot(v) - - if (np.any(Ktu == 0.) - or np.any(np.isnan(u)) or np.any(np.isnan(v)) - or np.any(np.isinf(u)) or np.any(np.isinf(v))): - # we have reached the machine precision - # come back to previous solution and quit loop - warnings.warn('Numerical errors at iteration %d' % cpt) - u = uprev - v = vprev - break - if cpt % 10 == 0: - # we can speed up the process by checking for the error only all - # the 10th iterations - err = abs(u - uprev).max() / max(abs(u).max(), abs(uprev).max(), - 1.) - if log: - log['err'].append(err) - if verbose: - if cpt % 200 == 0: - print( - '{:5s}|{:12s}'.format('It.', 'Err') + '\n' + '-' * 19) - print('{:5d}|{:8e}|'.format(cpt, err)) - cpt = cpt + 1 - - if n_hists: - logu = alpha[:, None] / reg + np.log(u) - logv = beta[:, None] / reg + np.log(v) - else: - logu = alpha / reg + np.log(u) - logv = beta / reg + np.log(v) - if log: - log['logu'] = logu - log['logv'] = logv - if n_hists: # return only loss - res = logsumexp(np.log(M + 1e-100)[:, :, None] + logu[:, None, :] + - logv[None, :, :] - M[:, :, None] / reg, axis=(0, 1)) - res = np.exp(res) - if log: - return res, log - else: - return res - - else: # return OT matrix - ot_matrix = np.exp(logu[:, None] + logv[None, :] - M / reg) - if log: - return ot_matrix, log - else: - return ot_matrix - - -def barycenter_unbalanced(A, M, reg, mu, weights=None, numItermax=1000, +def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, stopThr=1e-4, verbose=False, log=False): r"""Compute the entropic regularized unbalanced wasserstein barycenter of distributions A @@ -627,7 +415,7 @@ def barycenter_unbalanced(A, M, reg, mu, weights=None, numItermax=1000, - :math:`Wu_{reg}(\cdot,\cdot)` is the unbalanced entropic regularized Wasserstein distance (see ot.unbalanced.sinkhorn_unbalanced) - :math:`\mathbf{a}_i` are training distributions in the columns of matrix :math:`\mathbf{A}` - reg and :math:`\mathbf{M}` are respectively the regularization term and the cost matrix for OT - - mu is the marginal relaxation hyperparameter + - alpha is the marginal relaxation hyperparameter The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10]_ Parameters @@ -638,7 +426,7 @@ def barycenter_unbalanced(A, M, reg, mu, weights=None, numItermax=1000, loss matrix for OT reg : float Entropy regularization term > 0 - mu : float + alpha : float Marginal relaxation term > 0 weights : np.ndarray (n,) Weights of each histogram a_i on the simplex (barycentric coodinates) @@ -679,7 +467,7 @@ def barycenter_unbalanced(A, M, reg, mu, weights=None, numItermax=1000, K = np.exp(- M / reg) - fi = mu / (mu + reg) + fi = alpha / (alpha + reg) v = np.ones((p, n_hists)) / p u = np.ones((p, 1)) / p @@ -711,9 +499,8 @@ def barycenter_unbalanced(A, M, reg, mu, weights=None, numItermax=1000, if cpt % 10 == 0: # we can speed up the process by checking for the error only all # the 10th iterations - err_u = abs(u - uprev).max() / max(abs(u).max(), abs(uprev).max(), 1.) - err_v = abs(v - vprev).max() / max(abs(v).max(), abs(vprev).max(), 1.) - err = 0.5 * (err_u + err_v) + err = np.sum((u - uprev) ** 2) / np.sum((u) ** 2) + \ + np.sum((v - vprev) ** 2) / np.sum((v) ** 2) if log: log['err'].append(err) if verbose: @@ -725,8 +512,8 @@ def barycenter_unbalanced(A, M, reg, mu, weights=None, numItermax=1000, cpt += 1 if log: log['niter'] = cpt - log['logu'] = np.log(u + 1e-16) - log['logv'] = np.log(v + 1e-16) + log['u'] = u + log['v'] = v return q, log else: return q -- cgit v1.2.3 From a507556b1901e16351c211e69b38d8d74ac2bc3d Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Tue, 23 Jul 2019 21:51:53 +0200 Subject: rebase unbalanced --- test/test_unbalanced.py | 116 ++++++++++++++++-------------------------------- 1 file changed, 39 insertions(+), 77 deletions(-) diff --git a/test/test_unbalanced.py b/test/test_unbalanced.py index fc7aa5e..1395fe1 100644 --- a/test/test_unbalanced.py +++ b/test/test_unbalanced.py @@ -8,10 +8,8 @@ import numpy as np import ot import pytest -from scipy.misc import logsumexp - -@pytest.mark.parametrize("method", ["sinkhorn", "sinkhorn_stabilized"]) +@pytest.mark.parametrize("method", ["sinkhorn"]) def test_unbalanced_convergence(method): # test generalized sinkhorn for unbalanced OT n = 100 @@ -25,34 +23,29 @@ def test_unbalanced_convergence(method): M = ot.dist(x, x) epsilon = 1. - mu = 1. + alpha = 1. + K = np.exp(- M / epsilon) - G, log = ot.unbalanced.sinkhorn_unbalanced(a, b, M, reg=epsilon, mu=mu, + G, log = ot.unbalanced.sinkhorn_unbalanced(a, b, M, reg=epsilon, alpha=alpha, stopThr=1e-10, method=method, log=True) - loss = ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, mu, + loss = ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, alpha, method=method) # check fixed point equations - # in log-domain - fi = mu / (mu + epsilon) - logb = np.log(b + 1e-16) - loga = np.log(a + 1e-16) - logKtu = logsumexp(log["logu"][None, :] - M.T / epsilon, axis=1) - logKv = logsumexp(log["logv"][None, :] - M / epsilon, axis=1) - - v_final = fi * (logb - logKtu) - u_final = fi * (loga - logKv) + fi = alpha / (alpha + epsilon) + v_final = (b / K.T.dot(log["u"])) ** fi + u_final = (a / K.dot(log["v"])) ** fi np.testing.assert_allclose( - u_final, log["logu"], atol=1e-05) + u_final, log["u"], atol=1e-05) np.testing.assert_allclose( - v_final, log["logv"], atol=1e-05) + v_final, log["v"], atol=1e-05) # check if sinkhorn_unbalanced2 returns the correct loss np.testing.assert_allclose((G * M).sum(), loss, atol=1e-5) -@pytest.mark.parametrize("method", ["sinkhorn", "sinkhorn_stabilized"]) +@pytest.mark.parametrize("method", ["sinkhorn"]) def test_unbalanced_multiple_inputs(method): # test generalized sinkhorn for unbalanced OT n = 100 @@ -66,55 +59,27 @@ def test_unbalanced_multiple_inputs(method): M = ot.dist(x, x) epsilon = 1. - mu = 1. + alpha = 1. + K = np.exp(- M / epsilon) - loss, log = ot.unbalanced.sinkhorn_unbalanced(a, b, M, reg=epsilon, mu=mu, + loss, log = ot.unbalanced.sinkhorn_unbalanced(a, b, M, reg=epsilon, + alpha=alpha, stopThr=1e-10, method=method, log=True) # check fixed point equations - # in log-domain - fi = mu / (mu + epsilon) - logb = np.log(b + 1e-16) - loga = np.log(a + 1e-16)[:, None] - logKtu = logsumexp(log["logu"][:, None, :] - M[:, :, None] / epsilon, - axis=0) - logKv = logsumexp(log["logv"][None, :] - M[:, :, None] / epsilon, axis=1) - v_final = fi * (logb - logKtu) - u_final = fi * (loga - logKv) + fi = alpha / (alpha + epsilon) + v_final = (b / K.T.dot(log["u"])) ** fi + + u_final = (a[:, None] / K.dot(log["v"])) ** fi np.testing.assert_allclose( - u_final, log["logu"], atol=1e-05) + u_final, log["u"], atol=1e-05) np.testing.assert_allclose( - v_final, log["logv"], atol=1e-05) + v_final, log["v"], atol=1e-05) assert len(loss) == b.shape[1] -def test_stabilized_vs_sinkhorn(): - # test if stable version matches sinkhorn - n = 100 - - # Gaussian distributions - a = ot.datasets.make_1D_gauss(n, m=20, s=5) # m= mean, s= std - b1 = ot.datasets.make_1D_gauss(n, m=60, s=8) - b2 = ot.datasets.make_1D_gauss(n, m=30, s=4) - - # creating matrix A containing all distributions - b = np.vstack((b1, b2)).T - - M = ot.utils.dist0(n) - M /= np.median(M) - epsilon = 0.1 - mu = 1. - G, log = ot.unbalanced.sinkhorn_stabilized_unbalanced(a, b, M, reg=epsilon, - mu=mu, - log=True) - G2, log2 = ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, mu, - method="sinkhorn", log=True) - - np.testing.assert_allclose(G, G2) - - def test_unbalanced_barycenter(): # test generalized sinkhorn for unbalanced OT barycenter n = 100 @@ -127,30 +92,27 @@ def test_unbalanced_barycenter(): A = A * np.array([1, 2])[None, :] M = ot.dist(x, x) epsilon = 1. - mu = 1. + alpha = 1. + K = np.exp(- M / epsilon) - q, log = ot.unbalanced.barycenter_unbalanced(A, M, reg=epsilon, mu=mu, + q, log = ot.unbalanced.barycenter_unbalanced(A, M, reg=epsilon, alpha=alpha, stopThr=1e-10, log=True) # check fixed point equations - fi = mu / (mu + epsilon) - logA = np.log(A + 1e-16) - logq = np.log(q + 1e-16)[:, None] - logKtu = logsumexp(log["logu"][:, None, :] - M[:, :, None] / epsilon, - axis=0) - logKv = logsumexp(log["logv"][None, :] - M[:, :, None] / epsilon, axis=1) - v_final = fi * (logq - logKtu) - u_final = fi * (logA - logKv) + fi = alpha / (alpha + epsilon) + v_final = (q[:, None] / K.T.dot(log["u"])) ** fi + u_final = (A / K.dot(log["v"])) ** fi np.testing.assert_allclose( - u_final, log["logu"], atol=1e-05) + u_final, log["u"], atol=1e-05) np.testing.assert_allclose( - v_final, log["logv"], atol=1e-05) + v_final, log["v"], atol=1e-05) def test_implemented_methods(): - IMPLEMENTED_METHODS = ['sinkhorn', 'sinkhorn_stabilized'] - TO_BE_IMPLEMENTED_METHODS = ['sinkhorn_reg_scaling'] + IMPLEMENTED_METHODS = ['sinkhorn'] + TO_BE_IMPLEMENTED_METHODS = ['sinkhorn_stabilized', + 'sinkhorn_epsilon_scaling'] NOT_VALID_TOKENS = ['foo'] # test generalized sinkhorn for unbalanced OT barycenter n = 3 @@ -164,21 +126,21 @@ def test_implemented_methods(): M = ot.dist(x, x) epsilon = 1. - mu = 1. + alpha = 1. for method in IMPLEMENTED_METHODS: - ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, mu, + ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, method=method) - ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, mu, + ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, alpha, method=method) with pytest.warns(UserWarning, match='not implemented'): for method in set(TO_BE_IMPLEMENTED_METHODS): - ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, mu, + ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, method=method) - ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, mu, + ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, alpha, method=method) with pytest.raises(ValueError): for method in set(NOT_VALID_TOKENS): - ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, mu, + ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, method=method) - ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, mu, + ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, alpha, method=method) -- cgit v1.2.3 From 4709849bcc624d5e5c33755b997c56998f43d3e9 Mon Sep 17 00:00:00 2001 From: Kilian Fatras Date: Wed, 24 Jul 2019 18:46:44 +0200 Subject: corrected typos in barycenter examples --- examples/plot_barycenter_lp_vs_entropic.py | 7 ++++++- examples/plot_free_support_barycenter.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/examples/plot_barycenter_lp_vs_entropic.py b/examples/plot_barycenter_lp_vs_entropic.py index b82765e..d7c72d0 100644 --- a/examples/plot_barycenter_lp_vs_entropic.py +++ b/examples/plot_barycenter_lp_vs_entropic.py @@ -102,7 +102,7 @@ pl.tight_layout() problems.append([A, [bary_l2, bary_wass, bary_wass2]]) ############################################################################## -# Dirac Data +# Stair Data # ---------- #%% parameters @@ -168,6 +168,11 @@ pl.legend() pl.title('Barycenters') pl.tight_layout() + +############################################################################## +# Dirac Data +# ---------- + #%% parameters a1 = np.zeros(n) diff --git a/examples/plot_free_support_barycenter.py b/examples/plot_free_support_barycenter.py index b6efc59..64b89e4 100644 --- a/examples/plot_free_support_barycenter.py +++ b/examples/plot_free_support_barycenter.py @@ -62,7 +62,7 @@ X = ot.lp.free_support_barycenter(measures_locations, measures_weights, X_init, pl.figure(1) for (x_i, b_i) in zip(measures_locations, measures_weights): color = np.random.randint(low=1, high=10 * N) - pl.scatter(x_i[:, 0], x_i[:, 1], s=b * 1000, label='input measure') + pl.scatter(x_i[:, 0], x_i[:, 1], s=b_i * 1000, label='input measure') pl.scatter(X[:, 0], X[:, 1], s=b * 1000, c='black', marker='^', label='2-Wasserstein barycenter') pl.title('Data measures and their barycenter') pl.legend(loc=0) -- cgit v1.2.3 From 092866815cf906012f9194b87af1e7ae0270f7e7 Mon Sep 17 00:00:00 2001 From: ngayraud Date: Mon, 12 Aug 2019 15:49:25 -0400 Subject: Added Unbalaced transport to domain adaptation methods. Corrected small bug related to warnings in unbalaced.py . Added an error message when user wants to normalize with other than expected cost normalization functions. --- ot/da.py | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ ot/unbalanced.py | 2 +- ot/utils.py | 5 ++- 3 files changed, 126 insertions(+), 2 deletions(-) diff --git a/ot/da.py b/ot/da.py index 83f9027..c1d9849 100644 --- a/ot/da.py +++ b/ot/da.py @@ -6,6 +6,7 @@ Domain adaptation with optimal transport # Author: Remi Flamary # Nicolas Courty # Michael Perrot +# Nathalie Gayraud # # License: MIT License @@ -16,6 +17,7 @@ from .bregman import sinkhorn from .lp import emd from .utils import unif, dist, kernel, cost_normalization from .utils import check_params, BaseEstimator +from .unbalanced import sinkhorn_unbalanced from .optim import cg from .optim import gcg @@ -1793,3 +1795,122 @@ class MappingTransport(BaseEstimator): transp_Xs = K.dot(self.mapping_) return transp_Xs + + +class UnbalancedSinkhornTransport(BaseTransport): + + """Domain Adapatation unbalanced OT method based on sinkhorn algorithm + + Parameters + ---------- + reg_e : float, optional (default=1) + Entropic regularization parameter + reg_m : float, optional (default=0.1) + Mass regularization parameter + method : str + method used for the solver either 'sinkhorn', 'sinkhorn_stabilized' or + 'sinkhorn_epsilon_scaling', see those function for specific parameters + max_iter : int, float, optional (default=10) + The minimum number of iteration before stopping the optimization + algorithm if no it has not converged + tol : float, optional (default=10e-9) + Stop threshold on error (inner sinkhorn solver) (>0) + verbose : bool, optional (default=False) + Controls the verbosity of the optimization algorithm + log : bool, optional (default=False) + Controls the logs of the optimization algorithm + metric : string, optional (default="sqeuclidean") + The ground metric for the Wasserstein problem + norm : string, optional (default=None) + If given, normalize the ground metric to avoid numerical errors that + can occur with large metric values. + distribution_estimation : callable, optional (defaults to the uniform) + The kind of distribution estimation to employ + out_of_sample_map : string, optional (default="ferradans") + The kind of out of sample mapping to apply to transport samples + from a domain into another one. Currently the only possible option is + "ferradans" which uses the method proposed in [6]. + limit_max: float, optional (default=10) + Controls the semi supervised mode. Transport between labeled source + and target samples of different classes will exhibit an infinite cost + (10 times the maximum value of the cost matrix) + + Attributes + ---------- + coupling_ : array-like, shape (n_source_samples, n_target_samples) + The optimal coupling + log_ : dictionary + The dictionary of log, empty dic if parameter log is not True + + References + ---------- + + .. [1] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). + Scaling algorithms for unbalanced transport problems. arXiv preprint + arXiv:1607.05816. + + """ + + def __init__(self, reg_e=1., reg_m=0.1, method='sinkhorn', + max_iter=10, tol=10e-9, verbose=False, log=False, + metric="sqeuclidean", norm=None, + distribution_estimation=distribution_estimation_uniform, + out_of_sample_map='ferradans', limit_max=10): + + self.reg_e = reg_e + self.reg_m = reg_m + self.method = method + self.max_iter = max_iter + self.tol = tol + self.verbose = verbose + self.log = log + self.metric = metric + self.norm = norm + self.distribution_estimation = distribution_estimation + self.out_of_sample_map = out_of_sample_map + self.limit_max = limit_max + + def fit(self, Xs, ys=None, Xt=None, yt=None): + """Build a coupling matrix from source and target sets of samples + (Xs, ys) and (Xt, yt) + + Parameters + ---------- + Xs : array-like, shape (n_source_samples, n_features) + The training input samples. + ys : array-like, shape (n_source_samples,) + The class labels + Xt : array-like, shape (n_target_samples, n_features) + The training input samples. + yt : array-like, shape (n_target_samples,) + The class labels. If some target samples are unlabeled, fill the + yt's elements with -1. + + Warning: Note that, due to this convention -1 cannot be used as a + class label + + Returns + ------- + self : object + Returns self. + """ + + # check the necessary inputs parameters are here + if check_params(Xs=Xs, Xt=Xt): + + super(UnbalancedSinkhornTransport, self).fit(Xs, ys, Xt, yt) + + returned_ = sinkhorn_unbalanced( + a=self.mu_s, b=self.mu_t, M=self.cost_, + reg=self.reg_e, alpha=self.reg_m, method=self.method, + numItermax=self.max_iter, stopThr=self.tol, + verbose=self.verbose, log=self.log) + + # deal with the value of log + if self.log: + self.coupling_, self.log_ = returned_ + else: + self.coupling_ = returned_ + self.log_ = dict() + + return self diff --git a/ot/unbalanced.py b/ot/unbalanced.py index 467fda2..0f0692e 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -364,7 +364,7 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, or np.any(np.isinf(u)) or np.any(np.isinf(v))): # we have reached the machine precision # come back to previous solution and quit loop - warnings.warn('Numerical errors at iteration', cpt) + warnings.warn('Numerical errors at iteration %s' % cpt) u = uprev v = vprev break diff --git a/ot/utils.py b/ot/utils.py index 8419c83..be839f8 100644 --- a/ot/utils.py +++ b/ot/utils.py @@ -186,7 +186,10 @@ def cost_normalization(C, norm=None): C = np.log(1 + C) elif norm == "loglog": C = np.log1p(np.log1p(C)) - + else: + raise ValueError(f'Norm {norm} is not a valid option. ' + f'Valid options are:\n' + f'median, max, log, loglog') return C -- cgit v1.2.3 From 9d4b786a036ac95989825beec819521089fb4feb Mon Sep 17 00:00:00 2001 From: ngayraud Date: Mon, 12 Aug 2019 16:37:58 -0400 Subject: fixes for travis, added test, minor nits --- .travis.yml | 5 ++-- ot/da.py | 2 +- ot/utils.py | 4 +++- test/test_da.py | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 80 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5e5694b..72fd29a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ matrix: python: 3.5 - os: linux sudo: required - python: 3.6 + python: 3.6 - os: linux sudo: required python: 2.7 @@ -21,7 +21,6 @@ before_install: - ./.travis/before_install.sh before_script: # configure a headless display to test plot generation - "export DISPLAY=:99.0" - - "sh -e /etc/init.d/xvfb start" - sleep 3 # give xvfb some time to start # command to install dependencies install: @@ -30,6 +29,8 @@ install: - pip install flake8 pytest "pytest-cov<2.6" - pip install . # command to run tests + check syntax style +services: + - xvfb script: - python setup.py develop - flake8 examples/ ot/ test/ diff --git a/ot/da.py b/ot/da.py index c1d9849..2af855d 100644 --- a/ot/da.py +++ b/ot/da.py @@ -1852,7 +1852,7 @@ class UnbalancedSinkhornTransport(BaseTransport): """ def __init__(self, reg_e=1., reg_m=0.1, method='sinkhorn', - max_iter=10, tol=10e-9, verbose=False, log=False, + max_iter=10, tol=1e-9, verbose=False, log=False, metric="sqeuclidean", norm=None, distribution_estimation=distribution_estimation_uniform, out_of_sample_map='ferradans', limit_max=10): diff --git a/ot/utils.py b/ot/utils.py index be839f8..a334fea 100644 --- a/ot/utils.py +++ b/ot/utils.py @@ -178,7 +178,9 @@ def cost_normalization(C, norm=None): The input cost matrix normalized according to given norm. """ - if norm == "median": + if norm is None: + pass + elif norm == "median": C /= float(np.median(C)) elif norm == "max": C /= float(np.max(C)) diff --git a/test/test_da.py b/test/test_da.py index f7f3a9d..9efd2d9 100644 --- a/test/test_da.py +++ b/test/test_da.py @@ -245,6 +245,79 @@ def test_sinkhorn_transport_class(): assert len(otda.log_.keys()) != 0 +def test_unbalanced_sinkhorn_transport_class(): + """test_sinkhorn_transport + """ + + ns = 150 + nt = 200 + + Xs, ys = make_data_classif('3gauss', ns) + Xt, yt = make_data_classif('3gauss2', nt) + + otda = ot.da.UnbalancedSinkhornTransport() + + # test its computed + otda.fit(Xs=Xs, Xt=Xt) + assert hasattr(otda, "cost_") + assert hasattr(otda, "coupling_") + assert hasattr(otda, "log_") + + # test dimensions of coupling + assert_equal(otda.cost_.shape, ((Xs.shape[0], Xt.shape[0]))) + assert_equal(otda.coupling_.shape, ((Xs.shape[0], Xt.shape[0]))) + + # test margin constraints + mu_s = unif(ns) + mu_t = unif(nt) + assert_allclose( + np.sum(otda.coupling_, axis=0), mu_t, rtol=1e-3, atol=1e-3) + assert_allclose( + np.sum(otda.coupling_, axis=1), mu_s, rtol=1e-3, atol=1e-3) + + # test transform + transp_Xs = otda.transform(Xs=Xs) + assert_equal(transp_Xs.shape, Xs.shape) + + Xs_new, _ = make_data_classif('3gauss', ns + 1) + transp_Xs_new = otda.transform(Xs_new) + + # check that the oos method is working + assert_equal(transp_Xs_new.shape, Xs_new.shape) + + # test inverse transform + transp_Xt = otda.inverse_transform(Xt=Xt) + assert_equal(transp_Xt.shape, Xt.shape) + + Xt_new, _ = make_data_classif('3gauss2', nt + 1) + transp_Xt_new = otda.inverse_transform(Xt=Xt_new) + + # check that the oos method is working + assert_equal(transp_Xt_new.shape, Xt_new.shape) + + # test fit_transform + transp_Xs = otda.fit_transform(Xs=Xs, Xt=Xt) + assert_equal(transp_Xs.shape, Xs.shape) + + # test unsupervised vs semi-supervised mode + otda_unsup = ot.da.SinkhornTransport() + otda_unsup.fit(Xs=Xs, Xt=Xt) + n_unsup = np.sum(otda_unsup.cost_) + + otda_semi = ot.da.SinkhornTransport() + otda_semi.fit(Xs=Xs, ys=ys, Xt=Xt, yt=yt) + assert_equal(otda_semi.cost_.shape, ((Xs.shape[0], Xt.shape[0]))) + n_semisup = np.sum(otda_semi.cost_) + + # check that the cost matrix norms are indeed different + assert n_unsup != n_semisup, "semisupervised mode not working" + + # check everything runs well with log=True + otda = ot.da.SinkhornTransport(log=True) + otda.fit(Xs=Xs, ys=ys, Xt=Xt) + assert len(otda.log_.keys()) != 0 + + def test_emd_transport_class(): """test_sinkhorn_transport """ -- cgit v1.2.3 From b536be73326e20fd3959ba4fe28cc45a344f47d3 Mon Sep 17 00:00:00 2001 From: ngayraud Date: Mon, 12 Aug 2019 16:51:51 -0400 Subject: Attempting to fix docstyle --- ot/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ot/utils.py b/ot/utils.py index a334fea..b0d95f9 100644 --- a/ot/utils.py +++ b/ot/utils.py @@ -189,7 +189,7 @@ def cost_normalization(C, norm=None): elif norm == "loglog": C = np.log1p(np.log1p(C)) else: - raise ValueError(f'Norm {norm} is not a valid option. ' + raise ValueError(f'Norm {norm} is not a valid option.\n' f'Valid options are:\n' f'median, max, log, loglog') return C -- cgit v1.2.3 From 2633116175a09c468d953489c3fc7bab6aa69057 Mon Sep 17 00:00:00 2001 From: ngayraud Date: Mon, 12 Aug 2019 17:01:14 -0400 Subject: Attempting to fix docstyle --- ot/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ot/utils.py b/ot/utils.py index b0d95f9..d4127e3 100644 --- a/ot/utils.py +++ b/ot/utils.py @@ -189,9 +189,9 @@ def cost_normalization(C, norm=None): elif norm == "loglog": C = np.log1p(np.log1p(C)) else: - raise ValueError(f'Norm {norm} is not a valid option.\n' - f'Valid options are:\n' - f'median, max, log, loglog') + raise ValueError('Norm %s is not a valid option.\n' + 'Valid options are:\n' + 'median, max, log, loglog' % norm) return C -- cgit v1.2.3 From ce86d1476b32771d32b7e55566e7cab45bb57b3a Mon Sep 17 00:00:00 2001 From: ngayraud Date: Mon, 12 Aug 2019 17:03:08 -0400 Subject: Fix in test: no margin constraints here --- test/test_da.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/test/test_da.py b/test/test_da.py index 9efd2d9..2a5e50e 100644 --- a/test/test_da.py +++ b/test/test_da.py @@ -267,14 +267,6 @@ def test_unbalanced_sinkhorn_transport_class(): assert_equal(otda.cost_.shape, ((Xs.shape[0], Xt.shape[0]))) assert_equal(otda.coupling_.shape, ((Xs.shape[0], Xt.shape[0]))) - # test margin constraints - mu_s = unif(ns) - mu_t = unif(nt) - assert_allclose( - np.sum(otda.coupling_, axis=0), mu_t, rtol=1e-3, atol=1e-3) - assert_allclose( - np.sum(otda.coupling_, axis=1), mu_s, rtol=1e-3, atol=1e-3) - # test transform transp_Xs = otda.transform(Xs=Xs) assert_equal(transp_Xs.shape, Xs.shape) -- cgit v1.2.3 From cfdbbd21642c6082164b84db78c2ead07499a113 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Fri, 19 Jul 2019 17:04:14 +0200 Subject: remove square in convergence check add unbalanced with stabilization add unbalanced tests with stabilization fix doctest examples add xvfb in travis remove explicit call xvfb in travis change alpha to reg_m minor flake8 remove redundant sink definitions + better doc and naming add stabilized unbalanced barycenter + add not converged warnings add test for stable barycenter add generic barycenter func + make method funcs private fix typo + add method test for barycenters fix doc examples + add xml to gitignore fix whitespace in example change logsumexp import - scipy deprecation warning fix doctest improve naming + add stable barycenter in bregman add test for stable bar + test the method arg in bregman --- .gitignore | 3 + ot/__init__.py | 18 +- ot/bregman.py | 530 +++++++++++++++++++++----------- ot/unbalanced.py | 803 +++++++++++++++++++++++++++++++++++++++--------- pytest.ini | 0 test/test_bregman.py | 72 ++++- test/test_unbalanced.py | 163 +++++++--- 7 files changed, 1205 insertions(+), 384 deletions(-) create mode 100644 pytest.ini diff --git a/.gitignore b/.gitignore index 42a9aad..dadf84c 100644 --- a/.gitignore +++ b/.gitignore @@ -59,6 +59,9 @@ coverage.xml *.mo *.pot +# xml +*.xml + # Django stuff: *.log local_settings.py diff --git a/ot/__init__.py b/ot/__init__.py index 35ae6fc..7d9615a 100644 --- a/ot/__init__.py +++ b/ot/__init__.py @@ -1,7 +1,7 @@ """ -This is the main module of the POT toolbox. It provides easy access to -a number of sub-modules and functions described below. +This is the main module of the POT toolbox. It provides easy access to +a number of sub-modules and functions described below. .. note:: @@ -14,27 +14,27 @@ a number of sub-modules and functions described below. - :any:`ot.lp` contains OT solvers for the exact (Linear Program) OT problems. - :any:`ot.smooth` contains OT solvers for the regularized (l2 and kl) smooth OT problems. - - :any:`ot.gromov` contains solvers for Gromov-Wasserstein and Fused Gromov + - :any:`ot.gromov` contains solvers for Gromov-Wasserstein and Fused Gromov Wasserstein problems. - - :any:`ot.optim` contains generic solvers OT based optimization problems + - :any:`ot.optim` contains generic solvers OT based optimization problems - :any:`ot.da` contains classes and function related to Monge mapping estimation and Domain Adaptation (DA). - :any:`ot.gpu` contains GPU (cupy) implementation of some OT solvers - - :any:`ot.dr` contains Dimension Reduction (DR) methods such as Wasserstein + - :any:`ot.dr` contains Dimension Reduction (DR) methods such as Wasserstein Discriminant Analysis. - - :any:`ot.utils` contains utility functions such as distance computation and - timing. + - :any:`ot.utils` contains utility functions such as distance computation and + timing. - :any:`ot.datasets` contains toy dataset generation functions. - :any:`ot.plot` contains visualization functions - :any:`ot.stochastic` contains stochastic solvers for regularized OT. - :any:`ot.unbalanced` contains solvers for regularized unbalanced OT. .. warning:: - The list of automatically imported sub-modules is as follows: + The list of automatically imported sub-modules is as follows: :py:mod:`ot.lp`, :py:mod:`ot.bregman`, :py:mod:`ot.optim` :py:mod:`ot.utils`, :py:mod:`ot.datasets`, :py:mod:`ot.gromov`, :py:mod:`ot.smooth` - :py:mod:`ot.stochastic` + :py:mod:`ot.stochastic` The following sub-modules are not imported due to additional dependencies: diff --git a/ot/bregman.py b/ot/bregman.py index 70e4208..2f27d58 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -7,10 +7,12 @@ Bregman projections for regularized OT # Nicolas Courty # Kilian Fatras # Titouan Vayer +# Hicham Janati # # License: MIT License import numpy as np +import warnings from .utils import unif, dist @@ -31,7 +33,7 @@ def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, \gamma\geq 0 where : - - M is the (ns,nt) metric cost matrix + - M is the (dim_a, n_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - a and b are source and target weights (sum to 1) @@ -40,12 +42,12 @@ def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, Parameters ---------- - a : ndarray, shape (ns,) + a : ndarray, shape (dim_a,) samples weights in the source domain - b : ndarray, shape (nt,) or ndarray, shape (nt, nbb) + b : ndarray, shape (dim_b,) or ndarray, shape (dim_b, n_hists) samples in the target domain, compute sinkhorn with multiple targets and fixed M if b is a matrix (return OT loss + dual variables in log) - M : ndarray, shape (ns, nt) + M : ndarray, shape (dim_a, n_b) loss matrix reg : float Regularization term >0 @@ -64,7 +66,7 @@ def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, Returns ------- - gamma : ndarray, shape (ns, nt) + gamma : ndarray, shape (dim_a, n_b) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -103,30 +105,23 @@ def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, """ if method.lower() == 'sinkhorn': - def sink(): - return sinkhorn_knopp(a, b, M, reg, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, log=log, **kwargs) + return _sinkhorn_knopp(a, b, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, log=log, + **kwargs) elif method.lower() == 'greenkhorn': - def sink(): - return greenkhorn(a, b, M, reg, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, log=log) + return _greenkhorn(a, b, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, log=log) elif method.lower() == 'sinkhorn_stabilized': - def sink(): - return sinkhorn_stabilized(a, b, M, reg, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, log=log, **kwargs) + return _sinkhorn_stabilized(a, b, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) elif method.lower() == 'sinkhorn_epsilon_scaling': - def sink(): - return sinkhorn_epsilon_scaling( - a, b, M, reg, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, log=log, **kwargs) + return _sinkhorn_epsilon_scaling(a, b, M, reg, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) else: - print('Warning : unknown method using classic Sinkhorn Knopp') - - def sink(): - return sinkhorn_knopp(a, b, M, reg, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, log=log, **kwargs) - - return sink() + raise ValueError("Unknown method '%s'." % method) def sinkhorn2(a, b, M, reg, method='sinkhorn', numItermax=1000, @@ -146,7 +141,7 @@ def sinkhorn2(a, b, M, reg, method='sinkhorn', numItermax=1000, \gamma\geq 0 where : - - M is the (ns,nt) metric cost matrix + - M is the (dim_a, n_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - a and b are source and target weights (sum to 1) @@ -155,12 +150,12 @@ def sinkhorn2(a, b, M, reg, method='sinkhorn', numItermax=1000, Parameters ---------- - a : ndarray, shape (ns,) + a : ndarray, shape (dim_a,) samples weights in the source domain - b : ndarray, shape (nt,) or ndarray, shape (nt, nbb) + b : ndarray, shape (dim_b,) or ndarray, shape (dim_b, n_hists) samples in the target domain, compute sinkhorn with multiple targets and fixed M if b is a matrix (return OT loss + dual variables in log) - M : ndarray, shape (ns, nt) + M : ndarray, shape (dim_a, n_b) loss matrix reg : float Regularization term >0 @@ -218,35 +213,25 @@ def sinkhorn2(a, b, M, reg, method='sinkhorn', numItermax=1000, ot.bregman.sinkhorn_epsilon_scaling: Sinkhorn with epslilon scaling [9][10] """ - + b = np.asarray(b, dtype=np.float64) + if len(b.shape) < 2: + b = b[:, None] if method.lower() == 'sinkhorn': - def sink(): - return sinkhorn_knopp(a, b, M, reg, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, log=log, **kwargs) + return _sinkhorn_knopp(a, b, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, log=log, **kwargs) elif method.lower() == 'sinkhorn_stabilized': - def sink(): - return sinkhorn_stabilized(a, b, M, reg, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, log=log, **kwargs) + return _sinkhorn_stabilized(a, b, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, log=log, **kwargs) elif method.lower() == 'sinkhorn_epsilon_scaling': - def sink(): - return sinkhorn_epsilon_scaling( - a, b, M, reg, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, log=log, **kwargs) + return _sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) else: - print('Warning : unknown method using classic Sinkhorn Knopp') - - def sink(): - return sinkhorn_knopp(a, b, M, reg, **kwargs) + raise ValueError("Unknown method '%s'." % method) - b = np.asarray(b, dtype=np.float64) - if len(b.shape) < 2: - b = b[:, None] - return sink() - - -def sinkhorn_knopp(a, b, M, reg, numItermax=1000, - stopThr=1e-9, verbose=False, log=False, **kwargs): +def _sinkhorn_knopp(a, b, M, reg, numItermax=1000, + stopThr=1e-9, verbose=False, log=False, **kwargs): r""" Solve the entropic regularization optimal transport problem and return the OT matrix @@ -262,7 +247,7 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, \gamma\geq 0 where : - - M is the (ns,nt) metric cost matrix + - M is the (dim_a, n_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - a and b are source and target weights (sum to 1) @@ -271,12 +256,12 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, Parameters ---------- - a : ndarray, shape (ns,) + a : ndarray, shape (dim_a,) samples weights in the source domain - b : ndarray, shape (nt,) or ndarray, shape (nt, nbb) + b : ndarray, shape (dim_b,) or ndarray, shape (dim_b, n_hists) samples in the target domain, compute sinkhorn with multiple targets and fixed M if b is a matrix (return OT loss + dual variables in log) - M : ndarray, shape (ns, nt) + M : ndarray, shape (dim_a, n_b) loss matrix reg : float Regularization term >0 @@ -291,7 +276,7 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, Returns ------- - gamma : ndarray, shape (ns, nt) + gamma : ndarray, shape (dim_a, n_b) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -331,25 +316,25 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, b = np.ones((M.shape[1],), dtype=np.float64) / M.shape[1] # init data - Nini = len(a) - Nfin = len(b) + dim_a = len(a) + dim_b = len(b) if len(b.shape) > 1: - nbb = b.shape[1] + n_hists = b.shape[1] else: - nbb = 0 + n_hists = 0 if log: log = {'err': []} # we assume that no distances are null except those of the diagonal of # distances - if nbb: - u = np.ones((Nini, nbb)) / Nini - v = np.ones((Nfin, nbb)) / Nfin + if n_hists: + u = np.ones((dim_a, n_hists)) / dim_a + v = np.ones((dim_b, n_hists)) / dim_b else: - u = np.ones(Nini) / Nini - v = np.ones(Nfin) / Nfin + u = np.ones(dim_a) / dim_a + v = np.ones(dim_b) / dim_b # print(reg) @@ -384,13 +369,12 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, if cpt % 10 == 0: # we can speed up the process by checking for the error only all # the 10th iterations - if nbb: - err = np.sum((u - uprev)**2) / np.sum((u)**2) + \ - np.sum((v - vprev)**2) / np.sum((v)**2) + if n_hists: + np.einsum('ik,ij,jk->jk', u, K, v, out=tmp2) else: # compute right marginal tmp2= (diag(u)Kdiag(v))^T1 np.einsum('i,ij,j->j', u, K, v, out=tmp2) - err = np.linalg.norm(tmp2 - b)**2 # violation of marginal + err = np.linalg.norm(tmp2 - b) # violation of marginal if log: log['err'].append(err) @@ -404,7 +388,7 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, log['u'] = u log['v'] = v - if nbb: # return only loss + if n_hists: # return only loss res = np.einsum('ik,ij,jk,ij->k', u, K, v, M) if log: return res, log @@ -419,7 +403,7 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, return u.reshape((-1, 1)) * K * v.reshape((1, -1)) -def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log=False): +def _greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log=False): r""" Solve the entropic regularization optimal transport problem and return the OT matrix @@ -443,7 +427,7 @@ def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log= \gamma\geq 0 where : - - M is the (ns,nt) metric cost matrix + - M is the (dim_a, n_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - a and b are source and target weights (sum to 1) @@ -451,12 +435,12 @@ def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log= Parameters ---------- - a : ndarray, shape (ns,) + a : ndarray, shape (dim_a,) samples weights in the source domain - b : ndarray, shape (nt,) or ndarray, shape (nt, nbb) + b : ndarray, shape (dim_b,) or ndarray, shape (dim_b, n_hists) samples in the target domain, compute sinkhorn with multiple targets and fixed M if b is a matrix (return OT loss + dual variables in log) - M : ndarray, shape (ns, nt) + M : ndarray, shape (dim_a, n_b) loss matrix reg : float Regularization term >0 @@ -469,7 +453,7 @@ def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log= Returns ------- - gamma : ndarray, shape (ns, nt) + gamma : ndarray, shape (dim_a, n_b) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -481,7 +465,7 @@ def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log= >>> a=[.5, .5] >>> b=[.5, .5] >>> M=[[0., 1.], [1., 0.]] - >>> ot.bregman.greenkhorn(a, b, M, 1) + >>> ot.bregman._greenkhorn(a, b, M, 1) array([[0.36552929, 0.13447071], [0.13447071, 0.36552929]]) @@ -509,16 +493,16 @@ def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log= if len(b) == 0: b = np.ones((M.shape[1],), dtype=np.float64) / M.shape[1] - n = a.shape[0] - m = b.shape[0] + dim_a = a.shape[0] + dim_b = b.shape[0] # Next 3 lines equivalent to K= np.exp(-M/reg), but faster to compute K = np.empty_like(M) np.divide(M, -reg, out=K) np.exp(K, out=K) - u = np.full(n, 1. / n) - v = np.full(m, 1. / m) + u = np.full(dim_a, 1. / dim_a) + v = np.full(dim_b, 1. / dim_b) G = u[:, np.newaxis] * K * v[np.newaxis, :] viol = G.sum(1) - a @@ -571,8 +555,9 @@ def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log= return G -def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, - warmstart=None, verbose=False, print_period=20, log=False, **kwargs): +def _sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, + warmstart=None, verbose=False, print_period=20, + log=False, **kwargs): r""" Solve the entropic regularization OT problem with log stabilization @@ -588,7 +573,7 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, \gamma\geq 0 where : - - M is the (ns,nt) metric cost matrix + - M is the (dim_a, n_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - a and b are source and target weights (sum to 1) @@ -599,11 +584,11 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, Parameters ---------- - a : ndarray, shape (ns,) + a : ndarray, shape (dim_a,) samples weights in the source domain - b : ndarray, shape (nt,) + b : ndarray, shape (dim_b,) samples in the target domain - M : ndarray, shape (ns, nt) + M : ndarray, shape (dim_a, n_b) loss matrix reg : float Regularization term >0 @@ -622,7 +607,7 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, Returns ------- - gamma : ndarray, shape (ns, nt) + gamma : ndarray, shape (dim_a, n_b) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -634,7 +619,7 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, >>> a=[.5,.5] >>> b=[.5,.5] >>> M=[[0.,1.],[1.,0.]] - >>> ot.bregman.sinkhorn_stabilized(a,b,M,1) + >>> ot.bregman._sinkhorn_stabilized(a, b, M, 1) array([[0.36552929, 0.13447071], [0.13447071, 0.36552929]]) @@ -667,10 +652,10 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, # test if multiple target if len(b.shape) > 1: - nbb = b.shape[1] + n_hists = b.shape[1] a = a[:, np.newaxis] else: - nbb = 0 + n_hists = 0 # init data na = len(a) @@ -687,8 +672,8 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, else: alpha, beta = warmstart - if nbb: - u, v = np.ones((na, nbb)) / na, np.ones((nb, nbb)) / nb + if n_hists: + u, v = np.ones((na, n_hists)) / na, np.ones((nb, n_hists)) / nb else: u, v = np.ones(na) / na, np.ones(nb) / nb @@ -720,13 +705,13 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, # remove numerical problems and store them in K if np.abs(u).max() > tau or np.abs(v).max() > tau: - if nbb: + if n_hists: alpha, beta = alpha + reg * \ np.max(np.log(u), 1), beta + reg * np.max(np.log(v)) else: alpha, beta = alpha + reg * np.log(u), beta + reg * np.log(v) - if nbb: - u, v = np.ones((na, nbb)) / na, np.ones((nb, nbb)) / nb + if n_hists: + u, v = np.ones((na, n_hists)) / na, np.ones((nb, n_hists)) / nb else: u, v = np.ones(na) / na, np.ones(nb) / nb K = get_K(alpha, beta) @@ -734,12 +719,15 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, if cpt % print_period == 0: # we can speed up the process by checking for the error only all # the 10th iterations - if nbb: - err = np.sum((u - uprev)**2) / np.sum((u)**2) + \ - np.sum((v - vprev)**2) / np.sum((v)**2) + if n_hists: + err_u = abs(u - uprev).max() + err_u /= max(abs(u).max(), abs(uprev).max(), 1.) + err_v = abs(v - vprev).max() + err_v /= max(abs(v).max(), abs(vprev).max(), 1.) + err = 0.5 * (err_u + err_v) else: transp = get_Gamma(alpha, beta, u, v) - err = np.linalg.norm((np.sum(transp, axis=0) - b))**2 + err = np.linalg.norm((np.sum(transp, axis=0) - b)) if log: log['err'].append(err) @@ -766,7 +754,7 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, cpt = cpt + 1 if log: - if nbb: + if n_hists: alpha = alpha[:, None] beta = beta[:, None] logu = alpha / reg + np.log(u) @@ -776,26 +764,28 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, log['alpha'] = alpha + reg * np.log(u) log['beta'] = beta + reg * np.log(v) log['warmstart'] = (log['alpha'], log['beta']) - if nbb: - res = np.zeros((nbb)) - for i in range(nbb): + if n_hists: + res = np.zeros((n_hists)) + for i in range(n_hists): res[i] = np.sum(get_Gamma(alpha, beta, u[:, i], v[:, i]) * M) return res, log else: return get_Gamma(alpha, beta, u, v), log else: - if nbb: - res = np.zeros((nbb)) - for i in range(nbb): + if n_hists: + res = np.zeros((n_hists)) + for i in range(n_hists): res[i] = np.sum(get_Gamma(alpha, beta, u[:, i], v[:, i]) * M) return res else: return get_Gamma(alpha, beta, u, v) -def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, numInnerItermax=100, - tau=1e3, stopThr=1e-9, warmstart=None, verbose=False, print_period=10, log=False, **kwargs): +def _sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, + numInnerItermax=100, tau=1e3, stopThr=1e-9, + warmstart=None, verbose=False, print_period=10, + log=False, **kwargs): r""" Solve the entropic regularization optimal transport problem with log stabilization and epsilon scaling. @@ -812,7 +802,7 @@ def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, numInne \gamma\geq 0 where : - - M is the (ns,nt) metric cost matrix + - M is the (dim_a, n_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - a and b are source and target weights (sum to 1) @@ -823,18 +813,16 @@ def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, numInne Parameters ---------- - a : ndarray, shape (ns,) + a : ndarray, shape (dim_a,) samples weights in the source domain - b : ndarray, shape (nt,) + b : ndarray, shape (dim_b,) samples in the target domain - M : ndarray, shape (ns, nt) + M : ndarray, shape (dim_a, n_b) loss matrix reg : float Regularization term >0 tau : float thershold for max value in u or v for log scaling - tau : float - thershold for max value in u or v for log scaling warmstart : tuple of vectors if given then sarting values for alpha an beta log scalings numItermax : int, optional @@ -852,7 +840,7 @@ def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, numInne Returns ------- - gamma : ndarray, shape (ns, nt) + gamma : ndarray, shape (dim_a, n_b) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -864,7 +852,7 @@ def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, numInne >>> a=[.5, .5] >>> b=[.5, .5] >>> M=[[0., 1.], [1., 0.]] - >>> ot.bregman.sinkhorn_epsilon_scaling(a, b, M, 1) + >>> ot.bregman._sinkhorn_epsilon_scaling(a, b, M, 1) array([[0.36552929, 0.13447071], [0.13447071, 0.36552929]]) @@ -893,8 +881,8 @@ def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, numInne b = np.ones((M.shape[1],), dtype=np.float64) / M.shape[1] # init data - na = len(a) - nb = len(b) + dim_a = len(a) + dim_b = len(b) # nrelative umerical precision with 64 bits numItermin = 35 @@ -907,14 +895,14 @@ def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, numInne # we assume that no distances are null except those of the diagonal of # distances if warmstart is None: - alpha, beta = np.zeros(na), np.zeros(nb) + alpha, beta = np.zeros(dim_a), np.zeros(dim_b) else: alpha, beta = warmstart def get_K(alpha, beta): """log space computation""" - return np.exp(-(M - alpha.reshape((na, 1)) - - beta.reshape((1, nb))) / reg) + return np.exp(-(M - alpha.reshape((dim_a, 1)) + - beta.reshape((1, dim_b))) / reg) # print(np.min(K)) def get_reg(n): # exponential decreasing @@ -927,7 +915,7 @@ def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, numInne regi = get_reg(cpt) - G, logi = sinkhorn_stabilized(a, b, M, regi, numItermax=numInnerItermax, stopThr=1e-9, warmstart=( + G, logi = _sinkhorn_stabilized(a, b, M, regi, numItermax=numInnerItermax, stopThr=1e-9, warmstart=( alpha, beta), verbose=False, print_period=20, tau=tau, log=True) alpha = logi['alpha'] @@ -986,8 +974,8 @@ def projC(gamma, q): return np.multiply(gamma, q / np.maximum(np.sum(gamma, axis=0), 1e-10)) -def barycenter(A, M, reg, weights=None, numItermax=1000, - stopThr=1e-4, verbose=False, log=False): +def barycenter(A, M, reg, weights=None, method="sinkhorn", numItermax=10000, + stopThr=1e-4, verbose=False, log=False, **kwargs): r"""Compute the entropic regularized wasserstein barycenter of distributions A The function solves the following optimization problem: @@ -1005,13 +993,15 @@ def barycenter(A, M, reg, weights=None, numItermax=1000, Parameters ---------- - A : ndarray, shape (d,n) - n training distributions a_i of size d - M : ndarray, shape (d,d) - loss matrix for OT + A : ndarray, shape (dim, n_hists) + n_hists training distributions a_i of size dim + M : ndarray, shape (dim, dim) + loss matrix for OT reg : float - Regularization term >0 - weights : ndarray, shape (n,) + Regularization term > 0 + method : str (optional) + method used for the solver either 'sinkhorn' or 'sinkhorn_stabilized' + weights : ndarray, shape (n_hists,) Weights of each histogram a_i on the simplex (barycentric coodinates) numItermax : int, optional Max number of iterations @@ -1025,7 +1015,7 @@ def barycenter(A, M, reg, weights=None, numItermax=1000, Returns ------- - a : (d,) ndarray + a : (dim,) ndarray Wasserstein barycenter log : dict log dictionary return only if log==True in parameters @@ -1036,8 +1026,70 @@ def barycenter(A, M, reg, weights=None, numItermax=1000, .. [3] Benamou, J. D., Carlier, G., Cuturi, M., Nenna, L., & Peyré, G. (2015). Iterative Bregman projections for regularized transportation problems. SIAM Journal on Scientific Computing, 37(2), A1111-A1138. + """ + + if method.lower() == 'sinkhorn': + return _barycenter(A, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, log=log, + **kwargs) + elif method.lower() == 'sinkhorn_stabilized': + return _barycenter_stabilized(A, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) + else: + raise ValueError("Unknown method '%s'." % method) + + +def _barycenter(A, M, reg, weights=None, numItermax=1000, + stopThr=1e-4, verbose=False, log=False): + r"""Compute the entropic regularized wasserstein barycenter of distributions A + + The function solves the following optimization problem: + + .. math:: + \mathbf{a} = arg\min_\mathbf{a} \sum_i W_{reg}(\mathbf{a},\mathbf{a}_i) + + where : + + - :math:`W_{reg}(\cdot,\cdot)` is the entropic regularized Wasserstein distance (see ot.bregman.sinkhorn) + - :math:`\mathbf{a}_i` are training distributions in the columns of matrix :math:`\mathbf{A}` + - reg and :math:`\mathbf{M}` are respectively the regularization term and the cost matrix for OT + + The algorithm used for solving the problem is the Sinkhorn-Knopp matrix scaling algorithm as proposed in [3]_ + + Parameters + ---------- + A : ndarray, shape (dim, n_hists) + n_hists training distributions a_i of size dim + M : ndarray, shape (dim, dim) + loss matrix for OT + reg : float + Regularization term > 0 + weights : ndarray, shape (n_hists,) + Weights of each histogram a_i on the simplex (barycentric coodinates) + numItermax : int, optional + Max number of iterations + stopThr : float, optional + Stop threshol on error (>0) + verbose : bool, optional + Print information along iterations + log : bool, optional + record log if True + Returns + ------- + a : (dim,) ndarray + Wasserstein barycenter + log : dict + log dictionary return only if log==True in parameters + + + References + ---------- + + .. [3] Benamou, J. D., Carlier, G., Cuturi, M., Nenna, L., & Peyré, G. (2015). Iterative Bregman projections for regularized transportation problems. SIAM Journal on Scientific Computing, 37(2), A1111-A1138. + """ if weights is None: @@ -1082,6 +1134,136 @@ def barycenter(A, M, reg, weights=None, numItermax=1000, return geometricBar(weights, UKv) +def _barycenter_stabilized(A, M, reg, tau=1e10, weights=None, numItermax=1000, + stopThr=1e-4, verbose=False, log=False): + r"""Compute the entropic regularized wasserstein barycenter of distributions A + with stabilization. + + The function solves the following optimization problem: + + .. math:: + \mathbf{a} = arg\min_\mathbf{a} \sum_i W_{reg}(\mathbf{a},\mathbf{a}_i) + + where : + + - :math:`W_{reg}(\cdot,\cdot)` is the entropic regularized Wasserstein distance (see ot.bregman.sinkhorn) + - :math:`\mathbf{a}_i` are training distributions in the columns of matrix :math:`\mathbf{A}` + - reg and :math:`\mathbf{M}` are respectively the regularization term and the cost matrix for OT + + The algorithm used for solving the problem is the Sinkhorn-Knopp matrix scaling algorithm as proposed in [3]_ + + Parameters + ---------- + A : ndarray, shape (dim, n_hists) + n_hists training distributions a_i of size dim + M : ndarray, shape (dim, dim) + loss matrix for OT + reg : float + Regularization term > 0 + tau : float + thershold for max value in u or v for log scaling + weights : ndarray, shape (n_hists,) + Weights of each histogram a_i on the simplex (barycentric coodinates) + numItermax : int, optional + Max number of iterations + stopThr : float, optional + Stop threshol on error (>0) + verbose : bool, optional + Print information along iterations + log : bool, optional + record log if True + + + Returns + ------- + a : (dim,) ndarray + Wasserstein barycenter + log : dict + log dictionary return only if log==True in parameters + + + References + ---------- + + .. [3] Benamou, J. D., Carlier, G., Cuturi, M., Nenna, L., & Peyré, G. (2015). Iterative Bregman projections for regularized transportation problems. SIAM Journal on Scientific Computing, 37(2), A1111-A1138. + + """ + + dim, n_hists = A.shape + if weights is None: + weights = np.ones(n_hists) / n_hists + else: + assert(len(weights) == A.shape[1]) + + if log: + log = {'err': []} + + u = np.ones((dim, n_hists)) / dim + v = np.ones((dim, n_hists)) / dim + + # print(reg) + # Next 3 lines equivalent to K= np.exp(-M/reg), but faster to compute + K = np.empty(M.shape, dtype=M.dtype) + np.divide(M, -reg, out=K) + np.exp(K, out=K) + + cpt = 0 + err = 1. + alpha = np.zeros(dim) + beta = np.zeros(dim) + q = np.ones(dim) / dim + while (err > stopThr and cpt < numItermax): + qprev = q + Kv = K.dot(v) + u = A / (Kv + 1e-16) + Ktu = K.T.dot(u) + q = geometricBar(weights, Ktu) + Q = q[:, None] + v = Q / (Ktu + 1e-16) + absorbing = False + if (u > tau).any() or (v > tau).any(): + absorbing = True + print("YEAH absorbing") + alpha = alpha + reg * np.log(np.max(u, 1)) + beta = beta + reg * np.log(np.max(v, 1)) + K = np.exp((alpha[:, None] + beta[None, :] - + M) / reg) + v = np.ones_like(v) + Kv = K.dot(v) + if (np.any(Ktu == 0.) + or np.any(np.isnan(u)) or np.any(np.isnan(v)) + or np.any(np.isinf(u)) or np.any(np.isinf(v))): + # we have reached the machine precision + # come back to previous solution and quit loop + warnings.warn('Numerical errors at iteration %s' % cpt) + q = qprev + break + if (cpt % 10 == 0 and not absorbing) or cpt == 0: + # we can speed up the process by checking for the error only all + # the 10th iterations + err = abs(u * Kv - A).max() + if log: + log['err'].append(err) + if verbose: + if cpt % 50 == 0: + print( + '{:5s}|{:12s}'.format('It.', 'Err') + '\n' + '-' * 19) + print('{:5d}|{:8e}|'.format(cpt, err)) + + cpt += 1 + if err > stopThr: + warnings.warn("Stabilized Unbalanced Sinkhorn did not converge." + + "Try a larger entropy `reg`" + + "Or a larger absorption threshold `tau`.") + if log: + log['niter'] = cpt + log['logu'] = np.log(u + 1e-16) + log['logv'] = np.log(v + 1e-16) + return q, log + else: + return q + + def convolutional_barycenter2d(A, reg, weights=None, numItermax=10000, stopThr=1e-9, stabThr=1e-30, verbose=False, log=False): r"""Compute the entropic regularized wasserstein barycenter of distributions A where A is a collection of 2D images. @@ -1101,16 +1283,16 @@ def convolutional_barycenter2d(A, reg, weights=None, numItermax=10000, stopThr=1 Parameters ---------- - A : ndarray, shape (n, w, h) - n distributions (2D images) of size w x h + A : ndarray, shape (n_hists, width, height) + n distributions (2D images) of size width x height reg : float Regularization term >0 - weights : ndarray, shape (n,) + weights : ndarray, shape (n_hists,) Weights of each image on the simplex (barycentric coodinates) numItermax : int, optional Max number of iterations stopThr : float, optional - Stop threshol on error (>0) + Stop threshol on error (> 0) stabThr : float, optional Stabilization threshold to avoid numerical precision issue verbose : bool, optional @@ -1120,7 +1302,7 @@ def convolutional_barycenter2d(A, reg, weights=None, numItermax=10000, stopThr=1 Returns ------- - a : ndarray, shape (w, h) + a : ndarray, shape (width, height) 2D Wasserstein barycenter log : dict log dictionary return only if log==True in parameters @@ -1214,15 +1396,15 @@ def unmix(a, D, M, M0, h0, reg, reg0, alpha, numItermax=1000, Parameters ---------- - a : ndarray, shape (d) + a : ndarray, shape (n_observed) observed distribution - D : ndarray, shape (d, n) + D : ndarray, shape (dim, dim) dictionary matrix - M : ndarray, shape (d, d) + M : ndarray, shape (dim, dim) loss matrix - M0 : ndarray, shape (n, n) + M0 : ndarray, shape (n_observed, n_observed) loss matrix - h0 : ndarray, shape (n,) + h0 : ndarray, shape (dim,) prior on h reg : float Regularization term >0 (Wasserstein data fitting) @@ -1242,7 +1424,7 @@ def unmix(a, D, M, M0, h0, reg, reg0, alpha, numItermax=1000, Returns ------- - a : ndarray, shape (d,) + a : ndarray, shape (dim,) Wasserstein barycenter log : dict log dictionary return only if log==True in parameters @@ -1315,22 +1497,22 @@ def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numI \gamma\geq 0 where : - - :math:`M` is the (ns,nt) metric cost matrix + - :math:`M` is the (dim_a, n_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - :math:`a` and :math:`b` are source and target weights (sum to 1) Parameters ---------- - X_s : ndarray, shape (ns, d) + X_s : ndarray, shape (dim_a, d) samples in the source domain - X_t : ndarray, shape (nt, d) + X_t : ndarray, shape (dim_b, d) samples in the target domain reg : float Regularization term >0 - a : ndarray, shape (ns,) + a : ndarray, shape (dim_a,) samples weights in the source domain - b : ndarray, shape (nt,) + b : ndarray, shape (dim_b,) samples weights in the target domain numItermax : int, optional Max number of iterations @@ -1344,7 +1526,7 @@ def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numI Returns ------- - gamma : ndarray, shape (ns, nt) + gamma : ndarray, shape (dim_a, n_b) Regularized optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -1352,11 +1534,11 @@ def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numI Examples -------- - >>> n_s = 2 - >>> n_t = 2 + >>> n_a = 2 + >>> n_b = 2 >>> reg = 0.1 - >>> X_s = np.reshape(np.arange(n_s), (n_s, 1)) - >>> X_t = np.reshape(np.arange(0, n_t), (n_t, 1)) + >>> X_s = np.reshape(np.arange(n_a), (dim_a, 1)) + >>> X_t = np.reshape(np.arange(0, n_b), (dim_b, 1)) >>> empirical_sinkhorn(X_s, X_t, reg, verbose=False) # doctest: +NORMALIZE_WHITESPACE array([[4.99977301e-01, 2.26989344e-05], [2.26989344e-05, 4.99977301e-01]]) @@ -1405,22 +1587,22 @@ def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', num \gamma\geq 0 where : - - :math:`M` is the (ns,nt) metric cost matrix + - :math:`M` is the (dim_a, n_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - :math:`a` and :math:`b` are source and target weights (sum to 1) Parameters ---------- - X_s : ndarray, shape (ns, d) + X_s : ndarray, shape (n_samples_a, dim) samples in the source domain - X_t : ndarray, shape (nt, d) + X_t : ndarray, shape (n_samples_b, d) samples in the target domain reg : float Regularization term >0 - a : ndarray, shape (ns,) + a : ndarray, shape (n_samples_a,) samples weights in the source domain - b : ndarray, shape (nt,) + b : ndarray, shape (n_samples_b,) samples weights in the target domain numItermax : int, optional Max number of iterations @@ -1434,7 +1616,7 @@ def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', num Returns ------- - gamma : ndarray, shape (ns, nt) + gamma : ndarray, shape (n_samples_a, n_samples_b) Regularized optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -1442,11 +1624,11 @@ def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', num Examples -------- - >>> n_s = 2 - >>> n_t = 2 + >>> n_a = 2 + >>> n_b = 2 >>> reg = 0.1 - >>> X_s = np.reshape(np.arange(n_s), (n_s, 1)) - >>> X_t = np.reshape(np.arange(0, n_t), (n_t, 1)) + >>> X_s = np.reshape(np.arange(n_samples_a), (n_samples_a, 1)) + >>> X_t = np.reshape(np.arange(0, n_samples_b), (n_samples_b, 1)) >>> empirical_sinkhorn2(X_s, X_t, reg, verbose=False) array([4.53978687e-05]) @@ -1513,22 +1695,22 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli \gamma_b\geq 0 where : - - :math:`M` (resp. :math:`M_a, M_b`) is the (ns,nt) metric cost matrix (resp (ns, ns) and (nt, nt)) + - :math:`M` (resp. :math:`M_a, M_b`) is the (dim_a, n_b) metric cost matrix (resp (dim_a, ns) and (dim_b, nt)) - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - :math:`a` and :math:`b` are source and target weights (sum to 1) Parameters ---------- - X_s : ndarray, shape (ns, d) + X_s : ndarray, shape (n_samples_a, dim) samples in the source domain - X_t : ndarray, shape (nt, d) + X_t : ndarray, shape (n_samples_b, dim) samples in the target domain reg : float Regularization term >0 - a : ndarray, shape (ns,) + a : ndarray, shape (n_samples_a,) samples weights in the source domain - b : ndarray, shape (nt,) + b : ndarray, shape (n_samples_b,) samples weights in the target domain numItermax : int, optional Max number of iterations @@ -1541,18 +1723,18 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli Returns ------- - gamma : ndarray, shape (ns, nt) + gamma : ndarray, shape (n_samples_a, n_samples_b) Regularized optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters Examples -------- - >>> n_s = 2 - >>> n_t = 4 + >>> n_a = 2 + >>> n_b = 4 >>> reg = 0.1 - >>> X_s = np.reshape(np.arange(n_s), (n_s, 1)) - >>> X_t = np.reshape(np.arange(0, n_t), (n_t, 1)) + >>> X_s = np.reshape(np.arange(n_samples_a), (n_samples_a, 1)) + >>> X_t = np.reshape(np.arange(0, n_samples_b), (n_samples_b, 1)) >>> empirical_sinkhorn_divergence(X_s, X_t, reg) # doctest: +ELLIPSIS array([1.499...]) diff --git a/ot/unbalanced.py b/ot/unbalanced.py index 0f0692e..3f71d28 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -9,51 +9,56 @@ Regularized Unbalanced OT from __future__ import division import warnings import numpy as np +from scipy.special import logsumexp + # from .utils import unif, dist -def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, - stopThr=1e-9, verbose=False, log=False, **kwargs): +def sinkhorn_unbalanced(a, b, M, reg, reg_m, method='sinkhorn', numItermax=1000, + stopThr=1e-6, verbose=False, log=False, **kwargs): r""" - Solve the unbalanced entropic regularization optimal transport problem and return the loss + Solve the unbalanced entropic regularization optimal transport problem + and return the OT plan The function solves the following optimization problem: .. math:: - W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\alpha KL(\gamma 1, a) + \\alpha KL(\gamma^T 1, b) + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + reg_m KL(\gamma 1, a) + reg_m KL(\gamma^T 1, b) s.t. \gamma\geq 0 where : - - M is the (ns, nt) metric cost matrix - - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - - a and b are source and target weights + - M is the (dim_a, dim_b) metric cost matrix + - :math:`\Omega` is the entropic regularization + term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` + - a and b are source and target unbalanced distributions - KL is the Kullback-Leibler divergence - The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10, 23]_ + The algorithm used for solving the problem is the generalized + Sinkhorn-Knopp matrix scaling algorithm as proposed in [10, 23]_ Parameters ---------- - a : np.ndarray (ns,) - samples weights in the source domain - b : np.ndarray (nt,) or np.ndarray (nt,n_hists) - samples in the target domain, compute sinkhorn with multiple targets - and fixed M if b is a matrix (return OT loss + dual variables in log) - M : np.ndarray (ns, nt) + a : np.ndarray (dim_a,) + Unnormalized histogram of dimension dim_a + b : np.ndarray (dim_b,) or np.ndarray (dim_b, n_hists) + One or multiple unnormalized histograms of dimension dim_b + If many, compute all the OT distances (a, b_i) + M : np.ndarray (dim_a, dim_b) loss matrix reg : float Entropy regularization term > 0 - alpha : float + reg_m: float Marginal relaxation term > 0 method : str method used for the solver either 'sinkhorn', 'sinkhorn_stabilized' or - 'sinkhorn_epsilon_scaling', see those function for specific parameters + 'sinkhorn_reg_scaling', see those function for specific parameters numItermax : int, optional Max number of iterations stopThr : float, optional - Stop threshol on error (> 0) + Stop threshol on error (>0) verbose : bool, optional Print information along iterations log : bool, optional @@ -62,10 +67,16 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, Returns ------- - W : (nt) ndarray or float - Optimal transportation matrix for the given parameters - log : dict - log dictionary return only if log==True in parameters + if n_hists == 1: + gamma : (dim_a x dim_b) ndarray + Optimal transportation matrix for the given parameters + log : dict + log dictionary returned only if `log` is `True` + else: + ot_distance : (n_hists,) ndarray + the OT distance between `a` and each of the histograms `b_i` + log : dict + log dictionary returned only if `log` is `True` Examples -------- @@ -82,83 +93,96 @@ def sinkhorn_unbalanced(a, b, M, reg, alpha, method='sinkhorn', numItermax=1000, References ---------- - .. [2] M. Cuturi, Sinkhorn Distances : Lightspeed Computation of Optimal Transport, Advances in Neural Information Processing Systems (NIPS) 26, 2013 + .. [2] M. Cuturi, Sinkhorn Distances : Lightspeed Computation of Optimal + Transport, Advances in Neural Information Processing Systems + (NIPS) 26, 2013 - .. [9] Schmitzer, B. (2016). Stabilized Sparse Scaling Algorithms for Entropy Regularized Transport Problems. arXiv preprint arXiv:1610.06519. + .. [9] Schmitzer, B. (2016). Stabilized Sparse Scaling Algorithms for + Entropy Regularized Transport Problems. arXiv preprint arXiv:1610.06519. - .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). + Scaling algorithms for unbalanced transport problems. arXiv preprint + arXiv:1607.05816. - .. [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : Learning with a Wasserstein Loss, Advances in Neural Information Processing Systems (NIPS) 2015 + .. [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : + Learning with a Wasserstein Loss, Advances in Neural Information + Processing Systems (NIPS) 2015 See Also -------- ot.unbalanced.sinkhorn_knopp_unbalanced : Unbalanced Classic Sinkhorn [10] - ot.unbalanced.sinkhorn_stabilized_unbalanced: Unbalanced Stabilized sinkhorn [9][10] - ot.unbalanced.sinkhorn_epsilon_scaling_unbalanced: Unbalanced Sinkhorn with epslilon scaling [9][10] + ot.unbalanced.sinkhorn_stabilized_unbalanced: + Unbalanced Stabilized sinkhorn [9][10] + ot.unbalanced.sinkhorn_reg_scaling_unbalanced: + Unbalanced Sinkhorn with epslilon scaling [9][10] """ if method.lower() == 'sinkhorn': - def sink(): - return sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, - numItermax=numItermax, - stopThr=stopThr, verbose=verbose, - log=log, **kwargs) - - elif method.lower() in ['sinkhorn_stabilized', 'sinkhorn_epsilon_scaling']: + return _sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) + + elif method.lower() == 'sinkhorn_stabilized': + return _sinkhorn_stabilized_unbalanced(a, b, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, + verbose=verbose, + log=log, **kwargs) + elif method.lower() in ['sinkhorn_reg_scaling']: warnings.warn('Method not implemented yet. Using classic Sinkhorn Knopp') - - def sink(): - return sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, - numItermax=numItermax, - stopThr=stopThr, verbose=verbose, - log=log, **kwargs) + return _sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) else: - raise ValueError('Unknown method. Using classic Sinkhorn Knopp') - - return sink() + raise ValueError("Unknown method '%s'." % method) -def sinkhorn_unbalanced2(a, b, M, reg, alpha, method='sinkhorn', - numItermax=1000, stopThr=1e-9, verbose=False, +def sinkhorn_unbalanced2(a, b, M, reg, reg_m, method='sinkhorn', + numItermax=1000, stopThr=1e-6, verbose=False, log=False, **kwargs): r""" - Solve the entropic regularization unbalanced optimal transport problem and return the loss + Solve the entropic regularization unbalanced optimal transport problem and + return the loss The function solves the following optimization problem: .. math:: - W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\alpha KL(\gamma 1, a) + \\alpha KL(\gamma^T 1, b) + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + reg_m KL(\gamma 1, a) + reg_m KL(\gamma^T 1, b) s.t. \gamma\geq 0 where : - - M is the (ns, nt) metric cost matrix - - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - - a and b are source and target weights + - M is the (dim_a, dim_b) metric cost matrix + - :math:`\Omega` is the entropic regularization term + :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` + - a and b are source and target unbalanced distributions - KL is the Kullback-Leibler divergence - The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10, 23]_ + The algorithm used for solving the problem is the generalized + Sinkhorn-Knopp matrix scaling algorithm as proposed in [10, 23]_ Parameters ---------- - a : np.ndarray (ns,) - samples weights in the source domain - b : np.ndarray (nt,) or np.ndarray (nt, n_hists) - samples in the target domain, compute sinkhorn with multiple targets - and fixed M if b is a matrix (return OT loss + dual variables in log) - M : np.ndarray (ns,nt) + a : np.ndarray (dim_a,) + Unnormalized histogram of dimension dim_a + b : np.ndarray (dim_b,) or np.ndarray (dim_b, n_hists) + One or multiple unnormalized histograms of dimension dim_b + If many, compute all the OT distances (a, b_i) + M : np.ndarray (dim_a, dim_b) loss matrix reg : float Entropy regularization term > 0 - alpha : float + reg_m: float Marginal relaxation term > 0 method : str method used for the solver either 'sinkhorn', 'sinkhorn_stabilized' or - 'sinkhorn_epsilon_scaling', see those function for specific parameters + 'sinkhorn_reg_scaling', see those function for specific parameters numItermax : int, optional Max number of iterations stopThr : float, optional @@ -171,10 +195,10 @@ def sinkhorn_unbalanced2(a, b, M, reg, alpha, method='sinkhorn', Returns ------- - W : (nt) ndarray or float - Optimal transportation matrix for the given parameters + ot_distance : (n_hists,) ndarray + the OT distance between `a` and each of the histograms `b_i` log : dict - log dictionary return only if log==True in parameters + log dictionary returned only if `log` is `True` Examples -------- @@ -191,64 +215,70 @@ def sinkhorn_unbalanced2(a, b, M, reg, alpha, method='sinkhorn', References ---------- - .. [2] M. Cuturi, Sinkhorn Distances : Lightspeed Computation of Optimal Transport, Advances in Neural Information Processing Systems (NIPS) 26, 2013 + .. [2] M. Cuturi, Sinkhorn Distances : Lightspeed Computation of Optimal + Transport, Advances in Neural Information Processing Systems + (NIPS) 26, 2013 - .. [9] Schmitzer, B. (2016). Stabilized Sparse Scaling Algorithms for Entropy Regularized Transport Problems. arXiv preprint arXiv:1610.06519. + .. [9] Schmitzer, B. (2016). Stabilized Sparse Scaling Algorithms for + Entropy Regularized Transport Problems. arXiv preprint arXiv:1610.06519. - .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). + Scaling algorithms for unbalanced transport problems. arXiv preprint + arXiv:1607.05816. - .. [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : Learning with a Wasserstein Loss, Advances in Neural Information Processing Systems (NIPS) 2015 + .. [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : + Learning with a Wasserstein Loss, Advances in Neural Information + Processing Systems (NIPS) 2015 See Also -------- ot.unbalanced.sinkhorn_knopp : Unbalanced Classic Sinkhorn [10] ot.unbalanced.sinkhorn_stabilized: Unbalanced Stabilized sinkhorn [9][10] - ot.unbalanced.sinkhorn_epsilon_scaling: Unbalanced Sinkhorn with epslilon scaling [9][10] + ot.unbalanced.sinkhorn_reg_scaling: Unbalanced Sinkhorn with epslilon scaling [9][10] """ - - if method.lower() == 'sinkhorn': - def sink(): - return sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, - numItermax=numItermax, - stopThr=stopThr, verbose=verbose, - log=log, **kwargs) - - elif method.lower() in ['sinkhorn_stabilized', 'sinkhorn_epsilon_scaling']: - warnings.warn('Method not implemented yet. Using classic Sinkhorn Knopp') - - def sink(): - return sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, - numItermax=numItermax, - stopThr=stopThr, verbose=verbose, - log=log, **kwargs) - else: - raise ValueError('Unknown method. Using classic Sinkhorn Knopp') - b = np.asarray(b, dtype=np.float64) if len(b.shape) < 2: b = b[:, None] - - return sink() + if method.lower() == 'sinkhorn': + return _sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) + + elif method.lower() == 'sinkhorn_stabilized': + return _sinkhorn_stabilized_unbalanced(a, b, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, + verbose=verbose, + log=log, **kwargs) + elif method.lower() in ['sinkhorn_reg_scaling']: + warnings.warn('Method not implemented yet. Using classic Sinkhorn Knopp') + return _sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) + else: + raise ValueError('Unknown method %s.' % method) -def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, - stopThr=1e-9, verbose=False, log=False, **kwargs): +def _sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, numItermax=1000, + stopThr=1e-6, verbose=False, log=False, **kwargs): r""" Solve the entropic regularization unbalanced optimal transport problem and return the loss The function solves the following optimization problem: .. math:: - W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \\alpha KL(\gamma 1, a) + \\alpha KL(\gamma^T 1, b) + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + \reg_m KL(\gamma 1, a) + \reg_m KL(\gamma^T 1, b) s.t. \gamma\geq 0 where : - - M is the (ns, nt) metric cost matrix + - M is the (dim_a, dim_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - - a and b are source and target weights + - a and b are source and target unbalanced distributions - KL is the Kullback-Leibler divergence The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10, 23]_ @@ -256,16 +286,16 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, Parameters ---------- - a : np.ndarray (ns,) - samples weights in the source domain - b : np.ndarray (nt,) or np.ndarray (nt, n_hists) - samples in the target domain, compute sinkhorn with multiple targets - and fixed M if b is a matrix (return OT loss + dual variables in log) - M : np.ndarray (ns,nt) + a : np.ndarray (dim_a,) + Unnormalized histogram of dimension dim_a + b : np.ndarray (dim_b,) or np.ndarray (dim_b, n_hists) + One or multiple unnormalized histograms of dimension dim_b + If many, compute all the OT distances (a, b_i) + M : np.ndarray (dim_a, dim_b) loss matrix reg : float Entropy regularization term > 0 - alpha : float + reg_m: float Marginal relaxation term > 0 numItermax : int, optional Max number of iterations @@ -279,11 +309,16 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, Returns ------- - gamma : (ns x nt) ndarray - Optimal transportation matrix for the given parameters - log : dict - log dictionary return only if log==True in parameters - + if n_hists == 1: + gamma : (dim_a x dim_b) ndarray + Optimal transportation matrix for the given parameters + log : dict + log dictionary returned only if `log` is `True` + else: + ot_distance : (n_hists,) ndarray + the OT distance between `a` and each of the histograms `b_i` + log : dict + log dictionary returned only if `log` is `True` Examples -------- @@ -291,16 +326,20 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, >>> a=[.5, .5] >>> b=[.5, .5] >>> M=[[0., 1.],[1., 0.]] - >>> ot.unbalanced.sinkhorn_knopp_unbalanced(a, b, M, 1., 1.) + >>> ot.unbalanced._sinkhorn_knopp_unbalanced(a, b, M, 1., 1.) array([[0.51122823, 0.18807035], [0.18807035, 0.51122823]]) References ---------- - .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). + Scaling algorithms for unbalanced transport problems. arXiv preprint + arXiv:1607.05816. - .. [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : Learning with a Wasserstein Loss, Advances in Neural Information Processing Systems (NIPS) 2015 + .. [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : + Learning with a Wasserstein Loss, Advances in Neural Information + Processing Systems (NIPS) 2015 See Also -------- @@ -313,12 +352,12 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, b = np.asarray(b, dtype=np.float64) M = np.asarray(M, dtype=np.float64) - n_a, n_b = M.shape + dim_a, dim_b = M.shape if len(a) == 0: - a = np.ones(n_a, dtype=np.float64) / n_a + a = np.ones(dim_a, dtype=np.float64) / dim_a if len(b) == 0: - b = np.ones(n_b, dtype=np.float64) / n_b + b = np.ones(dim_b, dtype=np.float64) / dim_b if len(b.shape) > 1: n_hists = b.shape[1] @@ -331,21 +370,19 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, # we assume that no distances are null except those of the diagonal of # distances if n_hists: - u = np.ones((n_a, 1)) / n_a - v = np.ones((n_b, n_hists)) / n_b - a = a.reshape(n_a, 1) + u = np.ones((dim_a, 1)) / dim_a + v = np.ones((dim_b, n_hists)) / dim_b + a = a.reshape(dim_a, 1) else: - u = np.ones(n_a) / n_a - v = np.ones(n_b) / n_b + u = np.ones(dim_a) / dim_a + v = np.ones(dim_b) / dim_b - # print(reg) # Next 3 lines equivalent to K= np.exp(-M/reg), but faster to compute K = np.empty(M.shape, dtype=M.dtype) np.divide(M, -reg, out=K) np.exp(K, out=K) - # print(np.min(K)) - fi = alpha / (alpha + reg) + fi = reg_m / (reg_m + reg) cpt = 0 err = 1. @@ -371,8 +408,9 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, if cpt % 10 == 0: # we can speed up the process by checking for the error only all # the 10th iterations - err = np.sum((u - uprev)**2) / np.sum((u)**2) + \ - np.sum((v - vprev)**2) / np.sum((v)**2) + err_u = abs(u - uprev).max() / max(abs(u).max(), abs(uprev).max(), 1.) + err_v = abs(v - vprev).max() / max(abs(v).max(), abs(vprev).max(), 1.) + err = 0.5 * (err_u + err_v) if log: log['err'].append(err) if verbose: @@ -383,8 +421,8 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, cpt += 1 if log: - log['u'] = u - log['v'] = v + log['logu'] = np.log(u + 1e-16) + log['logv'] = np.log(v + 1e-16) if n_hists: # return only loss res = np.einsum('ik,ij,jk,ij->k', u, K, v, M) @@ -401,9 +439,224 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, alpha, numItermax=1000, return u[:, None] * K * v[None, :] -def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, - stopThr=1e-4, verbose=False, log=False): - r"""Compute the entropic regularized unbalanced wasserstein barycenter of distributions A +def _sinkhorn_stabilized_unbalanced(a, b, M, reg, reg_m, tau=1e5, numItermax=1000, + stopThr=1e-6, verbose=False, log=False, + **kwargs): + r""" + Solve the entropic regularization unbalanced optimal transport + problem and return the loss + + The function solves the following optimization problem using log-domain + stabilization as proposed in [10]: + + .. math:: + W = \min_\gamma <\gamma,M>_F + reg\cdot\Omega(\gamma) + reg_m KL(\gamma 1, a) + reg_m KL(\gamma^T 1, b) + + s.t. + \gamma\geq 0 + where : + + - M is the (dim_a, dim_b) metric cost matrix + - :math:`\Omega` is the entropic regularization + term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` + - a and b are source and target unbalanced distributions + - KL is the Kullback-Leibler divergence + + The algorithm used for solving the problem is the generalized + Sinkhorn-Knopp matrix scaling algorithm as proposed in [10, 23]_ + + + Parameters + ---------- + a : np.ndarray (dim_a,) + Unnormalized histogram of dimension dim_a + b : np.ndarray (dim_b,) or np.ndarray (dim_b, n_hists) + One or multiple unnormalized histograms of dimension dim_b + If many, compute all the OT distances (a, b_i) + M : np.ndarray (dim_a, dim_b) + loss matrix + reg : float + Entropy regularization term > 0 + reg_m: float + Marginal relaxation term > 0 + tau : float + thershold for max value in u or v for log scaling + numItermax : int, optional + Max number of iterations + stopThr : float, optional + Stop threshol on error (>0) + verbose : bool, optional + Print information along iterations + log : bool, optional + record log if True + + + Returns + ------- + if n_hists == 1: + gamma : (dim_a x dim_b) ndarray + Optimal transportation matrix for the given parameters + log : dict + log dictionary returned only if `log` is `True` + else: + ot_distance : (n_hists,) ndarray + the OT distance between `a` and each of the histograms `b_i` + log : dict + log dictionary returned only if `log` is `True` + Examples + -------- + + >>> import ot + >>> a=[.5, .5] + >>> b=[.5, .5] + >>> M=[[0., 1.],[1., 0.]] + >>> ot.unbalanced._sinkhorn_stabilized_unbalanced(a, b, M, 1., 1.) + array([[0.51122823, 0.18807035], + [0.18807035, 0.51122823]]) + + References + ---------- + + .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). + Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + + .. [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : + Learning with a Wasserstein Loss, Advances in Neural Information + Processing Systems (NIPS) 2015 + + See Also + -------- + ot.lp.emd : Unregularized OT + ot.optim.cg : General regularized OT + + """ + + a = np.asarray(a, dtype=np.float64) + b = np.asarray(b, dtype=np.float64) + M = np.asarray(M, dtype=np.float64) + + dim_a, dim_b = M.shape + + if len(a) == 0: + a = np.ones(dim_a, dtype=np.float64) / dim_a + if len(b) == 0: + b = np.ones(dim_b, dtype=np.float64) / dim_b + + if len(b.shape) > 1: + n_hists = b.shape[1] + else: + n_hists = 0 + + if log: + log = {'err': []} + + # we assume that no distances are null except those of the diagonal of + # distances + if n_hists: + u = np.ones((dim_a, n_hists)) / dim_a + v = np.ones((dim_b, n_hists)) / dim_b + a = a.reshape(dim_a, 1) + else: + u = np.ones(dim_a) / dim_a + v = np.ones(dim_b) / dim_b + + # print(reg) + # Next 3 lines equivalent to K= np.exp(-M/reg), but faster to compute + K = np.empty(M.shape, dtype=M.dtype) + np.divide(M, -reg, out=K) + np.exp(K, out=K) + + fi = reg_m / (reg_m + reg) + + cpt = 0 + err = 1. + alpha = np.zeros(dim_a) + beta = np.zeros(dim_b) + while (err > stopThr and cpt < numItermax): + uprev = u + vprev = v + + Kv = K.dot(v) + f_alpha = np.exp(- alpha / (reg + reg_m)) + f_beta = np.exp(- beta / (reg + reg_m)) + + if n_hists: + f_alpha = f_alpha[:, None] + f_beta = f_beta[:, None] + u = ((a / (Kv + 1e-16)) ** fi) * f_alpha + Ktu = K.T.dot(u) + v = ((b / (Ktu + 1e-16)) ** fi) * f_beta + absorbing = False + if (u > tau).any() or (v > tau).any(): + absorbing = True + if n_hists: + alpha = alpha + reg * np.log(np.max(u, 1)) + beta = beta + reg * np.log(np.max(v, 1)) + else: + alpha = alpha + reg * np.log(np.max(u)) + beta = beta + reg * np.log(np.max(v)) + K = np.exp((alpha[:, None] + beta[None, :] - + M) / reg) + v = np.ones_like(v) + Kv = K.dot(v) + + if (np.any(Ktu == 0.) + or np.any(np.isnan(u)) or np.any(np.isnan(v)) + or np.any(np.isinf(u)) or np.any(np.isinf(v))): + # we have reached the machine precision + # come back to previous solution and quit loop + warnings.warn('Numerical errors at iteration %s' % cpt) + u = uprev + v = vprev + break + if (cpt % 10 == 0 and not absorbing) or cpt == 0: + # we can speed up the process by checking for the error only all + # the 10th iterations + err = abs(u - uprev).max() / max(abs(u).max(), abs(uprev).max(), + 1.) + if log: + log['err'].append(err) + if verbose: + if cpt % 200 == 0: + print( + '{:5s}|{:12s}'.format('It.', 'Err') + '\n' + '-' * 19) + print('{:5d}|{:8e}|'.format(cpt, err)) + cpt = cpt + 1 + + if err > stopThr: + warnings.warn("Stabilized Unbalanced Sinkhorn did not converge." + + "Try a larger entropy `reg` or a lower mass `reg_m`." + + "Or a larger absorption threshold `tau`.") + if n_hists: + logu = alpha[:, None] / reg + np.log(u) + logv = beta[:, None] / reg + np.log(v) + else: + logu = alpha / reg + np.log(u) + logv = beta / reg + np.log(v) + if log: + log['logu'] = logu + log['logv'] = logv + if n_hists: # return only loss + res = logsumexp(np.log(M + 1e-100)[:, :, None] + logu[:, None, :] + + logv[None, :, :] - M[:, :, None] / reg, axis=(0, 1)) + res = np.exp(res) + if log: + return res, log + else: + return res + + else: # return OT matrix + ot_matrix = np.exp(logu[:, None] + logv[None, :] - M / reg) + if log: + return ot_matrix, log + else: + return ot_matrix + + +def _barycenter_unbalanced_stabilized(A, M, reg, reg_m, weights=None, tau=1e3, + numItermax=1000, stopThr=1e-6, + verbose=False, log=False): + r"""Compute the entropic unbalanced wasserstein barycenter of A with stabilization. The function solves the following optimization problem: @@ -412,28 +665,184 @@ def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, where : - - :math:`Wu_{reg}(\cdot,\cdot)` is the unbalanced entropic regularized Wasserstein distance (see ot.unbalanced.sinkhorn_unbalanced) - - :math:`\mathbf{a}_i` are training distributions in the columns of matrix :math:`\mathbf{A}` - - reg and :math:`\mathbf{M}` are respectively the regularization term and the cost matrix for OT - - alpha is the marginal relaxation hyperparameter - The algorithm used for solving the problem is the generalized Sinkhorn-Knopp matrix scaling algorithm as proposed in [10]_ + - :math:`Wu_{reg}(\cdot,\cdot)` is the unbalanced entropic regularized + Wasserstein distance (see ot.unbalanced.sinkhorn_unbalanced) + - :math:`\mathbf{a}_i` are training distributions in the columns of + matrix :math:`\mathbf{A}` + - reg and :math:`\mathbf{M}` are respectively the regularization term and + the cost matrix for OT + - reg_mis the marginal relaxation hyperparameter + The algorithm used for solving the problem is the generalized + Sinkhorn-Knopp matrix scaling algorithm as proposed in [10]_ Parameters ---------- - A : np.ndarray (d,n) - n training distributions a_i of size d - M : np.ndarray (d,d) - loss matrix for OT + A : np.ndarray (dim, n_hists) + `n_hists` training distributions a_i of dimension dim + M : np.ndarray (dim, dim) + ground metric matrix for OT. reg : float Entropy regularization term > 0 - alpha : float + reg_m : float Marginal relaxation term > 0 - weights : np.ndarray (n,) - Weights of each histogram a_i on the simplex (barycentric coodinates) + tau : float + Stabilization threshold for log domain absorption. + weights : np.ndarray (n_hists,) optional + Weight of each distribution (barycentric coodinates) + If None, uniform weights are used. numItermax : int, optional Max number of iterations stopThr : float, optional - Stop threshol on error (>0) + Stop threshol on error (> 0) + verbose : bool, optional + Print information along iterations + log : bool, optional + record log if True + + + Returns + ------- + a : (dim,) ndarray + Unbalanced Wasserstein barycenter + log : dict + log dictionary return only if log==True in parameters + + + References + ---------- + + .. [3] Benamou, J. D., Carlier, G., Cuturi, M., Nenna, L., & Peyré, + G. (2015). Iterative Bregman projections for regularized transportation + problems. SIAM Journal on Scientific Computing, 37(2), A1111-A1138. + .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). + Scaling algorithms for unbalanced transport problems. arXiv preprint + arXiv:1607.05816. + + + """ + dim, n_hists = A.shape + if weights is None: + weights = np.ones(n_hists) / n_hists + else: + assert(len(weights) == A.shape[1]) + + if log: + log = {'err': []} + + fi = reg_m / (reg_m + reg) + + u = np.ones((dim, n_hists)) / dim + v = np.ones((dim, n_hists)) / dim + + # print(reg) + # Next 3 lines equivalent to K= np.exp(-M/reg), but faster to compute + K = np.empty(M.shape, dtype=M.dtype) + np.divide(M, -reg, out=K) + np.exp(K, out=K) + + fi = reg_m / (reg_m + reg) + + cpt = 0 + err = 1. + alpha = np.zeros(dim) + beta = np.zeros(dim) + q = np.ones(dim) / dim + while (err > stopThr and cpt < numItermax): + qprev = q + Kv = K.dot(v) + f_alpha = np.exp(- alpha / (reg + reg_m)) + f_beta = np.exp(- beta / (reg + reg_m)) + f_alpha = f_alpha[:, None] + f_beta = f_beta[:, None] + u = ((A / (Kv + 1e-16)) ** fi) * f_alpha + Ktu = K.T.dot(u) + q = (Ktu ** (1 - fi)) * f_beta + q = q.dot(weights) ** (1 / (1 - fi)) + Q = q[:, None] + v = ((Q / (Ktu + 1e-16)) ** fi) * f_beta + absorbing = False + if (u > tau).any() or (v > tau).any(): + absorbing = True + alpha = alpha + reg * np.log(np.max(u, 1)) + beta = beta + reg * np.log(np.max(v, 1)) + K = np.exp((alpha[:, None] + beta[None, :] - + M) / reg) + v = np.ones_like(v) + Kv = K.dot(v) + if (np.any(Ktu == 0.) + or np.any(np.isnan(u)) or np.any(np.isnan(v)) + or np.any(np.isinf(u)) or np.any(np.isinf(v))): + # we have reached the machine precision + # come back to previous solution and quit loop + warnings.warn('Numerical errors at iteration %s' % cpt) + q = qprev + break + if (cpt % 10 == 0 and not absorbing) or cpt == 0: + # we can speed up the process by checking for the error only all + # the 10th iterations + err = abs(q - qprev).max() / max(abs(q).max(), + abs(qprev).max(), 1.) + if log: + log['err'].append(err) + if verbose: + if cpt % 50 == 0: + print( + '{:5s}|{:12s}'.format('It.', 'Err') + '\n' + '-' * 19) + print('{:5d}|{:8e}|'.format(cpt, err)) + + cpt += 1 + if err > stopThr: + warnings.warn("Stabilized Unbalanced Sinkhorn did not converge." + + "Try a larger entropy `reg` or a lower mass `reg_m`." + + "Or a larger absorption threshold `tau`.") + if log: + log['niter'] = cpt + log['logu'] = np.log(u + 1e-16) + log['logv'] = np.log(v + 1e-16) + return q, log + else: + return q + + +def _barycenter_unbalanced(A, M, reg, reg_m, weights=None, + numItermax=1000, stopThr=1e-6, + verbose=False, log=False): + r"""Compute the entropic unbalanced wasserstein barycenter of A. + + The function solves the following optimization problem with a + + .. math:: + \mathbf{a} = arg\min_\mathbf{a} \sum_i Wu_{reg}(\mathbf{a},\mathbf{a}_i) + + where : + + - :math:`Wu_{reg}(\cdot,\cdot)` is the unbalanced entropic regularized + Wasserstein distance (see ot.unbalanced.sinkhorn_unbalanced) + - :math:`\mathbf{a}_i` are training distributions in the columns of matrix + :math:`\mathbf{A}` + - reg and :math:`\mathbf{M}` are respectively the regularization term and + the cost matrix for OT + - reg_mis the marginal relaxation hyperparameter + The algorithm used for solving the problem is the generalized + Sinkhorn-Knopp matrix scaling algorithm as proposed in [10]_ + + Parameters + ---------- + A : np.ndarray (dim, n_hists) + `n_hists` training distributions a_i of dimension dim + M : np.ndarray (dim, dim) + ground metric matrix for OT. + reg : float + Entropy regularization term > 0 + reg_m: float + Marginal relaxation term > 0 + weights : np.ndarray (n_hists,) optional + Weight of each distribution (barycentric coodinates) + If None, uniform weights are used. + numItermax : int, optional + Max number of iterations + stopThr : float, optional + Stop threshol on error (> 0) verbose : bool, optional Print information along iterations log : bool, optional @@ -442,7 +851,7 @@ def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, Returns ------- - a : (d,) ndarray + a : (dim,) ndarray Unbalanced Wasserstein barycenter log : dict log dictionary return only if log==True in parameters @@ -451,12 +860,16 @@ def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, References ---------- - .. [3] Benamou, J. D., Carlier, G., Cuturi, M., Nenna, L., & Peyré, G. (2015). Iterative Bregman projections for regularized transportation problems. SIAM Journal on Scientific Computing, 37(2), A1111-A1138. - .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). Scaling algorithms for unbalanced transport problems. arXiv preprint arXiv:1607.05816. + .. [3] Benamou, J. D., Carlier, G., Cuturi, M., Nenna, L., & Peyré, G. + (2015). Iterative Bregman projections for regularized transportation + problems. SIAM Journal on Scientific Computing, 37(2), A1111-A1138. + .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). + Scaling algorithms for unbalanced transport problems. arXiv preprin + arXiv:1607.05816. """ - p, n_hists = A.shape + dim, n_hists = A.shape if weights is None: weights = np.ones(n_hists) / n_hists else: @@ -467,10 +880,10 @@ def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, K = np.exp(- M / reg) - fi = alpha / (alpha + reg) + fi = reg_m / (reg_m + reg) - v = np.ones((p, n_hists)) / p - u = np.ones((p, 1)) / p + v = np.ones((dim, n_hists)) / dim + u = np.ones((dim, 1)) / dim cpt = 0 err = 1. @@ -499,8 +912,11 @@ def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, if cpt % 10 == 0: # we can speed up the process by checking for the error only all # the 10th iterations - err = np.sum((u - uprev) ** 2) / np.sum((u) ** 2) + \ - np.sum((v - vprev) ** 2) / np.sum((v) ** 2) + err_u = abs(u - uprev).max() + err_u /= max(abs(u).max(), abs(uprev).max(), 1.) + err_v = abs(v - vprev).max() + err_v /= max(abs(v).max(), abs(vprev).max(), 1.) + err = 0.5 * (err_u + err_v) if log: log['err'].append(err) if verbose: @@ -512,8 +928,95 @@ def barycenter_unbalanced(A, M, reg, alpha, weights=None, numItermax=1000, cpt += 1 if log: log['niter'] = cpt - log['u'] = u - log['v'] = v + log['logu'] = np.log(u + 1e-16) + log['logv'] = np.log(v + 1e-16) return q, log else: return q + + +def barycenter_unbalanced(A, M, reg, reg_m, method="sinkhorn", weights=None, + numItermax=1000, stopThr=1e-6, + verbose=False, log=False, **kwargs): + r"""Compute the entropic unbalanced wasserstein barycenter of A. + + The function solves the following optimization problem with a + + .. math:: + \mathbf{a} = arg\min_\mathbf{a} \sum_i Wu_{reg}(\mathbf{a},\mathbf{a}_i) + + where : + + - :math:`Wu_{reg}(\cdot,\cdot)` is the unbalanced entropic regularized + Wasserstein distance (see ot.unbalanced.sinkhorn_unbalanced) + - :math:`\mathbf{a}_i` are training distributions in the columns of matrix + :math:`\mathbf{A}` + - reg and :math:`\mathbf{M}` are respectively the regularization term and + the cost matrix for OT + - reg_mis the marginal relaxation hyperparameter + The algorithm used for solving the problem is the generalized + Sinkhorn-Knopp matrix scaling algorithm as proposed in [10]_ + + Parameters + ---------- + A : np.ndarray (dim, n_hists) + `n_hists` training distributions a_i of dimension dim + M : np.ndarray (dim, dim) + ground metric matrix for OT. + reg : float + Entropy regularization term > 0 + reg_m: float + Marginal relaxation term > 0 + weights : np.ndarray (n_hists,) optional + Weight of each distribution (barycentric coodinates) + If None, uniform weights are used. + numItermax : int, optional + Max number of iterations + stopThr : float, optional + Stop threshol on error (> 0) + verbose : bool, optional + Print information along iterations + log : bool, optional + record log if True + + + Returns + ------- + a : (dim,) ndarray + Unbalanced Wasserstein barycenter + log : dict + log dictionary return only if log==True in parameters + + + References + ---------- + + .. [3] Benamou, J. D., Carlier, G., Cuturi, M., Nenna, L., & Peyré, G. + (2015). Iterative Bregman projections for regularized transportation + problems. SIAM Journal on Scientific Computing, 37(2), A1111-A1138. + .. [10] Chizat, L., Peyré, G., Schmitzer, B., & Vialard, F. X. (2016). + Scaling algorithms for unbalanced transport problems. arXiv preprin + arXiv:1607.05816. + + """ + + if method.lower() == 'sinkhorn': + return _barycenter_unbalanced(A, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) + + elif method.lower() == 'sinkhorn_stabilized': + return _barycenter_unbalanced_stabilized(A, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, + verbose=verbose, + log=log, **kwargs) + elif method.lower() in ['sinkhorn_reg_scaling']: + warnings.warn('Method not implemented yet. Using classic Sinkhorn Knopp') + return _barycenter_unbalanced(A, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) + else: + raise ValueError("Unknown method '%s'." % method) diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..e69de29 diff --git a/test/test_bregman.py b/test/test_bregman.py index 83ebba8..f70df10 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -7,6 +7,7 @@ import numpy as np import ot +import pytest def test_sinkhorn(): @@ -71,13 +72,11 @@ def test_sinkhorn_variants(): Gs = ot.sinkhorn(u, u, M, 1, method='sinkhorn_stabilized', stopThr=1e-10) Ges = ot.sinkhorn( u, u, M, 1, method='sinkhorn_epsilon_scaling', stopThr=1e-10) - Gerr = ot.sinkhorn(u, u, M, 1, method='do_not_exists', stopThr=1e-10) G_green = ot.sinkhorn(u, u, M, 1, method='greenkhorn', stopThr=1e-10) # check values np.testing.assert_allclose(G0, Gs, atol=1e-05) np.testing.assert_allclose(G0, Ges, atol=1e-05) - np.testing.assert_allclose(G0, Gerr) np.testing.assert_allclose(G0, G_green, atol=1e-5) print(G0, G_green) @@ -96,18 +95,17 @@ def test_sinkhorn_variants_log(): Gs, logs = ot.sinkhorn(u, u, M, 1, method='sinkhorn_stabilized', stopThr=1e-10, log=True) Ges, loges = ot.sinkhorn( u, u, M, 1, method='sinkhorn_epsilon_scaling', stopThr=1e-10, log=True) - Gerr, logerr = ot.sinkhorn(u, u, M, 1, method='do_not_exists', stopThr=1e-10, log=True) G_green, loggreen = ot.sinkhorn(u, u, M, 1, method='greenkhorn', stopThr=1e-10, log=True) # check values np.testing.assert_allclose(G0, Gs, atol=1e-05) np.testing.assert_allclose(G0, Ges, atol=1e-05) - np.testing.assert_allclose(G0, Gerr) np.testing.assert_allclose(G0, G_green, atol=1e-5) print(G0, G_green) -def test_bary(): +@pytest.mark.parametrize("method", ["sinkhorn", "sinkhorn_stabilized"]) +def test_barycenter(method): n_bins = 100 # nb bins @@ -126,14 +124,42 @@ def test_bary(): weights = np.array([1 - alpha, alpha]) # wasserstein - reg = 1e-3 - bary_wass = ot.bregman.barycenter(A, M, reg, weights) + reg = 1e-2 + bary_wass = ot.bregman.barycenter(A, M, reg, weights, method=method) np.testing.assert_allclose(1, np.sum(bary_wass)) ot.bregman.barycenter(A, M, reg, log=True, verbose=True) +def test_barycenter_stabilization(): + + n_bins = 100 # nb bins + + # Gaussian distributions + a1 = ot.datasets.make_1D_gauss(n_bins, m=30, s=10) # m= mean, s= std + a2 = ot.datasets.make_1D_gauss(n_bins, m=40, s=10) + + # creating matrix A containing all distributions + A = np.vstack((a1, a2)).T + + # loss matrix + normalization + M = ot.utils.dist0(n_bins) + M /= M.max() + + alpha = 0.5 # 0<=alpha<=1 + weights = np.array([1 - alpha, alpha]) + + # wasserstein + reg = 1e-2 + bar_stable = ot.bregman.barycenter(A, M, reg, weights, + method="sinkhorn_stabilized", + stopThr=1e-8) + bar = ot.bregman.barycenter(A, M, reg, weights, method="sinkhorn", + stopThr=1e-8) + np.testing.assert_allclose(bar, bar_stable) + + def test_wasserstein_bary_2d(): size = 100 # size of a square image @@ -279,3 +305,35 @@ def test_stabilized_vs_sinkhorn_multidim(): method="sinkhorn", log=True) np.testing.assert_allclose(G, G2) + + +def test_implemented_methods(): + IMPLEMENTED_METHODS = ['sinkhorn', 'sinkhorn_stabilized'] + ONLY_1D_methods = ['greenkhorn', 'sinkhorn_epsilon_scaling'] + NOT_VALID_TOKENS = ['foo'] + # test generalized sinkhorn for unbalanced OT barycenter + n = 3 + rng = np.random.RandomState(42) + + x = rng.randn(n, 2) + a = ot.utils.unif(n) + + # make dists unbalanced + b = ot.utils.unif(n) + A = rng.rand(n, 2) + M = ot.dist(x, x) + epsilon = 1. + + for method in IMPLEMENTED_METHODS: + ot.bregman.sinkhorn(a, b, M, epsilon, method=method) + ot.bregman.sinkhorn2(a, b, M, epsilon, method=method) + ot.bregman.barycenter(A, M, reg=epsilon, method=method) + with pytest.raises(ValueError): + for method in set(NOT_VALID_TOKENS): + ot.bregman.sinkhorn(a, b, M, epsilon, method=method) + ot.bregman.sinkhorn2(a, b, M, epsilon, method=method) + ot.bregman.barycenter(A, M, reg=epsilon, method=method) + for method in ONLY_1D_methods: + ot.bregman.sinkhorn(a, b, M, epsilon, method=method) + with pytest.raises(ValueError): + ot.bregman.sinkhorn2(a, b, M, epsilon, method=method) diff --git a/test/test_unbalanced.py b/test/test_unbalanced.py index 1395fe1..ca1efba 100644 --- a/test/test_unbalanced.py +++ b/test/test_unbalanced.py @@ -7,9 +7,12 @@ import numpy as np import ot import pytest +from ot.unbalanced import barycenter_unbalanced +from scipy.special import logsumexp -@pytest.mark.parametrize("method", ["sinkhorn"]) + +@pytest.mark.parametrize("method", ["sinkhorn", "sinkhorn_stabilized"]) def test_unbalanced_convergence(method): # test generalized sinkhorn for unbalanced OT n = 100 @@ -23,29 +26,35 @@ def test_unbalanced_convergence(method): M = ot.dist(x, x) epsilon = 1. - alpha = 1. - K = np.exp(- M / epsilon) + reg_m = 1. - G, log = ot.unbalanced.sinkhorn_unbalanced(a, b, M, reg=epsilon, alpha=alpha, - stopThr=1e-10, method=method, + G, log = ot.unbalanced.sinkhorn_unbalanced(a, b, M, reg=epsilon, + reg_m=reg_m, + method=method, log=True) - loss = ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, alpha, + loss = ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, reg_m, method=method) # check fixed point equations - fi = alpha / (alpha + epsilon) - v_final = (b / K.T.dot(log["u"])) ** fi - u_final = (a / K.dot(log["v"])) ** fi + # in log-domain + fi = reg_m / (reg_m + epsilon) + logb = np.log(b + 1e-16) + loga = np.log(a + 1e-16) + logKtu = logsumexp(log["logu"][None, :] - M.T / epsilon, axis=1) + logKv = logsumexp(log["logv"][None, :] - M / epsilon, axis=1) + + v_final = fi * (logb - logKtu) + u_final = fi * (loga - logKv) np.testing.assert_allclose( - u_final, log["u"], atol=1e-05) + u_final, log["logu"], atol=1e-05) np.testing.assert_allclose( - v_final, log["v"], atol=1e-05) + v_final, log["logv"], atol=1e-05) # check if sinkhorn_unbalanced2 returns the correct loss np.testing.assert_allclose((G * M).sum(), loss, atol=1e-5) -@pytest.mark.parametrize("method", ["sinkhorn"]) +@pytest.mark.parametrize("method", ["sinkhorn", "sinkhorn_stabilized"]) def test_unbalanced_multiple_inputs(method): # test generalized sinkhorn for unbalanced OT n = 100 @@ -59,28 +68,59 @@ def test_unbalanced_multiple_inputs(method): M = ot.dist(x, x) epsilon = 1. - alpha = 1. - K = np.exp(- M / epsilon) + reg_m = 1. loss, log = ot.unbalanced.sinkhorn_unbalanced(a, b, M, reg=epsilon, - alpha=alpha, - stopThr=1e-10, method=method, + reg_m=reg_m, + method=method, log=True) # check fixed point equations - fi = alpha / (alpha + epsilon) - v_final = (b / K.T.dot(log["u"])) ** fi - - u_final = (a[:, None] / K.dot(log["v"])) ** fi + # in log-domain + fi = reg_m / (reg_m + epsilon) + logb = np.log(b + 1e-16) + loga = np.log(a + 1e-16)[:, None] + logKtu = logsumexp(log["logu"][:, None, :] - M[:, :, None] / epsilon, + axis=0) + logKv = logsumexp(log["logv"][None, :] - M[:, :, None] / epsilon, axis=1) + v_final = fi * (logb - logKtu) + u_final = fi * (loga - logKv) np.testing.assert_allclose( - u_final, log["u"], atol=1e-05) + u_final, log["logu"], atol=1e-05) np.testing.assert_allclose( - v_final, log["v"], atol=1e-05) + v_final, log["logv"], atol=1e-05) assert len(loss) == b.shape[1] -def test_unbalanced_barycenter(): +def test_stabilized_vs_sinkhorn(): + # test if stable version matches sinkhorn + n = 100 + + # Gaussian distributions + a = ot.datasets.make_1D_gauss(n, m=20, s=5) # m= mean, s= std + b1 = ot.datasets.make_1D_gauss(n, m=60, s=8) + b2 = ot.datasets.make_1D_gauss(n, m=30, s=4) + + # creating matrix A containing all distributions + b = np.vstack((b1, b2)).T + + M = ot.utils.dist0(n) + M /= np.median(M) + epsilon = 0.1 + reg_m = 1. + G, log = ot.unbalanced.sinkhorn_unbalanced2(a, b, M, reg=epsilon, + method="sinkhorn_stabilized", + reg_m=reg_m, + log=True) + G2, log2 = ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, reg_m, + method="sinkhorn", log=True) + + np.testing.assert_allclose(G, G2, atol=1e-5) + + +@pytest.mark.parametrize("method", ["sinkhorn", "sinkhorn_stabilized"]) +def test_unbalanced_barycenter(method): # test generalized sinkhorn for unbalanced OT barycenter n = 100 rng = np.random.RandomState(42) @@ -92,27 +132,56 @@ def test_unbalanced_barycenter(): A = A * np.array([1, 2])[None, :] M = ot.dist(x, x) epsilon = 1. - alpha = 1. - K = np.exp(- M / epsilon) + reg_m = 1. - q, log = ot.unbalanced.barycenter_unbalanced(A, M, reg=epsilon, alpha=alpha, - stopThr=1e-10, - log=True) + q, log = barycenter_unbalanced(A, M, reg=epsilon, reg_m=reg_m, + method=method, log=True) # check fixed point equations - fi = alpha / (alpha + epsilon) - v_final = (q[:, None] / K.T.dot(log["u"])) ** fi - u_final = (A / K.dot(log["v"])) ** fi + fi = reg_m / (reg_m + epsilon) + logA = np.log(A + 1e-16) + logq = np.log(q + 1e-16)[:, None] + logKtu = logsumexp(log["logu"][:, None, :] - M[:, :, None] / epsilon, + axis=0) + logKv = logsumexp(log["logv"][None, :] - M[:, :, None] / epsilon, axis=1) + v_final = fi * (logq - logKtu) + u_final = fi * (logA - logKv) np.testing.assert_allclose( - u_final, log["u"], atol=1e-05) + u_final, log["logu"], atol=1e-05) np.testing.assert_allclose( - v_final, log["v"], atol=1e-05) + v_final, log["logv"], atol=1e-05) + + +def test_barycenter_stabilized_vs_sinkhorn(): + # test generalized sinkhorn for unbalanced OT barycenter + n = 100 + rng = np.random.RandomState(42) + + x = rng.randn(n, 2) + A = rng.rand(n, 2) + + # make dists unbalanced + A = A * np.array([1, 4])[None, :] + M = ot.dist(x, x) + epsilon = 0.5 + reg_m = 10 + + qstable, log = barycenter_unbalanced(A, M, reg=epsilon, + reg_m=reg_m, log=True, + tau=100, + method="sinkhorn_stabilized", + ) + q, log = barycenter_unbalanced(A, M, reg=epsilon, reg_m=reg_m, + method="sinkhorn", + log=True) + + np.testing.assert_allclose( + q, qstable, atol=1e-05) def test_implemented_methods(): - IMPLEMENTED_METHODS = ['sinkhorn'] - TO_BE_IMPLEMENTED_METHODS = ['sinkhorn_stabilized', - 'sinkhorn_epsilon_scaling'] + IMPLEMENTED_METHODS = ['sinkhorn', 'sinkhorn_stabilized'] + TO_BE_IMPLEMENTED_METHODS = ['sinkhorn_reg_scaling'] NOT_VALID_TOKENS = ['foo'] # test generalized sinkhorn for unbalanced OT barycenter n = 3 @@ -123,24 +192,30 @@ def test_implemented_methods(): # make dists unbalanced b = ot.utils.unif(n) * 1.5 - + A = rng.rand(n, 2) M = ot.dist(x, x) epsilon = 1. - alpha = 1. + reg_m = 1. for method in IMPLEMENTED_METHODS: - ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, + ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, reg_m, method=method) - ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, alpha, + ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, reg_m, method=method) + barycenter_unbalanced(A, M, reg=epsilon, reg_m=reg_m, + method=method) with pytest.warns(UserWarning, match='not implemented'): for method in set(TO_BE_IMPLEMENTED_METHODS): - ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, + ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, reg_m, method=method) - ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, alpha, + ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, reg_m, method=method) + barycenter_unbalanced(A, M, reg=epsilon, reg_m=reg_m, + method=method) with pytest.raises(ValueError): for method in set(NOT_VALID_TOKENS): - ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, alpha, + ot.unbalanced.sinkhorn_unbalanced(a, b, M, epsilon, reg_m, method=method) - ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, alpha, + ot.unbalanced.sinkhorn_unbalanced2(a, b, M, epsilon, reg_m, method=method) + barycenter_unbalanced(A, M, reg=epsilon, reg_m=reg_m, + method=method) -- cgit v1.2.3 From 7f4af32c70452ff12fa8c15dea317c14d3d97878 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Wed, 28 Aug 2019 15:40:40 +0200 Subject: correct call of unbalanced with reg_m --- ot/da.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ot/da.py b/ot/da.py index 2af855d..108a38d 100644 --- a/ot/da.py +++ b/ot/da.py @@ -1902,7 +1902,7 @@ class UnbalancedSinkhornTransport(BaseTransport): returned_ = sinkhorn_unbalanced( a=self.mu_s, b=self.mu_t, M=self.cost_, - reg=self.reg_e, alpha=self.reg_m, method=self.method, + reg=self.reg_e, reg_m=self.reg_m, method=self.method, numItermax=self.max_iter, stopThr=self.tol, verbose=self.verbose, log=self.log) -- cgit v1.2.3 From f4e8523c92a96d061040e3f25037e129d67a2d94 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Wed, 28 Aug 2019 15:47:52 +0200 Subject: fix empirical sinkhorn doc-example --- ot/bregman.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index 2f27d58..76698c2 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1534,11 +1534,11 @@ def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numI Examples -------- - >>> n_a = 2 - >>> n_b = 2 + >>> n_samples_a = 2 + >>> n_samples_b = 2 >>> reg = 0.1 - >>> X_s = np.reshape(np.arange(n_a), (dim_a, 1)) - >>> X_t = np.reshape(np.arange(0, n_b), (dim_b, 1)) + >>> X_s = np.reshape(np.arange(n_samples_a), (n_samples_a, 1)) + >>> X_t = np.reshape(np.arange(0, n_samples_b), (n_samples_b, 1)) >>> empirical_sinkhorn(X_s, X_t, reg, verbose=False) # doctest: +NORMALIZE_WHITESPACE array([[4.99977301e-01, 2.26989344e-05], [2.26989344e-05, 4.99977301e-01]]) @@ -1624,8 +1624,8 @@ def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', num Examples -------- - >>> n_a = 2 - >>> n_b = 2 + >>> n_samples_a = 2 + >>> n_samples_b = 2 >>> reg = 0.1 >>> X_s = np.reshape(np.arange(n_samples_a), (n_samples_a, 1)) >>> X_t = np.reshape(np.arange(0, n_samples_b), (n_samples_b, 1)) @@ -1730,8 +1730,8 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli Examples -------- - >>> n_a = 2 - >>> n_b = 4 + >>> n_samples_a = 2 + >>> n_samples_b = 4 >>> reg = 0.1 >>> X_s = np.reshape(np.arange(n_samples_a), (n_samples_a, 1)) >>> X_t = np.reshape(np.arange(0, n_samples_b), (n_samples_b, 1)) -- cgit v1.2.3 From c7269d3fc72c679711699a9df7b5670b0dd176b0 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Tue, 3 Sep 2019 17:26:22 +0200 Subject: style + make funcs public --- ot/bregman.py | 180 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 95 insertions(+), 85 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index 76698c2..02aeb6d 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -33,7 +33,7 @@ def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, \gamma\geq 0 where : - - M is the (dim_a, n_b) metric cost matrix + - M is the (dim_a, dim_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - a and b are source and target weights (sum to 1) @@ -47,7 +47,7 @@ def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, b : ndarray, shape (dim_b,) or ndarray, shape (dim_b, n_hists) samples in the target domain, compute sinkhorn with multiple targets and fixed M if b is a matrix (return OT loss + dual variables in log) - M : ndarray, shape (dim_a, n_b) + M : ndarray, shape (dim_a, dim_b) loss matrix reg : float Regularization term >0 @@ -66,7 +66,7 @@ def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, Returns ------- - gamma : ndarray, shape (dim_a, n_b) + gamma : ndarray, shape (dim_a, dim_b) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -105,21 +105,21 @@ def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, """ if method.lower() == 'sinkhorn': - return _sinkhorn_knopp(a, b, M, reg, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, log=log, - **kwargs) + return sinkhorn_knopp(a, b, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, log=log, + **kwargs) elif method.lower() == 'greenkhorn': - return _greenkhorn(a, b, M, reg, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, log=log) + return greenkhorn(a, b, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, log=log) elif method.lower() == 'sinkhorn_stabilized': - return _sinkhorn_stabilized(a, b, M, reg, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, - log=log, **kwargs) + return sinkhorn_stabilized(a, b, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) elif method.lower() == 'sinkhorn_epsilon_scaling': - return _sinkhorn_epsilon_scaling(a, b, M, reg, - numItermax=numItermax, - stopThr=stopThr, verbose=verbose, - log=log, **kwargs) + return sinkhorn_epsilon_scaling(a, b, M, reg, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) else: raise ValueError("Unknown method '%s'." % method) @@ -141,7 +141,7 @@ def sinkhorn2(a, b, M, reg, method='sinkhorn', numItermax=1000, \gamma\geq 0 where : - - M is the (dim_a, n_b) metric cost matrix + - M is the (dim_a, dim_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - a and b are source and target weights (sum to 1) @@ -155,7 +155,7 @@ def sinkhorn2(a, b, M, reg, method='sinkhorn', numItermax=1000, b : ndarray, shape (dim_b,) or ndarray, shape (dim_b, n_hists) samples in the target domain, compute sinkhorn with multiple targets and fixed M if b is a matrix (return OT loss + dual variables in log) - M : ndarray, shape (dim_a, n_b) + M : ndarray, shape (dim_a, dim_b) loss matrix reg : float Regularization term >0 @@ -173,8 +173,8 @@ def sinkhorn2(a, b, M, reg, method='sinkhorn', numItermax=1000, Returns ------- - W : (nt) ndarray or float - Optimal transportation matrix for the given parameters + W : (n_hists) ndarray or float + Optimal transportation loss for the given parameters log : dict log dictionary return only if log==True in parameters @@ -217,21 +217,23 @@ def sinkhorn2(a, b, M, reg, method='sinkhorn', numItermax=1000, if len(b.shape) < 2: b = b[:, None] if method.lower() == 'sinkhorn': - return _sinkhorn_knopp(a, b, M, reg, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, log=log, **kwargs) + return sinkhorn_knopp(a, b, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, log=log, + **kwargs) elif method.lower() == 'sinkhorn_stabilized': - return _sinkhorn_stabilized(a, b, M, reg, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, log=log, **kwargs) + return sinkhorn_stabilized(a, b, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, log=log, + **kwargs) elif method.lower() == 'sinkhorn_epsilon_scaling': - return _sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, - log=log, **kwargs) + return sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) else: raise ValueError("Unknown method '%s'." % method) -def _sinkhorn_knopp(a, b, M, reg, numItermax=1000, - stopThr=1e-9, verbose=False, log=False, **kwargs): +def sinkhorn_knopp(a, b, M, reg, numItermax=1000, + stopThr=1e-9, verbose=False, log=False, **kwargs): r""" Solve the entropic regularization optimal transport problem and return the OT matrix @@ -247,7 +249,7 @@ def _sinkhorn_knopp(a, b, M, reg, numItermax=1000, \gamma\geq 0 where : - - M is the (dim_a, n_b) metric cost matrix + - M is the (dim_a, dim_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - a and b are source and target weights (sum to 1) @@ -261,7 +263,7 @@ def _sinkhorn_knopp(a, b, M, reg, numItermax=1000, b : ndarray, shape (dim_b,) or ndarray, shape (dim_b, n_hists) samples in the target domain, compute sinkhorn with multiple targets and fixed M if b is a matrix (return OT loss + dual variables in log) - M : ndarray, shape (dim_a, n_b) + M : ndarray, shape (dim_a, dim_b) loss matrix reg : float Regularization term >0 @@ -276,7 +278,7 @@ def _sinkhorn_knopp(a, b, M, reg, numItermax=1000, Returns ------- - gamma : ndarray, shape (dim_a, n_b) + gamma : ndarray, shape (dim_a, dim_b) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -403,7 +405,8 @@ def _sinkhorn_knopp(a, b, M, reg, numItermax=1000, return u.reshape((-1, 1)) * K * v.reshape((1, -1)) -def _greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log=False): +def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, + log=False): r""" Solve the entropic regularization optimal transport problem and return the OT matrix @@ -427,7 +430,7 @@ def _greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log \gamma\geq 0 where : - - M is the (dim_a, n_b) metric cost matrix + - M is the (dim_a, dim_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - a and b are source and target weights (sum to 1) @@ -440,7 +443,7 @@ def _greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log b : ndarray, shape (dim_b,) or ndarray, shape (dim_b, n_hists) samples in the target domain, compute sinkhorn with multiple targets and fixed M if b is a matrix (return OT loss + dual variables in log) - M : ndarray, shape (dim_a, n_b) + M : ndarray, shape (dim_a, dim_b) loss matrix reg : float Regularization term >0 @@ -453,7 +456,7 @@ def _greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log Returns ------- - gamma : ndarray, shape (dim_a, n_b) + gamma : ndarray, shape (dim_a, dim_b) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -465,7 +468,7 @@ def _greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log >>> a=[.5, .5] >>> b=[.5, .5] >>> M=[[0., 1.], [1., 0.]] - >>> ot.bregman._greenkhorn(a, b, M, 1) + >>> ot.bregman.greenkhorn(a, b, M, 1) array([[0.36552929, 0.13447071], [0.13447071, 0.36552929]]) @@ -555,9 +558,9 @@ def _greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, log return G -def _sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, - warmstart=None, verbose=False, print_period=20, - log=False, **kwargs): +def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, + warmstart=None, verbose=False, print_period=20, + log=False, **kwargs): r""" Solve the entropic regularization OT problem with log stabilization @@ -573,7 +576,7 @@ def _sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, \gamma\geq 0 where : - - M is the (dim_a, n_b) metric cost matrix + - M is the (dim_a, dim_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - a and b are source and target weights (sum to 1) @@ -588,7 +591,7 @@ def _sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, samples weights in the source domain b : ndarray, shape (dim_b,) samples in the target domain - M : ndarray, shape (dim_a, n_b) + M : ndarray, shape (dim_a, dim_b) loss matrix reg : float Regularization term >0 @@ -607,7 +610,7 @@ def _sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, Returns ------- - gamma : ndarray, shape (dim_a, n_b) + gamma : ndarray, shape (dim_a, dim_b) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -619,7 +622,7 @@ def _sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, >>> a=[.5,.5] >>> b=[.5,.5] >>> M=[[0.,1.],[1.,0.]] - >>> ot.bregman._sinkhorn_stabilized(a, b, M, 1) + >>> ot.bregman.sinkhorn_stabilized(a, b, M, 1) array([[0.36552929, 0.13447071], [0.13447071, 0.36552929]]) @@ -658,8 +661,8 @@ def _sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, n_hists = 0 # init data - na = len(a) - nb = len(b) + dim_a = len(a) + dim_b = len(b) cpt = 0 if log: @@ -668,24 +671,25 @@ def _sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, # we assume that no distances are null except those of the diagonal of # distances if warmstart is None: - alpha, beta = np.zeros(na), np.zeros(nb) + alpha, beta = np.zeros(dim_a), np.zeros(dim_b) else: alpha, beta = warmstart if n_hists: - u, v = np.ones((na, n_hists)) / na, np.ones((nb, n_hists)) / nb + u = np.ones((dim_a, n_hists)) / dim_a + v = np.ones((dim_b, n_hists)) / dim_b else: - u, v = np.ones(na) / na, np.ones(nb) / nb + u, v = np.ones(dim_a) / dim_a, np.ones(dim_b) / dim_b def get_K(alpha, beta): """log space computation""" - return np.exp(-(M - alpha.reshape((na, 1)) - - beta.reshape((1, nb))) / reg) + return np.exp(-(M - alpha.reshape((dim_a, 1)) + - beta.reshape((1, dim_b))) / reg) def get_Gamma(alpha, beta, u, v): """log space gamma computation""" - return np.exp(-(M - alpha.reshape((na, 1)) - beta.reshape((1, nb))) - / reg + np.log(u.reshape((na, 1))) + np.log(v.reshape((1, nb)))) + return np.exp(-(M - alpha.reshape((dim_a, 1)) - beta.reshape((1, dim_b))) + / reg + np.log(u.reshape((dim_a, 1))) + np.log(v.reshape((1, dim_b)))) # print(np.min(K)) @@ -711,9 +715,9 @@ def _sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, else: alpha, beta = alpha + reg * np.log(u), beta + reg * np.log(v) if n_hists: - u, v = np.ones((na, n_hists)) / na, np.ones((nb, n_hists)) / nb + u, v = np.ones((dim_a, n_hists)) / dim_a, np.ones((dim_b, n_hists)) / dim_b else: - u, v = np.ones(na) / na, np.ones(nb) / nb + u, v = np.ones(dim_a) / dim_a, np.ones(dim_b) / dim_b K = get_K(alpha, beta) if cpt % print_period == 0: @@ -782,10 +786,10 @@ def _sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, return get_Gamma(alpha, beta, u, v) -def _sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, - numInnerItermax=100, tau=1e3, stopThr=1e-9, - warmstart=None, verbose=False, print_period=10, - log=False, **kwargs): +def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, + numInnerItermax=100, tau=1e3, stopThr=1e-9, + warmstart=None, verbose=False, print_period=10, + log=False, **kwargs): r""" Solve the entropic regularization optimal transport problem with log stabilization and epsilon scaling. @@ -802,7 +806,7 @@ def _sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, \gamma\geq 0 where : - - M is the (dim_a, n_b) metric cost matrix + - M is the (dim_a, dim_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - a and b are source and target weights (sum to 1) @@ -817,7 +821,7 @@ def _sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, samples weights in the source domain b : ndarray, shape (dim_b,) samples in the target domain - M : ndarray, shape (dim_a, n_b) + M : ndarray, shape (dim_a, dim_b) loss matrix reg : float Regularization term >0 @@ -840,7 +844,7 @@ def _sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, Returns ------- - gamma : ndarray, shape (dim_a, n_b) + gamma : ndarray, shape (dim_a, dim_b) Optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -852,7 +856,7 @@ def _sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, >>> a=[.5, .5] >>> b=[.5, .5] >>> M=[[0., 1.], [1., 0.]] - >>> ot.bregman._sinkhorn_epsilon_scaling(a, b, M, 1) + >>> ot.bregman.sinkhorn_epsilon_scaling(a, b, M, 1) array([[0.36552929, 0.13447071], [0.13447071, 0.36552929]]) @@ -915,8 +919,10 @@ def _sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, regi = get_reg(cpt) - G, logi = _sinkhorn_stabilized(a, b, M, regi, numItermax=numInnerItermax, stopThr=1e-9, warmstart=( - alpha, beta), verbose=False, print_period=20, tau=tau, log=True) + G, logi = sinkhorn_stabilized(a, b, M, regi, + numItermax=numInnerItermax, stopThr=1e-9, + warmstart=(alpha, beta), verbose=False, + print_period=20, tau=tau, log=True) alpha = logi['alpha'] beta = logi['beta'] @@ -1029,19 +1035,19 @@ def barycenter(A, M, reg, weights=None, method="sinkhorn", numItermax=10000, """ if method.lower() == 'sinkhorn': - return _barycenter(A, M, reg, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, log=log, - **kwargs) + return barycenter_sinkhorn(A, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, log=log, + **kwargs) elif method.lower() == 'sinkhorn_stabilized': - return _barycenter_stabilized(A, M, reg, numItermax=numItermax, - stopThr=stopThr, verbose=verbose, - log=log, **kwargs) + return barycenter_stabilized(A, M, reg, numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) else: raise ValueError("Unknown method '%s'." % method) -def _barycenter(A, M, reg, weights=None, numItermax=1000, - stopThr=1e-4, verbose=False, log=False): +def barycenter_sinkhorn(A, M, reg, weights=None, numItermax=1000, + stopThr=1e-4, verbose=False, log=False): r"""Compute the entropic regularized wasserstein barycenter of distributions A The function solves the following optimization problem: @@ -1134,8 +1140,8 @@ def _barycenter(A, M, reg, weights=None, numItermax=1000, return geometricBar(weights, UKv) -def _barycenter_stabilized(A, M, reg, tau=1e10, weights=None, numItermax=1000, - stopThr=1e-4, verbose=False, log=False): +def barycenter_stabilized(A, M, reg, tau=1e10, weights=None, numItermax=1000, + stopThr=1e-4, verbose=False, log=False): r"""Compute the entropic regularized wasserstein barycenter of distributions A with stabilization. @@ -1264,7 +1270,9 @@ def _barycenter_stabilized(A, M, reg, tau=1e10, weights=None, numItermax=1000, return q -def convolutional_barycenter2d(A, reg, weights=None, numItermax=10000, stopThr=1e-9, stabThr=1e-30, verbose=False, log=False): +def convolutional_barycenter2d(A, reg, weights=None, numItermax=10000, + stopThr=1e-9, stabThr=1e-30, verbose=False, + log=False): r"""Compute the entropic regularized wasserstein barycenter of distributions A where A is a collection of 2D images. @@ -1480,7 +1488,9 @@ def unmix(a, D, M, M0, h0, reg, reg0, alpha, numItermax=1000, return np.sum(K0, axis=1) -def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numIterMax=10000, stopThr=1e-9, verbose=False, log=False, **kwargs): +def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', + numIterMax=10000, stopThr=1e-9, verbose=False, + log=False, **kwargs): r''' Solve the entropic regularization optimal transport problem and return the OT matrix from empirical data @@ -1497,22 +1507,22 @@ def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numI \gamma\geq 0 where : - - :math:`M` is the (dim_a, n_b) metric cost matrix + - :math:`M` is the (n_samples_a, n_samples_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - :math:`a` and :math:`b` are source and target weights (sum to 1) Parameters ---------- - X_s : ndarray, shape (dim_a, d) + X_s : ndarray, shape (n_samples_a, dim) samples in the source domain - X_t : ndarray, shape (dim_b, d) + X_t : ndarray, shape (n_samples_b, dim) samples in the target domain reg : float Regularization term >0 - a : ndarray, shape (dim_a,) + a : ndarray, shape (n_samples_a,) samples weights in the source domain - b : ndarray, shape (dim_b,) + b : ndarray, shape (n_samples_b,) samples weights in the target domain numItermax : int, optional Max number of iterations @@ -1526,7 +1536,7 @@ def empirical_sinkhorn(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', numI Returns ------- - gamma : ndarray, shape (dim_a, n_b) + gamma : ndarray, shape (n_samples_a, n_samples_b) Regularized optimal transportation matrix for the given parameters log : dict log dictionary return only if log==True in parameters @@ -1587,7 +1597,7 @@ def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', num \gamma\geq 0 where : - - :math:`M` is the (dim_a, n_b) metric cost matrix + - :math:`M` is the (n_samples_a, n_samples_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - :math:`a` and :math:`b` are source and target weights (sum to 1) @@ -1596,7 +1606,7 @@ def empirical_sinkhorn2(X_s, X_t, reg, a=None, b=None, metric='sqeuclidean', num ---------- X_s : ndarray, shape (n_samples_a, dim) samples in the source domain - X_t : ndarray, shape (n_samples_b, d) + X_t : ndarray, shape (n_samples_b, dim) samples in the target domain reg : float Regularization term >0 @@ -1695,7 +1705,7 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli \gamma_b\geq 0 where : - - :math:`M` (resp. :math:`M_a, M_b`) is the (dim_a, n_b) metric cost matrix (resp (dim_a, ns) and (dim_b, nt)) + - :math:`M` (resp. :math:`M_a, M_b`) is the (n_samples_a, n_samples_b) metric cost matrix (resp (n_samples_a, n_samples_a) and (n_samples_b, n_samples_b)) - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - :math:`a` and :math:`b` are source and target weights (sum to 1) -- cgit v1.2.3 From 7efea812ad0b1c7e3783397dbd8f3ad802fb7ac2 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Tue, 3 Sep 2019 17:26:30 +0200 Subject: same for unbalanced --- ot/unbalanced.py | 102 +++++++++++++++++++++++++++---------------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/ot/unbalanced.py b/ot/unbalanced.py index 3f71d28..25e4cf5 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -120,23 +120,23 @@ def sinkhorn_unbalanced(a, b, M, reg, reg_m, method='sinkhorn', numItermax=1000, """ if method.lower() == 'sinkhorn': - return _sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, - numItermax=numItermax, - stopThr=stopThr, verbose=verbose, - log=log, **kwargs) + return sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) elif method.lower() == 'sinkhorn_stabilized': - return _sinkhorn_stabilized_unbalanced(a, b, M, reg, reg_m, - numItermax=numItermax, - stopThr=stopThr, - verbose=verbose, - log=log, **kwargs) + return sinkhorn_stabilized_unbalanced(a, b, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, + verbose=verbose, + log=log, **kwargs) elif method.lower() in ['sinkhorn_reg_scaling']: warnings.warn('Method not implemented yet. Using classic Sinkhorn Knopp') - return _sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, - numItermax=numItermax, - stopThr=stopThr, verbose=verbose, - log=log, **kwargs) + return sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) else: raise ValueError("Unknown method '%s'." % method) @@ -241,29 +241,29 @@ def sinkhorn_unbalanced2(a, b, M, reg, reg_m, method='sinkhorn', if len(b.shape) < 2: b = b[:, None] if method.lower() == 'sinkhorn': - return _sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, - numItermax=numItermax, - stopThr=stopThr, verbose=verbose, - log=log, **kwargs) + return sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) elif method.lower() == 'sinkhorn_stabilized': - return _sinkhorn_stabilized_unbalanced(a, b, M, reg, reg_m, - numItermax=numItermax, - stopThr=stopThr, - verbose=verbose, - log=log, **kwargs) + return sinkhorn_stabilized_unbalanced(a, b, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, + verbose=verbose, + log=log, **kwargs) elif method.lower() in ['sinkhorn_reg_scaling']: warnings.warn('Method not implemented yet. Using classic Sinkhorn Knopp') - return _sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, - numItermax=numItermax, - stopThr=stopThr, verbose=verbose, - log=log, **kwargs) + return sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) else: raise ValueError('Unknown method %s.' % method) -def _sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, numItermax=1000, - stopThr=1e-6, verbose=False, log=False, **kwargs): +def sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, numItermax=1000, + stopThr=1e-6, verbose=False, log=False, **kwargs): r""" Solve the entropic regularization unbalanced optimal transport problem and return the loss @@ -300,7 +300,7 @@ def _sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, numItermax=1000, numItermax : int, optional Max number of iterations stopThr : float, optional - Stop threshol on error (>0) + Stop threshol on error (> 0) verbose : bool, optional Print information along iterations log : bool, optional @@ -439,9 +439,9 @@ def _sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, numItermax=1000, return u[:, None] * K * v[None, :] -def _sinkhorn_stabilized_unbalanced(a, b, M, reg, reg_m, tau=1e5, numItermax=1000, - stopThr=1e-6, verbose=False, log=False, - **kwargs): +def sinkhorn_stabilized_unbalanced(a, b, M, reg, reg_m, tau=1e5, numItermax=1000, + stopThr=1e-6, verbose=False, log=False, + **kwargs): r""" Solve the entropic regularization unbalanced optimal transport problem and return the loss @@ -653,9 +653,9 @@ def _sinkhorn_stabilized_unbalanced(a, b, M, reg, reg_m, tau=1e5, numItermax=100 return ot_matrix -def _barycenter_unbalanced_stabilized(A, M, reg, reg_m, weights=None, tau=1e3, - numItermax=1000, stopThr=1e-6, - verbose=False, log=False): +def barycenter_unbalanced_stabilized(A, M, reg, reg_m, weights=None, tau=1e3, + numItermax=1000, stopThr=1e-6, + verbose=False, log=False): r"""Compute the entropic unbalanced wasserstein barycenter of A with stabilization. The function solves the following optimization problem: @@ -804,9 +804,9 @@ def _barycenter_unbalanced_stabilized(A, M, reg, reg_m, weights=None, tau=1e3, return q -def _barycenter_unbalanced(A, M, reg, reg_m, weights=None, - numItermax=1000, stopThr=1e-6, - verbose=False, log=False): +def barycenter_unbalanced_sinkhorn(A, M, reg, reg_m, weights=None, + numItermax=1000, stopThr=1e-6, + verbose=False, log=False): r"""Compute the entropic unbalanced wasserstein barycenter of A. The function solves the following optimization problem with a @@ -1001,22 +1001,22 @@ def barycenter_unbalanced(A, M, reg, reg_m, method="sinkhorn", weights=None, """ if method.lower() == 'sinkhorn': - return _barycenter_unbalanced(A, M, reg, reg_m, - numItermax=numItermax, - stopThr=stopThr, verbose=verbose, - log=log, **kwargs) + return barycenter_unbalanced_sinkhorn(A, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) elif method.lower() == 'sinkhorn_stabilized': - return _barycenter_unbalanced_stabilized(A, M, reg, reg_m, - numItermax=numItermax, - stopThr=stopThr, - verbose=verbose, - log=log, **kwargs) + return barycenter_unbalanced_stabilized(A, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, + verbose=verbose, + log=log, **kwargs) elif method.lower() in ['sinkhorn_reg_scaling']: warnings.warn('Method not implemented yet. Using classic Sinkhorn Knopp') - return _barycenter_unbalanced(A, M, reg, reg_m, - numItermax=numItermax, - stopThr=stopThr, verbose=verbose, - log=log, **kwargs) + return barycenter_unbalanced(A, M, reg, reg_m, + numItermax=numItermax, + stopThr=stopThr, verbose=verbose, + log=log, **kwargs) else: raise ValueError("Unknown method '%s'." % method) -- cgit v1.2.3 From 49d9b5cf4eecefdc0fff4db6c43e85d16e478efb Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Tue, 3 Sep 2019 17:35:23 +0200 Subject: fix doctest examples --- ot/unbalanced.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ot/unbalanced.py b/ot/unbalanced.py index 25e4cf5..d516dfc 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -326,7 +326,7 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, numItermax=1000, >>> a=[.5, .5] >>> b=[.5, .5] >>> M=[[0., 1.],[1., 0.]] - >>> ot.unbalanced._sinkhorn_knopp_unbalanced(a, b, M, 1., 1.) + >>> ot.unbalanced.sinkhorn_knopp_unbalanced(a, b, M, 1., 1.) array([[0.51122823, 0.18807035], [0.18807035, 0.51122823]]) @@ -510,7 +510,7 @@ def sinkhorn_stabilized_unbalanced(a, b, M, reg, reg_m, tau=1e5, numItermax=1000 >>> a=[.5, .5] >>> b=[.5, .5] >>> M=[[0., 1.],[1., 0.]] - >>> ot.unbalanced._sinkhorn_stabilized_unbalanced(a, b, M, 1., 1.) + >>> ot.unbalanced.sinkhorn_stabilized_unbalanced(a, b, M, 1., 1.) array([[0.51122823, 0.18807035], [0.18807035, 0.51122823]]) -- cgit v1.2.3 From e55232056a79de128583b87e65abc6d7a75fb298 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Tue, 3 Sep 2019 18:15:25 +0200 Subject: add unbalanced_barycenter import --- ot/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ot/__init__.py b/ot/__init__.py index 7d9615a..99f288e 100644 --- a/ot/__init__.py +++ b/ot/__init__.py @@ -65,7 +65,7 @@ from . import unbalanced # OT functions from .lp import emd, emd2, emd_1d, emd2_1d, wasserstein_1d from .bregman import sinkhorn, sinkhorn2, barycenter -from .unbalanced import sinkhorn_unbalanced, barycenter_unbalanced +from .unbalanced import sinkhorn_unbalanced, barycenter_unbalanced, sinkhorn_unbalanced2 from .da import sinkhorn_lpl1_mm # utils functions -- cgit v1.2.3 From a96caaed079b6e368df090c3e3290398e8b4a99e Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Tue, 3 Sep 2019 18:15:38 +0200 Subject: update UOT paragraph in quickstart --- docs/source/quickstart.rst | 107 ++++++++++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 46 deletions(-) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 1640d6a..e4ab3a3 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -2,13 +2,13 @@ Quick start guide ================= -In the following we provide some pointers about which functions and classes +In the following we provide some pointers about which functions and classes to use for different problems related to optimal transport (OT) and machine learning. We refer when we can to concrete examples in the documentation that are also available as notebooks on the POT Github. This document is not a tutorial on numerical optimal transport. For this we strongly -recommend to read the very nice book [15]_ . +recommend to read the very nice book [15]_ . Optimal transport and Wasserstein distance @@ -55,8 +55,8 @@ solver is quite efficient and uses sparsity of the solution. Examples of use for :any:`ot.emd` are available in : - :any:`auto_examples/plot_OT_2D_samples` - - :any:`auto_examples/plot_OT_1D` - - :any:`auto_examples/plot_OT_L1_vs_L2` + - :any:`auto_examples/plot_OT_1D` + - :any:`auto_examples/plot_OT_L1_vs_L2` Computing Wasserstein distance @@ -102,13 +102,13 @@ distance. An example of use for :any:`ot.emd2` is available in : - :any:`auto_examples/plot_compute_emd` - + Special cases ^^^^^^^^^^^^^ Note that the OT problem and the corresponding Wasserstein distance can in some -special cases be computed very efficiently. +special cases be computed very efficiently. For instance when the samples are in 1D, then the OT problem can be solved in :math:`O(n\log(n))` by using a simple sorting. In this case we provide the @@ -117,13 +117,13 @@ matrix and value. Note that since the solution is very sparse the :code:`sparse` parameter of :any:`ot.emd_1d` allows for solving and returning the solution for very large problems. Note that in order to compute directly the :math:`W_p` Wasserstein distance in 1D we provide the function :any:`ot.wasserstein_1d` that -takes :code:`p` as a parameter. +takes :code:`p` as a parameter. Another special case for estimating OT and Monge mapping is between Gaussian distributions. In this case there exists a close form solution given in Remark 2.29 in [15]_ and the Monge mapping is an affine function and can be also computed from the covariances and means of the source and target -distributions. In the case when the finite sample dataset is supposed gaussian, we provide +distributions. In the case when the finite sample dataset is supposed gaussian, we provide :any:`ot.da.OT_mapping_linear` that returns the parameters for the Monge mapping. @@ -176,7 +176,7 @@ solution of the resulting optimization problem can be expressed as: where :math:`u` and :math:`v` are vectors and :math:`K=\exp(-M/\lambda)` where the :math:`\exp` is taken component-wise. In order to solve the optimization problem, on can use an alternative projection algorithm called Sinkhorn-Knopp that can be very -efficient for large values if regularization. +efficient for large values if regularization. The Sinkhorn-Knopp algorithm is implemented in :any:`ot.sinkhorn` and :any:`ot.sinkhorn2` that return respectively the OT matrix and the value of the @@ -201,12 +201,12 @@ More details about the algorithms used are given in the following note. + :code:`method='sinkhorn'` calls :any:`ot.bregman.sinkhorn_knopp` the classic algorithm [2]_. + :code:`method='sinkhorn_stabilized'` calls :any:`ot.bregman.sinkhorn_stabilized` the - log stabilized version of the algorithm [9]_. + log stabilized version of the algorithm [9]_. + :code:`method='sinkhorn_epsilon_scaling'` calls :any:`ot.bregman.sinkhorn_epsilon_scaling` the epsilon scaling version - of the algorithm [9]_. + of the algorithm [9]_. + :code:`method='greenkhorn'` calls :any:`ot.bregman.greenkhorn` the - greedy sinkhorn verison of the algorithm [22]_. + greedy sinkhorn verison of the algorithm [22]_. In addition to all those variants of sinkhorn, we have another implementation solving the problem in the smooth dual or semi-dual in @@ -236,7 +236,7 @@ of algorithms in [18]_ [19]_. Examples of use for :any:`ot.sinkhorn` are available in : - :any:`auto_examples/plot_OT_2D_samples` - - :any:`auto_examples/plot_OT_1D` + - :any:`auto_examples/plot_OT_1D` - :any:`auto_examples/plot_OT_1D_smooth` - :any:`auto_examples/plot_stochastic` @@ -248,13 +248,13 @@ While entropic OT is the most common and favored in practice, there exist other kind of regularization. We provide in POT two specific solvers for other regularization terms, namely quadratic regularization and group lasso regularization. But we also provide in :any:`ot.optim` two generic solvers that allows solving any -smooth regularization in practice. +smooth regularization in practice. Quadratic regularization """""""""""""""""""""""" The first general regularization term we can solve is the quadratic -regularization of the form +regularization of the form .. math:: \Omega(\gamma)=\sum_{i,j} \gamma_{i,j}^2 @@ -264,7 +264,7 @@ densifying the OT matrix but it keeps some sort of sparsity that is lost with entropic regularization as soon as :math:`\lambda>0` [17]_. This problem can be solved with POT using solvers from :any:`ot.smooth`, more specifically functions :any:`ot.smooth.smooth_ot_dual` or -:any:`ot.smooth.smooth_ot_semi_dual` with parameter :code:`reg_type='l2'` to +:any:`ot.smooth.smooth_ot_semi_dual` with parameter :code:`reg_type='l2'` to choose the quadratic regularization. .. hint:: @@ -300,7 +300,7 @@ gradient algorithm [7]_ in function .. hint:: Examples of group Lasso regularization are available in : - - :any:`auto_examples/plot_otda_classes` + - :any:`auto_examples/plot_otda_classes` - :any:`auto_examples/plot_otda_d2` @@ -311,7 +311,7 @@ Finally we propose in POT generic solvers that can be used to solve any regularization as long as you can provide a function computing the regularization and a function computing its gradient (or sub-gradient). -In order to solve +In order to solve .. math:: \gamma^* = arg\min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j} + \lambda\Omega(\gamma) @@ -336,12 +336,12 @@ Another generic solver is proposed to solve the problem where :math:`\Omega_e` is the entropic regularization. In this case we use a generalized conditional gradient [7]_ implemented in :any:`ot.optim.gcg` that does not linearize the entropic term but -relies on :any:`ot.sinkhorn` for its iterations. +relies on :any:`ot.sinkhorn` for its iterations. .. hint:: An example of generic solvers are available in : - - :any:`auto_examples/plot_optim_OTreg` + - :any:`auto_examples/plot_optim_OTreg` Wasserstein Barycenters @@ -382,7 +382,7 @@ solver :any:`ot.lp.barycenter` that rely on generic LP solvers. By default the function uses :any:`scipy.optimize.linprog`, but more efficient LP solvers from cvxopt can be also used by changing parameter :code:`solver`. Note that this problem requires to solve a very large linear program and can be very slow in -practice. +practice. Similarly to the OT problem, OT barycenters can be computed in the regularized case. When using entropic regularization is used, the problem can be solved with a @@ -403,11 +403,11 @@ operators. We provide an implementation of this algorithm in function Examples of Wasserstein (:any:`ot.lp.barycenter`) and regularized Wasserstein barycenter (:any:`ot.bregman.barycenter`) computation are available in : - - :any:`auto_examples/plot_barycenter_1D` - - :any:`auto_examples/plot_barycenter_lp_vs_entropic` + - :any:`auto_examples/plot_barycenter_1D` + - :any:`auto_examples/plot_barycenter_lp_vs_entropic` An example of convolutional barycenter - (:any:`ot.bregman.convolutional_barycenter2d`) computation + (:any:`ot.bregman.convolutional_barycenter2d`) computation for 2D images is available in : @@ -451,13 +451,13 @@ optimal mapping is still an open problem in the general case but has been proven for smooth distributions by Brenier in his eponym `theorem `__. We provide in :any:`ot.da` several solvers for smooth Monge mapping estimation and domain -adaptation from discrete distributions. +adaptation from discrete distributions. Monge Mapping estimation ^^^^^^^^^^^^^^^^^^^^^^^^ We now discuss several approaches that are implemented in POT to estimate or -approximate a Monge mapping from finite distributions. +approximate a Monge mapping from finite distributions. First note that when the source and target distributions are supposed to be Gaussian distributions, there exists a close form solution for the mapping and its an @@ -513,16 +513,16 @@ A list of the provided implementation is given in the following note. Here is a list of the OT mapping classes inheriting from :any:`ot.da.BaseTransport` - + * :any:`ot.da.EMDTransport` : Barycentric mapping with EMD transport * :any:`ot.da.SinkhornTransport` : Barycentric mapping with Sinkhorn transport * :any:`ot.da.SinkhornL1l2Transport` : Barycentric mapping with Sinkhorn + group Lasso regularization [5]_ * :any:`ot.da.SinkhornLpl1Transport` : Barycentric mapping with Sinkhorn + - non convex group Lasso regularization [5]_ + non convex group Lasso regularization [5]_ * :any:`ot.da.LinearTransport` : Linear mapping estimation between Gaussians [14]_ - * :any:`ot.da.MappingTransport` : Nonlinear mapping estimation [8]_ + * :any:`ot.da.MappingTransport` : Nonlinear mapping estimation [8]_ .. hint:: @@ -550,7 +550,7 @@ consist in finding a linear projector optimizing the following criterion .. math:: P = \text{arg}\min_P \frac{\sum_i OT_e(\mu_i\#P,\mu_i\#P)}{\sum_{i,j\neq i} OT_e(\mu_i\#P,\mu_j\#P)} - + where :math:`\#` is the push-forward operator, :math:`OT_e` is the entropic OT loss and :math:`\mu_i` is the distribution of samples from class :math:`i`. :math:`P` is also constrained to @@ -575,10 +575,10 @@ respectively. Note that we also provide the Fisher discriminant estimator in Unbalanced optimal transport ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Unbalanced OT is a relaxation of the original OT problem where the violation of +Unbalanced OT is a relaxation of the entropy regularized OT problem where the violation of the constraint on the marginals is added to the objective of the optimization problem: - + .. math:: \min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j} + reg\cdot\Omega(\gamma) + \alpha KL(\gamma 1, a) + \alpha KL(\gamma^T 1, b) @@ -589,9 +589,24 @@ where KL is the Kullback-Leibler divergence. This formulation allows for computing approximate mapping between distributions that do not have the same amount of mass. Interestingly the problem can be solved with a generalization of the Bregman projections algorithm [10]_. We provide a solver for unbalanced OT -in :any:`ot.unbalanced` and more specifically -in function :any:`ot.sinkhorn_unbalanced`. A solver for unbalanced OT barycenter -is available in :any:`ot.barycenter_unbalanced`. +in :any:`ot.unbalanced`. Computing the optimal transport +plan or the transport cost is similar to the balanced case. The Sinkhorn-Knopp +algorithm is implemented in :any:`ot.sinkhorn_unbalanced` and :any:`ot.sinkhorn_unbalanced2` +that return respectively the OT matrix and the value of the +linear term. Note that the regularization parameter :math:`\alpha` in the +equation above is given to those functions with the parameter :code:`reg_m`. + +Similarly, Unbalanced OT barycenters can be computed using :any:`ot.barycenter_unbalanced`. + +.. note:: + The main function to solve entropic regularized OT is :any:`ot.sinkhorn_unbalanced`. + This function is a wrapper and the parameter :code:`method` help you select + the actual algorithm used to solve the problem: + + + :code:`method='sinkhorn'` calls :any:`ot.unbalanced.sinkhorn_knopp_unbalanced` + the generalized Sinkhorn algorithm [10]_. + + :code:`method='sinkhorn_stabilized'` calls :any:`ot.unbalanced.sinkhorn_stabilized_unbalanced` + the log stabilized version of the algorithm [10]_. .. hint:: @@ -636,7 +651,7 @@ barycenters that can be expressed as where :math:`Ck` is the distance matrix between samples in distribution :math:`k`. Note that interestingly the barycenter is defined as a symmetric -positive matrix. We provide a block coordinate optimization procedure in +positive matrix. We provide a block coordinate optimization procedure in :any:`ot.gromov.gromov_barycenters` and :any:`ot.gromov.entropic_gromov_barycenters` for non-regularized and regularized barycenters respectively. @@ -654,19 +669,19 @@ The implementations of FGW and FGW barycenter is provided in functions Examples of computation of GW, regularized G and FGW are available in : - :any:`auto_examples/plot_gromov` - - :any:`auto_examples/plot_fgw` + - :any:`auto_examples/plot_fgw` Examples of GW, regularized GW and FGW barycenters are available in : - :any:`auto_examples/plot_gromov_barycenter` - - :any:`auto_examples/plot_barycenter_fgw` + - :any:`auto_examples/plot_barycenter_fgw` GPU acceleration ^^^^^^^^^^^^^^^^ We provide several implementation of our OT solvers in :any:`ot.gpu`. Those -implementations use the :code:`cupy` toolbox that obviously need to be installed. +implementations use the :code:`cupy` toolbox that obviously need to be installed. .. note:: @@ -701,7 +716,7 @@ FAQ 1. **How to solve a discrete optimal transport problem ?** The solver for discrete OT is the function :py:mod:`ot.emd` that returns - the OT transport matrix. If you want to solve a regularized OT you can + the OT transport matrix. If you want to solve a regularized OT you can use :py:mod:`ot.sinkhorn`. @@ -714,9 +729,9 @@ FAQ T=ot.emd(a,b,M) # exact linear program T_reg=ot.sinkhorn(a,b,M,reg) # entropic regularized OT - More detailed examples can be seen on this example: + More detailed examples can be seen on this example: :doc:`auto_examples/plot_OT_2D_samples` - + 2. **pip install POT fails with error : ImportError: No module named Cython.Build** @@ -726,7 +741,7 @@ FAQ installing POT. Note that this problem do not occur when using conda-forge since the packages - there are pre-compiled. + there are pre-compiled. See `Issue #59 `__ for more details. @@ -751,7 +766,7 @@ FAQ In order to limit import time and hard dependencies in POT. we do not import some sub-modules automatically with :code:`import ot`. In order to use the acceleration in :any:`ot.gpu` you need first to import is with - :code:`import ot.gpu`. + :code:`import ot.gpu`. See `Issue #85 `__ and :any:`ot.gpu` for more details. @@ -763,7 +778,7 @@ References .. [1] Bonneel, N., Van De Panne, M., Paris, S., & Heidrich, W. (2011, December). `Displacement nterpolation using Lagrangian mass transport `__. - In ACM Transactions on Graphics (TOG) (Vol. 30, No. 6, p. 158). ACM. + In ACM Transactions on Graphics (TOG) (Vol. 30, No. 6, p. 158). ACM. .. [2] Cuturi, M. (2013). `Sinkhorn distances: Lightspeed computation of optimal transport `__. In Advances @@ -874,4 +889,4 @@ References .. [24] Vayer, T., Chapel, L., Flamary, R., Tavenard, R. and Courty, N. (2019). `Optimal Transport for structured data with application on graphs `__ Proceedings - of the 36th International Conference on Machine Learning (ICML). \ No newline at end of file + of the 36th International Conference on Machine Learning (ICML). -- cgit v1.2.3 From b639e3eba2e88e20b5d2df417368200e4fc5157c Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Tue, 3 Sep 2019 18:39:03 +0200 Subject: update UOT text + add frogner ref --- docs/source/quickstart.rst | 49 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index e4ab3a3..9729664 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -577,10 +577,10 @@ Unbalanced optimal transport Unbalanced OT is a relaxation of the entropy regularized OT problem where the violation of the constraint on the marginals is added to the objective of the optimization -problem: +problem. The unbalanced OT metric between two histograms a and b is defined as [25]_ [10]_: .. math:: - \min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j} + reg\cdot\Omega(\gamma) + \alpha KL(\gamma 1, a) + \alpha KL(\gamma^T 1, b) + W_u(a, b) = \min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j} + reg\cdot\Omega(\gamma) + \alpha KL(\gamma 1, a) + \alpha KL(\gamma^T 1, b) s.t. \quad \gamma\geq 0 @@ -596,26 +596,55 @@ that return respectively the OT matrix and the value of the linear term. Note that the regularization parameter :math:`\alpha` in the equation above is given to those functions with the parameter :code:`reg_m`. -Similarly, Unbalanced OT barycenters can be computed using :any:`ot.barycenter_unbalanced`. .. note:: - The main function to solve entropic regularized OT is :any:`ot.sinkhorn_unbalanced`. + The main function to solve entropic regularized UOT is :any:`ot.sinkhorn_unbalanced`. This function is a wrapper and the parameter :code:`method` help you select the actual algorithm used to solve the problem: + :code:`method='sinkhorn'` calls :any:`ot.unbalanced.sinkhorn_knopp_unbalanced` - the generalized Sinkhorn algorithm [10]_. + the generalized Sinkhorn algorithm [25]_ [10]_. + :code:`method='sinkhorn_stabilized'` calls :any:`ot.unbalanced.sinkhorn_stabilized_unbalanced` the log stabilized version of the algorithm [10]_. .. hint:: - Examples of the use of :any:`ot.sinkhorn_unbalanced` and - :any:`ot.barycenter_unbalanced` are available in : + Examples of the use of :any:`ot.sinkhorn_unbalanced` are available in : - :any:`auto_examples/plot_UOT_1D` - - :any:`auto_examples/plot_UOT_barycenter_1D` + + +Unbalanced Barycenters +^^^^^^^^^^^^^^^^^^^^^^ + +As with balanced distributions, we can define a barycenter of a set of +histograms with different masses as a Fréchet Mean: + + .. math:: + \min_{\mu} \quad \sum_{k} w_kW_u(\mu,\mu_k) + +Where :math:`W_u` is the unbalanced Wasserstein metric defined above. This problem +can also be solved using generalized version of Sinkhorn's algorithm and it is +implemented the main function :any:`ot.barycenter_unbalanced`. + + +.. note:: + The main function to compute UOT barycenters is :any:`ot.barycenter_unbalanced`. + This function is a wrapper and the parameter :code:`method` help you select + the actual algorithm used to solve the problem: + + + :code:`method='sinkhorn'` calls :any:`ot.unbalanced.barycenter_unbalanced_sinkhorn_unbalanced` + the generalized Sinkhorn algorithm [10]_. + + :code:`method='sinkhorn_stabilized'` calls :any:`ot.unbalanced.barycenter_unbalanced_stabilized` + the log stabilized version of the algorithm [10]_. + + +.. hint:: + + Examples of the use of :any:`ot.barycenter_unbalanced` are available in : + + - :any:`auto_examples/plot_UOT_barycenter_1D` Gromov-Wasserstein @@ -890,3 +919,7 @@ References (2019). `Optimal Transport for structured data with application on graphs `__ Proceedings of the 36th International Conference on Machine Learning (ICML). + +.. [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. : + Learning with a Wasserstein Loss, Advances in Neural Information + Processing Systems (NIPS) 2015 -- cgit v1.2.3 From e0c935a865a57bc4603144b27f1b58cbfba87760 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Wed, 4 Sep 2019 10:28:04 +0200 Subject: improve doc --- docs/source/quickstart.rst | 10 ++++------ ot/__init__.py | 3 ++- ot/bregman.py | 40 ++++++++++++++++++++++------------------ 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 9729664..978eaff 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -577,10 +577,10 @@ Unbalanced optimal transport Unbalanced OT is a relaxation of the entropy regularized OT problem where the violation of the constraint on the marginals is added to the objective of the optimization -problem. The unbalanced OT metric between two histograms a and b is defined as [25]_ [10]_: +problem. The unbalanced OT metric between two unbalanced histograms a and b is defined as [25]_ [10]_: .. math:: - W_u(a, b) = \min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j} + reg\cdot\Omega(\gamma) + \alpha KL(\gamma 1, a) + \alpha KL(\gamma^T 1, b) + W_u(a, b) = \min_\gamma \quad \sum_{i,j}\gamma_{i,j}M_{i,j} + reg\cdot\Omega(\gamma) + reg_m KL(\gamma 1, a) + reg_m KL(\gamma^T 1, b) s.t. \quad \gamma\geq 0 @@ -593,13 +593,11 @@ in :any:`ot.unbalanced`. Computing the optimal transport plan or the transport cost is similar to the balanced case. The Sinkhorn-Knopp algorithm is implemented in :any:`ot.sinkhorn_unbalanced` and :any:`ot.sinkhorn_unbalanced2` that return respectively the OT matrix and the value of the -linear term. Note that the regularization parameter :math:`\alpha` in the -equation above is given to those functions with the parameter :code:`reg_m`. - +linear term. .. note:: The main function to solve entropic regularized UOT is :any:`ot.sinkhorn_unbalanced`. - This function is a wrapper and the parameter :code:`method` help you select + This function is a wrapper and the parameter :code:`method` helps you select the actual algorithm used to solve the problem: + :code:`method='sinkhorn'` calls :any:`ot.unbalanced.sinkhorn_knopp_unbalanced` diff --git a/ot/__init__.py b/ot/__init__.py index 99f288e..df0ef8a 100644 --- a/ot/__init__.py +++ b/ot/__init__.py @@ -77,4 +77,5 @@ __all__ = ["emd", "emd2", 'emd_1d', "sinkhorn", "sinkhorn2", "utils", 'datasets' 'bregman', 'lp', 'tic', 'toc', 'toq', 'gromov', 'emd_1d', 'emd2_1d', 'wasserstein_1d', 'dist', 'unif', 'barycenter', 'sinkhorn_lpl1_mm', 'da', 'optim', - 'sinkhorn_unbalanced', "barycenter_unbalanced"] + 'sinkhorn_unbalanced', 'barycenter_unbalanced', + 'sinkhorn_unbalanced2'] diff --git a/ot/bregman.py b/ot/bregman.py index 02aeb6d..2cd832b 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -35,7 +35,7 @@ def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, - M is the (dim_a, dim_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - - a and b are source and target weights (sum to 1) + - a and b are source and target weights (histograms, both sum to 1) The algorithm used for solving the problem is the Sinkhorn-Knopp matrix scaling algorithm as proposed in [2]_ @@ -143,7 +143,7 @@ def sinkhorn2(a, b, M, reg, method='sinkhorn', numItermax=1000, - M is the (dim_a, dim_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - - a and b are source and target weights (sum to 1) + - a and b are source and target weights (histograms, both sum to 1) The algorithm used for solving the problem is the Sinkhorn-Knopp matrix scaling algorithm as proposed in [2]_ @@ -251,7 +251,7 @@ def sinkhorn_knopp(a, b, M, reg, numItermax=1000, - M is the (dim_a, dim_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - - a and b are source and target weights (sum to 1) + - a and b are source and target weights (histograms, both sum to 1) The algorithm used for solving the problem is the Sinkhorn-Knopp matrix scaling algorithm as proposed in [2]_ @@ -432,7 +432,7 @@ def greenkhorn(a, b, M, reg, numItermax=10000, stopThr=1e-9, verbose=False, - M is the (dim_a, dim_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - - a and b are source and target weights (sum to 1) + - a and b are source and target weights (histograms, both sum to 1) @@ -578,7 +578,8 @@ def sinkhorn_stabilized(a, b, M, reg, numItermax=1000, tau=1e3, stopThr=1e-9, - M is the (dim_a, dim_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - - a and b are source and target weights (sum to 1) + - a and b are source and target weights (histograms, both sum to 1) + The algorithm used for solving the problem is the Sinkhorn-Knopp matrix scaling algorithm as proposed in [2]_ but with the log stabilization @@ -808,7 +809,8 @@ def sinkhorn_epsilon_scaling(a, b, M, reg, numItermax=100, epsilon0=1e4, - M is the (dim_a, dim_b) metric cost matrix - :math:`\Omega` is the entropic regularization term :math:`\Omega(\gamma)=\sum_{i,j} \gamma_{i,j}\log(\gamma_{i,j})` - - a and b are source and target weights (sum to 1) + - a and b are source and target weights (histograms, both sum to 1) + The algorithm used for solving the problem is the Sinkhorn-Knopp matrix scaling algorithm as proposed in [2]_ but with the log stabilization @@ -1229,7 +1231,6 @@ def barycenter_stabilized(A, M, reg, tau=1e10, weights=None, numItermax=1000, absorbing = False if (u > tau).any() or (v > tau).any(): absorbing = True - print("YEAH absorbing") alpha = alpha + reg * np.log(np.max(u, 1)) beta = beta + reg * np.log(np.max(v, 1)) K = np.exp((alpha[:, None] + beta[None, :] - @@ -1394,9 +1395,12 @@ def unmix(a, D, M, M0, h0, reg, reg0, alpha, numItermax=1000, where : - :math:`W_{M,reg}(\cdot,\cdot)` is the entropic regularized Wasserstein distance with M loss matrix (see ot.bregman.sinkhorn) - - :math:`\mathbf{a}` is an observed distribution, :math:`\mathbf{h}_0` is aprior on unmixing - - reg and :math:`\mathbf{M}` are respectively the regularization term and the cost matrix for OT data fitting - - reg0 and :math:`\mathbf{M0}` are respectively the regularization term and the cost matrix for regularization + - :math: `\mathbf{D}` is a dictionary of `n_atoms` atoms of dimension `dim_a`, its expected shape is `(dim_a, n_atoms)` + - :math:`\mathbf{h}` is the estimated unmixing of dimension `n_atoms` + - :math:`\mathbf{a}` is an observed distribution of dimension `dim_a` + - :math:`\mathbf{h}_0` is a prior on `h` of dimension `dim_prior` + - reg and :math:`\mathbf{M}` are respectively the regularization term and the cost matrix (dim_a, dim_a) for OT data fitting + - reg0 and :math:`\mathbf{M0}` are respectively the regularization term and the cost matrix (dim_prior, n_atoms) regularization - :math:`\\alpha`weight data fitting and regularization The optimization problem is solved suing the algorithm described in [4] @@ -1404,16 +1408,16 @@ def unmix(a, D, M, M0, h0, reg, reg0, alpha, numItermax=1000, Parameters ---------- - a : ndarray, shape (n_observed) - observed distribution - D : ndarray, shape (dim, dim) + a : ndarray, shape (dim_a) + observed distribution (histogram, sums to 1) + D : ndarray, shape (dim_a, n_atoms) dictionary matrix - M : ndarray, shape (dim, dim) + M : ndarray, shape (dim_a, dim_a) loss matrix - M0 : ndarray, shape (n_observed, n_observed) + M0 : ndarray, shape (n_atoms, dim_prior) loss matrix - h0 : ndarray, shape (dim,) - prior on h + h0 : ndarray, shape (n_atoms,) + prior on the estimated unmixing h reg : float Regularization term >0 (Wasserstein data fitting) reg0 : float @@ -1432,7 +1436,7 @@ def unmix(a, D, M, M0, h0, reg, reg0, alpha, numItermax=1000, Returns ------- - a : ndarray, shape (dim,) + h : ndarray, shape (n_atoms,) Wasserstein barycenter log : dict log dictionary return only if log==True in parameters -- cgit v1.2.3 From 29848c2ab362fc5ff466cb0e12409a1cca61644f Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 9 Sep 2019 15:25:57 +0200 Subject: cleanup verison number 1.0- --- RELEASES.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index 112e4ab..66eee19 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,17 +1,16 @@ # POT Releases -## 1.0.0 Out of beta +## 0.6 Year 3 *July 2019* -This is the first official stable release of POT and this means a jump to 1.0.0! +This is the first official stable release of POT and this means a jump to 0.6! The library has been used in the wild for a while now and we have reached a state where a lot of fundamental OT solvers are available and tested. It has been quite stable in the last months but kept the beta flag in its Pypi classifiers until now. -Note that this major -release will be the last one supporting officially Python 2.7 (See +Note that this release will be the last one supporting officially Python 2.7 (See https://python3statement.org/ for more reasons). For next release we will keep the travis tests for Python 2 but will make them non necessary for merge in 2020. @@ -55,7 +54,7 @@ bring new features and solvers to the library. * Make doctest work on travis (PR #90) * Update documentation (PR #79, PR #84) * Solver for EMD in 1D (PR #89) -* Solvers for regularized unbalanced OT (PR #87) +* Solvers for regularized unbalanced OT (PR #87, PR#99) * Solver for Fused Gromov-Wasserstein (PR #86) * Add empirical Sinkhorn and empirical Sinkhorn divergences (PR #80) -- cgit v1.2.3 From 2f3741299989ffb105bed986f7a85d567fa6cb6a Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Sat, 19 Oct 2019 12:05:45 +0200 Subject: add weights arg in generic barycenter func --- ot/bregman.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index 2cd832b..ba5c7ba 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1037,11 +1037,13 @@ def barycenter(A, M, reg, weights=None, method="sinkhorn", numItermax=10000, """ if method.lower() == 'sinkhorn': - return barycenter_sinkhorn(A, M, reg, numItermax=numItermax, + return barycenter_sinkhorn(A, M, reg, weights=weights, + numItermax=numItermax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) elif method.lower() == 'sinkhorn_stabilized': - return barycenter_stabilized(A, M, reg, numItermax=numItermax, + return barycenter_stabilized(A, M, reg, weights=weights, + numItermax=numItermax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) else: -- cgit v1.2.3 From a919f960df57b4ea4beff57a3f7262b8064d8159 Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Sat, 19 Oct 2019 12:05:59 +0200 Subject: same for unbalanced --- ot/unbalanced.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ot/unbalanced.py b/ot/unbalanced.py index d516dfc..978df08 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -1002,12 +1002,14 @@ def barycenter_unbalanced(A, M, reg, reg_m, method="sinkhorn", weights=None, if method.lower() == 'sinkhorn': return barycenter_unbalanced_sinkhorn(A, M, reg, reg_m, + weights=weights, numItermax=numItermax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) elif method.lower() == 'sinkhorn_stabilized': return barycenter_unbalanced_stabilized(A, M, reg, reg_m, + weights=weights, numItermax=numItermax, stopThr=stopThr, verbose=verbose, @@ -1015,6 +1017,7 @@ def barycenter_unbalanced(A, M, reg, reg_m, method="sinkhorn", weights=None, elif method.lower() in ['sinkhorn_reg_scaling']: warnings.warn('Method not implemented yet. Using classic Sinkhorn Knopp') return barycenter_unbalanced(A, M, reg, reg_m, + weights=weights, numItermax=numItermax, stopThr=stopThr, verbose=verbose, log=log, **kwargs) -- cgit v1.2.3 From 161d68a79bc528a0d87e421f67a419cd757c7fba Mon Sep 17 00:00:00 2001 From: Hicham Janati Date: Sun, 20 Oct 2019 22:55:21 +0200 Subject: fix loop counter in barycenter + precision of dual variables --- ot/unbalanced.py | 102 +++++++++++++++++++++++++++---------------------------- 1 file changed, 50 insertions(+), 52 deletions(-) diff --git a/ot/unbalanced.py b/ot/unbalanced.py index 978df08..23f6607 100644 --- a/ot/unbalanced.py +++ b/ot/unbalanced.py @@ -384,10 +384,9 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, numItermax=1000, fi = reg_m / (reg_m + reg) - cpt = 0 err = 1. - while (err > stopThr and cpt < numItermax): + for i in range(numItermax): uprev = u vprev = v @@ -401,28 +400,27 @@ def sinkhorn_knopp_unbalanced(a, b, M, reg, reg_m, numItermax=1000, or np.any(np.isinf(u)) or np.any(np.isinf(v))): # we have reached the machine precision # come back to previous solution and quit loop - warnings.warn('Numerical errors at iteration %s' % cpt) + warnings.warn('Numerical errors at iteration %s' % i) u = uprev v = vprev break - if cpt % 10 == 0: - # we can speed up the process by checking for the error only all - # the 10th iterations - err_u = abs(u - uprev).max() / max(abs(u).max(), abs(uprev).max(), 1.) - err_v = abs(v - vprev).max() / max(abs(v).max(), abs(vprev).max(), 1.) - err = 0.5 * (err_u + err_v) - if log: - log['err'].append(err) + + err_u = abs(u - uprev).max() / max(abs(u).max(), abs(uprev).max(), 1.) + err_v = abs(v - vprev).max() / max(abs(v).max(), abs(vprev).max(), 1.) + err = 0.5 * (err_u + err_v) + if log: + log['err'].append(err) if verbose: - if cpt % 200 == 0: + if i % 50 == 0: print( '{:5s}|{:12s}'.format('It.', 'Err') + '\n' + '-' * 19) - print('{:5d}|{:8e}|'.format(cpt, err)) - cpt += 1 + print('{:5d}|{:8e}|'.format(i, err)) + if err < stopThr: + break if log: - log['logu'] = np.log(u + 1e-16) - log['logv'] = np.log(v + 1e-16) + log['logu'] = np.log(u + 1e-300) + log['logv'] = np.log(v + 1e-300) if n_hists: # return only loss res = np.einsum('ik,ij,jk,ij->k', u, K, v, M) @@ -747,8 +745,8 @@ def barycenter_unbalanced_stabilized(A, M, reg, reg_m, weights=None, tau=1e3, alpha = np.zeros(dim) beta = np.zeros(dim) q = np.ones(dim) / dim - while (err > stopThr and cpt < numItermax): - qprev = q + for i in range(numItermax): + qprev = q.copy() Kv = K.dot(v) f_alpha = np.exp(- alpha / (reg + reg_m)) f_beta = np.exp(- beta / (reg + reg_m)) @@ -777,7 +775,7 @@ def barycenter_unbalanced_stabilized(A, M, reg, reg_m, weights=None, tau=1e3, warnings.warn('Numerical errors at iteration %s' % cpt) q = qprev break - if (cpt % 10 == 0 and not absorbing) or cpt == 0: + if (i % 10 == 0 and not absorbing) or i == 0: # we can speed up the process by checking for the error only all # the 10th iterations err = abs(q - qprev).max() / max(abs(q).max(), @@ -785,20 +783,21 @@ def barycenter_unbalanced_stabilized(A, M, reg, reg_m, weights=None, tau=1e3, if log: log['err'].append(err) if verbose: - if cpt % 50 == 0: + if i % 50 == 0: print( '{:5s}|{:12s}'.format('It.', 'Err') + '\n' + '-' * 19) - print('{:5d}|{:8e}|'.format(cpt, err)) + print('{:5d}|{:8e}|'.format(i, err)) + if err < stopThr: + break - cpt += 1 if err > stopThr: warnings.warn("Stabilized Unbalanced Sinkhorn did not converge." + "Try a larger entropy `reg` or a lower mass `reg_m`." + "Or a larger absorption threshold `tau`.") if log: - log['niter'] = cpt - log['logu'] = np.log(u + 1e-16) - log['logv'] = np.log(v + 1e-16) + log['niter'] = i + log['logu'] = np.log(u + 1e-300) + log['logv'] = np.log(v + 1e-300) return q, log else: return q @@ -882,15 +881,15 @@ def barycenter_unbalanced_sinkhorn(A, M, reg, reg_m, weights=None, fi = reg_m / (reg_m + reg) - v = np.ones((dim, n_hists)) / dim - u = np.ones((dim, 1)) / dim - - cpt = 0 + v = np.ones((dim, n_hists)) + u = np.ones((dim, 1)) + q = np.ones(dim) err = 1. - while (err > stopThr and cpt < numItermax): - uprev = u - vprev = v + for i in range(numItermax): + uprev = u.copy() + vprev = v.copy() + qprev = q.copy() Kv = K.dot(v) u = (A / Kv) ** fi @@ -905,31 +904,30 @@ def barycenter_unbalanced_sinkhorn(A, M, reg, reg_m, weights=None, or np.any(np.isinf(u)) or np.any(np.isinf(v))): # we have reached the machine precision # come back to previous solution and quit loop - warnings.warn('Numerical errors at iteration %s' % cpt) + warnings.warn('Numerical errors at iteration %s' % i) u = uprev v = vprev + q = qprev break - if cpt % 10 == 0: - # we can speed up the process by checking for the error only all - # the 10th iterations - err_u = abs(u - uprev).max() - err_u /= max(abs(u).max(), abs(uprev).max(), 1.) - err_v = abs(v - vprev).max() - err_v /= max(abs(v).max(), abs(vprev).max(), 1.) - err = 0.5 * (err_u + err_v) - if log: - log['err'].append(err) - if verbose: - if cpt % 50 == 0: - print( - '{:5s}|{:12s}'.format('It.', 'Err') + '\n' + '-' * 19) - print('{:5d}|{:8e}|'.format(cpt, err)) + # compute change in barycenter + err = abs(q - qprev).max() + err /= max(abs(q).max(), abs(qprev).max(), 1.) + if log: + log['err'].append(err) + # if barycenter did not change + at least 10 iterations - stop + if err < stopThr and i > 10: + break + + if verbose: + if i % 10 == 0: + print( + '{:5s}|{:12s}'.format('It.', 'Err') + '\n' + '-' * 19) + print('{:5d}|{:8e}|'.format(i, err)) - cpt += 1 if log: - log['niter'] = cpt - log['logu'] = np.log(u + 1e-16) - log['logv'] = np.log(v + 1e-16) + log['niter'] = i + log['logu'] = np.log(u + 1e-300) + log['logv'] = np.log(v + 1e-300) return q, log else: return q -- cgit v1.2.3 From 2a32e2ea64d0d5096953a9b8259b0507fa58dca5 Mon Sep 17 00:00:00 2001 From: Kilian Date: Wed, 13 Nov 2019 13:55:24 +0100 Subject: fix log bug in gromov_wasserstein2 --- ot/gromov.py | 156 ++++++++++++++++++++++++++-------------------------- test/test_gromov.py | 4 ++ 2 files changed, 81 insertions(+), 79 deletions(-) diff --git a/ot/gromov.py b/ot/gromov.py index 699ae4c..9869341 100644 --- a/ot/gromov.py +++ b/ot/gromov.py @@ -276,7 +276,6 @@ def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, armijo=False, **kwargs - p : distribution in the source space - q : distribution in the target space - L : loss function to account for the misfit between the similarity matrices - - H : entropy Parameters ---------- @@ -343,6 +342,83 @@ def gromov_wasserstein(C1, C2, p, q, loss_fun, log=False, armijo=False, **kwargs return cg(p, q, 0, 1, f, df, G0, armijo=armijo, C1=C1, C2=C2, constC=constC, **kwargs) +def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False, armijo=False, **kwargs): + """ + Returns the gromov-wasserstein discrepancy between (C1,p) and (C2,q) + + The function solves the following optimization problem: + + .. math:: + GW = \min_T \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} + + Where : + - C1 : Metric cost matrix in the source space + - C2 : Metric cost matrix in the target space + - p : distribution in the source space + - q : distribution in the target space + - L : loss function to account for the misfit between the similarity matrices + + Parameters + ---------- + C1 : ndarray, shape (ns, ns) + Metric cost matrix in the source space + C2 : ndarray, shape (nt, nt) + Metric cost matrix in the target space + p : ndarray, shape (ns,) + Distribution in the source space. + q : ndarray, shape (nt,) + Distribution in the target space. + loss_fun : str + loss function used for the solver either 'square_loss' or 'kl_loss' + max_iter : int, optional + Max number of iterations + tol : float, optional + Stop threshold on error (>0) + verbose : bool, optional + Print information along iterations + log : bool, optional + record log if True + armijo : bool, optional + If True the steps of the line-search is found via an armijo research. Else closed form is used. + If there is convergence issues use False. + + Returns + ------- + gw_dist : float + Gromov-Wasserstein distance + log : dict + convergence information and Coupling marix + + References + ---------- + .. [12] Peyré, Gabriel, Marco Cuturi, and Justin Solomon, + "Gromov-Wasserstein averaging of kernel and distance matrices." + International Conference on Machine Learning (ICML). 2016. + + .. [13] Mémoli, Facundo. Gromov–Wasserstein distances and the + metric approach to object matching. Foundations of computational + mathematics 11.4 (2011): 417-487. + + """ + + constC, hC1, hC2 = init_matrix(C1, C2, p, q, loss_fun) + + G0 = p[:, None] * q[None, :] + + def f(G): + return gwloss(constC, hC1, hC2, G) + + def df(G): + return gwggrad(constC, hC1, hC2, G) + res, log_gw = cg(p, q, 0, 1, f, df, G0, log=True, armijo=armijo, C1=C1, C2=C2, constC=constC, **kwargs) + log_gw['gw_dist'] = gwloss(constC, hC1, hC2, res) + log_gw['T'] = res + if log: + return log_gw['gw_dist'], log_gw + else: + return log_gw['gw_dist'] + + def fused_gromov_wasserstein(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5, armijo=False, log=False, **kwargs): """ Computes the FGW transport between two graphs see [24] @@ -506,84 +582,6 @@ def fused_gromov_wasserstein2(M, C1, C2, p, q, loss_fun='square_loss', alpha=0.5 return log['fgw_dist'] -def gromov_wasserstein2(C1, C2, p, q, loss_fun, log=False, armijo=False, **kwargs): - """ - Returns the gromov-wasserstein discrepancy between (C1,p) and (C2,q) - - The function solves the following optimization problem: - - .. math:: - GW = \min_T \sum_{i,j,k,l} L(C1_{i,k},C2_{j,l})*T_{i,j}*T_{k,l} - - Where : - - C1 : Metric cost matrix in the source space - - C2 : Metric cost matrix in the target space - - p : distribution in the source space - - q : distribution in the target space - - L : loss function to account for the misfit between the similarity matrices - - H : entropy - - Parameters - ---------- - C1 : ndarray, shape (ns, ns) - Metric cost matrix in the source space - C2 : ndarray, shape (nt, nt) - Metric cost matrix in the target space - p : ndarray, shape (ns,) - Distribution in the source space. - q : ndarray, shape (nt,) - Distribution in the target space. - loss_fun : str - loss function used for the solver either 'square_loss' or 'kl_loss' - max_iter : int, optional - Max number of iterations - tol : float, optional - Stop threshold on error (>0) - verbose : bool, optional - Print information along iterations - log : bool, optional - record log if True - armijo : bool, optional - If True the steps of the line-search is found via an armijo research. Else closed form is used. - If there is convergence issues use False. - - Returns - ------- - gw_dist : float - Gromov-Wasserstein distance - log : dict - convergence information and Coupling marix - - References - ---------- - .. [12] Peyré, Gabriel, Marco Cuturi, and Justin Solomon, - "Gromov-Wasserstein averaging of kernel and distance matrices." - International Conference on Machine Learning (ICML). 2016. - - .. [13] Mémoli, Facundo. Gromov–Wasserstein distances and the - metric approach to object matching. Foundations of computational - mathematics 11.4 (2011): 417-487. - - """ - - constC, hC1, hC2 = init_matrix(C1, C2, p, q, loss_fun) - - G0 = p[:, None] * q[None, :] - - def f(G): - return gwloss(constC, hC1, hC2, G) - - def df(G): - return gwggrad(constC, hC1, hC2, G) - res, log = cg(p, q, 0, 1, f, df, G0, log=True, armijo=armijo, C1=C1, C2=C2, constC=constC, **kwargs) - log['gw_dist'] = gwloss(constC, hC1, hC2, res) - log['T'] = res - if log: - return log['gw_dist'], log - else: - return log['gw_dist'] - - def entropic_gromov_wasserstein(C1, C2, p, q, loss_fun, epsilon, max_iter=1000, tol=1e-9, verbose=False, log=False): """ diff --git a/test/test_gromov.py b/test/test_gromov.py index 70fa83f..43da9fc 100644 --- a/test/test_gromov.py +++ b/test/test_gromov.py @@ -44,10 +44,14 @@ def test_gromov(): gw, log = ot.gromov.gromov_wasserstein2(C1, C2, p, q, 'kl_loss', log=True) + gw_val = ot.gromov.gromov_wasserstein2(C1, C2, p, q, 'kl_loss', log=False) + G = log['T'] np.testing.assert_allclose(gw, 0, atol=1e-1, rtol=1e-1) + np.testing.assert_allclose(gw, gw_val, atol=1e-1, rtol=1e-1) # cf log=False + # check constratints np.testing.assert_allclose( p, G.sum(1), atol=1e-04) # cf convergence gromov -- cgit v1.2.3 From 6caf3b4809993826320a662d9f3d86be61ab3ad7 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 15 Nov 2019 09:28:52 +0100 Subject: Create pythonpackage.yml --- .github/workflows/pythonpackage.yml | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/pythonpackage.yml diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml new file mode 100644 index 0000000..bb94926 --- /dev/null +++ b/.github/workflows/pythonpackage.yml @@ -0,0 +1,35 @@ +name: Test Package + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + max-parallel: 4 + matrix: + python-version: [2.7, 3.5, 3.6, 3.7] + + steps: + - uses: actions/checkout@v1 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Lint with flake8 + run: | + pip install flake8 + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + pip install pytest "pytest-cov<2.6" + pip install . + python -m pytest -v test/ ot/ --doctest-modules --ignore ot/gpu/ --cov=ot -- cgit v1.2.3 From 81a32a35a4b7ff10473ea9cc465af2d5c9337918 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 15 Nov 2019 09:34:49 +0100 Subject: correct tests --- .github/workflows/pythonpackage.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml index bb94926..ec8f186 100644 --- a/.github/workflows/pythonpackage.yml +++ b/.github/workflows/pythonpackage.yml @@ -27,9 +27,9 @@ jobs: # stop the build if there are Python syntax errors or undefined names flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide - flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Test with pytest run: | pip install pytest "pytest-cov<2.6" - pip install . + python setup.py develop python -m pytest -v test/ ot/ --doctest-modules --ignore ot/gpu/ --cov=ot -- cgit v1.2.3 From 3635fc46d6fc55e6fa30b33ad07fe092dfd23241 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 15 Nov 2019 09:38:59 +0100 Subject: Remove github action tests (PR is coming) --- .github/workflows/pythonpackage.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml index ec8f186..cb3baf8 100644 --- a/.github/workflows/pythonpackage.yml +++ b/.github/workflows/pythonpackage.yml @@ -28,8 +28,3 @@ jobs: flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - - name: Test with pytest - run: | - pip install pytest "pytest-cov<2.6" - python setup.py develop - python -m pytest -v test/ ot/ --doctest-modules --ignore ot/gpu/ --cov=ot -- cgit v1.2.3 From 0280a3441b09c781035cda3b74213ec92026ff9e Mon Sep 17 00:00:00 2001 From: Kilian Date: Fri, 15 Nov 2019 16:10:37 +0100 Subject: fix bug numItermax emd in cg --- ot/optim.py | 6 ++++-- test/test_optim.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/ot/optim.py b/ot/optim.py index 0abd9e9..4012e0d 100644 --- a/ot/optim.py +++ b/ot/optim.py @@ -134,7 +134,7 @@ def solve_linesearch(cost, G, deltaG, Mi, f_val, return alpha, fc, f_val -def cg(a, b, M, reg, f, df, G0=None, numItermax=200, +def cg(a, b, M, reg, f, df, G0=None, numItermax=200, numItermaxEmd=100000, stopThr=1e-9, stopThr2=1e-9, verbose=False, log=False, **kwargs): """ Solve the general regularized OT problem with conditional gradient @@ -172,6 +172,8 @@ def cg(a, b, M, reg, f, df, G0=None, numItermax=200, initial guess (default is indep joint density) numItermax : int, optional Max number of iterations + numItermaxEmd : int, optional + Max number of iterations for emd stopThr : float, optional Stop threshol on the relative variation (>0) stopThr2 : float, optional @@ -238,7 +240,7 @@ def cg(a, b, M, reg, f, df, G0=None, numItermax=200, Mi += Mi.min() # solve linear program - Gc = emd(a, b, Mi) + Gc = emd(a, b, Mi, numItermax=numItermaxEmd) deltaG = Gc - G diff --git a/test/test_optim.py b/test/test_optim.py index ae31e1f..aade36e 100644 --- a/test/test_optim.py +++ b/test/test_optim.py @@ -37,6 +37,39 @@ def test_conditional_gradient(): np.testing.assert_allclose(b, G.sum(0)) +def test_conditional_gradient2(): + n = 4000 # nb samples + + mu_s = np.array([0, 0]) + cov_s = np.array([[1, 0], [0, 1]]) + + mu_t = np.array([4, 4]) + cov_t = np.array([[1, -.8], [-.8, 1]]) + + xs = ot.datasets.make_2D_samples_gauss(n, mu_s, cov_s) + xt = ot.datasets.make_2D_samples_gauss(n, mu_t, cov_t) + + a, b = np.ones((n,)) / n, np.ones((n,)) / n + + # loss matrix + M = ot.dist(xs, xt) + M /= M.max() + + def f(G): + return 0.5 * np.sum(G**2) + + def df(G): + return G + + reg = 1e-1 + + G, log = ot.optim.cg(a, b, M, reg, f, df, numItermaxEmd=200000, + verbose=True, log=True) + + np.testing.assert_allclose(a, G.sum(1)) + np.testing.assert_allclose(b, G.sum(0)) + + def test_generalized_conditional_gradient(): n_bins = 100 # nb bins -- cgit v1.2.3 From 7a02c69a3791682cc3993f7a20ed6841eef75441 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 29 Nov 2019 09:12:50 +0100 Subject: complete gitignore --- .gitignore | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.gitignore b/.gitignore index dadf84c..a2ace7c 100644 --- a/.gitignore +++ b/.gitignore @@ -106,3 +106,15 @@ ENV/ # coverage output folder cov_html/ + +docs/source/modules/generated/* +docs/source/_build/* + +# local debug folder +debug + +# vscode parameters +.vscode + +# pytest cahche +.pytest_cache \ No newline at end of file -- cgit v1.2.3 From e92ae6d155a6bed91c474a3e842581f09deceba3 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 29 Nov 2019 09:38:29 +0100 Subject: cleanup cpp code and annd emd with sparse Ot matrix --- ot/lp/EMD_wrapper.cpp | 95 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 75 insertions(+), 20 deletions(-) diff --git a/ot/lp/EMD_wrapper.cpp b/ot/lp/EMD_wrapper.cpp index fc7ca63..91110b4 100644 --- a/ot/lp/EMD_wrapper.cpp +++ b/ot/lp/EMD_wrapper.cpp @@ -17,18 +17,24 @@ int EMD_wrap(int n1, int n2, double *X, double *Y, double *D, double *G, double* alpha, double* beta, double *cost, int maxIter) { -// beware M and C anre strored in row major C style!!! + // beware M and C anre strored in row major C style!!! int n, m, i, cur; typedef FullBipartiteDigraph Digraph; - DIGRAPH_TYPEDEFS(FullBipartiteDigraph); + DIGRAPH_TYPEDEFS(FullBipartiteDigraph); - // Get the number of non zero coordinates for r and c + std::vector indI(n), indJ(m); + std::vector weights1(n), weights2(m); + Digraph di(n, m); + NetworkSimplexSimple net(di, true, n+m, n*m, maxIter); + + // Get the number of non zero coordinates for r and c and vectors n=0; for (int i=0; i0) { - n++; + weights1[ n ] = val; + indI[n++]=i; }else if(val<0){ return INFEASIBLE; } @@ -37,42 +43,85 @@ int EMD_wrap(int n1, int n2, double *X, double *Y, double *D, double *G, for (int i=0; i0) { - m++; + weights2[ m ] = -val; + indJ[m++]=i; }else if(val<0){ return INFEASIBLE; } } // Define the graph + net.supplyMap(&weights1[0], n, &weights2[0], m); + + // Set the cost of each edge + for (int i=0; i indI(n), indJ(m); std::vector weights1(n), weights2(m); Digraph di(n, m); NetworkSimplexSimple net(di, true, n+m, n*m, maxIter); - // Set supply and demand, don't account for 0 values (faster) - - cur=0; + // Get the number of non zero coordinates for r and c and vectors + n=0; for (int i=0; i0) { - weights1[ cur ] = val; - indI[cur++]=i; - } + weights1[ n ] = val; + indI[n++]=i; + }else if(val<0){ + return INFEASIBLE; + } } - - // Demand is actually negative supply... - - cur=0; + m=0; for (int i=0; i0) { - weights2[ cur ] = -val; - indJ[cur++]=i; - } + weights2[ m ] = -val; + indJ[m++]=i; + }else if(val<0){ + return INFEASIBLE; + } } - + // Define the graph net.supplyMap(&weights1[0], n, &weights2[0], m); // Set the cost of each edge @@ -90,14 +139,19 @@ int EMD_wrap(int n1, int n2, double *X, double *Y, double *D, double *G, if (ret==(int)net.OPTIMAL || ret==(int)net.MAX_ITER_REACHED) { *cost = 0; Arc a; di.first(a); + cur=0 for (; a != INVALID; di.next(a)) { int i = di.source(a); int j = di.target(a); double flow = net.flow(a); *cost += flow * (*(D+indI[i]*n2+indJ[j-n])); - *(G+indI[i]*n2+indJ[j-n]) = flow; + + *(G+cur) = flow; + *(iG+cur) = i; + *(jG+cur) = j; *(alpha + indI[i]) = -net.potential(i); *(beta + indJ[j-n]) = net.potential(j); + cur++; } } @@ -105,3 +159,4 @@ int EMD_wrap(int n1, int n2, double *X, double *Y, double *D, double *G, return ret; } + -- cgit v1.2.3 From df0d259ebab268517716d666ae45494b6ba998ea Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 29 Nov 2019 09:41:45 +0100 Subject: cant beleive i forgot a semicolumn --- ot/lp/EMD_wrapper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ot/lp/EMD_wrapper.cpp b/ot/lp/EMD_wrapper.cpp index 91110b4..29e2303 100644 --- a/ot/lp/EMD_wrapper.cpp +++ b/ot/lp/EMD_wrapper.cpp @@ -139,7 +139,7 @@ int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, if (ret==(int)net.OPTIMAL || ret==(int)net.MAX_ITER_REACHED) { *cost = 0; Arc a; di.first(a); - cur=0 + cur=0; for (; a != INVALID; di.next(a)) { int i = di.source(a); int j = di.target(a); -- cgit v1.2.3 From 3a858dfa1f2795b22d1e2db3cfd94d1eb7831f8d Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Fri, 29 Nov 2019 09:46:35 +0100 Subject: correct bad speedup --- ot/lp/EMD_wrapper.cpp | 48 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/ot/lp/EMD_wrapper.cpp b/ot/lp/EMD_wrapper.cpp index 29e2303..65fa80f 100644 --- a/ot/lp/EMD_wrapper.cpp +++ b/ot/lp/EMD_wrapper.cpp @@ -18,23 +18,17 @@ int EMD_wrap(int n1, int n2, double *X, double *Y, double *D, double *G, double* alpha, double* beta, double *cost, int maxIter) { // beware M and C anre strored in row major C style!!! - int n, m, i, cur; + int n, m, i, cur; typedef FullBipartiteDigraph Digraph; DIGRAPH_TYPEDEFS(FullBipartiteDigraph); - std::vector indI(n), indJ(m); - std::vector weights1(n), weights2(m); - Digraph di(n, m); - NetworkSimplexSimple net(di, true, n+m, n*m, maxIter); - - // Get the number of non zero coordinates for r and c and vectors + // Get the number of non zero coordinates for r and c n=0; for (int i=0; i0) { - weights1[ n ] = val; - indI[n++]=i; + n++; }else if(val<0){ return INFEASIBLE; } @@ -43,14 +37,42 @@ int EMD_wrap(int n1, int n2, double *X, double *Y, double *D, double *G, for (int i=0; i0) { - weights2[ m ] = -val; - indJ[m++]=i; + m++; }else if(val<0){ return INFEASIBLE; } } // Define the graph + + std::vector indI(n), indJ(m); + std::vector weights1(n), weights2(m); + Digraph di(n, m); + NetworkSimplexSimple net(di, true, n+m, n*m, maxIter); + + // Set supply and demand, don't account for 0 values (faster) + + cur=0; + for (int i=0; i0) { + weights1[ cur ] = val; + indI[cur++]=i; + } + } + + // Demand is actually negative supply... + + cur=0; + for (int i=0; i0) { + weights2[ cur ] = -val; + indJ[cur++]=i; + } + } + + net.supplyMap(&weights1[0], n, &weights2[0], m); // Set the cost of each edge @@ -147,8 +169,8 @@ int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, *cost += flow * (*(D+indI[i]*n2+indJ[j-n])); *(G+cur) = flow; - *(iG+cur) = i; - *(jG+cur) = j; + *(iG+cur) = indI[i]; + *(jG+cur) = indJ[j]; *(alpha + indI[i]) = -net.potential(i); *(beta + indJ[j-n]) = net.potential(j); cur++; -- cgit v1.2.3 From 4a6883e0ce2fd9f3edd374d54c4c219d876ceb76 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 2 Dec 2019 09:37:54 +0100 Subject: nothing explodes and it compiles --- ot/lp/EMD.h | 4 ++++ ot/lp/EMD_wrapper.cpp | 2 +- ot/lp/__init__.py | 29 ++++++++++++++++++++++------- ot/lp/emd_wrap.pyx | 38 +++++++++++++++++++++++++++++++++----- 4 files changed, 60 insertions(+), 13 deletions(-) diff --git a/ot/lp/EMD.h b/ot/lp/EMD.h index f42e222..bc513d2 100644 --- a/ot/lp/EMD.h +++ b/ot/lp/EMD.h @@ -32,4 +32,8 @@ enum ProblemType { int EMD_wrap(int n1,int n2, double *X, double *Y,double *D, double *G, double* alpha, double* beta, double *cost, int maxIter); +int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, + long *iG, long *jG, double *G, + double* alpha, double* beta, double *cost, int maxIter); + #endif diff --git a/ot/lp/EMD_wrapper.cpp b/ot/lp/EMD_wrapper.cpp index 65fa80f..3ca7319 100644 --- a/ot/lp/EMD_wrapper.cpp +++ b/ot/lp/EMD_wrapper.cpp @@ -108,7 +108,7 @@ int EMD_wrap(int n1, int n2, double *X, double *Y, double *D, double *G, int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, - int *iG, int *jG, double *G, + long *iG, long *jG, double *G, double* alpha, double* beta, double *cost, int maxIter) { // beware M and C anre strored in row major C style!!! int n, m, i, cur; diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index 0c92810..4fec7d9 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -27,7 +27,7 @@ __all__=['emd', 'emd2', 'barycenter', 'free_support_barycenter', 'cvx', 'emd_1d', 'emd2_1d', 'wasserstein_1d'] -def emd(a, b, M, numItermax=100000, log=False): +def emd(a, b, M, numItermax=100000, log=False, sparse=False): r"""Solves the Earth Movers distance problem and returns the OT matrix @@ -109,7 +109,12 @@ def emd(a, b, M, numItermax=100000, log=False): if len(b) == 0: b = np.ones((M.shape[1],), dtype=np.float64) / M.shape[1] - G, cost, u, v, result_code = emd_c(a, b, M, numItermax) + if sparse: + Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax,sparse) + G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) + else: + G, cost, u, v, result_code = emd_c(a, b, M, numItermax,sparse) + result_code_string = check_result(result_code) if log: log = {} @@ -123,7 +128,7 @@ def emd(a, b, M, numItermax=100000, log=False): def emd2(a, b, M, processes=multiprocessing.cpu_count(), - numItermax=100000, log=False, return_matrix=False): + numItermax=100000, log=False, sparse=False, return_matrix=False): r"""Solves the Earth Movers distance problem and returns the loss .. math:: @@ -214,19 +219,29 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), if log or return_matrix: def f(b): - G, cost, u, v, resultCode = emd_c(a, b, M, numItermax) - result_code_string = check_result(resultCode) + + if sparse: + Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax,sparse) + G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) + else: + G, cost, u, v, result_code = emd_c(a, b, M, numItermax,sparse) + + result_code_string = check_result(result_code) log = {} if return_matrix: log['G'] = G log['u'] = u log['v'] = v log['warning'] = result_code_string - log['result_code'] = resultCode + log['result_code'] = result_code return [cost, log] else: def f(b): - G, cost, u, v, result_code = emd_c(a, b, M, numItermax) + if sparse: + Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax,sparse) + G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) + else: + G, cost, u, v, result_code = emd_c(a, b, M, numItermax,sparse) check_result(result_code) return cost diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index 2b6c495..345cb66 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -20,6 +20,9 @@ import warnings cdef extern from "EMD.h": int EMD_wrap(int n1,int n2, double *X, double *Y,double *D, double *G, double* alpha, double* beta, double *cost, int maxIter) + int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, + long *iG, long *jG, double *G, + double* alpha, double* beta, double *cost, int maxIter) cdef enum ProblemType: INFEASIBLE, OPTIMAL, UNBOUNDED, MAX_ITER_REACHED @@ -39,7 +42,7 @@ def check_result(result_code): @cython.boundscheck(False) @cython.wraparound(False) -def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mode="c"] b, np.ndarray[double, ndim=2, mode="c"] M, int max_iter): +def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mode="c"] b, np.ndarray[double, ndim=2, mode="c"] M, int max_iter, bint sparse): """ Solves the Earth Movers distance problem and returns the optimal transport matrix @@ -82,12 +85,18 @@ def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mod """ cdef int n1= M.shape[0] cdef int n2= M.shape[1] + cdef int nmax=n1+n2-1 + cdef int result_code = 0 cdef double cost=0 - cdef np.ndarray[double, ndim=2, mode="c"] G=np.zeros([n1, n2]) cdef np.ndarray[double, ndim=1, mode="c"] alpha=np.zeros(n1) cdef np.ndarray[double, ndim=1, mode="c"] beta=np.zeros(n2) + cdef np.ndarray[double, ndim=2, mode="c"] G=np.zeros([0, 0]) + + cdef np.ndarray[double, ndim=1, mode="c"] Gv=np.zeros(0) + cdef np.ndarray[long, ndim=1, mode="c"] iG=np.zeros(0,dtype=np.int) + cdef np.ndarray[long, ndim=1, mode="c"] jG=np.zeros(0,dtype=np.int) if not len(a): a=np.ones((n1,))/n1 @@ -95,10 +104,29 @@ def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mod if not len(b): b=np.ones((n2,))/n2 - # calling the function - cdef int result_code = EMD_wrap(n1, n2, a.data, b.data, M.data, G.data, alpha.data, beta.data, &cost, max_iter) + if sparse: + + Gv=np.zeros(nmax) + iG=np.zeros(nmax,dtype=np.int) + jG=np.zeros(nmax,dtype=np.int) + + + result_code = EMD_wrap_return_sparse(n1, n2, a.data, b.data, M.data, iG.data, jG.data, G.data, alpha.data, beta.data, &cost, max_iter) + + + return Gv, iG, jG, cost, alpha, beta, result_code + + + else: + + + G=np.zeros([n1, n2]) + + + # calling the function + result_code = EMD_wrap(n1, n2, a.data, b.data, M.data, G.data, alpha.data, beta.data, &cost, max_iter) - return G, cost, alpha, beta, result_code + return G, cost, alpha, beta, result_code @cython.boundscheck(False) -- cgit v1.2.3 From 57321bd0172c97b77dfc8b14972c18d063b6dda8 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 2 Dec 2019 11:13:07 +0100 Subject: add awesome sparse solver --- ot/lp/EMD_wrapper.cpp | 65 ++++++++++++++++++++++++++++++++++++--------------- ot/lp/emd_wrap.pyx | 2 +- test/test_ot.py | 20 ++++++++++++++++ 3 files changed, 67 insertions(+), 20 deletions(-) diff --git a/ot/lp/EMD_wrapper.cpp b/ot/lp/EMD_wrapper.cpp index 3ca7319..2aa44c1 100644 --- a/ot/lp/EMD_wrapper.cpp +++ b/ot/lp/EMD_wrapper.cpp @@ -111,23 +111,19 @@ int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, long *iG, long *jG, double *G, double* alpha, double* beta, double *cost, int maxIter) { // beware M and C anre strored in row major C style!!! - int n, m, i, cur; + + // Get the number of non zero coordinates for r and c and vectors + int n, m, i, cur; typedef FullBipartiteDigraph Digraph; DIGRAPH_TYPEDEFS(FullBipartiteDigraph); - std::vector indI(n), indJ(m); - std::vector weights1(n), weights2(m); - Digraph di(n, m); - NetworkSimplexSimple net(di, true, n+m, n*m, maxIter); - - // Get the number of non zero coordinates for r and c and vectors + // Get the number of non zero coordinates for r and c n=0; for (int i=0; i0) { - weights1[ n ] = val; - indI[n++]=i; + n++; }else if(val<0){ return INFEASIBLE; } @@ -136,13 +132,41 @@ int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, for (int i=0; i0) { - weights2[ m ] = -val; - indJ[m++]=i; + m++; }else if(val<0){ return INFEASIBLE; } } + // Define the graph + + std::vector indI(n), indJ(m); + std::vector weights1(n), weights2(m); + Digraph di(n, m); + NetworkSimplexSimple net(di, true, n+m, n*m, maxIter); + + // Set supply and demand, don't account for 0 values (faster) + + cur=0; + for (int i=0; i0) { + weights1[ cur ] = val; + indI[cur++]=i; + } + } + + // Demand is actually negative supply... + + cur=0; + for (int i=0; i0) { + weights2[ cur ] = -val; + indJ[cur++]=i; + } + } + // Define the graph net.supplyMap(&weights1[0], n, &weights2[0], m); @@ -166,14 +190,17 @@ int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, int i = di.source(a); int j = di.target(a); double flow = net.flow(a); - *cost += flow * (*(D+indI[i]*n2+indJ[j-n])); - - *(G+cur) = flow; - *(iG+cur) = indI[i]; - *(jG+cur) = indJ[j]; - *(alpha + indI[i]) = -net.potential(i); - *(beta + indJ[j-n]) = net.potential(j); - cur++; + if (flow>0) + { + *cost += flow * (*(D+indI[i]*n2+indJ[j-n])); + + *(G+cur) = flow; + *(iG+cur) = indI[i]; + *(jG+cur) = indJ[j-n]; + *(alpha + indI[i]) = -net.potential(i); + *(beta + indJ[j-n]) = net.potential(j); + cur++; + } } } diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index 345cb66..f183995 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -111,7 +111,7 @@ def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mod jG=np.zeros(nmax,dtype=np.int) - result_code = EMD_wrap_return_sparse(n1, n2, a.data, b.data, M.data, iG.data, jG.data, G.data, alpha.data, beta.data, &cost, max_iter) + result_code = EMD_wrap_return_sparse(n1, n2, a.data, b.data, M.data, iG.data, jG.data, Gv.data, alpha.data, beta.data, &cost, max_iter) return Gv, iG, jG, cost, alpha, beta, result_code diff --git a/test/test_ot.py b/test/test_ot.py index dacae0a..4d59e12 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -118,6 +118,26 @@ def test_emd_empty(): np.testing.assert_allclose(w, 0) +def test_emd_sparse(): + + n = 100 + rng = np.random.RandomState(0) + + x = rng.randn(n, 2) + x2 = rng.randn(n, 2) + u = ot.utils.unif(n) + + M = ot.dist(x, x2) + + G = ot.emd([], [], M) + + Gs = ot.emd([], [], M, sparse=True) + + # check G is the same + np.testing.assert_allclose(G, Gs.todense()) + # check constraints + + def test_emd2_multi(): n = 500 # nb bins -- cgit v1.2.3 From a6a654de5e78dd388a793fbd26f60045b05d519c Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 2 Dec 2019 11:31:32 +0100 Subject: proper documentation and parameter --- ot/lp/EMD.h | 2 +- ot/lp/EMD_wrapper.cpp | 3 ++- ot/lp/__init__.py | 16 ++++++++++++++-- ot/lp/emd_wrap.pyx | 10 ++++++---- test/test_ot.py | 2 +- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/ot/lp/EMD.h b/ot/lp/EMD.h index bc513d2..9896091 100644 --- a/ot/lp/EMD.h +++ b/ot/lp/EMD.h @@ -33,7 +33,7 @@ enum ProblemType { int EMD_wrap(int n1,int n2, double *X, double *Y,double *D, double *G, double* alpha, double* beta, double *cost, int maxIter); int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, - long *iG, long *jG, double *G, + long *iG, long *jG, double *G, long * nG, double* alpha, double* beta, double *cost, int maxIter); #endif diff --git a/ot/lp/EMD_wrapper.cpp b/ot/lp/EMD_wrapper.cpp index 2aa44c1..9be2cdc 100644 --- a/ot/lp/EMD_wrapper.cpp +++ b/ot/lp/EMD_wrapper.cpp @@ -108,7 +108,7 @@ int EMD_wrap(int n1, int n2, double *X, double *Y, double *D, double *G, int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, - long *iG, long *jG, double *G, + long *iG, long *jG, double *G, long * nG, double* alpha, double* beta, double *cost, int maxIter) { // beware M and C anre strored in row major C style!!! @@ -202,6 +202,7 @@ int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, cur++; } } + *nG=cur; // nb of value +1 for numpy indexing } diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index 4fec7d9..d476071 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -27,7 +27,7 @@ __all__=['emd', 'emd2', 'barycenter', 'free_support_barycenter', 'cvx', 'emd_1d', 'emd2_1d', 'wasserstein_1d'] -def emd(a, b, M, numItermax=100000, log=False, sparse=False): +def emd(a, b, M, numItermax=100000, log=False, dense=True): r"""Solves the Earth Movers distance problem and returns the OT matrix @@ -62,6 +62,10 @@ def emd(a, b, M, numItermax=100000, log=False, sparse=False): log: bool, optional (default=False) If True, returns a dictionary containing the cost and dual variables. Otherwise returns only the optimal transportation matrix. + dense: boolean, optional (default=True) + If True, returns math:`\gamma` as a dense ndarray of shape (ns, nt). + Otherwise returns a sparse representation using scipy's `coo_matrix` + format. Returns ------- @@ -103,6 +107,8 @@ def emd(a, b, M, numItermax=100000, log=False, sparse=False): b = np.asarray(b, dtype=np.float64) M = np.asarray(M, dtype=np.float64) + sparse= not dense + # if empty array given then use uniform distributions if len(a) == 0: a = np.ones((M.shape[0],), dtype=np.float64) / M.shape[0] @@ -128,7 +134,7 @@ def emd(a, b, M, numItermax=100000, log=False, sparse=False): def emd2(a, b, M, processes=multiprocessing.cpu_count(), - numItermax=100000, log=False, sparse=False, return_matrix=False): + numItermax=100000, log=False, dense=True, return_matrix=False): r"""Solves the Earth Movers distance problem and returns the loss .. math:: @@ -166,6 +172,10 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), variables. Otherwise returns only the optimal transportation cost. return_matrix: boolean, optional (default=False) If True, returns the optimal transportation matrix in the log. + dense: boolean, optional (default=True) + If True, returns math:`\gamma` as a dense ndarray of shape (ns, nt). + Otherwise returns a sparse representation using scipy's `coo_matrix` + format. Returns ------- @@ -207,6 +217,8 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), b = np.asarray(b, dtype=np.float64) M = np.asarray(M, dtype=np.float64) + sparse=not dense + # problem with pikling Forks if sys.platform.endswith('win32'): processes=1 diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index f183995..4b6cdce 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -21,7 +21,7 @@ import warnings cdef extern from "EMD.h": int EMD_wrap(int n1,int n2, double *X, double *Y,double *D, double *G, double* alpha, double* beta, double *cost, int maxIter) int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, - long *iG, long *jG, double *G, + long *iG, long *jG, double *G, long * nG, double* alpha, double* beta, double *cost, int maxIter) cdef enum ProblemType: INFEASIBLE, OPTIMAL, UNBOUNDED, MAX_ITER_REACHED @@ -75,7 +75,8 @@ def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mod max_iter : int The maximum number of iterations before stopping the optimization algorithm if it has not converged. - + sparse : bool + Returning a sparse transport matrix if set to True Returns ------- @@ -87,6 +88,7 @@ def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mod cdef int n2= M.shape[1] cdef int nmax=n1+n2-1 cdef int result_code = 0 + cdef int nG=0 cdef double cost=0 cdef np.ndarray[double, ndim=1, mode="c"] alpha=np.zeros(n1) @@ -111,10 +113,10 @@ def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mod jG=np.zeros(nmax,dtype=np.int) - result_code = EMD_wrap_return_sparse(n1, n2, a.data, b.data, M.data, iG.data, jG.data, Gv.data, alpha.data, beta.data, &cost, max_iter) + result_code = EMD_wrap_return_sparse(n1, n2, a.data, b.data, M.data, iG.data, jG.data, Gv.data, &nG, alpha.data, beta.data, &cost, max_iter) - return Gv, iG, jG, cost, alpha, beta, result_code + return Gv[:nG], iG[:nG], jG[:nG], cost, alpha, beta, result_code else: diff --git a/test/test_ot.py b/test/test_ot.py index 4d59e12..7b44fd1 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -131,7 +131,7 @@ def test_emd_sparse(): G = ot.emd([], [], M) - Gs = ot.emd([], [], M, sparse=True) + Gs = ot.emd([], [], M, dense=False) # check G is the same np.testing.assert_allclose(G, Gs.todense()) -- cgit v1.2.3 From 127adbaf4eef7a6dffbdcd4f930fc6301587f861 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 2 Dec 2019 11:41:13 +0100 Subject: remove useless variable --- test/test_ot.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/test_ot.py b/test/test_ot.py index 7b44fd1..8602022 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -125,7 +125,6 @@ def test_emd_sparse(): x = rng.randn(n, 2) x2 = rng.randn(n, 2) - u = ot.utils.unif(n) M = ot.dist(x, x2) -- cgit v1.2.3 From 84384dd9e5dc78ed5cc867a53bd1de31c05d77fc Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 2 Dec 2019 13:34:05 +0100 Subject: add test emd2 --- test/test_ot.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/test_ot.py b/test/test_ot.py index 8602022..507d188 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -132,9 +132,12 @@ def test_emd_sparse(): Gs = ot.emd([], [], M, dense=False) + ws = ot.emd2([], [], M, dense=False) + # check G is the same np.testing.assert_allclose(G, Gs.todense()) - # check constraints + # check value + np.testing.assert_allclose(Gs.multiply(M).sum(), ws, rtol=1e-6) def test_emd2_multi(): -- cgit v1.2.3 From 7371b2f4f931db8f67ec2967253be8d95ff9fe80 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 2 Dec 2019 13:34:55 +0100 Subject: add test emd2 --- test/test_ot.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/test_ot.py b/test/test_ot.py index 507d188..48ea87f 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -171,7 +171,12 @@ def test_emd2_multi(): emdn = ot.emd2(a, b, M) ot.toc('multi proc : {} s') + ot.tic() + emdn2 = ot.emd2(a, b, M, dense = False) + ot.toc('multi proc : {} s') + np.testing.assert_allclose(emd1, emdn) + np.testing.assert_allclose(emd1, emdn2) # emd loss multipro proc with log ot.tic() -- cgit v1.2.3 From dfaba55affcca606e8e041bdbd0fc5a7735c2b07 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 2 Dec 2019 13:36:08 +0100 Subject: add test emd2 multi --- test/test_ot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_ot.py b/test/test_ot.py index 48ea87f..470fd0f 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -176,7 +176,7 @@ def test_emd2_multi(): ot.toc('multi proc : {} s') np.testing.assert_allclose(emd1, emdn) - np.testing.assert_allclose(emd1, emdn2) + np.testing.assert_allclose(emd1, emdn2, rtol=1e-6) # emd loss multipro proc with log ot.tic() -- cgit v1.2.3 From c439e3efb920086154c741b41f65d99165e875d8 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 2 Dec 2019 13:57:13 +0100 Subject: pep8 --- test/test_ot.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_ot.py b/test/test_ot.py index 470fd0f..fbacd8b 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -172,8 +172,8 @@ def test_emd2_multi(): ot.toc('multi proc : {} s') ot.tic() - emdn2 = ot.emd2(a, b, M, dense = False) - ot.toc('multi proc : {} s') + emdn2 = ot.emd2(a, b, M, dense=False) + ot.toc('multi proc : {} s') np.testing.assert_allclose(emd1, emdn) np.testing.assert_allclose(emd1, emdn2, rtol=1e-6) -- cgit v1.2.3 From a4afee871d8e9d5db68228d1ed5bf4853eedc294 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Tue, 3 Dec 2019 15:20:16 +0100 Subject: first implemntation sparse loss --- ot/lp/EMD.h | 5 +++ ot/lp/EMD_wrapper.cpp | 78 ++++++++++++++++++++++++++++++++++++++++++ ot/lp/emd_wrap.pyx | 4 +++ ot/lp/network_simplex_simple.h | 2 +- 4 files changed, 88 insertions(+), 1 deletion(-) diff --git a/ot/lp/EMD.h b/ot/lp/EMD.h index 9896091..fc94211 100644 --- a/ot/lp/EMD.h +++ b/ot/lp/EMD.h @@ -36,4 +36,9 @@ int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, long *iG, long *jG, double *G, long * nG, double* alpha, double* beta, double *cost, int maxIter); +int EMD_wrap_all_sparse(int n1, int n2, double *X, double *Y, + long *iD, long *jD, double *D, long nD, + long *iG, long *jG, double *G, long * nG, + double* alpha, double* beta, double *cost, int maxIter); + #endif diff --git a/ot/lp/EMD_wrapper.cpp b/ot/lp/EMD_wrapper.cpp index 9be2cdc..28e4af2 100644 --- a/ot/lp/EMD_wrapper.cpp +++ b/ot/lp/EMD_wrapper.cpp @@ -210,3 +210,81 @@ int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, return ret; } +int EMD_wrap_all_sparse(int n1, int n2, double *X, double *Y, + long *iD, long *jD, double *D, long nD, + long *iG, long *jG, double *G, long * nG, + double* alpha, double* beta, double *cost, int maxIter) { + // beware M and C anre strored in row major C style!!! + + // Get the number of non zero coordinates for r and c and vectors + int n, m, cur; + + typedef FullBipartiteDigraph Digraph; + DIGRAPH_TYPEDEFS(FullBipartiteDigraph); + + n=n1; + m=n2; + + + // Define the graph + + + std::vector weights2(m); + Digraph di(n, m); + NetworkSimplexSimple net(di, true, n+m, n*m, maxIter); + + // Set supply and demand, don't account for 0 values (faster) + + + // Demand is actually negative supply... + + cur=0; + for (int i=0; i0) { + weights2[ cur ] = -val; + } + } + + // Define the graph + net.supplyMap(X, n, &weights2[0], m); + + // Set the cost of each edge + for (int k=0; k0) + { + + *(G+cur) = flow; + *(iG+cur) = i; + *(jG+cur) = j-n; + *(alpha + i) = -net.potential(i); + *(beta + j-n) = net.potential(j); + cur++; + } + } + *nG=cur; // nb of value +1 for numpy indexing + + } + + + return ret; +} + diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index 4b6cdce..4e3586d 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -23,6 +23,10 @@ cdef extern from "EMD.h": int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, long *iG, long *jG, double *G, long * nG, double* alpha, double* beta, double *cost, int maxIter) + int EMD_wrap_all_sparse(int n1, int n2, double *X, double *Y, + long *iD, long *jD, double *D, long nD, + long *iG, long *jG, double *G, long * nG, + double* alpha, double* beta, double *cost, int maxIter) cdef enum ProblemType: INFEASIBLE, OPTIMAL, UNBOUNDED, MAX_ITER_REACHED diff --git a/ot/lp/network_simplex_simple.h b/ot/lp/network_simplex_simple.h index 7c6a4ce..498e921 100644 --- a/ot/lp/network_simplex_simple.h +++ b/ot/lp/network_simplex_simple.h @@ -686,7 +686,7 @@ namespace lemon { /// \see resetParams(), reset() ProblemType run() { #if DEBUG_LVL>0 - std::cout << "OPTIMAL = " << OPTIMAL << "\nINFEASIBLE = " << INFEASIBLE << "\nUNBOUNDED = " << UNBOUNDED << "\nMAX_ITER_REACHED" << MAX_ITER_REACHED\n"; + std::cout << "OPTIMAL = " << OPTIMAL << "\nINFEASIBLE = " << INFEASIBLE << "\nUNBOUNDED = " << UNBOUNDED << "\nMAX_ITER_REACHED" << MAX_ITER_REACHED << "\n" ; #endif if (!init()) return INFEASIBLE; -- cgit v1.2.3 From 92233f79e098f1930248d815e66c0a929508af59 Mon Sep 17 00:00:00 2001 From: Kilian Date: Mon, 9 Dec 2019 15:56:48 +0100 Subject: add assert for emd dimension mismatch --- ot/lp/__init__.py | 6 ++++++ test/test_ot.py | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index 0c92810..f77c3d7 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -109,6 +109,9 @@ def emd(a, b, M, numItermax=100000, log=False): if len(b) == 0: b = np.ones((M.shape[1],), dtype=np.float64) / M.shape[1] + assert (a.shape[0] == M.shape[0] or b.shape[0] == M.shape[1]), \ + "Dimension mismatch, check dimensions of M with a and b" + G, cost, u, v, result_code = emd_c(a, b, M, numItermax) result_code_string = check_result(result_code) if log: @@ -212,6 +215,9 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), if len(b) == 0: b = np.ones((M.shape[1],), dtype=np.float64) / M.shape[1] + assert (a.shape[0] == M.shape[0] or b.shape[0] == M.shape[1]), \ + "Dimension mismatch, check dimensions of M with a and b" + if log or return_matrix: def f(b): G, cost, u, v, resultCode = emd_c(a, b, M, numItermax) diff --git a/test/test_ot.py b/test/test_ot.py index dacae0a..1343604 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -14,6 +14,22 @@ from ot.datasets import make_1D_gauss as gauss import pytest +def test_emd_dimension_mismatch(): + # test emd and emd2 for simple identity + n_samples = 100 + n_features = 2 + rng = np.random.RandomState(0) + + x = rng.randn(n_samples, n_features) + a = ot.utils.unif(n_samples + 1) + + M = ot.dist(x, x) + + np.testing.assert_raises(AssertionError, emd, a, a, M) + + np.testing.assert_raises(AssertionError, emd2, a, a, M) + + def test_emd_emd2(): # test emd and emd2 for simple identity n = 100 -- cgit v1.2.3 From 428b44e15591071cfcd69af365d878cfd876f9d3 Mon Sep 17 00:00:00 2001 From: Kilian Date: Mon, 9 Dec 2019 16:35:49 +0100 Subject: calling ot.emd test --- test/test_ot.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/test_ot.py b/test/test_ot.py index 1343604..25cdfd4 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -14,8 +14,9 @@ from ot.datasets import make_1D_gauss as gauss import pytest + def test_emd_dimension_mismatch(): - # test emd and emd2 for simple identity + # test emd and emd2 for dimension mismatch n_samples = 100 n_features = 2 rng = np.random.RandomState(0) @@ -25,9 +26,9 @@ def test_emd_dimension_mismatch(): M = ot.dist(x, x) - np.testing.assert_raises(AssertionError, emd, a, a, M) + np.testing.assert_raises(AssertionError, ot.emd, a, a, M) - np.testing.assert_raises(AssertionError, emd2, a, a, M) + np.testing.assert_raises(AssertionError, ot.emd2, a, a, M) def test_emd_emd2(): -- cgit v1.2.3 From 92dbe259032d340a259209e477e9aac74897689e Mon Sep 17 00:00:00 2001 From: Kilian Date: Mon, 9 Dec 2019 16:43:54 +0100 Subject: pep8 --- test/test_ot.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/test_ot.py b/test/test_ot.py index 25cdfd4..42a3d0a 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -14,7 +14,6 @@ from ot.datasets import make_1D_gauss as gauss import pytest - def test_emd_dimension_mismatch(): # test emd and emd2 for dimension mismatch n_samples = 100 -- cgit v1.2.3 From a9bbc2cfdffd22ceee3256102e470df6c25338f3 Mon Sep 17 00:00:00 2001 From: Kilian Date: Tue, 10 Dec 2019 11:23:50 +0100 Subject: change or in assert by and --- ot/lp/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index f77c3d7..4cce41c 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -109,7 +109,7 @@ def emd(a, b, M, numItermax=100000, log=False): if len(b) == 0: b = np.ones((M.shape[1],), dtype=np.float64) / M.shape[1] - assert (a.shape[0] == M.shape[0] or b.shape[0] == M.shape[1]), \ + assert (a.shape[0] == M.shape[0] and b.shape[0] == M.shape[1]), \ "Dimension mismatch, check dimensions of M with a and b" G, cost, u, v, result_code = emd_c(a, b, M, numItermax) @@ -215,7 +215,7 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), if len(b) == 0: b = np.ones((M.shape[1],), dtype=np.float64) / M.shape[1] - assert (a.shape[0] == M.shape[0] or b.shape[0] == M.shape[1]), \ + assert (a.shape[0] == M.shape[0] and b.shape[0] == M.shape[1]), \ "Dimension mismatch, check dimensions of M with a and b" if log or return_matrix: -- cgit v1.2.3 From 3cb03158c42dde141d6f33973ea6e3394b9dc3d4 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Wed, 18 Dec 2019 10:15:30 +0100 Subject: cleanup variable name dense --- ot/lp/__init__.py | 30 ++++++++++++++---------------- ot/lp/emd_wrap.pyx | 26 +++++++++++++------------- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index d476071..bb9829a 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -107,7 +107,6 @@ def emd(a, b, M, numItermax=100000, log=False, dense=True): b = np.asarray(b, dtype=np.float64) M = np.asarray(M, dtype=np.float64) - sparse= not dense # if empty array given then use uniform distributions if len(a) == 0: @@ -115,11 +114,11 @@ def emd(a, b, M, numItermax=100000, log=False, dense=True): if len(b) == 0: b = np.ones((M.shape[1],), dtype=np.float64) / M.shape[1] - if sparse: - Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax,sparse) - G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) + if dense: + G, cost, u, v, result_code = emd_c(a, b, M, numItermax,dense) else: - G, cost, u, v, result_code = emd_c(a, b, M, numItermax,sparse) + Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax,dense) + G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) result_code_string = check_result(result_code) if log: @@ -217,8 +216,6 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), b = np.asarray(b, dtype=np.float64) M = np.asarray(M, dtype=np.float64) - sparse=not dense - # problem with pikling Forks if sys.platform.endswith('win32'): processes=1 @@ -231,12 +228,11 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), if log or return_matrix: def f(b): - - if sparse: - Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax,sparse) - G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) + if dense: + G, cost, u, v, result_code = emd_c(a, b, M, numItermax,dense) else: - G, cost, u, v, result_code = emd_c(a, b, M, numItermax,sparse) + Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax,dense) + G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) result_code_string = check_result(result_code) log = {} @@ -249,11 +245,13 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), return [cost, log] else: def f(b): - if sparse: - Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax,sparse) - G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) + if dense: + G, cost, u, v, result_code = emd_c(a, b, M, numItermax,dense) else: - G, cost, u, v, result_code = emd_c(a, b, M, numItermax,sparse) + Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax,dense) + G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) + + result_code_string = check_result(result_code) check_result(result_code) return cost diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index 4e3586d..636a9e3 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -46,7 +46,7 @@ def check_result(result_code): @cython.boundscheck(False) @cython.wraparound(False) -def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mode="c"] b, np.ndarray[double, ndim=2, mode="c"] M, int max_iter, bint sparse): +def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mode="c"] b, np.ndarray[double, ndim=2, mode="c"] M, int max_iter, bint dense): """ Solves the Earth Movers distance problem and returns the optimal transport matrix @@ -110,8 +110,19 @@ def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mod if not len(b): b=np.ones((n2,))/n2 - if sparse: + if dense: + # init OT matrix + G=np.zeros([n1, n2]) + + # calling the function + result_code = EMD_wrap(n1, n2, a.data, b.data, M.data, G.data, alpha.data, beta.data, &cost, max_iter) + + return G, cost, alpha, beta, result_code + + else: + + # init sparse OT matrix Gv=np.zeros(nmax) iG=np.zeros(nmax,dtype=np.int) jG=np.zeros(nmax,dtype=np.int) @@ -123,17 +134,6 @@ def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mod return Gv[:nG], iG[:nG], jG[:nG], cost, alpha, beta, result_code - else: - - - G=np.zeros([n1, n2]) - - - # calling the function - result_code = EMD_wrap(n1, n2, a.data, b.data, M.data, G.data, alpha.data, beta.data, &cost, max_iter) - - return G, cost, alpha, beta, result_code - @cython.boundscheck(False) @cython.wraparound(False) -- cgit v1.2.3 From d97f81dd731c4b1132939500076fd48c89f19d1f Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Wed, 18 Dec 2019 10:17:31 +0100 Subject: update test --- test/test_ot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_ot.py b/test/test_ot.py index fbacd8b..3dd544c 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -128,7 +128,7 @@ def test_emd_sparse(): M = ot.dist(x, x2) - G = ot.emd([], [], M) + G = ot.emd([], [], M, dense=True) Gs = ot.emd([], [], M, dense=False) -- cgit v1.2.3 From fc6afbd19e75e10b539062e012583c283750d9f6 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Wed, 18 Dec 2019 10:48:58 +0100 Subject: correct documentation in pyx file --- ot/lp/emd_wrap.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index 636a9e3..3220d12 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -79,8 +79,8 @@ def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mod max_iter : int The maximum number of iterations before stopping the optimization algorithm if it has not converged. - sparse : bool - Returning a sparse transport matrix if set to True + dense : bool + Return a sparse transport matrix if set to False Returns ------- -- cgit v1.2.3 From e9954bbd959be41c59136cf921fbf094b127eb4e Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Wed, 18 Dec 2019 12:56:55 +0100 Subject: cleanup emd.h and pyx file --- ot/lp/EMD.h | 4 ---- ot/lp/emd_wrap.pyx | 4 ---- 2 files changed, 8 deletions(-) diff --git a/ot/lp/EMD.h b/ot/lp/EMD.h index fc94211..2adaace 100644 --- a/ot/lp/EMD.h +++ b/ot/lp/EMD.h @@ -36,9 +36,5 @@ int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, long *iG, long *jG, double *G, long * nG, double* alpha, double* beta, double *cost, int maxIter); -int EMD_wrap_all_sparse(int n1, int n2, double *X, double *Y, - long *iD, long *jD, double *D, long nD, - long *iG, long *jG, double *G, long * nG, - double* alpha, double* beta, double *cost, int maxIter); #endif diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index 3220d12..c0d7128 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -23,10 +23,6 @@ cdef extern from "EMD.h": int EMD_wrap_return_sparse(int n1, int n2, double *X, double *Y, double *D, long *iG, long *jG, double *G, long * nG, double* alpha, double* beta, double *cost, int maxIter) - int EMD_wrap_all_sparse(int n1, int n2, double *X, double *Y, - long *iD, long *jD, double *D, long nD, - long *iG, long *jG, double *G, long * nG, - double* alpha, double* beta, double *cost, int maxIter) cdef enum ProblemType: INFEASIBLE, OPTIMAL, UNBOUNDED, MAX_ITER_REACHED -- cgit v1.2.3 From 3582b6ffe571cb96b69dc6c356ef8d946df57fe7 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Mon, 6 Jan 2020 11:33:01 +0100 Subject: add screenkhorn: screening Sinkhorn algorithm --- ot/bregman.py | 288 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 287 insertions(+), 1 deletion(-) diff --git a/ot/bregman.py b/ot/bregman.py index ba5c7ba..61b8605 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -8,13 +8,15 @@ Bregman projections for regularized OT # Kilian Fatras # Titouan Vayer # Hicham Janati +# Mokhtar Z. Alaya # # License: MIT License import numpy as np import warnings from .utils import unif, dist - +import bottleneck +from scipy.optimize import fmin_l_bfgs_b def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, stopThr=1e-9, verbose=False, log=False, **kwargs): @@ -1787,3 +1789,287 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli sinkhorn_div = sinkhorn_loss_ab - 1 / 2 * (sinkhorn_loss_a + sinkhorn_loss_b) return max(0, sinkhorn_div) + +def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=True, verbose=False): + + """" + Screening Sinkhorn Algorithm for Regularized Optimal Transport. + + Parameters + ---------- + a : `numpy.ndarray`, shape=(ns,) + samples weights in the source domain. + + b : `numpy.ndarray`, shape=(nt,) + samples weights in the target domain. + + M : `numpy.ndarray`, shape=(ns, nt) + Cost matrix. + + reg : `float` + Level of the entropy regularisation. + + ns_budget: `int` + Number budget of points to be keeped in the source domain. + + nt_budget: `int` + Number budget of points to be keeped in the target domain. + + uniform: `bool`, default=True + If `True`, a_i = 1. / ns and b_j = 1. / nt + + restricted: `bool`, default=True + If `True`, a warm-start initialization for the L-BFGS-B solver + using a restricted Sinkhorn algorithm with at most 5 iterations. + + verbose: `bool`, default=False + If `True`, dispaly informations along iterations. + + Returns + ------- + Gsc : `numpy.ndarray`, shape=(ns, nt) + Screened optimal transportation matrix for the given parameters. + + References: + ----------- + .. [1] M. Z. Alaya, Maxime Bérar, Gilles Gasso, Alain Rakotomamonjy. Screening Sinkhorn Algorithm for Regularized + Optimal Transport, NeurIPS 2019. + + """ + a = np.asarray(a, dtype=np.float64) + b = np.asarray(b, dtype=np.float64) + + # if the "autograd" package is needed for some experiments, we then have to change the instance of the cost matrix M + # from "ArrayBox"-type to "np.array"-type as follows: + if isinstance(M, np.ndarray) == False: + M = M._value + + M = np.asarray(M, dtype=np.float64) + ns, nt = M.shape + + # calculate the Gibbs kernel + K = np.empty_like(M) + np.divide(M, - reg, out=K) + np.exp(K, out=K) + + def projection(u, epsilon): + u[np.where(u <= epsilon)] = epsilon + return u + + # ----------------------------------------------------------------------------------------------------------------# + # Step 1: Screening Pre-processing # + # ----------------------------------------------------------------------------------------------------------------# + + if ns_budget == ns and nt_budget == nt: + # full number of budget points (ns, nt) = (ns_budget, nt_budget) + I = list(range(ns)) + J = list(range(nt)) + epsilon = 0.0 + kappa = 1.0 + + cst_u = 0. + cst_v = 0. + + bounds_u = [(0.0, np.inf)] * ns + bounds_v = [(0.0, np.inf)] * nt + + a_I = a + b_J = b + K_min = K.min() + K_IJ = K + K_IJc = [] + K_IcJ = [] + + vec_eps_IJc = np.zeros(nt) + vec_eps_IcJ = np.zeros(ns) + + else: + # sum of rows and columns of K + K_sum_cols = K.sum(axis=1) + K_sum_rows = K.sum(axis=0) + + if uniform: + if ns / ns_budget < 4: + aK_sort = np.sort(K_sum_cols) + epsilon_u_square = a[0] / aK_sort[ns_budget - 1] + else: + aK_sort = bottleneck.partition(K_sum_cols, ns_budget - 1)[ns_budget - 1] + epsilon_u_square = a[0] / aK_sort + + if nt / ns_budget < 4: + bK_sort = np.sort(K_sum_rows) + epsilon_v_square = b[0] / bK_sort[ns_budget - 1] + else: + bK_sort = bottleneck.partition(K_sum_rows, nt_budget - 1)[nt_budget - 1] + epsilon_v_square = b[0] / bK_sort + else: + aK = a / K_sum_cols + bK = b / K_sum_rows + + aK_sort = np.sort(aK)[::-1] + epsilon_u_square = aK_sort[ns_budget - 1] + + bK_sort = np.sort(bK)[::-1] + epsilon_v_square = bK_sort[ns_budget - 1] + + # active sets I and J (see Proposition .. in [1]) + I = np.where(a >= epsilon_u_square * K_sum_cols)[0].tolist() + J = np.where(b >= epsilon_v_square * K_sum_rows)[0].tolist() + + if len(I) != ns_budget: + if uniform: + aK = a / K_sum_cols + aK_sort = np.sort(aK)[::-1] + epsilon_u_square = aK_sort[ns_budget - 1:ns_budget + 1].mean() + I = np.where(a >= epsilon_u_square * K_sum_cols)[0].tolist() + + if len(J) != nt_budget: + if uniform: + bK = b / K_sum_rows + bK_sort = np.sort(bK)[::-1] + epsilon_v_square = bK_sort[ns_budget - 1:ns_budget + 1].mean() + J = np.where(b >= epsilon_v_square * K_sum_rows)[0].tolist() + + epsilon = (epsilon_u_square * epsilon_v_square) ** (1 / 4) + kappa = (epsilon_v_square / epsilon_u_square) ** (1 / 2) + + if verbose: + print("Epsilon = %s\n" %epsilon) + print("Scaling factor = %s\n" %kappa) + + if verbose: + print('|I_active| = %s \t |J_active| = %s ' %(len(I), len(J))) + + # Ic, Jc: complementary of the active sets I and J + Ic = list(set(list(range(ns))) - set(I)) + Jc = list(set(list(range(nt))) - set(J)) + + K_IJ = K[np.ix_(I, J)] + K_IcJ = K[np.ix_(Ic, J)] + K_IJc = K[np.ix_(I, Jc)] + + K_min = K_IJ.min() + if K_min == 0: + K_min = np.finfo(float).tiny + + # a_I, b_J, a_Ic, b_Jc + a_I = a[I] + b_J = b[J] + if not uniform: + a_I_min = a_I.min() + a_I_max = a_I.max() + b_J_max = b_J.max() + b_J_min = b_J.min() + else: + a_I_min = a_I[0] + a_I_max = a_I[0] + b_J_max = b_J[0] + b_J_min = b_J[0] + + # box constraints in L-BFGS-B (see Proposition 1 in [1]) + bounds_u = [(max(kappa * a_I_min / (epsilon * (nt - ns_budget) + ns_budget * (b_J_max / ( + epsilon * ns * K_min))), epsilon / kappa), a_I_max / (epsilon * nt * K_min))] * ns_budget + + bounds_v = [(max(b_J_min / (epsilon * (ns - ns_budget) + ns_budget * (a_I_max / (epsilon * nt * K_min))), \ + epsilon * kappa), b_J_max / (epsilon * ns * K_min))] * ns_budget + + # pre-calculated constants for the objective + vec_eps_IJc = epsilon * kappa * (K_IJc * np.ones(nt - ns_budget).reshape((1, -1))).sum(axis=1) + vec_eps_IcJ = (epsilon / kappa) * (np.ones(ns - ns_budget).reshape((-1, 1)) * K_IcJ).sum(axis=0) + + # initialisation + u0 = np.full(ns_budget, (1. / ns_budget) + epsilon / kappa) + v0 = np.full(nt_budget, (1. / nt_budget) + epsilon * kappa) + + # pre-calculed constants for Restricted Sinkhorn (see Algorithm 2 in [1]) + if restricted: + if ns_budget != ns or ns_budget != nt: + cst_u = kappa * epsilon * K_IJc.sum(axis=1) + cst_v = epsilon * K_IcJ.sum(axis=0) / kappa + + cpt = 1 + while (cpt < 5): # 5 iterations + K_IJ_v = K_IJ.T @ u0 + cst_v + v0 = b_J / (kappa * K_IJ_v) + KIJ_u = K_IJ @ v0 + cst_u + u0 = (kappa * a_I) / KIJ_u + cpt += 1 + + u0 = projection(u0, epsilon / kappa) + v0 = projection(v0, epsilon * kappa) + + else: + u0 = u0 + v0 = v0 + + def restricted_sinkhorn(usc, vsc, max_iter=5): + """ + Restricted Sinkhorn Algorithm as a warm-start initialized point for L-BFGS-B (see Algorithm 2 in [1]). + """ + cpt = 1 + while (cpt < max_iter): + K_IJ_v = K_IJ.T @ usc + cst_v + vsc = b_J / (kappa * K_IJ_v) + KIJ_u = K_IJ @ vsc + cst_u + usc = (kappa * a_I) / KIJ_u + cpt += 1 + + usc = projection(usc, epsilon / kappa) + vsc = projection(vsc, epsilon * kappa) + + return usc, vsc + + def screened_obj(usc, vsc): + part_IJ = usc @ K_IJ @ vsc - kappa * a_I @ np.log(usc) - (1. / kappa) * b_J @ np.log(vsc) + part_IJc = usc @ vec_eps_IJc + part_IcJ = vec_eps_IcJ @ vsc + psi_epsilon = part_IJ + part_IJc + part_IcJ + return psi_epsilon + + def screened_grad(usc, vsc): + # gradients of Psi_epsilon w.r.t u and v + grad_u = K_IJ @ vsc + vec_eps_IJc - kappa * a_I / usc + grad_v = K_IJ.T @ usc + vec_eps_IcJ - (1. / kappa) * b_J / vsc + return grad_u, grad_v + + def bfgspost(theta): + + u = theta[:ns_budget] + v = theta[ns_budget:] + # objective + f = screened_obj(u, v) + # gradient + g_u, g_v = screened_grad(u, v) + g = np.hstack([g_u, g_v]) + return f, g + + #----------------------------------------------------------------------------------------------------------------# + # Step 2: L-BFGS-B solver # + #----------------------------------------------------------------------------------------------------------------# + + u0, v0 = restricted_sinkhorn(u0, v0) + theta0 = np.hstack([u0, v0]) + maxiter = 10000 # max number of iterations + maxfun = 10000 # max number of function evaluations + pgtol = 1e-09 # final objective function accuracy + + bounds = bounds_u + bounds_v # constraint bounds + obj = lambda theta: bfgspost(theta) + + theta, _, _ = fmin_l_bfgs_b(func=obj, + x0=theta0, + bounds=bounds, + maxfun=maxfun, + pgtol=pgtol, + maxiter=maxiter) + + usc = theta[:ns_budget] + vsc = theta[ns_budget:] + + usc_full = np.full(ns, epsilon / kappa) + vsc_full = np.full(nt, epsilon * kappa) + usc_full[I] = usc + vsc_full[J] = vsc + + Gsc = usc_full.reshape((-1, 1)) * K * vsc_full.reshape((1, -1)) + return Gsc -- cgit v1.2.3 From d4b403ef3bda06db101d8a7c3dba1e0be36e9c80 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Tue, 7 Jan 2020 11:18:43 +0100 Subject: close "bottleneck" tag --- ot/bregman.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ot/bregman.py b/ot/bregman.py index 61b8605..58c76d0 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -15,7 +15,6 @@ Bregman projections for regularized OT import numpy as np import warnings from .utils import unif, dist -import bottleneck from scipy.optimize import fmin_l_bfgs_b def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, @@ -1893,6 +1892,7 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru aK_sort = np.sort(K_sum_cols) epsilon_u_square = a[0] / aK_sort[ns_budget - 1] else: + import bottleneck aK_sort = bottleneck.partition(K_sum_cols, ns_budget - 1)[ns_budget - 1] epsilon_u_square = a[0] / aK_sort @@ -1900,6 +1900,7 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru bK_sort = np.sort(K_sum_rows) epsilon_v_square = b[0] / bK_sort[ns_budget - 1] else: + import bottleneck bK_sort = bottleneck.partition(K_sum_rows, nt_budget - 1)[nt_budget - 1] epsilon_v_square = b[0] / bK_sort else: -- cgit v1.2.3 From 3979fe909c64403337ed9259de9b8673dd789a18 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Tue, 7 Jan 2020 11:47:41 +0100 Subject: update readme --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d8bb051..08bacd4 100644 --- a/README.md +++ b/README.md @@ -180,6 +180,7 @@ The contributors to this library are * [Vayer Titouan](https://tvayer.github.io/) * [Hicham Janati](https://hichamjanati.github.io/) (Unbalanced OT) * [Romain Tavenard](https://rtavenar.github.io/) (1d Wasserstein) +* [Mokhtar Z. Alaya](http://mzalaya.github.io/) (Screenkhorn) This toolbox benefit a lot from open source research and we would like to thank the following persons for providing some code (in various languages): @@ -252,4 +253,6 @@ You can also post bug reports and feature requests in Github issues. Make sure t [24] Vayer, T., Chapel, L., Flamary, R., Tavenard, R. and Courty, N. (2019). [Optimal Transport for structured data with application on graphs](http://proceedings.mlr.press/v97/titouan19a.html) Proceedings of the 36th International Conference on Machine Learning (ICML). -[25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. (2019). [Learning with a Wasserstein Loss](http://cbcl.mit.edu/wasserstein/) Advances in Neural Information Processing Systems (NIPS). +[25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. (2015). [Learning with a Wasserstein Loss](http://cbcl.mit.edu/wasserstein/) Advances in Neural Information Processing Systems (NIPS). + +[26] Alaya M. Z., Bérar M., Gasso G., Rakotomamonjy A. (2019). Screening Sinkhorn Algorithm for Regularized Optimal Transport (https://papers.nips.cc/paper/9386-screening-sinkhorn-algorithm-for-regularized-optimal-transport) Advances in Neural Information Processing Systems (NIPS). -- cgit v1.2.3 From 0d33c3f42b1c22768c45299589b9b699f4f9f924 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Tue, 7 Jan 2020 11:49:27 +0100 Subject: update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 08bacd4..ce59e59 100644 --- a/README.md +++ b/README.md @@ -255,4 +255,4 @@ You can also post bug reports and feature requests in Github issues. Make sure t [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. (2015). [Learning with a Wasserstein Loss](http://cbcl.mit.edu/wasserstein/) Advances in Neural Information Processing Systems (NIPS). -[26] Alaya M. Z., Bérar M., Gasso G., Rakotomamonjy A. (2019). Screening Sinkhorn Algorithm for Regularized Optimal Transport (https://papers.nips.cc/paper/9386-screening-sinkhorn-algorithm-for-regularized-optimal-transport) Advances in Neural Information Processing Systems (NIPS). +[26] Alaya M. Z., Bérar M., Gasso G., Rakotomamonjy A. (2019). [Screening Sinkhorn Algorithm for Regularized Optimal Transport](https://papers.nips.cc/paper/9386-screening-sinkhorn-algorithm-for-regularized-optimal-transport) Advances in Neural Information Processing Systems (NIPS). -- cgit v1.2.3 From e11dbadefab138a6d1d41c1e08d9c58c9b294e99 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Tue, 7 Jan 2020 11:51:14 +0100 Subject: update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ce59e59..6bb8d24 100644 --- a/README.md +++ b/README.md @@ -255,4 +255,4 @@ You can also post bug reports and feature requests in Github issues. Make sure t [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. (2015). [Learning with a Wasserstein Loss](http://cbcl.mit.edu/wasserstein/) Advances in Neural Information Processing Systems (NIPS). -[26] Alaya M. Z., Bérar M., Gasso G., Rakotomamonjy A. (2019). [Screening Sinkhorn Algorithm for Regularized Optimal Transport](https://papers.nips.cc/paper/9386-screening-sinkhorn-algorithm-for-regularized-optimal-transport) Advances in Neural Information Processing Systems (NIPS). +[26] Alaya M. Z., Bérar M., Gasso G., Rakotomamonjy A. (2019). [Screening Sinkhorn Algorithm for Regularized Optimal Transport](https://papers.nips.cc/paper/9386-screening-sinkhorn-algorithm-for-regularized-optimal-transport), Advances in Neural Information Processing Systems 32 (NIPS). -- cgit v1.2.3 From 4488a0b577075daac13fd381f09c2a1969273bd1 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Tue, 7 Jan 2020 13:20:05 +0100 Subject: update README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6bb8d24..f82099e 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ It provides the following solvers: * Stochastic Optimization for Large-scale Optimal Transport (semi-dual problem [18] and dual problem [19]) * Non regularized free support Wasserstein barycenters [20]. * Unbalanced OT with KL relaxation distance and barycenter [10, 25]. +* Screening Sinkhorn Algorithm for OT [26]. Some demonstrations (both in Python and Jupyter Notebook format) are available in the examples folder. -- cgit v1.2.3 From e821872581e5e62d984883d8b8f881e35160be56 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Tue, 7 Jan 2020 13:22:44 +0100 Subject: update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f82099e..987adf1 100644 --- a/README.md +++ b/README.md @@ -256,4 +256,4 @@ You can also post bug reports and feature requests in Github issues. Make sure t [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. (2015). [Learning with a Wasserstein Loss](http://cbcl.mit.edu/wasserstein/) Advances in Neural Information Processing Systems (NIPS). -[26] Alaya M. Z., Bérar M., Gasso G., Rakotomamonjy A. (2019). [Screening Sinkhorn Algorithm for Regularized Optimal Transport](https://papers.nips.cc/paper/9386-screening-sinkhorn-algorithm-for-regularized-optimal-transport), Advances in Neural Information Processing Systems 32 (NIPS). +[26] Alaya M. Z., Bérar M., Gasso G., Rakotomamonjy A. (2019). [Screening Sinkhorn Algorithm for Regularized Optimal Transport](https://papers.nips.cc/paper/9386-screening-sinkhorn-algorithm-for-regularized-optimal-transport), Advances in Neural Information Processing Systems 33 (NIPS). -- cgit v1.2.3 From 27b6740ea95b609ecdb103fbff7c1bbc62071ddc Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Tue, 7 Jan 2020 15:29:23 +0100 Subject: improve documentation of screenkhorn add Exception at the beginning to check the installation of bottleneck module --- ot/bregman.py | 62 +++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 17 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index 58c76d0..456b61f 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1789,52 +1789,82 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli sinkhorn_div = sinkhorn_loss_ab - 1 / 2 * (sinkhorn_loss_a + sinkhorn_loss_b) return max(0, sinkhorn_div) -def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=True, verbose=False): +def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=True, verbose=False, log=False): """" - Screening Sinkhorn Algorithm for Regularized Optimal Transport. + Screening Sinkhorn Algorithm for Regularized Optimal Transport + + The function solves an approximate dual of Sinkhorn divergence [2] which is written as the following optimization problem: + + ..math:: + (u, v) = \argmin_{u, v} 1_{ns}.T B(u,v) 1_{nt} - <\kappa u, a> - + + where B(u,v) = \diag(e^u) K \diag(e^v), with K = e^{-M/reg} and + + s.t. e^{u_i} >= \epsilon / \kappa, for all i in {1, ..., ns} + + e^{v_j} >= \epsilon \kappa, for all j in {1, ..., nt} + + The parameters \kappa and \epsilon are determined w.r.t the couple number budget of points (ns_budget, nt_budget), see Equation (5) in [26] + Parameters ---------- a : `numpy.ndarray`, shape=(ns,) - samples weights in the source domain. + samples weights in the source domain b : `numpy.ndarray`, shape=(nt,) - samples weights in the target domain. + samples weights in the target domain M : `numpy.ndarray`, shape=(ns, nt) Cost matrix. reg : `float` - Level of the entropy regularisation. + Level of the entropy regularisation ns_budget: `int` - Number budget of points to be keeped in the source domain. + Number budget of points to be keeped in the source domain nt_budget: `int` - Number budget of points to be keeped in the target domain. + Number budget of points to be keeped in the target domain uniform: `bool`, default=True If `True`, a_i = 1. / ns and b_j = 1. / nt restricted: `bool`, default=True If `True`, a warm-start initialization for the L-BFGS-B solver - using a restricted Sinkhorn algorithm with at most 5 iterations. + using a restricted Sinkhorn algorithm with at most 5 iterations verbose: `bool`, default=False - If `True`, dispaly informations along iterations. - + If `True`, dispaly informations along iterations + + Dependency + ---------- + To gain more efficiency, screenkhorn needs to call the "Bottleneck" package (https://pypi.org/project/Bottleneck/) in the screening pre-processing step. + If Bottleneck isn't installed, the following error message appears: + "Bottleneck module doesn't exist. Install it from https://pypi.org/project/Bottleneck/" + + Returns ------- - Gsc : `numpy.ndarray`, shape=(ns, nt) - Screened optimal transportation matrix for the given parameters. + gamma : `numpy.ndarray`, shape=(ns, nt) + Screened optimal transportation matrix for the given parameters + + log : `dict`, default=False + Log dictionary return only if log==True in parameters - References: + + References ----------- - .. [1] M. Z. Alaya, Maxime Bérar, Gilles Gasso, Alain Rakotomamonjy. Screening Sinkhorn Algorithm for Regularized - Optimal Transport, NeurIPS 2019. + .. [26] Alaya M. Z., Bérar M., Gasso G., Rakotomamonjy A. (2019). Screening Sinkhorn Algorithm for Regularized Optimal Transport (NIPS) 33, 2019 """ + # check if bottleneck module exists + try: + import bottleneck + except ImportError as e: + print("Bottleneck module doesn't exist. Install it from https://pypi.org/project/Bottleneck/") + a = np.asarray(a, dtype=np.float64) b = np.asarray(b, dtype=np.float64) @@ -1892,7 +1922,6 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru aK_sort = np.sort(K_sum_cols) epsilon_u_square = a[0] / aK_sort[ns_budget - 1] else: - import bottleneck aK_sort = bottleneck.partition(K_sum_cols, ns_budget - 1)[ns_budget - 1] epsilon_u_square = a[0] / aK_sort @@ -1900,7 +1929,6 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru bK_sort = np.sort(K_sum_rows) epsilon_v_square = b[0] / bK_sort[ns_budget - 1] else: - import bottleneck bK_sort = bottleneck.partition(K_sum_rows, nt_budget - 1)[nt_budget - 1] epsilon_v_square = b[0] / bK_sort else: -- cgit v1.2.3 From 7d603f0aa642dbe49da70ad3143fd4e9c74a22c5 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Tue, 7 Jan 2020 15:34:22 +0100 Subject: delete "ArrayBox"-type test of dist. matrix M --- ot/bregman.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index 456b61f..dedbf28 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1867,12 +1867,6 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru a = np.asarray(a, dtype=np.float64) b = np.asarray(b, dtype=np.float64) - - # if the "autograd" package is needed for some experiments, we then have to change the instance of the cost matrix M - # from "ArrayBox"-type to "np.array"-type as follows: - if isinstance(M, np.ndarray) == False: - M = M._value - M = np.asarray(M, dtype=np.float64) ns, nt = M.shape @@ -1882,7 +1876,7 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru np.exp(K, out=K) def projection(u, epsilon): - u[np.where(u <= epsilon)] = epsilon + u[u <= epsilon] = epsilon return u # ----------------------------------------------------------------------------------------------------------------# -- cgit v1.2.3 From be33a36eb1916968d9281c5a76e12e04b7ddb686 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Tue, 7 Jan 2020 15:51:58 +0100 Subject: replace @ operator by np.dot --- ot/bregman.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index dedbf28..4a899a6 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1885,8 +1885,8 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru if ns_budget == ns and nt_budget == nt: # full number of budget points (ns, nt) = (ns_budget, nt_budget) - I = list(range(ns)) - J = list(range(nt)) + I = list(np.arange(ns)) + J = list(np.arange(nt)) epsilon = 0.0 kappa = 1.0 @@ -1989,7 +1989,7 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru b_J_max = b_J[0] b_J_min = b_J[0] - # box constraints in L-BFGS-B (see Proposition 1 in [1]) + # box constraints in L-BFGS-B (see Proposition 1 in [26]) bounds_u = [(max(kappa * a_I_min / (epsilon * (nt - ns_budget) + ns_budget * (b_J_max / ( epsilon * ns * K_min))), epsilon / kappa), a_I_max / (epsilon * nt * K_min))] * ns_budget @@ -2004,7 +2004,7 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru u0 = np.full(ns_budget, (1. / ns_budget) + epsilon / kappa) v0 = np.full(nt_budget, (1. / nt_budget) + epsilon * kappa) - # pre-calculed constants for Restricted Sinkhorn (see Algorithm 2 in [1]) + # pre-calculed constants for Restricted Sinkhorn (see Algorithm 2 in [26]) if restricted: if ns_budget != ns or ns_budget != nt: cst_u = kappa * epsilon * K_IJc.sum(axis=1) @@ -2012,9 +2012,9 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru cpt = 1 while (cpt < 5): # 5 iterations - K_IJ_v = K_IJ.T @ u0 + cst_v + K_IJ_v = np.dot(K_IJ.T, u0) + cst_v v0 = b_J / (kappa * K_IJ_v) - KIJ_u = K_IJ @ v0 + cst_u + KIJ_u = np.dot(K_IJ, v0) + cst_u u0 = (kappa * a_I) / KIJ_u cpt += 1 @@ -2031,9 +2031,9 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru """ cpt = 1 while (cpt < max_iter): - K_IJ_v = K_IJ.T @ usc + cst_v + K_IJ_v = np.dot(K_IJ.T, usc) + cst_v vsc = b_J / (kappa * K_IJ_v) - KIJ_u = K_IJ @ vsc + cst_u + KIJ_u = np.dot(K_IJ, vsc) + cst_u usc = (kappa * a_I) / KIJ_u cpt += 1 @@ -2043,16 +2043,16 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru return usc, vsc def screened_obj(usc, vsc): - part_IJ = usc @ K_IJ @ vsc - kappa * a_I @ np.log(usc) - (1. / kappa) * b_J @ np.log(vsc) - part_IJc = usc @ vec_eps_IJc - part_IcJ = vec_eps_IcJ @ vsc + part_IJ = np.dot(np.dot(usc, K_IJ), vsc) - kappa * np.dot(a_I, np.log(usc)) - (1. / kappa) * np.dot(b_J, np.log(vsc)) + part_IJc = np.dot(usc, vec_eps_IJc) + part_IcJ = np.dot(vec_eps_IcJ, vsc) psi_epsilon = part_IJ + part_IJc + part_IcJ return psi_epsilon def screened_grad(usc, vsc): # gradients of Psi_epsilon w.r.t u and v - grad_u = K_IJ @ vsc + vec_eps_IJc - kappa * a_I / usc - grad_v = K_IJ.T @ usc + vec_eps_IcJ - (1. / kappa) * b_J / vsc + grad_u = np.dot(K_IJ, vsc) + vec_eps_IJc - kappa * a_I / usc + grad_v = np.dot(K_IJ.T, usc) + vec_eps_IcJ - (1. / kappa) * b_J / vsc return grad_u, grad_v def bfgspost(theta): -- cgit v1.2.3 From 69c666fc82553bed0fbbc7fc17a906eb2487ddf7 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Tue, 7 Jan 2020 16:03:18 +0100 Subject: set default param. for LBFGS in the function's prototype --- ot/bregman.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index 4a899a6..12eaa65 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1789,7 +1789,8 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli sinkhorn_div = sinkhorn_loss_ab - 1 / 2 * (sinkhorn_loss_a + sinkhorn_loss_b) return max(0, sinkhorn_div) -def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=True, verbose=False, log=False): +def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=True, + maxiter=10000, maxfun=10000, pgtol=1e-09, verbose=False, log=False): """" Screening Sinkhorn Algorithm for Regularized Optimal Transport @@ -1834,6 +1835,15 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru restricted: `bool`, default=True If `True`, a warm-start initialization for the L-BFGS-B solver using a restricted Sinkhorn algorithm with at most 5 iterations + + maxiter : `int`, default=10000 + Maximum number of iterations in LBFGS solver + + maxfun : `int`, default=10000 + Maximum number of function evaluations in LBFGS solver + + pgtol : `float`, default=1e-09 + Final objective function accuracy in LBFGS solver verbose: `bool`, default=False If `True`, dispaly informations along iterations @@ -2056,7 +2066,6 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru return grad_u, grad_v def bfgspost(theta): - u = theta[:ns_budget] v = theta[ns_budget:] # objective @@ -2072,10 +2081,7 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru u0, v0 = restricted_sinkhorn(u0, v0) theta0 = np.hstack([u0, v0]) - maxiter = 10000 # max number of iterations - maxfun = 10000 # max number of function evaluations - pgtol = 1e-09 # final objective function accuracy - + bounds = bounds_u + bounds_v # constraint bounds obj = lambda theta: bfgspost(theta) -- cgit v1.2.3 From 05a97b44a7137ef6cb0397cca3bb2ea1f8736ac5 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Tue, 7 Jan 2020 16:10:36 +0100 Subject: fix default values for the budget arguments --- ot/bregman.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index 12eaa65..8a20307 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1789,7 +1789,7 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli sinkhorn_div = sinkhorn_loss_ab - 1 / 2 * (sinkhorn_loss_a + sinkhorn_loss_b) return max(0, sinkhorn_div) -def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=True, +def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, restricted=True, maxiter=10000, maxfun=10000, pgtol=1e-09, verbose=False, log=False): """" @@ -1823,11 +1823,13 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru reg : `float` Level of the entropy regularisation - ns_budget: `int` + ns_budget: `int`, deafult=None Number budget of points to be keeped in the source domain + If it is None then 50% of the source sample points will be keeped - nt_budget: `int` + nt_budget: `int`, deafult=None Number budget of points to be keeped in the target domain + If it is None then 50% of the target sample points will be keeped uniform: `bool`, default=True If `True`, a_i = 1. / ns and b_j = 1. / nt @@ -1874,11 +1876,17 @@ def screenkhorn(a, b, M, reg, ns_budget, nt_budget, uniform=True, restricted=Tru import bottleneck except ImportError as e: print("Bottleneck module doesn't exist. Install it from https://pypi.org/project/Bottleneck/") - + a = np.asarray(a, dtype=np.float64) b = np.asarray(b, dtype=np.float64) M = np.asarray(M, dtype=np.float64) ns, nt = M.shape + + # by default, we keep only 50% of the sapmle data points + if ns_budget is None: + ns_budget = int(np.floor(0.5*ns)) + if nt_budget is None: + ns_budget = int(np.floor(0.5*ns)) # calculate the Gibbs kernel K = np.empty_like(M) -- cgit v1.2.3 From 92b7075568207a468cc821cd6a21e130b9d89f96 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Tue, 7 Jan 2020 16:21:40 +0100 Subject: replace reshape by numpy slicing in return --- ot/bregman.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index 8a20307..8cfea7e 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -2107,6 +2107,14 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest vsc_full = np.full(nt, epsilon * kappa) usc_full[I] = usc vsc_full[J] = vsc + + if log: + log['u'] = usc_full + log['v'] = vsc_full + + gamma = usc_full[:, None] * K * vsc_full[None, :] - Gsc = usc_full.reshape((-1, 1)) * K * vsc_full.reshape((1, -1)) - return Gsc + if log: + return gamma, log + else: + return gamma -- cgit v1.2.3 From cfe26140af85082197151d0dc50915c0bd71f602 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Tue, 7 Jan 2020 19:00:50 +0100 Subject: fix definitions complementary active sets Ic, Jc --- ot/bregman.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index 8cfea7e..c0634b1 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1982,8 +1982,8 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest print('|I_active| = %s \t |J_active| = %s ' %(len(I), len(J))) # Ic, Jc: complementary of the active sets I and J - Ic = list(set(list(range(ns))) - set(I)) - Jc = list(set(list(range(nt))) - set(J)) + Ic = list(set(np.arange(ns)) - set(I)) + Jc = list(set(np.arange(nt)) - set(J)) K_IJ = K[np.ix_(I, J)] K_IcJ = K[np.ix_(Ic, J)] -- cgit v1.2.3 From 88fb534d83f42e45a42c0a9773ccfe338cd3a811 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Tue, 7 Jan 2020 19:09:30 +0100 Subject: fix typos in documentation --- ot/bregman.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index c0634b1..ceb7754 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1818,7 +1818,7 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest samples weights in the target domain M : `numpy.ndarray`, shape=(ns, nt) - Cost matrix. + Cost matrix reg : `float` Level of the entropy regularisation @@ -2045,7 +2045,7 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest def restricted_sinkhorn(usc, vsc, max_iter=5): """ - Restricted Sinkhorn Algorithm as a warm-start initialized point for L-BFGS-B (see Algorithm 2 in [1]). + Restricted Sinkhorn Algorithm as a warm-start initialized point for L-BFGS-B (see Algorithm 2 in [26]) """ cpt = 1 while (cpt < max_iter): -- cgit v1.2.3 From 45119609cbc317f59beb92382c28de6c51290c53 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Wed, 8 Jan 2020 11:03:59 +0100 Subject: using binary indexing for definition the active sets --- ot/bregman.py | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index ceb7754..b664ac1 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1884,13 +1884,13 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest # by default, we keep only 50% of the sapmle data points if ns_budget is None: - ns_budget = int(np.floor(0.5*ns)) + ns_budget = int(np.floor(0.5*ns)) if nt_budget is None: - ns_budget = int(np.floor(0.5*ns)) + nt_budget = int(np.floor(0.5*ns)) # calculate the Gibbs kernel K = np.empty_like(M) - np.divide(M, - reg, out=K) + np.divide(M, -reg, out=K) np.exp(K, out=K) def projection(u, epsilon): @@ -1898,13 +1898,13 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest return u # ----------------------------------------------------------------------------------------------------------------# - # Step 1: Screening Pre-processing # + # Step 1: Screening pre-processing # # ----------------------------------------------------------------------------------------------------------------# if ns_budget == ns and nt_budget == nt: # full number of budget points (ns, nt) = (ns_budget, nt_budget) - I = list(np.arange(ns)) - J = list(np.arange(nt)) + I = np.arange(ns) + J = np.arange(nt) epsilon = 0.0 kappa = 1.0 @@ -1953,37 +1953,34 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest bK_sort = np.sort(bK)[::-1] epsilon_v_square = bK_sort[ns_budget - 1] - # active sets I and J (see Proposition .. in [1]) - I = np.where(a >= epsilon_u_square * K_sum_cols)[0].tolist() - J = np.where(b >= epsilon_v_square * K_sum_rows)[0].tolist() + # active sets I and J (see Lemma 1 in [26]) + I = np.where(a >= epsilon_u_square * K_sum_cols)[0] + J = np.where(b >= epsilon_v_square * K_sum_rows)[0] if len(I) != ns_budget: if uniform: aK = a / K_sum_cols aK_sort = np.sort(aK)[::-1] epsilon_u_square = aK_sort[ns_budget - 1:ns_budget + 1].mean() - I = np.where(a >= epsilon_u_square * K_sum_cols)[0].tolist() + I = np.where(a >= epsilon_u_square * K_sum_cols)[0] if len(J) != nt_budget: if uniform: bK = b / K_sum_rows bK_sort = np.sort(bK)[::-1] - epsilon_v_square = bK_sort[ns_budget - 1:ns_budget + 1].mean() - J = np.where(b >= epsilon_v_square * K_sum_rows)[0].tolist() + epsilon_v_square = bK_sort[nt_budget - 1:nt_budget + 1].mean() + J = np.where(b >= epsilon_v_square * K_sum_rows)[0] epsilon = (epsilon_u_square * epsilon_v_square) ** (1 / 4) kappa = (epsilon_v_square / epsilon_u_square) ** (1 / 2) - + if verbose: print("Epsilon = %s\n" %epsilon) - print("Scaling factor = %s\n" %kappa) - - if verbose: print('|I_active| = %s \t |J_active| = %s ' %(len(I), len(J))) # Ic, Jc: complementary of the active sets I and J - Ic = list(set(np.arange(ns)) - set(I)) - Jc = list(set(np.arange(nt)) - set(J)) + Ic = np.arange(ns)[~np.isin(np.arange(ns), I)] + Jc = np.arange(nt)[~np.isin(np.arange(nt), J)] K_IJ = K[np.ix_(I, J)] K_IcJ = K[np.ix_(Ic, J)] @@ -2109,12 +2106,13 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest vsc_full[J] = vsc if log: - log['u'] = usc_full - log['v'] = vsc_full + log['u'] = usc_full + log['v'] = vsc_full gamma = usc_full[:, None] * K * vsc_full[None, :] - + gamma = gamma / gamma.sum() + if log: - return gamma, log + return gamma, log else: - return gamma + return gamma -- cgit v1.2.3 From e00f46aa2ea11f0e88a5b2005caa7518ca109357 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Wed, 8 Jan 2020 18:49:16 +0100 Subject: fix binary indexing --- ot/bregman.py | 109 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 55 insertions(+), 54 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index b664ac1..28377b0 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -17,6 +17,7 @@ import warnings from .utils import unif, dist from scipy.optimize import fmin_l_bfgs_b + def sinkhorn(a, b, M, reg, method='sinkhorn', numItermax=1000, stopThr=1e-9, verbose=False, log=False, **kwargs): r""" @@ -1788,24 +1789,24 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli sinkhorn_div = sinkhorn_loss_ab - 1 / 2 * (sinkhorn_loss_a + sinkhorn_loss_b) return max(0, sinkhorn_div) - + + def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, restricted=True, maxiter=10000, maxfun=10000, pgtol=1e-09, verbose=False, log=False): - """" Screening Sinkhorn Algorithm for Regularized Optimal Transport - + The function solves an approximate dual of Sinkhorn divergence [2] which is written as the following optimization problem: - + ..math:: (u, v) = \argmin_{u, v} 1_{ns}.T B(u,v) 1_{nt} - <\kappa u, a> - - + where B(u,v) = \diag(e^u) K \diag(e^v), with K = e^{-M/reg} and - + s.t. e^{u_i} >= \epsilon / \kappa, for all i in {1, ..., ns} - + e^{v_j} >= \epsilon \kappa, for all j in {1, ..., nt} - + The parameters \kappa and \epsilon are determined w.r.t the couple number budget of points (ns_budget, nt_budget), see Equation (5) in [26] @@ -1837,31 +1838,31 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest restricted: `bool`, default=True If `True`, a warm-start initialization for the L-BFGS-B solver using a restricted Sinkhorn algorithm with at most 5 iterations - + maxiter : `int`, default=10000 Maximum number of iterations in LBFGS solver - + maxfun : `int`, default=10000 Maximum number of function evaluations in LBFGS solver - + pgtol : `float`, default=1e-09 Final objective function accuracy in LBFGS solver verbose: `bool`, default=False If `True`, dispaly informations along iterations - + Dependency ---------- To gain more efficiency, screenkhorn needs to call the "Bottleneck" package (https://pypi.org/project/Bottleneck/) in the screening pre-processing step. If Bottleneck isn't installed, the following error message appears: "Bottleneck module doesn't exist. Install it from https://pypi.org/project/Bottleneck/" - - + + Returns ------- gamma : `numpy.ndarray`, shape=(ns, nt) Screened optimal transportation matrix for the given parameters - + log : `dict`, default=False Log dictionary return only if log==True in parameters @@ -1876,17 +1877,17 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest import bottleneck except ImportError as e: print("Bottleneck module doesn't exist. Install it from https://pypi.org/project/Bottleneck/") - + a = np.asarray(a, dtype=np.float64) b = np.asarray(b, dtype=np.float64) M = np.asarray(M, dtype=np.float64) ns, nt = M.shape - - # by default, we keep only 50% of the sapmle data points + + # by default, we keep only 50% of the sample data points if ns_budget is None: - ns_budget = int(np.floor(0.5*ns)) + ns_budget = int(np.floor(0.5 * ns)) if nt_budget is None: - nt_budget = int(np.floor(0.5*ns)) + nt_budget = int(np.floor(0.5 * nt)) # calculate the Gibbs kernel K = np.empty_like(M) @@ -1903,20 +1904,19 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest if ns_budget == ns and nt_budget == nt: # full number of budget points (ns, nt) = (ns_budget, nt_budget) - I = np.arange(ns) - J = np.arange(nt) - epsilon = 0.0 - kappa = 1.0 + I = np.ones(ns, dtype=bool) + J = np.ones(nt, dtype=bool) + epsilon = 0.0 + kappa = 1.0 cst_u = 0. cst_v = 0. bounds_u = [(0.0, np.inf)] * ns bounds_v = [(0.0, np.inf)] * nt - + a_I = a b_J = b - K_min = K.min() K_IJ = K K_IJc = [] K_IcJ = [] @@ -1937,9 +1937,9 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest aK_sort = bottleneck.partition(K_sum_cols, ns_budget - 1)[ns_budget - 1] epsilon_u_square = a[0] / aK_sort - if nt / ns_budget < 4: + if nt / nt_budget < 4: bK_sort = np.sort(K_sum_rows) - epsilon_v_square = b[0] / bK_sort[ns_budget - 1] + epsilon_v_square = b[0] / bK_sort[nt_budget - 1] else: bK_sort = bottleneck.partition(K_sum_rows, nt_budget - 1)[nt_budget - 1] epsilon_v_square = b[0] / bK_sort @@ -1951,36 +1951,37 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest epsilon_u_square = aK_sort[ns_budget - 1] bK_sort = np.sort(bK)[::-1] - epsilon_v_square = bK_sort[ns_budget - 1] + epsilon_v_square = bK_sort[nt_budget - 1] # active sets I and J (see Lemma 1 in [26]) - I = np.where(a >= epsilon_u_square * K_sum_cols)[0] - J = np.where(b >= epsilon_v_square * K_sum_rows)[0] + I = a >= epsilon_u_square * K_sum_cols + J = b >= epsilon_v_square * K_sum_rows - if len(I) != ns_budget: + if sum(I) != ns_budget: if uniform: aK = a / K_sum_cols aK_sort = np.sort(aK)[::-1] epsilon_u_square = aK_sort[ns_budget - 1:ns_budget + 1].mean() - I = np.where(a >= epsilon_u_square * K_sum_cols)[0] + I = a >= epsilon_u_square * K_sum_cols - if len(J) != nt_budget: + if sum(J) != nt_budget: if uniform: bK = b / K_sum_rows bK_sort = np.sort(bK)[::-1] epsilon_v_square = bK_sort[nt_budget - 1:nt_budget + 1].mean() - J = np.where(b >= epsilon_v_square * K_sum_rows)[0] + J = b >= epsilon_v_square * K_sum_rows epsilon = (epsilon_u_square * epsilon_v_square) ** (1 / 4) kappa = (epsilon_v_square / epsilon_u_square) ** (1 / 2) - + if verbose: - print("Epsilon = %s\n" %epsilon) - print('|I_active| = %s \t |J_active| = %s ' %(len(I), len(J))) + print("epsilon = %s\n" % epsilon) + print("kappa= %s\n" % kappa) + print('|I_active| = %s \t |J_active| = %s ' % (sum(I), sum(J))) # Ic, Jc: complementary of the active sets I and J - Ic = np.arange(ns)[~np.isin(np.arange(ns), I)] - Jc = np.arange(nt)[~np.isin(np.arange(nt), J)] + Ic = ~I + Jc = ~J K_IJ = K[np.ix_(I, J)] K_IcJ = K[np.ix_(Ic, J)] @@ -2005,23 +2006,23 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest b_J_min = b_J[0] # box constraints in L-BFGS-B (see Proposition 1 in [26]) - bounds_u = [(max(kappa * a_I_min / (epsilon * (nt - ns_budget) + ns_budget * (b_J_max / ( - epsilon * ns * K_min))), epsilon / kappa), a_I_max / (epsilon * nt * K_min))] * ns_budget + bounds_u = [(max(a_I_min / ((nt - nt_budget) * epsilon + nt_budget * (b_J_max / ( + ns * epsilon * kappa * K_min))), epsilon / kappa), a_I_max / (nt * epsilon * K_min))] * ns_budget - bounds_v = [(max(b_J_min / (epsilon * (ns - ns_budget) + ns_budget * (a_I_max / (epsilon * nt * K_min))), \ - epsilon * kappa), b_J_max / (epsilon * ns * K_min))] * ns_budget + bounds_v = [(max(b_J_min / ((ns - ns_budget) * epsilon + ns_budget * (kappa * a_I_max / (nt * epsilon * K_min))), + epsilon * kappa), b_J_max / (ns * epsilon * K_min))] * nt_budget # pre-calculated constants for the objective - vec_eps_IJc = epsilon * kappa * (K_IJc * np.ones(nt - ns_budget).reshape((1, -1))).sum(axis=1) + vec_eps_IJc = epsilon * kappa * (K_IJc * np.ones(nt - nt_budget).reshape((1, -1))).sum(axis=1) vec_eps_IcJ = (epsilon / kappa) * (np.ones(ns - ns_budget).reshape((-1, 1)) * K_IcJ).sum(axis=0) # initialisation u0 = np.full(ns_budget, (1. / ns_budget) + epsilon / kappa) v0 = np.full(nt_budget, (1. / nt_budget) + epsilon * kappa) - # pre-calculed constants for Restricted Sinkhorn (see Algorithm 2 in [26]) + # pre-calculed constants for Restricted Sinkhorn (see Algorithm 1 in supplementary of [26]) if restricted: - if ns_budget != ns or ns_budget != nt: + if ns_budget != ns or nt_budget != nt: cst_u = kappa * epsilon * K_IJc.sum(axis=1) cst_v = epsilon * K_IcJ.sum(axis=0) / kappa @@ -2042,7 +2043,7 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest def restricted_sinkhorn(usc, vsc, max_iter=5): """ - Restricted Sinkhorn Algorithm as a warm-start initialized point for L-BFGS-B (see Algorithm 2 in [26]) + Restricted Sinkhorn Algorithm as a warm-start initialized point for L-BFGS-B (see Algorithm 1 in supplementary of [26]) """ cpt = 1 while (cpt < max_iter): @@ -2086,9 +2087,9 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest u0, v0 = restricted_sinkhorn(u0, v0) theta0 = np.hstack([u0, v0]) - + bounds = bounds_u + bounds_v # constraint bounds - obj = lambda theta: bfgspost(theta) + def obj(theta): return bfgspost(theta) theta, _, _ = fmin_l_bfgs_b(func=obj, x0=theta0, @@ -2104,15 +2105,15 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest vsc_full = np.full(nt, epsilon * kappa) usc_full[I] = usc vsc_full[J] = vsc - + if log: log['u'] = usc_full log['v'] = vsc_full - + gamma = usc_full[:, None] * K * vsc_full[None, :] gamma = gamma / gamma.sum() - + if log: return gamma, log else: - return gamma + return gamma \ No newline at end of file -- cgit v1.2.3 From 3e77515b4f19cf1c37b2f971a54b2fe5efe9daef Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Wed, 8 Jan 2020 18:54:07 +0100 Subject: add illustration for screenkhorn --- examples/plot_screenkhorn_1D.py | 103 ++++++++++++++++++ notebooks/plot_screenkhorn_1D.ipynb | 207 ++++++++++++++++++++++++++++++++++++ 2 files changed, 310 insertions(+) create mode 100644 examples/plot_screenkhorn_1D.py create mode 100644 notebooks/plot_screenkhorn_1D.ipynb diff --git a/examples/plot_screenkhorn_1D.py b/examples/plot_screenkhorn_1D.py new file mode 100644 index 0000000..e0d7bfd --- /dev/null +++ b/examples/plot_screenkhorn_1D.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[ ]: + + +get_ipython().run_line_magic('matplotlib', 'inline') + + +# +# # 1D Screened optimal transport +# +# +# This example illustrates the computation of Screenkhorn: Screening Sinkhorn Algorithm for Optimal transport. +# +# + +# In[13]: + + +# Author: Mokhtar Z. Alaya +# +# License: MIT License + +import numpy as np +import matplotlib.pylab as pl +import ot +import ot.plot +from ot.datasets import make_1D_gauss as gauss +from ot.bregman import screenkhorn + + +# Generate data +# ------------- +# +# + +# In[14]: + + +#%% parameters + +n = 100 # nb bins + +# bin positions +x = np.arange(n, dtype=np.float64) + +# Gaussian distributions +a = gauss(n, m=20, s=5) # m= mean, s= std +b = gauss(n, m=60, s=10) + +# loss matrix +M = ot.dist(x.reshape((n, 1)), x.reshape((n, 1))) +M /= M.max() + + +# Plot distributions and loss matrix +# ---------------------------------- +# +# + +# In[15]: + + +#%% plot the distributions + +pl.figure(1, figsize=(6.4, 3)) +pl.plot(x, a, 'b', label='Source distribution') +pl.plot(x, b, 'r', label='Target distribution') +pl.legend() + +# plot distributions and loss matrix + +pl.figure(2, figsize=(5, 5)) +ot.plot.plot1D_mat(a, b, M, 'Cost matrix M') + + +# Solve Screened Sinkhorn +# -------------- +# +# + +# In[21]: + + +# Screenkhorn + +lambd = 1e-2 # entropy parameter +ns_budget = 30 # budget number of points to be keeped in the source distribution +nt_budget = 30 # budget number of points to be keeped in the target distribution + +Gsc = screenkhorn(a, b, M, lambd, ns_budget, nt_budget, uniform=False, restricted=True, verbose=True) +pl.figure(4, figsize=(5, 5)) +ot.plot.plot1D_mat(a, b, Gs, 'OT matrix Screenkhorn') + +pl.show() + + +# In[ ]: + + + + diff --git a/notebooks/plot_screenkhorn_1D.ipynb b/notebooks/plot_screenkhorn_1D.ipynb new file mode 100644 index 0000000..6126346 --- /dev/null +++ b/notebooks/plot_screenkhorn_1D.ipynb @@ -0,0 +1,207 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# 1D Screened optimal transport\n", + "\n", + "\n", + "This example illustrates the computation of Screenkhorn: Screening Sinkhorn Algorithm for Optimal transport.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# Author: Mokhtar Z. Alaya \n", + "#\n", + "# License: MIT License\n", + "\n", + "import numpy as np\n", + "import matplotlib.pylab as pl\n", + "import ot\n", + "import ot.plot\n", + "from ot.datasets import make_1D_gauss as gauss\n", + "from ot.bregman import screenkhorn" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Generate data\n", + "-------------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "#%% parameters\n", + "\n", + "n = 100 # nb bins\n", + "\n", + "# bin positions\n", + "x = np.arange(n, dtype=np.float64)\n", + "\n", + "# Gaussian distributions\n", + "a = gauss(n, m=20, s=5) # m= mean, s= std\n", + "b = gauss(n, m=60, s=10)\n", + "\n", + "# loss matrix\n", + "M = ot.dist(x.reshape((n, 1)), x.reshape((n, 1)))\n", + "M /= M.max()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot distributions and loss matrix\n", + "----------------------------------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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V8TExNCjR4+c6qSYmJic6c4Lm9PPOcd7773Hueeee9LtRa0rUtQ07ueffz5JSUl89NFHTJw4kUsvvZR77rnnlO1yx1nUPvzXC5uqviSq5pquO5jzH1oJJIysWgWHDpWuAd3voot0tUJrBzGhLC0tjTp16hATE8P69ev5uoCeH+3atWPz5s3s2rUL5xyzZ8/Oua9///7861//yrm+atUqoOAp0QEuuuiinOnbU1JS8p3qfffu3dSoUYNrrrmGO+64g5UrVxb5vHllZGTwzjvvAPD666/nTOOee6r63O0zhT13165defPNNwF49dVXucjf2FmGLIGEEf8BUzCm969TR9tBAljczRjPDBo0iKNHjxIfH8/UqVPp0qVLvttVr16d6dOn07dvX3r27EmDBg1yqpTuv/9+jh49SmxsLO3atWPKlCkA9OnTh5SUFDp06HBKI/rNN9/Mvn37iIuLY9q0afm2gaSkpHDBBReQkJDA3//+95zSx7hx4+jbty99+/Yt8vXVqlWLlStX0rFjR7744gvu8zVKTpw4kSeffJLu3btz4MCBnO0Li3n69OnMnDmTuLg4Zs+ezbRp04rcf2nZdO5hZMQIWLYMvv02OM83fjzMmqWj2osorZsIFwnTuR85coQaNWrgnOPGG28kNjaWW265xeuwwopN5x7BkpIgnwOhEktM1C7BudajMSZszZgxg4SEBNq2bcuxY8f4wx/+4HVIEc8a0cPEgQOwdWvx1v8oij8ZJSXpyHZjwtnEiRM9HVRXEVkJJEz42ueCWgJp107XUrcaQ2NMSVgCCRP+P/lOnYL3nJUr6/guSyAGgtu904Sfknz+lkDCRFIStGihvaeCKTERkpN1jRFTcVWrVo19+/ZZEqmgnHPs27ePatWqFetx1gYSJpKSoHPn4D9vYiI89RR88w2cd17wn9+Eh0aNGpGamsqePXu8DsV4pFq1ajQq5hTflkDCwN69sHMn3HRT8J/bXyWWlGQJpCKrXLkyzZs39zoME2YCqsISkQEisllEtorIpHzuryois333LxeRZrnuixORL0VkvYisFZHilZEMvgGpQW1A9zv/fIiJsXYQY0zxFZlARCQKeAoYCLQFRohI2zybXQ8ccM61BKYBj/oeGw28Cox3zrUDegEZQYu+gvAnkI4dg//c0dHQocOv+zDGmEAFUgLpDGx1zm13zp0A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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "#%% plot the distributions\n", + "\n", + "pl.figure(1, figsize=(6.4, 3))\n", + "pl.plot(x, a, 'b', label='Source distribution')\n", + "pl.plot(x, b, 'r', label='Target distribution')\n", + "pl.legend()\n", + "\n", + "# plot distributions and loss matrix\n", + "\n", + "pl.figure(2, figsize=(5, 5))\n", + "ot.plot.plot1D_mat(a, b, M, 'Cost matrix M')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Solve Screened Sinkhorn\n", + "--------------\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epsilon = 0.014767606916367452\n", + "\n", + "Kappa = 3.3854408965782907\n", + "\n", + "|I_active| = 30 \t |J_active| = 30 \n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Screenkhorn\n", + "\n", + "lambd = 1e-2 # entropy parameter\n", + "ns_budget = 30 # budget number of points to be keeped in the source distribution\n", + "nt_budget = 30 # budget number of points to be keeped in the target distribution\n", + "\n", + "Gsc = screenkhorn(a, b, M, lambd, ns_budget, nt_budget, uniform=False, restricted=True, verbose=True)\n", + "pl.figure(4, figsize=(5, 5))\n", + "ot.plot.plot1D_mat(a, b, Gs, 'OT matrix Screenkhorn')\n", + "\n", + "pl.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} -- cgit v1.2.3 From 112a2d46b80b91af399ee12c3711ba61d7aef977 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Wed, 8 Jan 2020 19:28:09 +0100 Subject: plot_screenkhorn_1D.ipynb --- notebooks/plot_screenkhorn_1D.ipynb | 207 ------------------------------------ 1 file changed, 207 deletions(-) delete mode 100644 notebooks/plot_screenkhorn_1D.ipynb diff --git a/notebooks/plot_screenkhorn_1D.ipynb b/notebooks/plot_screenkhorn_1D.ipynb deleted file mode 100644 index 6126346..0000000 --- a/notebooks/plot_screenkhorn_1D.ipynb +++ /dev/null @@ -1,207 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "# 1D Screened optimal transport\n", - "\n", - "\n", - "This example illustrates the computation of Screenkhorn: Screening Sinkhorn Algorithm for Optimal transport.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "# Author: Mokhtar Z. Alaya \n", - "#\n", - "# License: MIT License\n", - "\n", - "import numpy as np\n", - "import matplotlib.pylab as pl\n", - "import ot\n", - "import ot.plot\n", - "from ot.datasets import make_1D_gauss as gauss\n", - "from ot.bregman import screenkhorn" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Generate data\n", - "-------------\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "#%% parameters\n", - "\n", - "n = 100 # nb bins\n", - "\n", - "# bin positions\n", - "x = np.arange(n, dtype=np.float64)\n", - "\n", - "# Gaussian distributions\n", - "a = gauss(n, m=20, s=5) # m= mean, s= std\n", - "b = gauss(n, m=60, s=10)\n", - "\n", - "# loss matrix\n", - "M = ot.dist(x.reshape((n, 1)), x.reshape((n, 1)))\n", - "M /= M.max()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot distributions and loss matrix\n", - "----------------------------------\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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V8TExNCjR4+c6qSYmJic6c4Lm9PPOcd7773Hueeee9LtRa0rUtQ07ueffz5JSUl89NFHTJw4kUsvvZR77rnnlO1yx1nUPvzXC5uqviSq5pquO5jzH1oJJIysWgWHDpWuAd3voot0tUJrBzGhLC0tjTp16hATE8P69ev5uoCeH+3atWPz5s3s2rUL5xyzZ8/Oua9///7861//yrm+atUqoOAp0QEuuuiinOnbU1JS8p3qfffu3dSoUYNrrrmGO+64g5UrVxb5vHllZGTwzjvvAPD666/nTOOee6r63O0zhT13165defPNNwF49dVXucjf2FmGLIGEEf8BUzCm969TR9tBAljczRjPDBo0iKNHjxIfH8/UqVPp0qVLvttVr16d6dOn07dvX3r27EmDBg1yqpTuv/9+jh49SmxsLO3atWPKlCkA9OnTh5SUFDp06HBKI/rNN9/Mvn37iIuLY9q0afm2gaSkpHDBBReQkJDA3//+95zSx7hx4+jbty99+/Yt8vXVqlWLlStX0rFjR7744gvu8zVKTpw4kSeffJLu3btz4MCBnO0Li3n69OnMnDmTuLg4Zs+ezbRp04rcf2nZdO5hZMQIWLYMvv02OM83fjzMmqWj2osorZsIFwnTuR85coQaNWrgnOPGG28kNjaWW265xeuwwopN5x7BkpIgnwOhEktM1C7BudajMSZszZgxg4SEBNq2bcuxY8f4wx/+4HVIEc8a0cPEgQOwdWvx1v8oij8ZJSXpyHZjwtnEiRM9HVRXEVkJJEz42ueCWgJp107XUrcaQ2NMSVgCCRP+P/lOnYL3nJUr6/guSyAGgtu904Sfknz+lkDCRFIStGihvaeCKTERkpN1jRFTcVWrVo19+/ZZEqmgnHPs27ePatWqFetx1gYSJpKSoHPn4D9vYiI89RR88w2cd17wn9+Eh0aNGpGamsqePXu8DsV4pFq1ajQq5hTflkDCwN69sHMn3HRT8J/bXyWWlGQJpCKrXLkyzZs39zoME2YCqsISkQEisllEtorIpHzuryois333LxeRZrnuixORL0VkvYisFZHilZEMvgGpQW1A9zv/fIiJsXYQY0zxFZlARCQKeAoYCLQFRohI2zybXQ8ccM61BKYBj/oeGw28Cox3zrUDegEZQYu+gvAnkI4dg//c0dHQocOv+zDGmEAFUgLpDGx1zm13zp0A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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "#%% plot the distributions\n", - "\n", - "pl.figure(1, figsize=(6.4, 3))\n", - "pl.plot(x, a, 'b', label='Source distribution')\n", - "pl.plot(x, b, 'r', label='Target distribution')\n", - "pl.legend()\n", - "\n", - "# plot distributions and loss matrix\n", - "\n", - "pl.figure(2, figsize=(5, 5))\n", - "ot.plot.plot1D_mat(a, b, M, 'Cost matrix M')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Solve Screened Sinkhorn\n", - "--------------\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epsilon = 0.014767606916367452\n", - "\n", - "Kappa = 3.3854408965782907\n", - "\n", - "|I_active| = 30 \t |J_active| = 30 \n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Screenkhorn\n", - "\n", - "lambd = 1e-2 # entropy parameter\n", - "ns_budget = 30 # budget number of points to be keeped in the source distribution\n", - "nt_budget = 30 # budget number of points to be keeped in the target distribution\n", - "\n", - "Gsc = screenkhorn(a, b, M, lambd, ns_budget, nt_budget, uniform=False, restricted=True, verbose=True)\n", - "pl.figure(4, figsize=(5, 5))\n", - "ot.plot.plot1D_mat(a, b, Gs, 'OT matrix Screenkhorn')\n", - "\n", - "pl.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.4" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} -- cgit v1.2.3 From 73de2854ef8564521e082ea706ba2ed5ab44786e Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Fri, 10 Jan 2020 06:05:54 +0100 Subject: improve documentation --- examples/plot_screenkhorn_1D.py | 45 ++++++++++++++++++----------------------- ot/bregman.py | 12 +++++------ 2 files changed, 26 insertions(+), 31 deletions(-) diff --git a/examples/plot_screenkhorn_1D.py b/examples/plot_screenkhorn_1D.py index e0d7bfd..22a9ddc 100644 --- a/examples/plot_screenkhorn_1D.py +++ b/examples/plot_screenkhorn_1D.py @@ -4,16 +4,22 @@ # In[ ]: +from ot.bregman import screenkhorn +from ot.datasets import make_1D_gauss as gauss +import ot.plot +import ot +import matplotlib.pylab as pl +import numpy as np get_ipython().run_line_magic('matplotlib', 'inline') -# +# # # 1D Screened optimal transport -# -# +# +# # This example illustrates the computation of Screenkhorn: Screening Sinkhorn Algorithm for Optimal transport. -# -# +# +# # In[13]: @@ -22,18 +28,11 @@ get_ipython().run_line_magic('matplotlib', 'inline') # # License: MIT License -import numpy as np -import matplotlib.pylab as pl -import ot -import ot.plot -from ot.datasets import make_1D_gauss as gauss -from ot.bregman import screenkhorn - # Generate data # ------------- -# -# +# +# # In[14]: @@ -56,8 +55,8 @@ M /= M.max() # Plot distributions and loss matrix # ---------------------------------- -# -# +# +# # In[15]: @@ -77,17 +76,17 @@ ot.plot.plot1D_mat(a, b, M, 'Cost matrix M') # Solve Screened Sinkhorn # -------------- -# -# +# +# # In[21]: # Screenkhorn -lambd = 1e-2 # entropy parameter -ns_budget = 30 # budget number of points to be keeped in the source distribution -nt_budget = 30 # budget number of points to be keeped in the target distribution +lambd = 1e-2 # entropy parameter +ns_budget = 30 # budget number of points to be keeped in the source distribution +nt_budget = 30 # budget number of points to be keeped in the target distribution Gsc = screenkhorn(a, b, M, lambd, ns_budget, nt_budget, uniform=False, restricted=True, verbose=True) pl.figure(4, figsize=(5, 5)) @@ -97,7 +96,3 @@ pl.show() # In[ ]: - - - - diff --git a/ot/bregman.py b/ot/bregman.py index 28377b0..4f24cf4 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1791,7 +1791,7 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli return max(0, sinkhorn_div) -def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, restricted=True, +def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, restricted=True, maxiter=10000, maxfun=10000, pgtol=1e-09, verbose=False, log=False): """" Screening Sinkhorn Algorithm for Regularized Optimal Transport @@ -1824,18 +1824,18 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=True, rest reg : `float` Level of the entropy regularisation - ns_budget: `int`, deafult=None + ns_budget : `int`, deafult=None Number budget of points to be keeped in the source domain If it is None then 50% of the source sample points will be keeped - nt_budget: `int`, deafult=None + nt_budget : `int`, deafult=None Number budget of points to be keeped in the target domain If it is None then 50% of the target sample points will be keeped - uniform: `bool`, default=True - If `True`, a_i = 1. / ns and b_j = 1. / nt + uniform : `bool`, default=False + If `True`, the source and target distribution are supposed to be uniform, namely a_i = 1 / ns and b_j = 1 / nt. - restricted: `bool`, default=True + restricted : `bool`, default=True If `True`, a warm-start initialization for the L-BFGS-B solver using a restricted Sinkhorn algorithm with at most 5 iterations -- cgit v1.2.3 From 5a70afeaa1671e4af010009d47bdea1073967e1e Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Fri, 10 Jan 2020 11:52:37 +0100 Subject: update screenkhorn example --- examples/plot_screenkhorn_1D.py | 66 ++++++++++++----------------------------- ot/bregman.py | 8 ++--- 2 files changed, 23 insertions(+), 51 deletions(-) diff --git a/examples/plot_screenkhorn_1D.py b/examples/plot_screenkhorn_1D.py index 22a9ddc..0eb64b0 100644 --- a/examples/plot_screenkhorn_1D.py +++ b/examples/plot_screenkhorn_1D.py @@ -1,41 +1,26 @@ -#!/usr/bin/env python -# coding: utf-8 - -# In[ ]: - - -from ot.bregman import screenkhorn -from ot.datasets import make_1D_gauss as gauss -import ot.plot -import ot -import matplotlib.pylab as pl -import numpy as np -get_ipython().run_line_magic('matplotlib', 'inline') - - -# -# # 1D Screened optimal transport -# -# -# This example illustrates the computation of Screenkhorn: Screening Sinkhorn Algorithm for Optimal transport. -# -# - -# In[13]: +# -*- coding: utf-8 -*- +""" +=============================== +1D Screened optimal transport +=============================== +This example illustrates the computation of Screenkhorn: +Screening Sinkhorn Algorithm for Optimal transport. +""" # Author: Mokhtar Z. Alaya # # License: MIT License +import numpy as np +import matplotlib.pylab as pl +import ot.plot +from ot.datasets import make_1D_gauss as gauss +from ot.bregman import screenkhorn +############################################################################## # Generate data # ------------- -# -# - -# In[14]: - #%% parameters @@ -52,14 +37,9 @@ b = gauss(n, m=60, s=10) M = ot.dist(x.reshape((n, 1)), x.reshape((n, 1))) M /= M.max() - +############################################################################## # Plot distributions and loss matrix # ---------------------------------- -# -# - -# In[15]: - #%% plot the distributions @@ -73,14 +53,9 @@ pl.legend() pl.figure(2, figsize=(5, 5)) ot.plot.plot1D_mat(a, b, M, 'Cost matrix M') - +############################################################################## # Solve Screened Sinkhorn -# -------------- -# -# - -# In[21]: - +# ----------------------- # Screenkhorn @@ -90,9 +65,6 @@ nt_budget = 30 # budget number of points to be keeped in the target distributio Gsc = screenkhorn(a, b, M, lambd, ns_budget, nt_budget, uniform=False, restricted=True, verbose=True) pl.figure(4, figsize=(5, 5)) -ot.plot.plot1D_mat(a, b, Gs, 'OT matrix Screenkhorn') - -pl.show() - +ot.plot.plot1D_mat(a, b, Gsc, 'OT matrix Screenkhorn') -# In[ ]: +pl.show() \ No newline at end of file diff --git a/ot/bregman.py b/ot/bregman.py index 4f24cf4..95b27e4 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1793,13 +1793,13 @@ def empirical_sinkhorn_divergence(X_s, X_t, reg, a=None, b=None, metric='sqeucli def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, restricted=True, maxiter=10000, maxfun=10000, pgtol=1e-09, verbose=False, log=False): - """" + r"""" Screening Sinkhorn Algorithm for Regularized Optimal Transport The function solves an approximate dual of Sinkhorn divergence [2] which is written as the following optimization problem: ..math:: - (u, v) = \argmin_{u, v} 1_{ns}.T B(u,v) 1_{nt} - <\kappa u, a> - + (u, v) = \argmin_{u, v} 1_{ns}^\top B(u,v) 1_{nt} - <\kappa u, a> - where B(u,v) = \diag(e^u) K \diag(e^v), with K = e^{-M/reg} and @@ -1853,8 +1853,8 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res Dependency ---------- - To gain more efficiency, screenkhorn needs to call the "Bottleneck" package (https://pypi.org/project/Bottleneck/) in the screening pre-processing step. - If Bottleneck isn't installed, the following error message appears: + To gain more efficiency, screenkhorn needs to call the "Bottleneck" package (https://pypi.org/project/Bottleneck/) + in the screening pre-processing step. If Bottleneck isn't installed, the following error message appears: "Bottleneck module doesn't exist. Install it from https://pypi.org/project/Bottleneck/" -- cgit v1.2.3 From cadd301c4de54332378159ab55a02a48beb1d753 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Fri, 10 Jan 2020 12:00:08 +0100 Subject: improve doc --- ot/bregman.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index 95b27e4..0f02226 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1799,15 +1799,15 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res The function solves an approximate dual of Sinkhorn divergence [2] which is written as the following optimization problem: ..math:: - (u, v) = \argmin_{u, v} 1_{ns}^\top B(u,v) 1_{nt} - <\kappa u, a> - + (u, v) = \argmin_{u, v} 1_{ns}^T B(u,v) 1_{nt} - <\kappa u, a> - - where B(u,v) = \diag(e^u) K \diag(e^v), with K = e^{-M/reg} and + where B(u,v) = \diag(e^u) K \diag(e^v), with K = e^{-M/reg} and - s.t. e^{u_i} >= \epsilon / \kappa, for all i in {1, ..., ns} + s.t. e^{u_i} \geq \epsilon / \kappa, for all i \in {1, ..., ns} - e^{v_j} >= \epsilon \kappa, for all j in {1, ..., nt} + e^{v_j} \geq \epsilon \kappa, for all j \in {1, ..., nt} - The parameters \kappa and \epsilon are determined w.r.t the couple number budget of points (ns_budget, nt_budget), see Equation (5) in [26] + The parameters \kappa and \epsilon are determined w.r.t the couple number budget of points (ns_budget, nt_budget), see Equation (5) in [26] Parameters @@ -1843,9 +1843,9 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res Maximum number of iterations in LBFGS solver maxfun : `int`, default=10000 - Maximum number of function evaluations in LBFGS solver + Maximum number of function evaluations in LBFGS solver - pgtol : `float`, default=1e-09 + pgtol : `float`, default=1e-09 Final objective function accuracy in LBFGS solver verbose: `bool`, default=False @@ -2116,4 +2116,4 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res if log: return gamma, log else: - return gamma \ No newline at end of file + return gamma -- cgit v1.2.3 From 0461fb539b23d90d772fe5c4dd75463f915a1da5 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Fri, 10 Jan 2020 12:17:45 +0100 Subject: improve doc --- ot/bregman.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index 0f02226..16012b5 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1833,7 +1833,7 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res If it is None then 50% of the target sample points will be keeped uniform : `bool`, default=False - If `True`, the source and target distribution are supposed to be uniform, namely a_i = 1 / ns and b_j = 1 / nt. + If `True`, the source and target distribution are supposed to be uniform, i.e., a_i = 1 / ns and b_j = 1 / nt restricted : `bool`, default=True If `True`, a warm-start initialization for the L-BFGS-B solver @@ -1848,8 +1848,9 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res pgtol : `float`, default=1e-09 Final objective function accuracy in LBFGS solver - verbose: `bool`, default=False - If `True`, dispaly informations along iterations + verbose : `bool`, default=False + If `True`, dispaly informations about the cardinals of the active sets and the paramerters kappa + and epsilon Dependency ---------- @@ -2116,4 +2117,4 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res if log: return gamma, log else: - return gamma + return gamma \ No newline at end of file -- cgit v1.2.3 From 365adbccc73f7fea28811b16cbbbdbb77761e55c Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Fri, 10 Jan 2020 13:01:42 +0100 Subject: add simple test for screenkhorn --- test/test_bregman.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/test_bregman.py b/test/test_bregman.py index f70df10..eb74a9f 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -337,3 +337,14 @@ def test_implemented_methods(): ot.bregman.sinkhorn(a, b, M, epsilon, method=method) with pytest.raises(ValueError): ot.bregman.sinkhorn2(a, b, M, epsilon, method=method) + +def test_screenkhorn(): + # test screenkhorn + rng = np.random.RandomState(0) + n = 100 + a = ot.unif(n) + b = ot.unif(n) + + x = rng.randn(n, 2) + M = ot.dist(x, x) + G_screen = ot.bregman.screenkhorn(a, b, M, 1e-1) \ No newline at end of file -- cgit v1.2.3 From 18242437e73aba9cf131fafc1571e376b57f25f6 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Mon, 13 Jan 2020 09:50:49 +0100 Subject: fix simple test of screenkhorn in test/ --- test/test_bregman.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_bregman.py b/test/test_bregman.py index eb74a9f..bc8f6ae 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -347,4 +347,4 @@ def test_screenkhorn(): x = rng.randn(n, 2) M = ot.dist(x, x) - G_screen = ot.bregman.screenkhorn(a, b, M, 1e-1) \ No newline at end of file + G_screen = ot.bregman.screenkhorn(a, b, M, 1e-2, uniform=True, verbose=True) \ No newline at end of file -- cgit v1.2.3 From 4918d2c619aaa654c524c9c5dc7f4dc82b838f82 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Thu, 16 Jan 2020 16:44:40 +0100 Subject: update readme --- README.md | 2 +- test/test_bregman.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 987adf1..c115776 100644 --- a/README.md +++ b/README.md @@ -256,4 +256,4 @@ You can also post bug reports and feature requests in Github issues. Make sure t [25] Frogner C., Zhang C., Mobahi H., Araya-Polo M., Poggio T. (2015). [Learning with a Wasserstein Loss](http://cbcl.mit.edu/wasserstein/) Advances in Neural Information Processing Systems (NIPS). -[26] Alaya M. Z., Bérar M., Gasso G., Rakotomamonjy A. (2019). [Screening Sinkhorn Algorithm for Regularized Optimal Transport](https://papers.nips.cc/paper/9386-screening-sinkhorn-algorithm-for-regularized-optimal-transport), Advances in Neural Information Processing Systems 33 (NIPS). +[26] Alaya M. Z., Bérar M., Gasso G., Rakotomamonjy A. (2019). [Screening Sinkhorn Algorithm for Regularized Optimal Transport](https://papers.nips.cc/paper/9386-screening-sinkhorn-algorithm-for-regularized-optimal-transport), Advances in Neural Information Processing Systems 33 (NeurIPS). diff --git a/test/test_bregman.py b/test/test_bregman.py index bc8f6ae..52e9fb2 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -338,6 +338,7 @@ def test_implemented_methods(): with pytest.raises(ValueError): ot.bregman.sinkhorn2(a, b, M, epsilon, method=method) + def test_screenkhorn(): # test screenkhorn rng = np.random.RandomState(0) @@ -347,4 +348,4 @@ def test_screenkhorn(): x = rng.randn(n, 2) M = ot.dist(x, x) - G_screen = ot.bregman.screenkhorn(a, b, M, 1e-2, uniform=True, verbose=True) \ No newline at end of file + G_screen = ot.bregman.screenkhorn(a, b, M, 1e-2, uniform=True, verbose=True) -- cgit v1.2.3 From 936b5e1eb965e1d8c71b7b26cfa5238face1aaa3 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Thu, 16 Jan 2020 17:13:01 +0100 Subject: update --- .idea/POT.iml | 11 +++++++++++ test/test_bregman.py | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 .idea/POT.iml diff --git a/.idea/POT.iml b/.idea/POT.iml new file mode 100644 index 0000000..6711606 --- /dev/null +++ b/.idea/POT.iml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/test/test_bregman.py b/test/test_bregman.py index 52e9fb2..bcec095 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -348,4 +348,4 @@ def test_screenkhorn(): x = rng.randn(n, 2) M = ot.dist(x, x) - G_screen = ot.bregman.screenkhorn(a, b, M, 1e-2, uniform=True, verbose=True) + G_screen = ot.bregman.screenkhorn(a, b, M, 1e-2, uniform=True, verbose=True) \ No newline at end of file -- cgit v1.2.3 From 0f753104856b7c69c6e126b2564353c1e8ccbf77 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Sat, 18 Jan 2020 06:52:42 +0100 Subject: clean --- .idea/POT.iml | 3 ++- examples/plot_screenkhorn_1D.py | 28 ++++++++++++++++----- ot/bregman.py | 56 +++++++++++++++++++++++------------------ 3 files changed, 55 insertions(+), 32 deletions(-) diff --git a/.idea/POT.iml b/.idea/POT.iml index 6711606..7c9d48f 100644 --- a/.idea/POT.iml +++ b/.idea/POT.iml @@ -6,6 +6,7 @@ - \ No newline at end of file diff --git a/examples/plot_screenkhorn_1D.py b/examples/plot_screenkhorn_1D.py index 0eb64b0..103d54c 100644 --- a/examples/plot_screenkhorn_1D.py +++ b/examples/plot_screenkhorn_1D.py @@ -14,6 +14,7 @@ Screening Sinkhorn Algorithm for Optimal transport. import numpy as np import matplotlib.pylab as pl +import time import ot.plot from ot.datasets import make_1D_gauss as gauss from ot.bregman import screenkhorn @@ -54,17 +55,32 @@ pl.figure(2, figsize=(5, 5)) ot.plot.plot1D_mat(a, b, M, 'Cost matrix M') ############################################################################## -# Solve Screened Sinkhorn +# Solve Screenkhorn # ----------------------- # Screenkhorn - -lambd = 1e-2 # entropy parameter +lambd = 1e-3 # entropy parameter ns_budget = 30 # budget number of points to be keeped in the source distribution nt_budget = 30 # budget number of points to be keeped in the target distribution -Gsc = screenkhorn(a, b, M, lambd, ns_budget, nt_budget, uniform=False, restricted=True, verbose=True) +tic = time.time() +G_screen = screenkhorn(a, b, M, lambd, ns_budget, nt_budget, uniform=False, restricted=True, verbose=True) +tac_screen = time.time() - tic + +# Sinkhorn +tic = time.time() +G_sink = ot.sinkhorn(a, b, M, lambd, verbose=False) +tac_sink = time.time() - tic + + pl.figure(4, figsize=(5, 5)) -ot.plot.plot1D_mat(a, b, Gsc, 'OT matrix Screenkhorn') +ot.plot.plot1D_mat(a, b, G_screen, 'OT matrix Screenkhorn') -pl.show() \ No newline at end of file +pl.show() + +############################################################################## +# Time complexity +# ----------------------- +print("Sinkhorn time complexity: %s\n" % tac_sink) +print("Screenkhorn time complexity: %s\n" % tac_screen) +print("Time_Sinkhorn / Time_Screenkhorn: %s\n" % (tac_sink / tac_screen)) diff --git a/ot/bregman.py b/ot/bregman.py index 16012b5..aff9f8c 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1876,7 +1876,7 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res # check if bottleneck module exists try: import bottleneck - except ImportError as e: + except ImportError: print("Bottleneck module doesn't exist. Install it from https://pypi.org/project/Bottleneck/") a = np.asarray(a, dtype=np.float64) @@ -1905,8 +1905,8 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res if ns_budget == ns and nt_budget == nt: # full number of budget points (ns, nt) = (ns_budget, nt_budget) - I = np.ones(ns, dtype=bool) - J = np.ones(nt, dtype=bool) + Isel = np.ones(ns, dtype=bool) + Jsel = np.ones(nt, dtype=bool) epsilon = 0.0 kappa = 1.0 @@ -1955,46 +1955,48 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res epsilon_v_square = bK_sort[nt_budget - 1] # active sets I and J (see Lemma 1 in [26]) - I = a >= epsilon_u_square * K_sum_cols - J = b >= epsilon_v_square * K_sum_rows + Isel = a >= epsilon_u_square * K_sum_cols + Jsel = b >= epsilon_v_square * K_sum_rows - if sum(I) != ns_budget: + if sum(Isel) != ns_budget: if uniform: aK = a / K_sum_cols aK_sort = np.sort(aK)[::-1] epsilon_u_square = aK_sort[ns_budget - 1:ns_budget + 1].mean() - I = a >= epsilon_u_square * K_sum_cols + Isel = a >= epsilon_u_square * K_sum_cols + ns_budget = sum(Isel) - if sum(J) != nt_budget: + if sum(Jsel) != nt_budget: if uniform: bK = b / K_sum_rows bK_sort = np.sort(bK)[::-1] epsilon_v_square = bK_sort[nt_budget - 1:nt_budget + 1].mean() - J = b >= epsilon_v_square * K_sum_rows + Jsel = b >= epsilon_v_square * K_sum_rows + nt_budget = sum(Jsel) epsilon = (epsilon_u_square * epsilon_v_square) ** (1 / 4) kappa = (epsilon_v_square / epsilon_u_square) ** (1 / 2) if verbose: print("epsilon = %s\n" % epsilon) - print("kappa= %s\n" % kappa) - print('|I_active| = %s \t |J_active| = %s ' % (sum(I), sum(J))) + print("kappa = %s\n" % kappa) + print('Cardinality of selected points: |Isel| = %s \t |Jsel| = %s \n' % (sum(Isel), sum(Jsel))) # Ic, Jc: complementary of the active sets I and J - Ic = ~I - Jc = ~J + Ic = ~Isel + Jc = ~Jsel - K_IJ = K[np.ix_(I, J)] - K_IcJ = K[np.ix_(Ic, J)] - K_IJc = K[np.ix_(I, Jc)] + K_IJ = K[np.ix_(Isel, Jsel)] + K_IcJ = K[np.ix_(Ic, Jsel)] + K_IJc = K[np.ix_(Isel, Jc)] K_min = K_IJ.min() if K_min == 0: K_min = np.finfo(float).tiny # a_I, b_J, a_Ic, b_Jc - a_I = a[I] - b_J = b[J] + a_I = a[Isel] + b_J = b[Jsel] if not uniform: a_I_min = a_I.min() a_I_max = a_I.max() @@ -2028,7 +2030,7 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res cst_v = epsilon * K_IcJ.sum(axis=0) / kappa cpt = 1 - while (cpt < 5): # 5 iterations + while cpt < 5: # 5 iterations K_IJ_v = np.dot(K_IJ.T, u0) + cst_v v0 = b_J / (kappa * K_IJ_v) KIJ_u = np.dot(K_IJ, v0) + cst_u @@ -2047,7 +2049,7 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res Restricted Sinkhorn Algorithm as a warm-start initialized point for L-BFGS-B (see Algorithm 1 in supplementary of [26]) """ cpt = 1 - while (cpt < max_iter): + while cpt < max_iter: K_IJ_v = np.dot(K_IJ.T, usc) + cst_v vsc = b_J / (kappa * K_IJ_v) KIJ_u = np.dot(K_IJ, vsc) + cst_u @@ -2067,7 +2069,7 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res return psi_epsilon def screened_grad(usc, vsc): - # gradients of Psi_epsilon w.r.t u and v + # gradients of Psi_(kappa,epsilon) w.r.t u and v grad_u = np.dot(K_IJ, vsc) + vec_eps_IJc - kappa * a_I / usc grad_v = np.dot(K_IJ.T, usc) + vec_eps_IcJ - (1. / kappa) * b_J / vsc return grad_u, grad_v @@ -2090,7 +2092,9 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res theta0 = np.hstack([u0, v0]) bounds = bounds_u + bounds_v # constraint bounds - def obj(theta): return bfgspost(theta) + + def obj(theta): + return bfgspost(theta) theta, _, _ = fmin_l_bfgs_b(func=obj, x0=theta0, @@ -2104,13 +2108,15 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res usc_full = np.full(ns, epsilon / kappa) vsc_full = np.full(nt, epsilon * kappa) - usc_full[I] = usc - vsc_full[J] = vsc + usc_full[Isel] = usc + vsc_full[Jsel] = vsc if log: + log = {} log['u'] = usc_full log['v'] = vsc_full - + log['Isel'] = Isel + log['Jsel'] = Jsel gamma = usc_full[:, None] * K * vsc_full[None, :] gamma = gamma / gamma.sum() -- cgit v1.2.3 From 55e4f76095e5cea22429846fc9d1a790d7eb691b Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Sat, 18 Jan 2020 06:56:31 +0100 Subject: remove .idea/POT.iml --- .idea/POT.iml | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 .idea/POT.iml diff --git a/.idea/POT.iml b/.idea/POT.iml deleted file mode 100644 index 7c9d48f..0000000 --- a/.idea/POT.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - \ No newline at end of file -- cgit v1.2.3 From 3be0c215143e16c59ddd3be902416e91c3292937 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Sat, 18 Jan 2020 07:15:09 +0100 Subject: clean --- examples/plot_screenkhorn_1D.py | 2 +- test/test_bregman.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/plot_screenkhorn_1D.py b/examples/plot_screenkhorn_1D.py index 103d54c..7c0de82 100644 --- a/examples/plot_screenkhorn_1D.py +++ b/examples/plot_screenkhorn_1D.py @@ -59,7 +59,7 @@ ot.plot.plot1D_mat(a, b, M, 'Cost matrix M') # ----------------------- # Screenkhorn -lambd = 1e-3 # entropy parameter +lambd = 1e-03 # entropy parameter ns_budget = 30 # budget number of points to be keeped in the source distribution nt_budget = 30 # budget number of points to be keeped in the target distribution diff --git a/test/test_bregman.py b/test/test_bregman.py index bcec095..2398d45 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -348,4 +348,7 @@ def test_screenkhorn(): x = rng.randn(n, 2) M = ot.dist(x, x) - G_screen = ot.bregman.screenkhorn(a, b, M, 1e-2, uniform=True, verbose=True) \ No newline at end of file + G_sink = ot.sinkhorn(a, b, M, 1e-03) + G_screen = ot.bregman.screenkhorn(a, b, M, 1e-03, uniform=True, verbose=True) + np.testing.assert_allclose(G_sink.sum(0), G_screen.sum(0), atol=1e-02) + np.testing.assert_allclose(G_sink.sum(1), G_screen.sum(1), atol=1e-02) \ No newline at end of file -- cgit v1.2.3 From b3fb1ef40a482f0989686b79373060d764b62d38 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Sat, 18 Jan 2020 07:45:34 +0100 Subject: clean --- ot/bregman.py | 3 ++- test/test_bregman.py | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ot/bregman.py b/ot/bregman.py index aff9f8c..c304b5d 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -2117,10 +2117,11 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res log['v'] = vsc_full log['Isel'] = Isel log['Jsel'] = Jsel + gamma = usc_full[:, None] * K * vsc_full[None, :] gamma = gamma / gamma.sum() if log: return gamma, log else: - return gamma \ No newline at end of file + return gamma diff --git a/test/test_bregman.py b/test/test_bregman.py index 2398d45..e376715 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -348,7 +348,7 @@ def test_screenkhorn(): x = rng.randn(n, 2) M = ot.dist(x, x) - G_sink = ot.sinkhorn(a, b, M, 1e-03) - G_screen = ot.bregman.screenkhorn(a, b, M, 1e-03, uniform=True, verbose=True) - np.testing.assert_allclose(G_sink.sum(0), G_screen.sum(0), atol=1e-02) - np.testing.assert_allclose(G_sink.sum(1), G_screen.sum(1), atol=1e-02) \ No newline at end of file + G_s = ot.sinkhorn(a, b, M, 1e-03) + G_sc = ot.bregman.screenkhorn(a, b, M, 1e-03, uniform=True, verbose=True) + np.testing.assert_allclose(G_s.sum(0), G_sc.sum(0), atol=1e-02) + np.testing.assert_allclose(G_s.sum(1), G_sc.sum(1), atol=1e-02) \ No newline at end of file -- cgit v1.2.3 From 7f7b1c547b54b394db975f4ff9d0287904a7b820 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Sat, 18 Jan 2020 09:04:48 +0100 Subject: make autopep --- test/test_bregman.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/test/test_bregman.py b/test/test_bregman.py index e376715..fd0679b 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -106,7 +106,6 @@ def test_sinkhorn_variants_log(): @pytest.mark.parametrize("method", ["sinkhorn", "sinkhorn_stabilized"]) def test_barycenter(method): - n_bins = 100 # nb bins # Gaussian distributions @@ -133,7 +132,6 @@ def test_barycenter(method): def test_barycenter_stabilization(): - n_bins = 100 # nb bins # Gaussian distributions @@ -161,7 +159,6 @@ def test_barycenter_stabilization(): def test_wasserstein_bary_2d(): - size = 100 # size of a square image a1 = np.random.randn(size, size) a1 += a1.min() @@ -185,7 +182,6 @@ def test_wasserstein_bary_2d(): def test_unmix(): - n_bins = 50 # nb bins # Gaussian distributions @@ -207,7 +203,7 @@ def test_unmix(): # wasserstein reg = 1e-3 - um = ot.bregman.unmix(a, D, M, M0, h0, reg, 1, alpha=0.01,) + um = ot.bregman.unmix(a, D, M, M0, h0, reg, 1, alpha=0.01, ) np.testing.assert_allclose(1, np.sum(um), rtol=1e-03, atol=1e-03) np.testing.assert_allclose([0.5, 0.5], um, rtol=1e-03, atol=1e-03) @@ -256,7 +252,7 @@ def test_empirical_sinkhorn(): def test_empirical_sinkhorn_divergence(): - #Test sinkhorn divergence + # Test sinkhorn divergence n = 10 a = ot.unif(n) b = ot.unif(n) @@ -348,7 +344,10 @@ def test_screenkhorn(): x = rng.randn(n, 2) M = ot.dist(x, x) - G_s = ot.sinkhorn(a, b, M, 1e-03) - G_sc = ot.bregman.screenkhorn(a, b, M, 1e-03, uniform=True, verbose=True) - np.testing.assert_allclose(G_s.sum(0), G_sc.sum(0), atol=1e-02) - np.testing.assert_allclose(G_s.sum(1), G_sc.sum(1), atol=1e-02) \ No newline at end of file + # sinkhorn + G_sink = ot.sinkhorn(a, b, M, 1e-03) + # screenkhorn + G_screen = ot.bregman.screenkhorn(a, b, M, 1e-03, uniform=True, verbose=True) + # check marginals + np.testing.assert_allclose(G_sink.sum(0), G_screen.sum(0), atol=1e-02) + np.testing.assert_allclose(G_s.sum(1), G_screen.sum(1), atol=1e-02) -- cgit v1.2.3 From a1747a10e80751eacca4273af61083a853fb9dd4 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Sat, 18 Jan 2020 09:12:55 +0100 Subject: make autopep --- test/test_bregman.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_bregman.py b/test/test_bregman.py index fd0679b..f54ba9f 100644 --- a/test/test_bregman.py +++ b/test/test_bregman.py @@ -350,4 +350,4 @@ def test_screenkhorn(): G_screen = ot.bregman.screenkhorn(a, b, M, 1e-03, uniform=True, verbose=True) # check marginals np.testing.assert_allclose(G_sink.sum(0), G_screen.sum(0), atol=1e-02) - np.testing.assert_allclose(G_s.sum(1), G_screen.sum(1), atol=1e-02) + np.testing.assert_allclose(G_sink.sum(1), G_screen.sum(1), atol=1e-02) -- cgit v1.2.3 From 7c25e0725e357e4beecc3bfb6f1468a5b5140e74 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Sat, 18 Jan 2020 09:35:14 +0100 Subject: clean --- examples/plot_screenkhorn_1D.py | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/examples/plot_screenkhorn_1D.py b/examples/plot_screenkhorn_1D.py index 7c0de82..bfd374e 100644 --- a/examples/plot_screenkhorn_1D.py +++ b/examples/plot_screenkhorn_1D.py @@ -14,7 +14,6 @@ Screening Sinkhorn Algorithm for Optimal transport. import numpy as np import matplotlib.pylab as pl -import time import ot.plot from ot.datasets import make_1D_gauss as gauss from ot.bregman import screenkhorn @@ -59,28 +58,11 @@ ot.plot.plot1D_mat(a, b, M, 'Cost matrix M') # ----------------------- # Screenkhorn -lambd = 1e-03 # entropy parameter +lambd = 2e-03 # entropy parameter ns_budget = 30 # budget number of points to be keeped in the source distribution nt_budget = 30 # budget number of points to be keeped in the target distribution -tic = time.time() G_screen = screenkhorn(a, b, M, lambd, ns_budget, nt_budget, uniform=False, restricted=True, verbose=True) -tac_screen = time.time() - tic - -# Sinkhorn -tic = time.time() -G_sink = ot.sinkhorn(a, b, M, lambd, verbose=False) -tac_sink = time.time() - tic - - pl.figure(4, figsize=(5, 5)) ot.plot.plot1D_mat(a, b, G_screen, 'OT matrix Screenkhorn') - -pl.show() - -############################################################################## -# Time complexity -# ----------------------- -print("Sinkhorn time complexity: %s\n" % tac_sink) -print("Screenkhorn time complexity: %s\n" % tac_screen) -print("Time_Sinkhorn / Time_Screenkhorn: %s\n" % (tac_sink / tac_screen)) +pl.show() \ No newline at end of file -- cgit v1.2.3 From b6fa567fcb8eaef0699cc8d8ca087ad9c1fb05de Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Sat, 18 Jan 2020 09:48:00 +0100 Subject: clean --- examples/plot_screenkhorn_1D.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/plot_screenkhorn_1D.py b/examples/plot_screenkhorn_1D.py index bfd374e..840ead8 100644 --- a/examples/plot_screenkhorn_1D.py +++ b/examples/plot_screenkhorn_1D.py @@ -65,4 +65,4 @@ nt_budget = 30 # budget number of points to be keeped in the target distributio G_screen = screenkhorn(a, b, M, lambd, ns_budget, nt_budget, uniform=False, restricted=True, verbose=True) pl.figure(4, figsize=(5, 5)) ot.plot.plot1D_mat(a, b, G_screen, 'OT matrix Screenkhorn') -pl.show() \ No newline at end of file +pl.show() -- cgit v1.2.3 From e92b7075decc2b6b55a5b395768f733a577591ea Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Fri, 24 Jan 2020 01:39:26 +0100 Subject: add a warning for non installed Botteleneck module --- ot/bregman.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ot/bregman.py b/ot/bregman.py index c304b5d..2707b7c 100644 --- a/ot/bregman.py +++ b/ot/bregman.py @@ -1877,7 +1877,8 @@ def screenkhorn(a, b, M, reg, ns_budget=None, nt_budget=None, uniform=False, res try: import bottleneck except ImportError: - print("Bottleneck module doesn't exist. Install it from https://pypi.org/project/Bottleneck/") + warnings.warn("Bottleneck module is not installed. Install it from https://pypi.org/project/Bottleneck/ for better performance.") + bottleneck = np a = np.asarray(a, dtype=np.float64) b = np.asarray(b, dtype=np.float64) -- cgit v1.2.3 From c5b1c7cfa3bbf0bed056f2c7c6bedc0d0148a8ce Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Fri, 24 Jan 2020 09:23:02 +0100 Subject: modify pymanopt version in requirements --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 5a3432b..d62190a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,6 +4,7 @@ cython matplotlib sphinx-gallery autograd -pymanopt +pymanopt== 0.2.4, python_version < '3' +pymanopt, python_version >= '3' cvxopt pytest -- cgit v1.2.3 From cae39790dd09a43decc56479d0704717db2ed729 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Fri, 24 Jan 2020 09:32:47 +0100 Subject: modify pymanopt version in requirements --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index d62190a..26053e8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ cython matplotlib sphinx-gallery autograd -pymanopt== 0.2.4, python_version < '3' -pymanopt, python_version >= '3' +pymanopt== 0.2.4, python_version < 3 +pymanopt, python_version >= 3 cvxopt pytest -- cgit v1.2.3 From 6d4ccaca7705646c9b46b1d01a001943b6c778a9 Mon Sep 17 00:00:00 2001 From: "Mokhtar Z. Alaya" Date: Fri, 24 Jan 2020 09:40:20 +0100 Subject: modify pymanopt version in requirements --- requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 26053e8..c08822e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ cython matplotlib sphinx-gallery autograd -pymanopt== 0.2.4, python_version < 3 -pymanopt, python_version >= 3 +pymanopt==0.2.4; python_version <'3' +pymanopt; python_version >= '3' cvxopt -pytest +pytest \ No newline at end of file -- cgit v1.2.3 From 3844639d3dd4e0dd360ebef34dd657d26664039e Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 27 Jan 2020 09:35:19 +0100 Subject: add test for constraint viuolation of duals --- test/test_ot.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/test_ot.py b/test/test_ot.py index 18b6294..c756e51 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -337,7 +337,10 @@ def test_dual_variables(): # Check that both cost computations are equivalent np.testing.assert_almost_equal(cost1, log['cost']) check_duality_gap(a, b, M, G, log['u'], log['v'], log['cost']) - + + viol=log['u'][:,None]+log['v'][None,:]-M + + assert viol.max()<1e-8 def check_duality_gap(a, b, M, G, u, v, cost): cost_dual = np.vdot(a, u) + np.vdot(b, v) -- cgit v1.2.3 From 30fc233f7f62d571a562971a945d68c3782f0780 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 27 Jan 2020 09:37:42 +0100 Subject: correct pep8 --- test/test_ot.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/test_ot.py b/test/test_ot.py index c756e51..245a107 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -337,10 +337,11 @@ def test_dual_variables(): # Check that both cost computations are equivalent np.testing.assert_almost_equal(cost1, log['cost']) check_duality_gap(a, b, M, G, log['u'], log['v'], log['cost']) - - viol=log['u'][:,None]+log['v'][None,:]-M - - assert viol.max()<1e-8 + + viol = log['u'][:, None] + log['v'][None, :] - M + + assert viol.max() < 1e-8 + def check_duality_gap(a, b, M, G, u, v, cost): cost_dual = np.vdot(a, u) + np.vdot(b, v) -- cgit v1.2.3 From e5196fa7a8c493b831fd5dac52a89bbf29e7b0e6 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 27 Jan 2020 10:40:05 +0100 Subject: correct bug in emd emd2 still todo --- ot/lp/__init__.py | 194 +++++++++++++++++++++++++++++++++++++++++++++++------ ot/lp/emd_wrap.pyx | 2 + 2 files changed, 174 insertions(+), 22 deletions(-) diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index eabdd3a..a771ce4 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -23,11 +23,150 @@ from ..utils import parmap from .cvx import barycenter from ..utils import dist -__all__=['emd', 'emd2', 'barycenter', 'free_support_barycenter', 'cvx', - 'emd_1d', 'emd2_1d', 'wasserstein_1d'] +__all__ = ['emd', 'emd2', 'barycenter', 'free_support_barycenter', 'cvx', + 'emd_1d', 'emd2_1d', 'wasserstein_1d'] -def emd(a, b, M, numItermax=100000, log=False, dense=True): +def center_ot_dual(alpha0, beta0, a=None, b=None): + r"""Center dual OT potentials wrt theirs weights + + The main idea of this function is to find unique dual potentials + that ensure some kind of centering/fairness. It will help have + stability when multiple calling of the OT solver with small changes. + + Basically we add another constraint to the potential that will not + change the objective value but will ensure unicity. The constraint + is the following: + + .. math:: + \alpha^T a= \beta^T b + + in addition to the OT problem constraints. + + since :math:`\sum_i a_i=\sum_j b_j` this can be solved by adding/removing + a constant from both :math:`\alpha_0` and :math:`\beta_0`. + + .. math:: + c=\frac{\beta0^T b-\alpha_0^T a}{1^Tb+1^Ta} + + \alpha=\alpha_0+c + + \beta=\beta0+c + + Parameters + ---------- + alpha0 : (ns,) numpy.ndarray, float64 + Source dual potential + beta0 : (nt,) numpy.ndarray, float64 + Target dual potential + a : (ns,) numpy.ndarray, float64 + Source histogram (uniform weight if empty list) + b : (nt,) numpy.ndarray, float64 + Target histogram (uniform weight if empty list) + + Returns + ------- + alpha : (ns,) numpy.ndarray, float64 + Source centered dual potential + beta : (nt,) numpy.ndarray, float64 + Target centered dual potential + + """ + # if no weights are provided, use uniform + if a is None: + a = np.ones(alpha0.shape[0]) / alpha0.shape[0] + if b is None: + b = np.ones(beta0.shape[0]) / beta0.shape[0] + + # compute constant that balances the weighted sums of the duals + c = (b.dot(beta0) - a.dot(alpha0)) / (a.sum() + b.sum()) + + # update duals + alpha = alpha0 + c + beta = beta0 - c + + return alpha, beta + + +def estimate_dual_null_weights(alpha0, beta0, a, b, M): + r"""Estimate feasible values for 0-weighted dual potentials + + The feasible values are computed efficiently bjt rather coarsely. + First we compute the constraints violations: + + .. math:: + V=\alpha+\beta^T-M + + Next we compute the max amount of violation per row (alpha) and + columns (beta) + + .. math:: + v^a_i=\max_j V_{i,j} + + v^b_j=\max_i V_{i,j} + + Finally we update the dual potential with 0 weights if a + constraint is violated + + .. math:: + \alpha_i = \alpha_i -v^a_i \quad \text{ if } a_i=0 \text{ and } v^a_i>0 + + \beta_j = \beta_j -v^b_j \quad \text{ if } b_j=0 \text{ and } v^b_j>0 + + In the end the dual potential are centred using function + :ref:`center_ot_dual`. + + Note that all those updates do not change the objective value of the + solution but provide dual potential that do not violate the constraints. + + Parameters + ---------- + alpha0 : (ns,) numpy.ndarray, float64 + Source dual potential + beta0 : (nt,) numpy.ndarray, float64 + Target dual potential + alpha0 : (ns,) numpy.ndarray, float64 + Source dual potential + beta0 : (nt,) numpy.ndarray, float64 + Target dual potential + a : (ns,) numpy.ndarray, float64 + Source histogram (uniform weight if empty list) + b : (nt,) numpy.ndarray, float64 + Target histogram (uniform weight if empty list) + M : (ns,nt) numpy.ndarray, float64 + Loss matrix (c-order array with type float64) + + Returns + ------- + alpha : (ns,) numpy.ndarray, float64 + Source corrected dual potential + beta : (nt,) numpy.ndarray, float64 + Target corrected dual potential + + """ + + # binary indexing of non-zeros weights + asel = a != 0 + bsel = b != 0 + + # compute dual constraints violation + Viol = alpha0[:, None] + beta0[None, :] - M + + # Compute worst violation per line and columns + aviol = np.max(Viol, 1) + bviol = np.max(Viol, 0) + + # update corrects violation of + alpha_up = -1 * ~asel * np.maximum(aviol, 0) + beta_up = -1 * ~bsel * np.maximum(bviol, 0) + + alpha = alpha0 + alpha_up + beta = beta0 + beta_up + + return center_ot_dual(alpha, beta, a, b) + + +def emd(a, b, M, numItermax=100000, log=False, dense=True, center_dual=True): r"""Solves the Earth Movers distance problem and returns the OT matrix @@ -43,7 +182,7 @@ def emd(a, b, M, numItermax=100000, log=False, dense=True): - a and b are the sample weights .. warning:: - Note that the M matrix needs to be a C-order numpy.array in float64 + Note that the M matrix needs to be a C-order numpy.array in float64 format. Uses the algorithm proposed in [1]_ @@ -66,6 +205,9 @@ def emd(a, b, M, numItermax=100000, log=False, dense=True): If True, returns math:`\gamma` as a dense ndarray of shape (ns, nt). Otherwise returns a sparse representation using scipy's `coo_matrix` format. + center_dual: boolean, optional (default=True) + If True, centers the dual potential using function + :ref:`center_ot_dual`. Returns ------- @@ -107,7 +249,6 @@ def emd(a, b, M, numItermax=100000, log=False, dense=True): b = np.asarray(b, dtype=np.float64) M = np.asarray(M, dtype=np.float64) - # if empty array given then use uniform distributions if len(a) == 0: a = np.ones((M.shape[0],), dtype=np.float64) / M.shape[0] @@ -117,11 +258,21 @@ def emd(a, b, M, numItermax=100000, log=False, dense=True): assert (a.shape[0] == M.shape[0] and b.shape[0] == M.shape[1]), \ "Dimension mismatch, check dimensions of M with a and b" + asel = a != 0 + bsel = b != 0 + if dense: - G, cost, u, v, result_code = emd_c(a, b, M, numItermax,dense) + G, cost, u, v, result_code = emd_c(a, b, M, numItermax, dense) + + if np.any(~asel) or np.any(~bsel): + u, v = estimate_dual_null_weights(u, v, a, b, M) + else: - Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax,dense) - G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) + Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax, dense) + G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) + + if np.any(~asel) or np.any(~bsel): + u, v = estimate_dual_null_weights(u, v, a, b, M) result_code_string = check_result(result_code) if log: @@ -151,7 +302,7 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), - a and b are the sample weights .. warning:: - Note that the M matrix needs to be a C-order numpy.array in float64 + Note that the M matrix needs to be a C-order numpy.array in float64 format. Uses the algorithm proposed in [1]_ @@ -177,7 +328,7 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), dense: boolean, optional (default=True) If True, returns math:`\gamma` as a dense ndarray of shape (ns, nt). Otherwise returns a sparse representation using scipy's `coo_matrix` - format. + format. Returns ------- @@ -221,7 +372,7 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), # problem with pikling Forks if sys.platform.endswith('win32'): - processes=1 + processes = 1 # if empty array given then use uniform distributions if len(a) == 0: @@ -235,10 +386,10 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), if log or return_matrix: def f(b): if dense: - G, cost, u, v, result_code = emd_c(a, b, M, numItermax,dense) + G, cost, u, v, result_code = emd_c(a, b, M, numItermax, dense) else: - Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax,dense) - G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) + Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax, dense) + G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) result_code_string = check_result(result_code) log = {} @@ -252,10 +403,10 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), else: def f(b): if dense: - G, cost, u, v, result_code = emd_c(a, b, M, numItermax,dense) + G, cost, u, v, result_code = emd_c(a, b, M, numItermax, dense) else: - Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax,dense) - G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) + Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax, dense) + G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) result_code_string = check_result(result_code) check_result(result_code) @@ -265,7 +416,7 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), return f(b) nb = b.shape[1] - if processes>1: + if processes > 1: res = parmap(f, [b[:, i] for i in range(nb)], processes) else: res = list(map(f, [b[:, i].copy() for i in range(nb)])) @@ -273,7 +424,6 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), return res - def free_support_barycenter(measures_locations, measures_weights, X_init, b=None, weights=None, numItermax=100, stopThr=1e-7, verbose=False, log=None): """ Solves the free support (locations of the barycenters are optimized, not the weights) Wasserstein barycenter problem (i.e. the weighted Frechet mean for the 2-Wasserstein distance) @@ -326,7 +476,7 @@ def free_support_barycenter(measures_locations, measures_weights, X_init, b=None k = X_init.shape[0] d = X_init.shape[1] if b is None: - b = np.ones((k,))/k + b = np.ones((k,)) / k if weights is None: weights = np.ones((N,)) / N @@ -337,7 +487,7 @@ def free_support_barycenter(measures_locations, measures_weights, X_init, b=None displacement_square_norm = stopThr + 1. - while ( displacement_square_norm > stopThr and iter_count < numItermax ): + while (displacement_square_norm > stopThr and iter_count < numItermax): T_sum = np.zeros((k, d)) @@ -347,7 +497,7 @@ def free_support_barycenter(measures_locations, measures_weights, X_init, b=None T_i = emd(b, measure_weights_i, M_i) T_sum = T_sum + weight_i * np.reshape(1. / b, (-1, 1)) * np.matmul(T_i, measure_locations_i) - displacement_square_norm = np.sum(np.square(T_sum-X)) + displacement_square_norm = np.sum(np.square(T_sum - X)) if log: displacement_square_norms.append(displacement_square_norm) diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index c0d7128..a4987f4 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -40,6 +40,8 @@ def check_result(result_code): return message + + @cython.boundscheck(False) @cython.wraparound(False) def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mode="c"] b, np.ndarray[double, ndim=2, mode="c"] M, int max_iter, bint dense): -- cgit v1.2.3 From 9a9b3547837eac56349ce8df92bb5b0565daa2d6 Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Mon, 27 Jan 2020 10:59:58 +0100 Subject: correct emd2 and add centering for dual potentials --- ot/lp/__init__.py | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index a771ce4..aa3166f 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -264,6 +264,9 @@ def emd(a, b, M, numItermax=100000, log=False, dense=True, center_dual=True): if dense: G, cost, u, v, result_code = emd_c(a, b, M, numItermax, dense) + if center_dual: + u, v = center_ot_dual(u, v, a, b) + if np.any(~asel) or np.any(~bsel): u, v = estimate_dual_null_weights(u, v, a, b, M) @@ -271,6 +274,9 @@ def emd(a, b, M, numItermax=100000, log=False, dense=True, center_dual=True): Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax, dense) G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) + if center_dual: + u, v = center_ot_dual(u, v, a, b) + if np.any(~asel) or np.any(~bsel): u, v = estimate_dual_null_weights(u, v, a, b, M) @@ -287,7 +293,8 @@ def emd(a, b, M, numItermax=100000, log=False, dense=True, center_dual=True): def emd2(a, b, M, processes=multiprocessing.cpu_count(), - numItermax=100000, log=False, dense=True, return_matrix=False): + numItermax=100000, log=False, dense=True, return_matrix=False, + center_dual=True): r"""Solves the Earth Movers distance problem and returns the loss .. math:: @@ -329,6 +336,9 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), If True, returns math:`\gamma` as a dense ndarray of shape (ns, nt). Otherwise returns a sparse representation using scipy's `coo_matrix` format. + center_dual: boolean, optional (default=True) + If True, centers the dual potential using function + :ref:`center_ot_dual`. Returns ------- @@ -383,14 +393,23 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), assert (a.shape[0] == M.shape[0] and b.shape[0] == M.shape[1]), \ "Dimension mismatch, check dimensions of M with a and b" + asel = a != 0 + if log or return_matrix: def f(b): + bsel = b != 0 if dense: G, cost, u, v, result_code = emd_c(a, b, M, numItermax, dense) else: Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax, dense) G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) + if center_dual: + u, v = center_ot_dual(u, v, a, b) + + if np.any(~asel) or np.any(~bsel): + u, v = estimate_dual_null_weights(u, v, a, b, M) + result_code_string = check_result(result_code) log = {} if return_matrix: @@ -402,12 +421,19 @@ def emd2(a, b, M, processes=multiprocessing.cpu_count(), return [cost, log] else: def f(b): + bsel = b != 0 if dense: G, cost, u, v, result_code = emd_c(a, b, M, numItermax, dense) else: Gv, iG, jG, cost, u, v, result_code = emd_c(a, b, M, numItermax, dense) G = coo_matrix((Gv, (iG, jG)), shape=(a.shape[0], b.shape[0])) + if center_dual: + u, v = center_ot_dual(u, v, a, b) + + if np.any(~asel) or np.any(~bsel): + u, v = estimate_dual_null_weights(u, v, a, b, M) + result_code_string = check_result(result_code) check_result(result_code) return cost -- cgit v1.2.3 From f65073faa73b36280a19ff8b9c383e66f8bdbd2b Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Thu, 30 Jan 2020 08:04:36 +0100 Subject: comlete documentation --- ot/lp/__init__.py | 30 +++++++++++++++++++----------- ot/lp/emd_wrap.pyx | 6 ++++++ test/test_ot.py | 4 ++-- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/ot/lp/__init__.py b/ot/lp/__init__.py index aa3166f..cdd505d 100644 --- a/ot/lp/__init__.py +++ b/ot/lp/__init__.py @@ -28,10 +28,10 @@ __all__ = ['emd', 'emd2', 'barycenter', 'free_support_barycenter', 'cvx', def center_ot_dual(alpha0, beta0, a=None, b=None): - r"""Center dual OT potentials wrt theirs weights + r"""Center dual OT potentials w.r.t. theirs weights The main idea of this function is to find unique dual potentials - that ensure some kind of centering/fairness. It will help have + that ensure some kind of centering/fairness. The main idea is to find dual potentials that lead to the same final objective value for both source and targets (see below for more details). It will help having stability when multiple calling of the OT solver with small changes. Basically we add another constraint to the potential that will not @@ -91,7 +91,15 @@ def center_ot_dual(alpha0, beta0, a=None, b=None): def estimate_dual_null_weights(alpha0, beta0, a, b, M): r"""Estimate feasible values for 0-weighted dual potentials - The feasible values are computed efficiently bjt rather coarsely. + The feasible values are computed efficiently but rather coarsely. + + .. warning:: + This function is necessary because the C++ solver in emd_c + discards all samples in the distributions with + zeros weights. This means that while the primal variable (transport + matrix) is exact, the solver only returns feasible dual potentials + on the samples with weights different from zero. + First we compute the constraints violations: .. math:: @@ -113,11 +121,11 @@ def estimate_dual_null_weights(alpha0, beta0, a, b, M): \beta_j = \beta_j -v^b_j \quad \text{ if } b_j=0 \text{ and } v^b_j>0 - In the end the dual potential are centred using function + In the end the dual potentials are centered using function :ref:`center_ot_dual`. Note that all those updates do not change the objective value of the - solution but provide dual potential that do not violate the constraints. + solution but provide dual potentials that do not violate the constraints. Parameters ---------- @@ -130,9 +138,9 @@ def estimate_dual_null_weights(alpha0, beta0, a, b, M): beta0 : (nt,) numpy.ndarray, float64 Target dual potential a : (ns,) numpy.ndarray, float64 - Source histogram (uniform weight if empty list) + Source distribution (uniform weights if empty list) b : (nt,) numpy.ndarray, float64 - Target histogram (uniform weight if empty list) + Target distribution (uniform weights if empty list) M : (ns,nt) numpy.ndarray, float64 Loss matrix (c-order array with type float64) @@ -150,11 +158,11 @@ def estimate_dual_null_weights(alpha0, beta0, a, b, M): bsel = b != 0 # compute dual constraints violation - Viol = alpha0[:, None] + beta0[None, :] - M + constraint_violation = alpha0[:, None] + beta0[None, :] - M - # Compute worst violation per line and columns - aviol = np.max(Viol, 1) - bviol = np.max(Viol, 0) + # Compute largest violation per line and columns + aviol = np.max(constraint_violation, 1) + bviol = np.max(constraint_violation, 0) # update corrects violation of alpha_up = -1 * ~asel * np.maximum(aviol, 0) diff --git a/ot/lp/emd_wrap.pyx b/ot/lp/emd_wrap.pyx index a4987f4..d345fd4 100644 --- a/ot/lp/emd_wrap.pyx +++ b/ot/lp/emd_wrap.pyx @@ -66,6 +66,12 @@ def emd_c(np.ndarray[double, ndim=1, mode="c"] a, np.ndarray[double, ndim=1, mod .. warning:: Note that the M matrix needs to be a C-order :py.cls:`numpy.array` + .. warning:: + The C++ solver discards all samples in the distributions with + zeros weights. This means that while the primal variable (transport + matrix) is exact, the solver only returns feasible dual potentials + on the samples with weights different from zero. + Parameters ---------- a : (ns,) numpy.ndarray, float64 diff --git a/test/test_ot.py b/test/test_ot.py index 245a107..47df946 100644 --- a/test/test_ot.py +++ b/test/test_ot.py @@ -338,9 +338,9 @@ def test_dual_variables(): np.testing.assert_almost_equal(cost1, log['cost']) check_duality_gap(a, b, M, G, log['u'], log['v'], log['cost']) - viol = log['u'][:, None] + log['v'][None, :] - M + constraint_violation = log['u'][:, None] + log['v'][None, :] - M - assert viol.max() < 1e-8 + assert constraint_violation.max() < 1e-8 def check_duality_gap(a, b, M, G, u, v, cost): -- cgit v1.2.3