matlab練習程式(Sinkhorn演算法)

Dsp Tian發表於2024-07-06

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

結果如下:

兩個分佈:

變換矩陣:

相關文章