淺談K-SVD


由於工作需要,最近剛剛看了一些K-SVD的介紹,這里給自己做一下小節。

K-SVD我們一般是用在字典學習、稀疏編碼方面,它可以認為是K-means的一種擴展,http://en.wikipedia.org/wiki/K-means_clustering

我們進行K-SVD的目標是要構造一個過完備的矩陣,然后選擇最稀疏的系數解使得矩陣可以對其訓練集相似的目標向量進行稀疏表示。

就字典學習來說,我們所設計的字典目標要滿足(還有第二種情況我們先不考慮):

其中$Y$是你要表示的信號($n\times N$),$D$是字典,也就是過完備矩陣($n\times K$),$X$為系數矩陣($K\times N$)。這里需要說明的是$X$與$Y$是按列對應,所表示的含義是字典中的條目(每一列)按照$X_i$為系數進行線性組合,就會得到$Y$。而我們的目的是在已知$X$和$Y$的情況下更新字典來滿足上述條件。

構造字典的算法分為兩步:稀疏表示和字典更新。

稀疏表示:

首先要有一個初始化的字典$D$,然后我們將$DX$看做$D$中的每列與$X$中對應每行的乘積,這樣就將$DX$給分片,即$DX=\sum_{i=1}^K{d_i}{x_i^T}$

字典更新:

這里我們的思想是逐次更新字典向量,通過K次迭代完成字典的一次更新。我們在剝離第K個條目之后,上述表達式會產生一個"空洞",而我們要做的就是尋找新的$d_i$和$x_i$來填補這個"空洞"來更加趨於收斂情況,所使用的方法便是SVD

上式中的E是誤差矩陣,對E做SVD分解,$E=U\Lambda V^T$,其中U和V的列矢量均是正交基,$\Lambda$是對角矩陣。若$\Lambda$的對角元素從大到小排列,則表示E的能量分量主軸在相應幾個正交方向上由大到小分配,如此我們取U的第一個列向量來表示$d_i$,取V的第一個列向量與$\Lambda$的第一個元素的成績表示$x_i$,這樣就完成了字典一個條目的更新。

但是這里我們要注意的是,X是一個稀疏矩陣,我們通過上述方法得到的X有可能不滿足稀疏條件,處理方法是我們只計算$x_i$中的非零列,可以理解為我們用$x_i$中非零元素構建一個新的矩陣$\Omega$($N\times M$),M是$x_i$中的非零元素個數,N是字典中每個向量的維數。然后我們上式進行變化:

$$E_k^R=E_k\Omega, x_R^k=x_T^k\Omega$$

然后我們對$E_k^R$進行SVD分解,按照上面思路,得到新的字典條目$d_i$。這里做一下說明,上面乘以新的矩陣$\Omega$其實就是把字典中沒有做貢獻的向量給移除掉,從而不會造成直接分解之前的向量不稀疏的情況了。

在字典更新時,有可能出現極限情況,即$x_i=0$,如此E收縮后也為0矩陣,即無法進行SVD,解決方法是計算誤差矩陣E的每一列的平方,找到平方和最大的列也就是誤差最大的列,被表示為最小列填充該字典列,以此最大限度的減小誤差,讓字典可以繼續有效更新。

參考:

http://home.ustc.edu.cn/~zywvvd/files/K-SVD.pdf

http://blog.nrdang.com/?p=35

http://blog.csdn.net/abcjennifer/article/details/8693342

Aharon M, Elad M, Bruckstein A. -svd: An algorithm for designing overcomplete dictionaries for sparse representation[J]. Signal Processing, IEEE Transactions on, 2006, 54(11): 4311-4322.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM