稀疏表示介紹(中)

 

聲明html

  1. 以前雖然聽過壓縮感知和稀疏表示,實際上昨天才正式着手開始瞭解,純屬新手,若有錯誤,敬請指出,共同進步。算法

  2. 主要學習資料是 Coursera 上 Duke 大學的公開課——Image and video processing, by Pro.Guillermo Sapiro 第 9 課。api

  3. 因爲對圖像處理的瞭解也來自與該課程,沒正經兒看過幾本圖像方面的書籍,有些術語只能用視頻中的英文來表達,見諒哈!ide


 

1. Uniqueness

假設咱們已知字典矩陣 D 和稀疏向量 a, 計算出一個信號 x,即 Da = x, x 存在一個關於 D 的稀疏表示。反過來如今已知前面的 D 和 x,根據 L0 的優化問題,能夠概括爲:函數

 的解是惟一的嗎?學習

顯然不必定。好比, D 中某些 atoms 剛好相等,或者 column1 = column2 + column3, 之前由 column2 和 column3 如今只用 column1 表示便可。固然也有正面的例子,好比 DCT 變換, 基向量徹底正交,解是惟一的。這與 D 中 atoms 的不相關性數目 K 有關。優化

 

2. Sparse Coding

和上面同樣,現有字典 D 和帶有噪聲的信號 y,進行稀疏編碼的問題能夠表示的 L0 優化問題:ui

這是一個組合優化問題。假設 alpha 的非零項數目爲 L (sparse Level), 先令 L = 1, 每個列向量嘗試一遍,看看是否又知足條件的,共有 K 種組合。若是沒有,再令 L = 2, 再次嘗試,共有 K(K-1)/2 中組合。尚未知足條件的,則令 L = 3......組合的數目呈指數增加,這是一個 NP-hard 的問題。 實際應用中的 K = 1000, L = 10, 要窮盡全部的排列組合大概須要計算幾百萬年,所以要採用近似算法, 目前主要有 relaxation methods 和 greedy methods。編碼

  1. Relaxation Methods - the Basis Pursuit (BP)
    咱們知道, L0 norm 能夠數出向量中非零 entries 的數目,具備很好的現實意義,可是因爲它數學特性(求導等)極差,很是不適合做爲一個優化模型中目標函數。在線性分類器中,你能夠把誤分點的數目做爲目標函數,可是無法優化,因此,咱們看到的線性分類器的的目標函數通常是 L1 norm(感知器算法), L2 norm(LMS 算法和最小二乘法)以及最大熵(Logistic Regresson)等,也能達到比較好的效果。在上一篇博客中,能夠看到 L1 是菱形, L2 是球體,L1 具備更好的稀疏性(解更靠近座標軸),因此咱們採用鬆弛方法將 L0 norm 轉換爲 L1 norm:atom


    雖然咱們把 count number 變成了 count the magnitude, 可是在某些條件下,上式的解與鬆弛以前的解等價。上述方法也叫 BP,新定義的問題是一個凸優化問題,解決的方法不少,有 Interior Point methods, Sequential shrinkage for union of ortho-bases, Iterative shrinkage 等。

     

  2. Greedy Methods - Matching Pursuit (MP)
    第一步,找到最接近(平行) y 的 atom, 等效與在 alpha 向量上僅取一個非零項,求出最接近的 atom, 保留下來
    第二步,計算偏差是否知足要求,若是知足,算法中止,不然,計算出殘差信號,和第一步相似,找到最接近殘差向量的 atom, 保留下來
    第三步,調整已選向量的係數,使得 Da 最接近 y,重複第二步 (OMP, Orthogonal Matching Pursuit)

總結一下解決這個問題的算法有:

 

3. Dictionary Learning - K-SVD

字典學習的一個假設是——字典對於一張 good-behaved 的圖像具備稀疏表示。所以,選擇字典的原則就有可以稀疏地表達信號。有兩種方法來設計字典,一種是從已知的變換基中選擇,或者能夠稱爲 beyond wavelet 變換,好比 DCT 實際上就是一個稀疏表示(高頻部分系數趨向於 0),這種方法很通用,可是不可以 adapted to the signal。第二種方法是字典學習,即經過已有的大量圖片數據進行訓練和學習。

好比,如今有 P 個信號(張圖片)要進行稀疏表示,如何學習一個字典?

上式字典矩陣 D 和 alpha 組成的稀疏表示 A 矩陣都是可變量,目前有幾種算法解決這個問題,下面介紹 K-SVD 算法(K-Means的一種變種),idea 很是簡單。假設如今有原始信號矩陣 X^T, 該矩陣的每一行表示一個信號或者一張圖片, D 矩陣是字典矩陣,右下方是 sparse coding 矩陣,紅色的點表示非零項:

算法步驟以下:

 

Step 1: Initialize。在 X^T 矩陣中隨機挑選一些行向量(一些原圖),填滿矩陣 D。( K-means 隨機選點初始化) 

Step 2: Sparse Coding. 用上一小節的方法(鬆弛或者貪婪法)進行稀疏編碼,Row-by-Row 計算出稀疏矩陣。

Step 3: Dictionary Update. 字典以列向量爲基,天然要 Column-by-Column 地更新字典。好比如今更新某一列, 下方對應的紅點,根據紅點找到對應的信號(圖像),而後除掉其餘不相關的圖像,獲得示意圖以下:


上圖中字典的 atom 對四張圖片都有貢獻,咱們調整 atom 的目的是使得這個貢獻更大,從而使稀疏性表示效果更好。固然,一個 atom 只能表示一條直線,三張圖片的信號極有可能不在這條直線上,咱們要作的是將中間的偏差降到最小,這其實就是一個最小二乘(MSE)的問題。具體作法是將最右下角的矩陣進行 SVD 分解(SVD 相關知識可參考以前我寫的博客),找出主成分,而後回到 Step2, 迭代。

相關文章
相關標籤/搜索