小白理解k-svd算法
小白理解k-svd字典學習
?
一、字典學習
字典學習也可簡單稱之為稀疏編碼,字典學習偏向于學習字典D。從矩陣分解角度,看字典學習過程:給定樣本數(shù)據(jù)集Y,Y的每一列表示一個樣本;字典學習的目標是把Y矩陣分解成D、X矩陣:
?
同時滿足約束條件:X盡可能稀疏,同時D的每一列是一個歸一化向量。
D稱之為字典,D的每一列稱之為原子;X稱之為編碼矢量、特征、系數(shù)矩陣;字典學習可以有三種目標函數(shù)形式
(1)第一種形式:
這種形式因為L0難以求解,所以很多時候用L1正則項替代近似。
?
(2)第二種形式:
?
ε是重構誤差所允許的最大值。
?
(3)第三種形式:
?
L是一個常數(shù),稀疏度約束參數(shù),上面三種形式相互等價。
因為目標函數(shù)中存在兩個未知變量D、X,K-svd是字典學習的一種經(jīng)典算法,其求解方法跟lasso差不多,固定其中一個,然后更新另外一個變量,交替迭代更新。
如果D的列數(shù)少于Y的行數(shù),就相當于欠完備字典,類似于PCA降維;如果D的列數(shù)大于Y的行數(shù),稱之為超完備字典;如果剛好等于,那么就稱之為完備字典。假設現(xiàn)在有了一個N*T的過完備字典?D(比如前面所述圖像傅里葉變換的所有頻率的波),一個要表示的對象y(要還原的圖像),求一套系數(shù)x,使得y=Dx,這里y是一個已知的長為N的列向量,x是一個未知的長為T的列向量,解方程。
?
這是一個T個未知數(shù),N個方程的方程組,T>N,所以是有無窮多解的,線性代數(shù)中這樣的方程很熟悉了。?
上面我就隨便舉了個N=5,?T=8的例子,用來隨便感受下。
?
?
這里可以引出一個名詞,ill-posed problem(不適定問題),即有多個滿足條件的解,無法判斷哪個解更加合適,這是更“落地”的應用場景,inverse problem(逆問題),比如圖像去噪,從噪聲圖中提取干凈圖。于是需要做一個約束。
增加限制條件,要求x盡可能稀疏,怎么“稀疏”呢?就是x的0盡可能多,即norm(x, 0)(零范數(shù):非0元素個數(shù))盡可能小。這樣就有唯一解了嗎?也還不是,如何能“約束”出各位合適的解,如何解,正是稀疏表示所研究的重點問題。比如后來有證明D滿足一定條件情況下x滿足norm(x,1)即可還原原始數(shù)據(jù)等,這有不少大神開啟這個領域的故事這里就不講了。
?
二、k-svd字典學習算法概述
?
給定訓練數(shù)據(jù)Y,Y的每一列表示一個樣本,我們的目標是求解字典D的每一列(原子)。關于它為什么叫做k-svd,當然是其中綜合了k-means 和SVD 的思想。k-means 常用于聚類分類 ,具體的步驟如下:
(1)在樣本集中隨機挑選k個樣本作為質心,即隨機初始化k個原子,此步驟可視為字典的初始化。
(2)通過計算樣本與質心之間的距離,樣本類別化為最近的質心所對應的類別,就是,離誰近,則化為誰的類。此步驟可視為稀疏矩陣的初始化,只不過對應系數(shù)矩陣的每一列只有一項不為0,其余均為0,不為0的一項的索引便是我們樣本對應的類別。
(3)通過劃分好的類別來重新計算每類樣本的質心。此步便是原子矩陣的優(yōu)化。
(4)根據(jù)新計算得來的質心重新分類(原子矩陣,即字典的每個列向量則可看做是一個質心)。此步便是稀疏矩陣的優(yōu)化。
(5)直至兩步質心(原子矩陣)相差少于規(guī)定的閾值,便停止優(yōu)化。
k-svd 字典學習的步驟如下:
1、隨機初始化字典D(類似k-means一樣初始化)
從樣本集Y中隨機挑選k個樣本,作為D的原子;并且初始化編碼矩陣X為0矩陣。
2、固定字典,求取每個樣本的稀疏編碼
編碼過程采用如下公式:
?
ε是重構誤差所允許的最大值。
假設我們的單個樣本是向量y,為了簡單起見我們就假設原子只有這4個,也就是字典D=[α1、α2、α3、α4],且D是已經(jīng)知道的;我們的目標是計算y的編碼x,使得x盡量的稀疏。
(1)首先從α1、α2、α3、α4中找出與向量y最近的那個向量,也就是分別計算點乘:
α1*y、α2*y、α3*y、α4*y
然后求取最大值對應的原子α。
(2)假設α2*y最大,那么我們就用α2,作為我們的第一個原子,然后我們的初次編碼向量就為:
x1=(0,b,0,0)
b是一個未知參數(shù)。
(3)求解系數(shù)b:
y-b*α2=0
方程只有一個未知參數(shù)b,是一個高度超靜定方程,求解最小二乘問題。
(4)然后我們用x1與α2相乘重構出數(shù)據(jù),然后計算殘差向量:
y’=y-b*α2
如果殘差向量y’滿足重構誤差閾值范圍ε,那么就結束,否則就進入下一步;
(5)計算剩余的字典α1、α3、α4與殘差向量y’的最近的向量,也就是計算
α1*y’、α3*y’、α4*y’
然后求取最大值對應的向量α,假設α3*y’為最大值,那么就令新的編碼向量為:
x2=(0,b,c,0)
b、c是未知參數(shù)。
(6)求解系數(shù)b、c,于是我們可以列出方程:
y-b*α2-c*α3=0
方程中有兩個未知參數(shù)b、c,我們可以進行求解最小二乘方程,求得b、c。
(7)更新殘差向量y’:
y’=y-b*α2-c*α3
如果y’的模長滿足閾值范圍,那么就結束,否則就繼續(xù)循環(huán),就這樣一直循環(huán)下去。
3、逐列更新字典、并更新對應的非零編碼
通過上面那一步,我們已經(jīng)知道樣本的編碼。接著我們的目標是更新字典、同時還要更新編碼。K-svd采用逐列更新的方法更新字典,就是當更新第k列原子的時候,其它的原子固定不變。假設我們當前要更新第k個原子αk,令編碼矩陣X對應的第k行為xk,則目標函數(shù)為:
?
上面的方程,我們需要注意的是xk不是把X一整行都拿出來更新(因為xk中有的是零、有的是非零元素,如果全部抽取出來,那么后面計算的時候xk就不再保持以前的稀疏性了),所以我們只能抽取出非零的元素形成新的非零向量,然后Ek只保留xk對應的非零元素項。
?
K-SVD和MOD最大的不同在于,每次只更新字典的一個原子(即D的一列),而不是每次用一個x更新整個D。
回憶下前面的y=Dx,但是學一個字典,當然不能只用一個數(shù)據(jù),現(xiàn)在來升級版:?
Y?=?DX
哈?小寫變大寫?意思是一組y和其對應的一組x,那么Y和X指的矩陣。
現(xiàn)在要更新字典D的第k個原子,也就是第k列,它能影響到的是Y的第k行,同樣對應D的第k列的系數(shù),也是X的第k行。
目標函數(shù)的轉化:
Ek?是去掉原子?dk?的?D?中的誤差,于是目標函數(shù)轉化為?D?的其他列固定,要更新的?dk?使全局誤差(?∥Y?DX∥?)最小化。 即可得到字典的第k個原子。求解這里的?Dk,?xkT?,就用到對?E?的SVD分解了。
?
但是直接分解?E?得到的?xkT?并不稀疏。
更新字典和稀疏系數(shù)是迭代進行的,在“本次”迭代中,找到“上次”迭代中哪些Y用到了字典D的原子k,也就是X的第k行哪些元素不為0,x1k,?x2k,?x3k,?x4k?里,假設?x1k,?x3k?不為0,那么對應的Y的1,3列就是用到了D的原子k的信號(Y的每列是一個信號)。現(xiàn)在把它們拆出來:?
?
這樣得到只保留非零位置的X、D計算目標函數(shù)后得到的只保留對應位置的?Ektemp?,對這個?Ektemp?再做SVD分解,Ektemp?=?UΣVT,?U?的第一列即為新的?$\widetildeozvdkddzhkzd_{k}$,?V?的第一列與?Σ(1,?1)?的乘積為新的?$\widetilde{x}^{T}_{k}$?。
逐列更新得到新字典?$\widetilde{D}$?
然后算法就在1和2之間一直迭代更新,直到收斂。
?
參考文獻
http://blog.csgrandeur.com/blogs/20170323-ksvd-and-denoising
http://blog.csdn.net/hjimce/article/details/50810129
https://blog.csdn.net/weixin_41469272/article/details/81944385?utm_source=copy?
字典學習的K - SVD 算法分析
K-SVD: An Algorithm for Designing Overcomplete
Dictionaries for Sparse Representation?Dictionaries for Sparse Representation
總結
以上是生活随笔為你收集整理的小白理解k-svd算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CTFSHOW-web入门-XXE
- 下一篇: android 六棱形分析图,[转载]菱