matlab练习程序(Sinkhorn算法)
Sinkhorn算法是为了解决最优传输问题,该问题是给定两个概率分布u和v,找到一个方法,使其从u转换到v的代价最小。
具体到这里是找到了一个转移矩阵。
算法步骤如下:
1. 给定两个概率分布u和v,其中u和v是归一化后数据,维度分别为m和n。
2. 给定矩阵K(m,n),K=1.0/(m*n)。
3. 按下面公式交替迭代u和v:
4. 最终转移矩阵可以表示为:
代码如下:
clear all;close all;clc; u = normpdf(-2:0.1:2, 0, 1)'; v = normpdf(-1:0.1:5, -1, 2)'; u = u/sum(u); v = v/sum(v); m = length(u); n = length(v); K= ones(m,n)*(1.0/(m*n)); u0 = u; u1 = v; for iter = 1:1000 u0 = u ./ (K * u1); % update u u1 = v ./ (K'* u0); % update v end P = diag(u0) * K * diag(u1); newu = (P*v)/sum(P*v); newv = (u'*P)/sum(u'*P); plot(u,'r-*'); hold on; plot(v,'g-*'); plot(newu,'ro'); plot(newv,'go'); figure; image(mat2gray(P)*255);
结果如下:
两个分布:
变换矩阵: