稀疏表示(Sparse representation)原理理解

正文

稀疏表示(Sparse Representation)也叫作稀疏編碼(Sparse Coding),就是用字典中元素的線性組合去表示測試樣本。

我們現在考慮圖片分類問題,如下:

圖片分類

現在給定一個任務,在字典中找出10張圖片,用這10張圖片的一個線性組合去儘可能的表示測試樣本,如果是你的話,你會怎麼選,你會選10張桌子圖片去表示 一張狗的圖片嗎?不會的,你會選10張狗的圖片竟可能的描述測試樣本。這也就是稀疏表示的過程。表示,就是用字典中的元素(就是字典中的樣本)的線性組合儘可能的描述(還原)測試樣本。稀疏表示要用盡可能少的字典中的元素去描述測試樣本。爲什麼要稀疏呢?爲什麼選用的字典中的樣本要儘可能少呢?你可以想象對於一個狗的圖片,我用大量的字典中桌子的的樣本,東補補西湊湊,只要桌子的樣本夠多,我也是可以用大量桌子圖片的線性組合去表示狗這張圖片的。所以對字典中選取的樣本的數量要求儘可能的少。

然後,我們的任務就是怎麼將這個想法,用數學的公式表示出來,然後用計算機編程實現。

對應的數學表示

在圖片分類的問題上,通常把一個兩維圖像,展成一個一維的向量(一般說向量,是列向量),來方便後邊的操作。如何將一個二維圖像展成一個一維向量呢,很簡單,就是以列展開,第一列下邊接上第二列,第二列下邊接上第三列.....

完整之後就是這樣一個情況:

轉化爲向量

下面我將詳細的解釋這圖途中每一個字母的含義

Y_{i} 表示的是第i個測試樣本(就是上個圖中左側的狗這個測試樣本),上邊我們提到我們已經將二維圖像展成了一個一維圖像,在這裏Y_{i} 爲N*1的向量,N表示樣本的維度。

D表示的是字典(就是上一個圖中的字典),這裏對字典中的每一個二維圖像也展成了一個向量。D是一個N*M的矩陣,N表示樣本的維度,所有的樣本的維度都是相同的,用圖像處理可以很簡單的做到。M表示字典中訓練樣本的個數。

注意這個圖中D=[\varphi _{1}^{^{T}};\varphi _{2}^{^{T}};...;\varphi _{n}^{^{T}}] 的表述是不準確的,實際上應該是D=[\varphi _{1},\varphi _{2},...,\varphi _{n},] ,其中\varphi _{i} 表示的是第i類訓練樣本的訓練集,n表示類別總共n類。假設i個類別中訓練樣本的個數用p_{i} 表示,那麼可以得到n類樣本總的樣本個數爲\sum _{1}^{n} p_{i}=M

X_{i} 就是對應第i個測試樣本的稀疏係數。

下面我將講明這個公式代表的具體意思(很重要),

Y_{i}=D\times X_{i}

我們把D矩陣寫成行向量的形式,上個公式就變成了

Y_{i}=[d_{1},d_{2},...,d_{M}]\times X_{i}

注意這裏的d_{i} 與上邊提到的\varphi _{i} 所表示的意思是不一樣的,d_{i} 是一個N*1的向量,表示字典中第i個元素(訓練樣本),而\varphi _{i} 表示的是一個N*p_{i} 的矩陣,表示的是字典中第i個訓練樣本的總體。

我們再把X_{i} 展開,

Y_{i}=[d_{1},d_{2},...,d_{M}]\times [x_{1};x_{2};...x_{M}]

[x_{1};x_{2};...x_{M}] 表示列向量,我們繼續變換

Y_{i}=x_{1}\times d_{1}+x_{2}\times d_{2}+...+x_{n}\times d_{n}

這個公式的含義是什麼呢?你可以想仔細想想,是不是很興奮,他代表這用的d1,d2...等訓練樣本去表示測試樣本,這不就是我們在開頭提出的問題嗎?選10張照片去表示狗。

現在稀疏表示,表示已經出來了,稀疏怎麼辦呢,很好辦,我們約束係數X_{i}  是稀疏的,具體的約束就是X_{i} 中非零項的個數不能超過10,用數學公式表示就是 ||X_{i}||_{0}<T, 這個叫做0範數,就是要求X_{i} 中非零項的個數不能超過T。

最後還有一個問題怎麼描述 誤差呢,因爲 

Y_{i}=x_{1}\times d_{1}+x_{2}\times d_{2}+...+x_{n}\times d_{n}

要做到嚴格的相等太難了,實際中是存在誤差的,如何描述這個誤差呢?

是不是已經想到辦法了

(Y_{i}-x_{1}\times d_{1}+x_{2}\times d_{2}+...+x_{n}\times d_{n})^{2}

最終上邊所提的到的表示的問題,最終就轉化成了如下公式:

\arg \min ||Y_{i}-D\times X_{i}||_{2}^{2} \quad s.t. ||X_{i}||_{0}<T

arg min這個單詞下邊應該有一個X_{i} (CSDN的公式編輯器中沒有找到如何編寫),表示在s.t.的約束下,使得上個公式最小的X_{i} 的值。

如何求解這個問題,我們就直接用現成的算法就好,我一般用OMP算法,具體見https://blog.csdn.net/scucj/article/details/7467955

最後最後的問題來了?怎麼分類呢??先想幾分鐘,其實很簡單

那就是用字典中每一個類別對應的訓練樣本乘以與之對應的稀疏係數中的分量。

我們上邊提到

Y_{i}=[d_{1},d_{2},...,d_{M}]\times [x_{1};x_{2};...x_{M}]

現在我不這麼劃分了,我將D字典不按照樣本數量劃分了,我按照樣本類別劃分。

Y_{i}=[D_{1},D_{2},...,D_{n}]\times [\alpha _{1};\alpha _{2};...\alpha _{n}]

Di表示字典D中第i個類別中所有的樣本,\alpha _{i} 表示Di 在係數X中對應的分量。

最終||Y_{i}-D_{i}\times \alpha _{i}||_{2} 表示用字典D中的第i類去重建測試樣本 Y_{i} 的誤差。我們將誤差最小的類別最爲Y_{i} 的預測類別。

具體的流程請見:

SRC具體流程

 

 

至此本片文章結束。

但是我的朋友要求我要理論+實踐,理論部分講完了,實踐部分,你們自己寫吧。我覺得我講的已經十分清楚了,這麼清楚的一片博客,一個認真閱讀的讀者,應該可以自己寫出代碼來了吧

(來自朋友的一頓毒打)

所以,我還寫了代碼(真香),用稀疏表示來進行人臉識別(人臉分類)的。(臉好疼)

這是結果

用稀疏表示人臉分類的結果

code:code

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章