Note
Go to the end to download the full example code.
OT distance on the Circle
Shows how to compute the Wasserstein distance on the circle
# Author: Clément Bonet <clement.bonet@univ-ubs.fr>
#
# License: MIT License
# sphinx_gallery_thumbnail_number = 2
import numpy as np
import matplotlib.pylab as pl
import ot
from scipy.special import iv
Plot data
def pdf_von_Mises(theta, mu, kappa):
pdf = np.exp(kappa * np.cos(theta - mu)) / (2.0 * np.pi * iv(0, kappa))
return pdf
t = np.linspace(0, 2 * np.pi, 1000, endpoint=False)
mu1 = 1
kappa1 = 20
mu_targets = np.linspace(mu1, mu1 + 2 * np.pi, 10)
pdf1 = pdf_von_Mises(t, mu1, kappa1)
pl.figure(1)
for k, mu in enumerate(mu_targets):
pdf_t = pdf_von_Mises(t, mu, kappa1)
if k == 0:
label = "Source distributions"
else:
label = None
pl.plot(t / (2 * np.pi), pdf_t, c="b", label=label)
pl.plot(t / (2 * np.pi), pdf1, c="r", label="Target distribution")
pl.legend()
mu2 = 0
kappa2 = kappa1
x1 = np.random.vonmises(mu1, kappa1, size=(10,)) + np.pi
x2 = np.random.vonmises(mu2, kappa2, size=(10,)) + np.pi
angles = np.linspace(0, 2 * np.pi, 150)
pl.figure(2)
pl.plot(np.cos(angles), np.sin(angles), c="k")
pl.xlim(-1.25, 1.25)
pl.ylim(-1.25, 1.25)
pl.scatter(np.cos(x1), np.sin(x1), c="b")
pl.scatter(np.cos(x2), np.sin(x2), c="r")