機器學習算法總結(九)——降維(SVD, PCA)


  降維是機器學習中很重要的一種思想。在機器學習中經常會碰到一些高維的數據集,而在高維數據情形下會出現數據樣本稀疏,距離計算等困難,這類問題是所有機器學習方法共同面臨的嚴重問題,稱之為“ 維度災難 ”。另外在高維特征中容易出現特征之間的線性相關,這也就意味着有的特征是冗余存在的。基於這些問題,降維思想就出現了。

  降維方法有很多,而且分為線性降維和非線性降維,本篇文章主要講解線性降維。

 

1、奇異值分解(SVD)

  為什么先介紹SVD算法,因為在后面的PCA算法的實現用到了SVD算法。SVD算法不光可以用於降維算法中的特征分解,還可以用於推薦系統,以及自然語言處理等領域。是很多機器學習算法的基石。

  在線性代數中我們學過矩陣(在這里的矩陣必須是$n × n$的方陣)的特征分解,矩陣A和特征值、特征向量之間的關系如下

  

  將A矩陣做特征分解,特征向量$Q$是一組正交向量,具體表達式如下

  

  在這里因為$Q$中$n$個特征向量為標准正交基,滿足$Q^T = Q^{-1}$,也就是說$Q$為酉矩陣。

  矩陣的特征值分解的局限性比較大,要求矩陣A必須是方陣(即行和列必須相等的矩陣),那么對於一般的矩陣該如何做分解?

  奇異值分解就可以處理這些一般性的矩陣,假設現在矩陣A是一個$m × n$的矩陣,我們可以將它的奇異值分解寫成下面的形式

  

  在這里$U$是$m × m$的矩陣,$\Sigma$是$m × n$的矩陣(除對角線上的值,其余的值全為0),$V$是$n × n$的矩陣。在這里矩陣$U$和$V$都是酉矩陣,也就是說滿足$U^TU = I$,$V^TV = I$(其中$I$為單位矩陣)。對於SVD的定義如下圖

  

  矩陣$A^TA$是一個$n × n$的方陣,我們對該方陣做特征值分解,可以得到下面的表達式

  

  我們將這里得到的向量$v_i$稱為右奇異向量。通過該值我們可以得到$u_i$(左奇異向量,方陣U中的向量)和$\sigma_i$(矩陣$\Sigma$中對角線上的值,也就是我們的奇異值)

  

  對於奇異值,它跟我們特征分解中的特征值相似,在奇異值矩陣$\Sigma$中也是按照從大到小排列的,而且奇異值減小的特別快。在很多情況下,前10%甚至前1%的奇異值的和就占總和的99%以上的比例。也就是說我們可以用最大的K個奇異值和對應的左右奇異向量來近似的描述矩陣,如下圖所示

  

  具體表達式如下

  $A_{m × n} = U_{m × m} {\Sigma}_{m × n} V^T_{n × n} ≈ U_{m × k} {\Sigma}_{k × k} V^T_{k × n}$

  在並行化計算下,奇異值分解是非常快的。但是奇異值分解出的矩陣解釋性不強,有點黑盒子的感覺,不過還是在很多領域有着使用。

 

