1:稀疏表示:
考慮線性等式,或者是線性逼近。X=Da ,這裏的D是M∗P 的矩陣。稱爲字典(字典學習中),測量矩陣(壓縮感知中),權重矩陣(多任務學習中),其中M<<P 。D 中的每一列稱爲原子。其模型爲
min||a||0
s.t.X=Da
等價於
min1/2||X−Da||22+λ||a||0
當然其中
||a||0 可以用其最優凸近似
||a||1 來近似替代進行求解。
如圖,即爲稀疏表示模型。我們對
a 取
l0 範數,就是要求
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 列的時候,其他的列固定,那麼原問題可以寫成如下分解方式:
其中需要說明的是dk 是D 的第K 列,akT 是A 第K 行。這意思是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學習