# -*- coding: utf-8 -*- """ Bregman projection for regularized Otimal transport """ import numpy as np def sinkhorn(a,b, M, reg,numItermax = 1000,stopThr=1e-9): """ Solve the optimal transport problem (OT) .. 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 metric cost matrix - Omega is the entropic regularization term - a and b are the sample weights Parameters ---------- a : (ns,) ndarray samples in the source domain b : (nt,) ndarray samples in the target domain M : (ns,nt) ndarray loss matrix reg: float() Regularization term >0 Returns ------- gamma: (ns x nt) ndarray Optimal transportation matrix for the given parameters """ # init data Nini = len(a) Nfin = len(b) cpt = 0 # we assume that no distances are null except those of the diagonal of distances u = np.ones(Nini)/Nini v = np.ones(Nfin)/Nfin uprev=np.zeros(Nini) vprev=np.zeros(Nini) #print reg K = np.exp(-M/reg) #print np.min(K) Kp = np.dot(np.diag(1/a),K) transp = K cpt = 0 err=1 while (err>stopThr and cpttol_error and cpttol_error and cpt