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);
結果如下:
兩個分佈:
變換矩陣: