字典學習與稀疏表示

2021-09-01 13:18:40 字數 1872 閱讀 8569

假設我們用乙個m*n的矩陣表示資料集x,每一行代表乙個樣本,每一列代表樣本的乙個屬性,一般而言,該矩陣是稠密的,即大多數元素不為0。 稀疏表示的含義是,尋找乙個係數矩陣a(k*n)以及乙個字典矩陣b(m*k),使得b*a盡可能的還原x,且a盡可能的稀疏。a便是x的稀疏表示。

x是y的稀疏表示 (sparse coding)

人工構造的過完備over-complete字典(例如:dct,小波字典等),過於完備,會有冗餘

針對某張做字典學習後獲得的字典,適應性強

可以將該問題看成乙個優化問題,第一項是確保a和xi能夠很好地重構yi(失真少),第二項是確保xi盡量稀疏(字典構建耦合性小)。正則項本該用l0範數(非零項的個數),但因為比較難求解,這裡用l1範數代替,l1範數代表的是絕對值的和。

建立模型

輸入是yi,需要求解的是a和xi。剛開始的時候,a是乙個由部分yi構成的初始矩陣,然後求解xi,xi確定後,可以再求優化後的a,如此反覆迭代獲得最優的結果。這種求解方式稱為ksvd,速度比較快。這是兩步求解的演算法:先固定a,求x,再固定x更新a,交替進行。k-svd和k-means方法本質上都屬於一種壓縮的思想,都主要包含以下兩個步驟:(1)稀疏編碼;(2)字典更新。k-svd中,稀疏編碼可使用omp方法,然後字典更新使用svd奇異值分解,細節可參考以下鏈結的內容:(

在k-means方法中,k-means 先隨機選擇k個初始點作為字典,k個初始點就代表k類。然後通過k-means聚類,聚出k個類(稀疏編碼階段),每個聚類中心(均值)做為新的字典(字典更新)。k-means的編碼矩陣x是乙個高度稀疏的矩陣,x的每一列就只有乙個非零的元素,對應聚類中心。而k-svd的編碼矩陣的每一列可以有多個非零元素。

k-svd方法的求解步驟如下:

1. 基本定義

y是乙個矩陣,是參與訓練的樣本yi的集合,樣本數量為n,假設樣本的維度是m。

a是乙個矩陣,是字典,該矩陣是k*m,其中k是字典中原子的數量,m是原子的維度(和樣本維度一致)

x是乙個矩陣,是稀疏**xi的集合,xi的維度是m

2. 初始化

從樣本集y中隨機挑選k個樣本,作為a的初始值;並且初始化x為0

3. 求解xi

為了簡單起見,我們抽出乙個樣本進行討論,假定樣本為y向量,稀疏**為x向量。現在y和a算是已知的,求解x,同時滿足x盡量的稀疏,也就是非零元素盡量的少。假設a為[a1,a2,a3,a4,a5],其中有5個原子。首先求出離y距離最近的原子,假設是a3。那麼我們就可以求出乙個初步的x為[0,0,c3,0,0],c3是乙個未知係數,代表原子的權重。假定y=c3*a3。可求得c3的值。接著我們用求出的c3求殘差向量y'=y-c3*α3,y'是乙個預設的閾值向量,當y'小於閾值的話,則停止計算,如果不小於的話,轉到下一步。

計算剩餘的原子a1,a2,a4,a5中與殘差向量y'距離最近的,假設是a1,那麼更新x為[c1,0,c3,0,0],假設y=c1*a1+c3*a3,求解出c1,然後更新殘差向量y'=y-c1*a1-c3*α3。判斷是否小於閾值,如果不滿足,再繼續求下乙個最近的原子的係數。求解原子係數的數量也可以指定為乙個常量,例如3,那就代表迭代3次。

4. 更新字典

通過上乙個步驟可以求出所有的xi,接著就可以更新字典a了。k-svd的方法是逐個地更新字典的原子以及編碼。

稀疏表示 字典學習

online learning toolbox francesco orabona machine perception toolbox mpt 偶然的機會發現了這個工具箱,雖說05年都沒有再更新了,但是很多東西還是可以借鑑的。很好的乙個工具箱,功能包含face detection,eye dete...

稀疏表示和字典學習

稀疏表示 假設有乙個mn的矩陣y,我們要找到乙個mk的字典矩陣d和乙個稀疏的kn的係數矩陣x,使得使得y盡可能由dx表示,x就是y的稀疏表示。字典學習 字典學習包括兩個階段,一是字典構建階段,而是利用字典稀疏地表示樣本階段,每個階段都有不同的演算法可以選擇。龐大資料可以由字典裡的基本元素通過不同組合...

字典學習 稀疏表示學習筆記

首先向大家安利一下南大周志華老師寫的 機器學習 這本書,作為乙個對此一竅不通的人看了都覺得很有意思,受益匪淺。語言平實卻又乾貨十足,比某些故弄玄虛泛泛而談的其它國內教材高到不知 去了。最近看的 涉及到稀疏表示,正好這本書有講到。這兩天看了一下該書關於稀疏表示的部分 第11章 將核心知識點總結歸納一下...