2、主成分分析(PCA)  

  PCA算法可以說是最常用的算法,在數據壓縮,消除冗余等領域有着廣泛的使用。

  先來回顧下向量的內積,假設存在兩條發自原點的有向線段A和B,如下圖所示

  

  設$\alpha$是兩個向量之間的夾角,則向量的內積可以表示為

  

  此時假設向量B的模為1,則上面的式子可以表示為

  

  也就是說當向量B的模為1時,向量A與B的內積等於向量A在向量B上的投影的矢量長度(提醒:這個特性結合后面的基)  

  確定一個向量不能只是單單的靠該直線的本身,也和該直線所在的坐標系有關,對於二維空間內向量$(x,y)$事實上可以表示為

  

  在這里(1, 0)和(0, 1)叫做二維空間中的一組基(也就是我們的x,y單位坐標軸),如下圖所示

  

  事實上對於一條直線我們可以選擇任意兩個線性無關的單位向量(選擇單位向量是因為便於計算,參考上面的提醒)來表示它的基,如下圖所示我們用兩條單位對角線作為基(在這里我們選擇的基是正交的,因為正交基具有較好的性質,因此一般都選擇正交基)

  

  有了這些理解之后,我們可以認為兩個矩陣相乘的意義是將右邊矩陣中的每一列列向量變換到左邊矩陣中每一行行向量為基所表示的空間(提醒:該結論會結合下面的PCA中從高維到低維的映射來討論

  首先假設在低維空間存在這樣一個超平面,將數據從高維映射到該超平面上會使得樣本之間的方差最大(樣本之間方差最大,也就意味着樣本在映射到低維之后仍能較好的保留各樣本之間的差異性。若映射后存在大量的樣本重合,則映射后的樣本中會存在大量無用的樣本)假定對樣本做中心化處理,也就是使得樣本的均值為0,則所有樣本的方差和可以表示為

  

  因此我們只要找到一組基,使得樣本投影到每個基上的方差最大,但是這樣存在一個問題,因為在尋找每個基時都是滿足方差最大,這可能會導致后面的基和前面的基重合,這樣就沒有意義。因此單純的選擇方差最大的方向顯然是不合適的,我們引入一個約束條件。在尋找這樣一組正交基時,我們不僅要使得映射后的方差最大,還要使得各特征之間的協方差為0(協方差表示特征之間的相關性,使得特征都線性無關)協方差表示如下

  

  那么對於方差和協方差有沒有一個可以同時表達這兩個值的東西呢?協方差矩陣就可以,協方差矩陣是對稱矩陣,矩陣的對角線上是方差,其余的值都是協方差,其具體表示如下

  

  那么問題就好求解了,我們只要將協方差矩陣進行對角化,對角化后的矩陣除了對角線上的值,其余的值都為0

  設原始數據矩陣X對應的協方差矩陣為$C$,而$P$是一組基按行組成的矩陣,設$Y=PX$,則$Y$為$X$對$P$做基變換后的數據。設$Y$的協方差矩陣為$D$,我們推導一下$D$與$C$的關系

  $D = Y {Y^T} = P X {X^T} {P^T} = P C {P^T}$

  優化目標變成了尋找一個矩陣$P$,滿足是正交基矩陣,並且對角元素按從大到小依次排列,那么$P$的前$K$行就是要尋找的基,用$P$的前$K$行組成的矩陣乘以$X$就使得$X$從$N$維降到了$K$維並滿足上述優化條件。

  因此現在我們只需要對協方差矩陣C做對角化就好了,而且由於C是實對稱矩陣,因此滿足不同特征值下的特征向量兩兩正交。對協方差矩陣C做對角化

  

  然后我們要找的$P$就是

  

  得到$P$之后就可以直接求得我們降維后的矩陣$Y = PX$(注意:這里對於矩陣$X$做左乘是會壓縮行的,也就是矩陣$Y$的行數要少於矩陣$X$,因此原始矩陣$X$是$n * m$,其中$n$是特征數,$m$是樣本數)。這就是整個PCA的簡單理解流程

  事實上在數據量很大時,求協方差矩陣,然后在進行特征分解是一個很慢的過程,因此在PCA背后的實現也是借助奇異值分解來做的,在這里我們只要求得奇異值分解中的左奇異向量或右奇異向量中的一個(具體求哪個是要根據你的X向量的書寫方式的,即行數是樣本數還是特征數,總之左奇異向量是用來壓縮行數,右奇異向量是用來壓縮列數,而我們的目的是要壓縮特征數)

  在我們的PCA轉換中是一個線性轉換,因此也被稱為線性降維。但有時數據不是線性的,無法用線性降維獲得好的結果,那么這里就引入了我們的核PCA方法來處理這些問題,具體表達式如下

  

  只需要在求協方差矩陣時,將數據先映射到高維(根據低維不可分的數據在高維必定可分的原理),然后再對這高維的數據進行PCA降維處理,為了減少計算量,像支持向量機中那樣用核函數來處理求內積的問題。這類方法就是核主成分分析方法(KPCA),KPCA由於要做核運算,因此計算量比PCA大很多。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM