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);

结果如下:

两个分布:

变换矩阵:

posted @ 2024-07-06 22:28  Dsp Tian  阅读(114)  评论(0编辑  收藏  举报