注意
跳转到末尾 以下载完整示例代码。
不平衡最优传输的平移不变Sinkhorn
此示例说明了文献[73]中提出的平移不变Sinkhorn算法相比于传统Sinkhorn算法具有更好的收敛性。
[73] Séjourné, T., Vialard, F. X., & Peyré, G. (2022). 更快的不平衡最优运输:平移不变的Sinkhorn和1维Frank-Wolfe。 在国际人工智能与统计会议上(第4995-5021页)。PMLR。
# Author: Clément Bonet <clement.bonet@ensae.fr>
# License: MIT License
import numpy as np
import matplotlib.pylab as pl
import ot
设置参数
计算带有Sinkhorn和翻译不变Sinkhorn的熵kl正则化UOT
err_sinkhorn_uot = np.empty((n_iter, num_iter_max))
err_sinkhorn_uot_ti = np.empty((n_iter, num_iter_max))
for seed in range(n_iter):
np.random.seed(seed)
xs = ot.datasets.make_2D_samples_gauss(n, mu_s, cov_s)
xt = ot.datasets.make_2D_samples_gauss(n, mu_t, cov_t)
xs = np.concatenate((xs, (np.random.rand(n_noise, 2) - 4)), axis=0)
xt = np.concatenate((xt, (np.random.rand(n_noise, 2) + 6)), axis=0)
n = n + n_noise
a, b = np.ones((n,)) / n, np.ones((n,)) / n # uniform distribution on samples
# loss matrix
M = ot.dist(xs, xt)
M /= M.max()
entropic_kl_uot, log_uot = ot.unbalanced.sinkhorn_unbalanced(
a,
b,
M,
reg,
reg_m_kl,
reg_type="kl",
log=True,
numItermax=num_iter_max,
stopThr=0,
)
entropic_kl_uot_ti, log_uot_ti = ot.unbalanced.sinkhorn_unbalanced(
a,
b,
M,
reg,
reg_m_kl,
reg_type="kl",
method="sinkhorn_translation_invariant",
log=True,
numItermax=num_iter_max,
stopThr=0,
)
err_sinkhorn_uot[seed] = log_uot["err"]
err_sinkhorn_uot_ti[seed] = log_uot_ti["err"]
绘制结果
mean_sinkh = np.mean(err_sinkhorn_uot, axis=0)
std_sinkh = np.std(err_sinkhorn_uot, axis=0)
mean_sinkh_ti = np.mean(err_sinkhorn_uot_ti, axis=0)
std_sinkh_ti = np.std(err_sinkhorn_uot_ti, axis=0)
absc = list(range(num_iter_max))
pl.plot(absc, mean_sinkh, label="Sinkhorn")
pl.fill_between(absc, mean_sinkh - 2 * std_sinkh, mean_sinkh + 2 * std_sinkh, alpha=0.5)
pl.plot(absc, mean_sinkh_ti, label="Translation Invariant Sinkhorn")
pl.fill_between(
absc, mean_sinkh_ti - 2 * std_sinkh_ti, mean_sinkh_ti + 2 * std_sinkh_ti, alpha=0.5
)
pl.yscale("log")
pl.legend()
pl.xlabel("Number of Iterations")
pl.ylabel(r"$\|u-v\|_\infty$")
pl.grid(True)
pl.show()

脚本的总运行时间: (0分钟2.139秒)