Deep Learning 學習筆記(9):主成分分析( PCA )與 白化( whitening )

廢話:

這博客有三個月沒更新了。python

三個月!!!尼瑪我真是夠懶了!!算法

這三個月我複習什麼去了呢?app

託福…………機器學習

也不是說我複習緊張到徹底沒時間更新,函數

事實上我甚至有時間打LOL。學習

只是說,我一次就只能(只想?)作一件事情。編碼

對我來講,在兩種不一樣思惟之間轉換是十分耗費能量的。spa

說白了我!就!是!個!廢!柴!……哼……3d


前言:

PCA與白化,blog

就是對輸入數據進行預處理,

前者對數據進行降維,後者對數據進行方差處理。

雖然說原理挺簡單,可是做用可不小。

以前的師兄作實驗的時候,就是忘了對數據預處理,

結果實驗失敗了。

可見好的PCA對實驗結果影響挺重要。


主成成分分析(PCA):

 

主要思想(我總結的):

經過拋棄攜帶信息量較少的維度對數據進行降維處理,從而加速機器學習進程。

 

方法:

1、數據的旋轉(其實我覺着,這個有點像向量正交化的過程)

一、使用的輸入數據集表示爲 \textstyle \{x^{(1)}, x^{(2)}, \ldots, x^{(m)}\}

二、首先計算出協方差矩陣 \textstyle \Sigma ,以下所示:

\begin{align}
\Sigma = \frac{1}{m} \sum_{i=1}^m (x^{(i)})(x^{(i)})^T. 
\end{align}

能夠證實,數據變化的主方向 \textstyle u_1 就是協方差矩陣 \textstyle \Sigma 的主特徵向量,而 變化的次方向\textstyle u_2 是次特徵向量,以此類推。

(證實略,事實上若是隻是想實現算法這個定理不用理解。但我已決定重修線代(By Myself),由於越到後面愈加現線性代數的重要性。)

三、咱們能夠經過matlab或其餘線代軟件求解出協方差矩陣的特徵向量,並按列排列以下:

\begin{align}
U = 
\begin{bmatrix} 
| & | & & |  \\
u_1 & u_2 & \cdots & u_n  \\
| & | & & | 
\end{bmatrix} 		
\end{align}

      \textstyle u_1 是主特徵向量(對應最大的特徵值), \textstyle u_2 是次特徵向量。以此類推,另記 \textstyle \lambda_1, \lambda_2, \ldots, \lambda_n 爲相應的特徵值(數值遞減)。

四、旋轉數據。向量  構成了一個新基,能夠用來表示數據。令 爲訓練樣本,那麼  就是樣本點 i 在維度 上的投影的長度(幅值)。

 

     至此,以二位空間爲例,咱們能夠把 \textstyle x 用 \textstyle (u_1, u_2) 基表達爲:

\begin{align}
x_{\rm rot} = U^Tx = \begin{bmatrix} u_1^Tx \\ u_2^Tx \end{bmatrix} 
\end{align}

   

     引用UFDL兩張圖

     可見變化最大的維度(攜帶信息最多,在咱們EE人的眼中,交流能量(方差)能夠用來表徵信號的信息)被排到了最前。

旋轉前 旋轉後
PCA-u1.png PCA-rotated.png

 

 

 

2、數據的取捨

接上,咱們用方差來表徵一個信號的信息,在旋轉事後的數據中,咱們把最後面方差較小的維度捨去。

\begin{align}
\hat{x}  = U \begin{bmatrix} \tilde{x}_1 \\ \vdots \\ \tilde{x}_k \\ 0 \\ \vdots \\ 0 \end{bmatrix}  
= \sum_{i=1}^k u_i \tilde{x}_i.
\end{align}

保留下來的數據與原數據所攜帶的信息比爲

\begin{align}
\frac{\sum_{j=1}^k \lambda_j}{\sum_{j=1}^n \lambda_j}.
\end{align}

通常取

\begin{align}
\frac{\sum_{j=1}^k \lambda_j}{\sum_{j=1}^n \lambda_j} \geq 0.99. 
\end{align}

若向他人介紹PCA算法詳情,告訴他們你選擇的 \textstyle k 保留了99%的方差

總的來講,PCA後,數據的近似表示

