K-SVD算法學習

1:稀疏表示:
考慮線性等式,或者是線性逼近。X=Da ,這裏的D是MP 的矩陣。稱爲字典(字典學習中),測量矩陣(壓縮感知中),權重矩陣(多任務學習中),其中M<<PD 中的每一列稱爲原子。其模型爲

min||a||0
s.t.X=Da
等價於
min1/2||XDa||22+λ||a||0
當然其中||a||0 可以用其最優凸近似||a||1 來近似替代進行求解。
這裏寫圖片描述
如圖,即爲稀疏表示模型。我們對al0 範數,就是要求a 中的元素非0元儘可能少,0元素儘可能多,故爲稀疏表示。有由上圖可以看到,a 只有三個位置非0,也即是X 可以由字典D 的第四個原子,第七個原子,第13個原子線性表出,而係數的大小,由a 中的非0元確定。

2:K-means 算法
所謂K-means 算法,聚類方法中最簡單的一種。其目的就是尋找潛在的K 個類別y ,從而使樣本Xi 合理的歸屬到不同的類別y 中。其具體算法是如下兩步:
:首先隨機選取K 個質心μ1,μ2,,μK
:重複如下兩步直到收斂:
1) 把樣本Xi 歸屬到某一類中,具體的做法如下:

Ci=argminj||Xiμj||22
表示的是如果Xiμj 距離最小的話,那麼就把Xi 歸屬到μj 這一類中。對樣本中所有元素都如此進行分類。
2)重新計算質心的位置μ1,μ2,,μK 。最簡單的辦法就是把一類中的所有元素的座標求平均。

其實K-means也是一中稀疏表示:對於樣本元素Y ,目的是找到其距離最近的質心 。其解決如下優化問題:
這裏寫圖片描述
字典D 中含有K 個原子或者說是質心。對於樣本Yi ,約束要求的是,找到對應的稀疏表示Xi ,只有一個原子被選中,也即是稀疏表示 Xi 中只有一個元素不爲0。那麼樣本樣本Yi 即屬於相應的質心。近似模型如下:
這裏寫圖片描述

3:K-svd算法
K-means算法是字典中只有一個原子被選中,也就是這個元素Yi 只由一個原子來表示。而K-svd 鬆弛了這一要求:用儘可能少的原子來近似表出。其模型如下:
這裏寫圖片描述
其中X 爲樣本數據,A 爲稀疏表示矩陣。對於樣本Xi ,約束條件要求的是,用儘可能少的原子(<T0 個)來近似表示Xi 。也可以用如下模型來近似:
這裏寫圖片描述
關於其直觀描述如下圖:
這裏寫圖片描述
其中矩陣A 爲稀疏表示矩陣。也即是對於樣本X1 ,用第三個原子和第十個原子線性表出。同樣的可以看出其他的樣本。

K-svd的算法求解:
1)固定D ,更新求解A 。暫且還沒看。
2)更新D 。在這個過程中,只更新D 的一列,一列更新完,更新下一列。更新第K 列的時候,其他的列固定,那麼原問題可以寫成如下分解方式:
這裏寫圖片描述
其中需要說明的是dkD 的第K 列,akTAK 行。這意思是dk 原子對整個樣本矩陣的影響或者說貢獻,把所有用到dk 原子的樣本抽取出來進行計算,也即是如下圖所示:
這裏寫圖片描述

接下來有:

這裏寫圖片描述

4:K-svd算法
這裏寫圖片描述
自己寫的一個程序,不太成熟,也可能不正確,只是爲了自己加深理解罷了。

“`
function [D,X]=Ksvd(Y,X)

D=rand(25,100);%%隨機生成字典
k=size(D,2);
N=size(Y,2);
err=Y-D*X;
for iter=1:50 %%最多迭代100次
for i=1:k
temp=find(X(i,:)); %%表示第i行的所有非零元
max=length(temp);
omega=zeros(N,max);
for ind=1:max
omega(temp(ind),ind)=1;
end

Err=err+D(:,i)*X(i,:);
ErR=Err*omega;
[U S V]=svds(ErR,1,’L’);
D(:,i)=U(:,1);
X(i,:)=V(:,1)*S(1,1);
end
end

參考文獻
1:An Algorithm for Designing Overcomplete Dictionaries for Sparse Representation

2:KSVD學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章