在遇到維度災難的時候,作為數據處理者們最先想到的降維方法一定是SVD(奇異值分解)和PCA(主成分分析)。
兩者的原理在各種算法和機器學習的書籍中都有介紹,兩者之間也有着某種千絲萬縷的聯系。本文在簡單介紹PCA和SVD原理的基礎上比較了兩者的區別與聯系,以及兩者適用的場景和得到的效果。
一、SVD
1.1 特征值分解
在說奇異值分解之前,先說說特征值分解,特征值分解 \(A = PDP^{-1}\) ,只對A為正交矩陣來說,且得到的D是對角的。由於特征值分解和奇異值分解的本質都是矩陣分解,其本身的幾何意義沒有那么明顯,我們能夠看到的是矩陣分解后的三個矩陣對於幾何變換的意義。
假設對稱矩陣A有m個不同的特征值,設特征值為 \(\lambda_{i}\) ,對應的單位特征向量為 \(x_{i}\) ,則有:
\(Ax_{1}=\lambda_{1}x_{1}\)
\(Ax_{2}=\lambda_{2}x_{2}\)
...
\(Ax_{m}=\lambda_{m}x_{m}\)
進而...
\(AU=U\Lambda\)
U為單位正交矩陣,其每個列向量為A對應的單位特征向量,所以U的逆等於U的轉置,可得:
\(A=U\Lambda U^{T}\)
這里,我們已經進行完了特征值分解,將A分解成了三個矩陣,現在讓我們用A來對一個向量 \(x\) 進行變換,即:
\(Ax=U\Lambda U^{T}x\)
我們先把三個分解后的矩陣打開來看:
\(Ax=[x_{1},x_{2}...x_{m}]\begin{bmatrix}\lambda_{1} && \\ & ... & \\ && \lambda_{m}\end{bmatrix} \begin{bmatrix}x_{1}^{T}\\x_{2}^{T}\\...\\x_{m}^{T}\end{bmatrix}x\)
對等式右邊做遞歸相乘操作:
- \(U^{T}\) 的每一行對應一個單位正交向量,也可以說它的所有行構成了一組新的單位正交基。 \(U^{T}x\) 的結果相當於 \(U^{T}\) 的每一行與\(x\)向量做內積,內積的幾何意義在於一個向量\(x\)在另一向量 \(x_{1}^{T}\) 上的投影再乘以 \(x_{1}^{T}\) 的模,對於單位矩陣 \(x_{1}^{T}\) 來說,這個模為1。所以, \(U^{T}x\) 的幾何意義就是一個正交變換,將\(x\)向量映射到新的正交基上,其結果為新基上的坐標。這個過程可以看作是旋轉。
- 再看 \(\Lambda U^{T}x\) , \(\Lambda\) 是一個對角矩陣,對角矩陣的元素即為A的特征值。這個過程相當於對 \(U^{T}x\) 的結果的每一維做了一個拉伸或收縮,且如果某一維度的特征值為0,則這一維度直接去除。
- 最后看 \(U\Lambda U^{T}x\) ,與1同理,同樣是進行一個單位正交變換,由於U和U'是互為逆矩陣,所以U變換是U’變換的逆變換。
- 現在可以看到特征值分解的意義了:
假設對稱陣特征值全為1那么顯然它就是單位陣,如果對稱陣的特征值有個別是0其他全是1,那么它就是一個正交投影矩陣,它將m維向量投影到它的列空間中。
1.2 奇異值分解(SVD)
先看幾何意義:SVD分解的結果為: \(A =U \Sigma V^{T}\) ,與前面的特征值分解1~4相似,幾何意義可以理解為:
A 是一個線性變換,把 A 分解成 USV',S 給出了變換后橢圓長短軸的長度, U 和 V'一起確定了變換后的方向,所以 U、S、V' 包含了這個線性變換的全部信息。S 矩陣的對角線元素稱為 A 的奇異值,與特征值一樣,大的奇異值對應長軸,小的奇異值對應短軸,大的奇異值包含更多信息。
特征值分解的本質是將一組正交基映射到另一組正交基上,A為映射矩陣。那么對於非對稱矩陣呢?對任意m✖️n矩陣 \(A_{m*n}\) ,能否在n維空間中找到一組正交基使得經過它變換后在m維中還是正交的呢?
為了找到這一組正交基V,我們先假設已經找到了這一組n維空間正交基 \(\{v_{1},v_{2}...,v_{n}\}\) ,
那么 \(Av_{1},Av{2}...\) 即為n維空間中的正交基經過矩陣A的變換后在m維空間的向量。請看上面的圖,圖表示3維空間到2維空間的一個變換,假設變換矩陣A為
\(\begin{bmatrix}4&11&14\\8&7&-2\end{bmatrix}\) (一個2✖️3的矩陣),v1為 \(\begin{bmatrix}1/3\\2/3\\2/3\end{bmatrix}\) (在3維空間中的一個單位向量)。
那么線性變換x -> Ax:
\(Av_{1}=\begin{bmatrix}4&11&14\\8&7&-2\end{bmatrix}\begin{bmatrix}1/3\\2/3\\2/3\end{bmatrix}=\begin{bmatrix}18\\6\end{bmatrix}\)
其結果正好對應2維空間橢圓的長軸,我們可以聯想到A與某個特定的單位向量v2相乘應該是對應橢圓的短軸了。可是,為什么呢?
對於上例中A這個3維空間到2維空間的線性變換,我們想找出使得長度 \(||Av||\) 最大的單位向量v。使得 \(||Av||\) 最大化的v同樣可以使得 \(||Av||^{2}\) 最大化,且后者更容易計算:
\(||Av||^{2}=(Av)^{T}(Av)=v^{T}A^{T}Av=v^{T}(A^{T}A)v ---(*1)\)
這是一個二次型。\(A^{T}A\)是個對稱矩陣,我們可以求出其特征值\(\lambda\)和對應的特征向量\(v\):
\(A^{T}Av=\lambda v\)
帶入(*1),則:
\(||Av||^{2}==v^{T}(A^{T}A)v==v^{T}\lambda v=\lambda\) ---------v是單位向量
對於每一個 \(\lambda_{i}\) ,開根號即為對應的奇異值 \(\sigma_{i}\)
可以得到, \(||Av||=\sqrt{\lambda}=\sigma\) ,所以向量v經過矩陣A變換后在m維空間中的向量長度就是對應的奇異值\(\sigma\)呀,amazing!
這就是奇異值分解中V矩陣的意義, \(AV=[Av_{1},Av_{2}...Av_{n}]\) ,等式右邊矩陣中每一個Av代表n維空間中一個單位向量v經過A的映射到m維空間坐標的值,且所有向量v之間是正交的(因為對稱矩陣不同特征的特征向量之間正交)。
所以\(AV\)的幾何意義就是找到n維空間中的一組單位正交基\(V=[v_{1},...,v_{n}]\),使得V在通過線性變換A后,在m維空間中得到的向量仍是正交的。
那么,U矩陣是什么呢?
前面,我們已經知道 \(Av_{i}\) 代表m維空間中的向量,那么將每個 \(Av_{i}\) 單位化得到一組標准正交基 \(\{u_{1}, ...,u_{r}\}\) , 將其擴充到m維則得到U。
此處 \(u_{i}=\frac{1}{||Av_{i}||}Av_{i}=\frac{1}{\sigma_{i}}Av_{i}---(*2)\)
還記得\(\sigma\)嘛,奇異值。上面已經討論過,每一個奇異值也是每一個向量v經過矩陣A變換后在m維空間中的向量長度。那么再看(*2)式,是不是覺得很自然了呢!
所以 \(U\Sigma=[u_{1},...u_{m}]\begin{bmatrix}\sigma_{1} && \\ & ... & \\ && \sigma_{r}..\\&&&0\end{bmatrix}=[\sigma_{1}u_{1},...,\sigma_{r}u_{r},0,...0]---(*3)\)
看(*3)的等式最右邊,\(u\)為n維空間中向量v在矩陣變換A后在m維空間中的單位向量,\(\sigma\)為該單位向量的長度,所以 \(U\Sigma\) 就是n維空間中向量集V在矩陣變換A后在m維空間中的向量集,這跟\(AV\)的幾何意義完全一樣。
所以, \(AV=U\Sigma\)
進而, \(A=U\Sigma V^{T}\)
到這為止,奇異值分解的幾何意義已經講完了,它是將變換矩陣進行分解的一個過程,那么奇異值分解為什么可以降維呢?
假設我們要對 \(A_{m\times n}\) 進行降維,那么通過奇異值分解 \(A_{m\times n}=U_{m\times m}\Sigma_{m\times n}V_{n\times n}\) ,等式兩邊等價。由於 \(\Sigma_{m\times n}\) 的對角線元素,也就是奇異值的分布是:幾乎前10%甚至1%的奇異值的和占了全部奇異值只和的99%以上,也就是說,我們也可以用最大的k個的奇異值和對應的左右奇異向量U和V來近似描述矩陣,即:
\(A_{m\times n}=U_{m\times m}\Sigma_{m\times n}V_{n\times n}\approx U_{m\times k}\Sigma_{k\times k}V_{k\times n}\)
這里借用Pinard大神的兩張圖:
這是正常的奇異值分解:
這是可近似的分解結果:
SVD計算過程:
- 將矩陣\(A^{T}A\)正交對角化
- 算出 \(V,\Sigma\)
- 構造U
PS: 有關SVD在推薦系統上的應用可以看我的這篇博客從SVD到推薦系統
二、PCA
主成分分析是一個優化問題。
借用LittleHann大神的圖:
這是一個二維坐標,上面的點是二維上的點,我們現在要用一維來表示這些點,有希望盡可能保留原來的信息,應該怎么辦?這就是主成分分析需要解決的問題。
其實,上述問題我們需要解決的無非是找到一組基,使得原來的樣本點映射到這組基上的距離足夠近(最近重構性),且樣本點在這組基上的投影盡可能分開(最大可分性)。
2.1 最大化方差
最大可分性需要是的樣本點在新基上的投影盡可能分開,這種分散程度在數學上我們可以用樣本點的方差來表示。方差越大,表示分散程度越大。此處,一個維度基上各樣本點投影的方差可以看做是每個元素與字段均值的差的平方和的均值,即
\(Var(a)=\frac{1}{m}\sum_{i=1}^{m}(a_{i}-\mu)^{2}\)
所以,在進行PCA之前,我們需要把樣本矩陣進行均值化,這樣上式可以變為
\(Var(a)=\frac{1}{m}\sum_{i=1}^{m}a_{i}^{2}\)
2.2 最小化協方差
對於上面二維降成一維的問題來說,找到那個使得方差最大的方向就可以了。但是對於高維問題來說,比如從三維到二維,如果我們單純只選擇方差最大的方向,很明顯,第二個選擇的維度與第一個維度應該是“幾乎重合在一起”,顯然這樣的維度是沒有用的,因此,應該有其他約束條件。從直觀上說,讓不同盡可能表示更多的原始信息,我們是不希望它們之間存在(線性)相關性的,因為相關性意味着兩個維度不是完全獨立,必然存在重復表示的信息。
數學上可以用兩個字段的協方差表示其相關性,由於已經讓每個字段均值為0,則:
\(Cov(a,b)=\frac{1}{m}\sum_{i=1}^{m}a_{i}b_{i}\)
所以,在維度均值為0的情況下,兩個維度的協方差表示為其內積除以元素數m。
當協方差為0時,表示兩個維度的字段完全獨立。為了讓協方差為0,我們選擇第二個基時只能在與第一個基正交的方向上選擇。因此最終選擇的兩個方向一定是正交的。至此,我們得到了降維問題的優化目標:
將一組N維向量降為K維(K大於0,小於N),其目標是選擇K個單位(模為1)正交基,使得原始數據變換到這組基上后,各字段兩兩間協方差為0(各自獨立),而字段的方差則盡可能大(投影后的點盡可能離散)。在正交的約束下,取最大的K個方差
2.3 協方差矩陣
對於2.1和2.2的兩個優化目標(最大化方差,最小化協方差),都可以用一個矩陣來實現,這就是協方差矩陣。
假設一個二維空間,共有m個樣本,按列組成矩陣X
然后用X乘X的轉置,得到協方差矩陣
對角線是基上每個維度樣本投影的方差,非對角線上是不同兩個維度之間的字段的協方差。當前協方差矩陣是樣本在原來的正交基上的情況。很明顯,由於協方差不為0,所以這個分布是有冗余的。我們的目標就是找到另一組基,使得同樣的這些樣本在那組基上可以達到方差最大,協方差最小。
這就需要對當前協方差矩陣進行對角化了。由於協方差矩陣是對稱矩陣,必然可以找到矩陣P,令\(Y=PX\),使得:
\(D=\frac{1}{m}YY^{T}=\frac{1}{m}(PX)(PX)^{T}=P(\frac{1}{m}XX^{T})P^{T}=PCP^{T}\)
其中C為原來的協方差矩陣,經過對角化之后得到D矩陣,且D矩陣的非對角線元素全為0,所以我們的優化目標優變為:
優化目標變成了尋找一個矩陣P,滿足\(PCP^{T}\)是一個對角矩陣,並且對角元素按從大到小依次排列,那么P的前K行就是要尋找的基,用P的前K行組成的矩陣乘以X就使得X從N維降到了K維並滿足上述優化條件
所以主成分分析的步驟為:
- 設有m條n維數據,組成\(X_{n \times m}\)矩陣
- 對所有樣本進行中心化
- 計算樣本的協方差矩陣
- 對協方差矩陣進行特征值分解
- 取最大的k個特征值所對應的特征向量構成矩陣P
- Y=PX 即為降維到k維后的數據
最后,送上這張經典的圖:
三、SVD與PCA區別與聯系
3.1 從目的上來說:
SVD是一種矩陣分解方法,相當於因式分解,他的目的純粹就是將一個矩陣拆分成多個矩陣相乘的形式。
PCA從名字上就很直觀,找到矩陣的主成分,也就意味這從一出生這就是個降維的方法。
3.2 從方法上來說:
PCA在過程中要計算協方差矩陣,當樣本數和特征數很多的時候,這個計算量是相當大的。
注意到SVD也可以得到協方差矩陣 \(X^{T}X\) 最大的k個特征向量張成的矩陣,但是SVD有個好處,有一些SVD的實現算法可以不求先求出協方差矩陣\(X^{T}X\),也能求出我們的右奇異矩陣V。也就是說,我們的PCA算法可以不用做特征分解,而是做SVD來完成。
另一方面,A的奇異值分解迭代計算比協方差矩陣的特征值分解更快更准確。
注意到PCA僅僅使用了SVD的右奇異矩陣V,沒有使用左奇異矩陣U,那么左奇異矩陣有什么用呢?
假設我們的樣本是m✖️n的矩陣X,如果我們通過SVD找到了矩陣 \(X^{T}X\) 的最大的k個特征向量組成的m✖️d維矩陣U,則我們進行如下處理:
\(X'_{d \times n}=U^{T}_{d \times m}X_{m\times n}\)
可以得到一個d✖️n的矩陣X',且這個矩陣和我們原來的m✖️n維的樣本矩陣X相比,行數從m剪到了k,可見對行數進行了壓縮。
也就是說,左奇異矩陣可以用於行數的壓縮。相對的,右奇異矩陣可以用於列數即特征維度的壓縮,也就是我們的PCA降維。
換句話說,SVD可以獲取另一個方向上的主成分,而PCA只能獲得單個方向上的主成分。這一點在NLP的文本處理上得到了很大體現。
3.3 從操作上來說:
下面來看sklearn手冊
這是 sklearn.decomposition.PCA
的 fit_transform()
操作:
這是 sklearn.decomposition.TruncatedSVD
的 fit_transform()
操作:
看到兩者的區別了嘛?兩者在輸出上都是一樣的,唯一的區別在輸入,SVD可以輸入稀疏矩陣(sparse matrix)。在原理上,也可以說SVD更適於輸入稀疏矩陣。
因為PCA需要進行去均值化處理,所以不可避免的破壞了矩陣的稀疏性。所以,對於稀疏矩陣來說,SVD更適用,這樣對於大數據來說節省了很大空間。
四、附錄:
4.1 基變換
如上圖,在黑色直角坐標系(x,y)上,紅色箭頭表示的向量x的坐標為(3,2),現在我要改變坐標系,將該紅色向量在以藍色坐標系上(也就是另一個基)進行表示。
繼續看上圖,(1,1)和(-1,1)也可以成為藍色坐標的一組基。但是一般來說,我們希望基的模是1,因為從內積的意義( \(A\cdot B=|A||B|cos\theta\) ,若A或B有一個模是1,那么內積表示的就是另一向量在模是1的向量上的投影)可以看到,如果基的模是1,那么就可以方便的用向量點乘基而直接獲得其在新基上的坐標了!
所以,藍色坐標的基我們表示為 \((\frac{1}{\sqrt2},\frac{1}{\sqrt2}),(-\frac{1}{\sqrt2},\frac{1}{\sqrt2})\)
那么基變換就可以表示為:
等式左邊第一個矩陣的每一行為新基向量,第二個矩陣的每一列為一個需要變換的樣本。等式右邊為每個樣本在新基下的坐標表示。
從矩陣相乘的角度來講:
兩個矩陣相乘的意義是將右邊矩陣中的每一列列向量變換到左邊矩陣中每一行行向量為基所表示的空間中去。更抽象的說,一個矩陣可以表示一種線性變換
Reference:
- 《線性代數及其應用》. David C Lay
- https://blog.csdn.net/zhongkejingwang/article/details/43053513
- http://www.cnblogs.com/LittleHann/p/6558575.html#undefined (強烈推薦)
- https://my.oschina.net/findbill/blog/535044
- https://www.cnblogs.com/pinard/p/6251584.html
- https://blog.csdn.net/wangjian1204/article/details/50642732
- 《機器學習》. 周志華