\begin{align}
\tilde{x} = 
\begin{bmatrix} 
x_{{\rm rot},1} \\
\vdots \\ 
x_{{\rm rot},k} \\
0 \\ 
\vdots \\ 
0 \\ 
\end{bmatrix}
\approx 
\begin{bmatrix} 
x_{{\rm rot},1} \\
\vdots \\ 
x_{{\rm rot},k} \\
x_{{\rm rot},k+1} \\
\vdots \\ 
x_{{\rm rot},n} 
\end{bmatrix}
= x_{\rm rot} 
\end{align}

即,咱們捨去n維向量中的(n-k)維,用k維向量來表示數據,可見數據的維度被縮小了。

 

如,捨去第二維以後的數據

PCA-xtilde.png

 

3、復原

其實通常都不復原,那麼辛苦排除了無用信息還復原幹蛋。只是說有這麼個東西……

矩陣 \textstyle U 有正交性,即知足 \textstyle U^TU = UU^T = I ,因此若想將旋轉後的向量 \textstyle x_{\rm rot} 還原爲原始數據 \textstyle x ,將其左乘矩陣\textstyle U便可: \textstyle x=U x_{\rm rot} , 驗算一下: \textstyle U x_{\rm rot} =  UU^T x = x,即:

\begin{align}
\tilde{x} = 
\begin{bmatrix} 
x_{{\rm rot},1} \\
\vdots \\ 
x_{{\rm rot},k} \\
0 \\ 
\vdots \\ 
0 \\ 
\end{bmatrix}
\approx 
\begin{bmatrix} 
x_{{\rm rot},1} \\
\vdots \\ 
x_{{\rm rot},k} \\
x_{{\rm rot},k+1} \\
\vdots \\ 
x_{{\rm rot},n} 
\end{bmatrix}
= x_{\rm rot} 
\end{align}

 

 


白化(Whitening):

  主要思想(教程上的):

  因爲圖像中相鄰像素之間具備很強的相關性,因此用於訓練時輸入是冗餘的。白化的目的就是下降輸入的冗餘性;更正式的說,咱們但願經過白化過程使得學習算法的輸入具備以下性質:(i)特徵之間相關性較低;(ii)全部特徵具備相同的方差。

 

  方法:   

  在上一步PCA中,旋轉事後的維度間已經不具備相關性(果然正交化?)。所以這裏只用將數據的方差化爲一便可。

  可知協方差矩陣對角元素的值爲 \textstyle \lambda_1 ,\textstyle \lambda_2 ……爲數據方差,方差歸一:

                                     \begin{align}
x_{{\rm PCAwhite},i} = \frac{x_{{\rm rot},i} }{\sqrt{\lambda_i}}.   
\end{align}

 

  (對,就這麼就完了,固然這只是最最最簡單的東西)

 

TIPS:

  未防止 \textstyle \lambda_i 過於接近零,這樣在縮放步驟時咱們除以 \sqrt{\lambda_i} 將致使除以一個接近0的值;這可能使數據上溢 。於是在實踐中,咱們使用少許的正則化實現這個縮放過程,即在取平方根和倒數以前給特徵值加上一個很小的常數 \textstyle \epsilon

\begin{align}
x_{{\rm PCAwhite},i} = \frac{x_{{\rm rot},i} }{\sqrt{\lambda_i + \epsilon}}.
\end{align}

  當 \textstyle x 在區間 \textstyle [-1,1] 上時, 通常取值爲 \textstyle \epsilon \approx 10^{-5}

(教程上是這麼說的,可是事實上我認爲若是某一維度的\textstyle \lambda_i過於接近零,這個維度在PCA過程當中將會被捨棄。可能教程中針對的是未通過PCA的數據即:ZCAWhite?)

 

 


完結:?

基本上把幾個月的深度學習本身過了一遍(雖然有至關一部分是複製粘貼的0)。

後面的池化和卷積就不寫了,能用到的很少。

至於稀疏編碼寫不寫,還要看學不學。

由於在UFLDL裏面這方面的內容還未完善,

並且稀疏編碼的激活函數都是可學習的,

不只理解難度大,實現起來難度也大。

師兄學習的時候跑了兩天………………況且個人I3-M一代。

暫且就這樣吧。

 

接下來想學習python和theano,

提升應用能力,

而後向本身找點資料搞實驗。(事實上已經找到)

不過須要指導老師,和老師打交道什麼的最不懂了。

 

自學DL後深深感到線性代數知識的匱乏,須要惡補。

同時發現這個是DL由於可並行計算不少,頗有硬件加速的前途(FPGA?不過矩陣運算好像還不成熟?)。

要是作成芯片確定頗有前途啊~

 

管他呢!

相關文章
相關標籤/搜索