在用數據對模型進行訓練時,一般會遇到維度太高,也就是數據的特徵太多的問題,有時特徵之間還存在必定的相關性,這時若是還使用原數據訓練模型,模型的精度會大大降低,所以要下降數據的維度,同時新數據的特徵之間還要保持線性無關,這樣的方法稱爲主成分分析(Principal component analysis,PCA),新數據的特徵稱爲主成分,獲得主成分的方法有兩種:直接對協方差矩陣進行特徵值分解和對數據矩陣進行奇異值分解(SVD)。算法
數據X由n個特徵降維到k個特徵,這k個特徵保留最大信息(方差)。對原座標系中的數據進行主成分分析等價於進行座標系的旋轉變化,將數據投影到新的座標系下,新座標系的第一座標軸表示第一主成分,第二座標軸表示第二主成分,以此類推。數據在每一軸上的座標值的平方表示相應變量的方差,PCA的目標就是方差最大的變量,才能保留儘量多的信息,由於方差越大,表示數據分散程度越大,所包含的信息也就越多。
優化
假設X是m*n的矩陣,\(x_k\)是投影前的數據(k=1,2,…,n),\(x_k^{'}\)是投影后的數據,e是新的座標軸。投影長度\(α_k=e^tx_k\),能夠將\(e^t\)當作是cosθ,新數據\(x_k^{'}\)在新座標軸e下的座標爲\(α_k e\),表示從原點出發,沿着e方向走了\(α_k\)距離。根據方差最大的原則,即\(α_k\)要最大,由勾股定理\(\alpha_k^2+\left \| x_kx_k{'}\right \|^2=\left\|o x_k\right\|^2\)可知,當\(α_k\)最大時,\(\left\|x_kx_k^{'}\right\|^2\)要最小,所以轉換成求\(\left\|x_kx_k^{'}\right\|^2\)最小,約束條件是\(\left\|e\right\|=1\),數學表達式爲:spa
\(min J(e)\\ =\sum_{i=1}^n\left\|x_k^{'}-x_k\right\|^2\\ =\sum_{i=1}^n\left\|\alpha_ke-x_k\right\|^2\\ =\sum_{i=1}^n\alpha_k^2\left\|e\right\|^2 - 2\sum_{i=1}^n\alpha_ke^tx_k + \sum_{i=1}^n\left\|x_k\right\|^2\\ =\sum_{i=1}^n\alpha_k^2-2\sum_{i=1}^n\alpha_k^2+\sum_{i=1}^n\left\|x_k\right\|^2\\ =-\sum_{i=1}^n\alpha_k^2+\sum_{i=1}^n\left\|x_k\right\|^2\\ =-\sum_{i=1}^ne^tx_kx_k^te+\sum_{i=1}^n\left\|x_k\right\|^2\)component
要使\(-\sum_{i=1}^ne^tx_kx_k^te+\sum_{i=1}^n\left\|x_k\right\|^2\)最小,因爲\(\sum_{i=1}^n\left\|x_k\right\|^2\)不包含e,由於轉換爲求\(\sum_{i=1}^ne^tx_kx_k^te\)的最大值,同時記\(S=\sum_{i=1}^nx_kx_k^t\),實際上,S是協方差X的協方差矩陣,問題可轉化爲blog
對於上述優化問題,能夠用拉格朗日乘子法求解:\(u=e^tSe-\lambda(e^te-1),\frac{\partial u}{\partial e} = 2Se-2\lambda e=0\),解得:\(Se = \lambda e\)排序
能夠看出,知足條件的投影方向e(k個)是協方差矩陣S的前k大特徵值對應的特徵向量,所以PCA轉化爲求數據X的協方差矩陣的特徵值,將特徵值降序排序,對應的特徵向量構成的矩陣就是所求的旋轉矩陣ip
就是通常的矩陣求特徵值和特徵向量的問題,此處不作詳細介紹,須要注意的是,是對數據X的協方差矩陣\(X^TX\)求特徵值和特徵向量,前k個特徵向量構成的矩陣P(此處默認P已經按照特徵值的大小順序進行排列,維度爲n*k),那麼新數據\(newX = X*P\),則newX由X的\(m*n\)變成\(m*k(k<n)\),此時數據已經下降維度了。ci
對於任意的矩陣\(A\in\mathbb{R}^{m*n}\),均可以將A分解成三個矩陣:數學
而且U和V是正交陣,\(\sum\)是對角陣,即class
本質上來講,奇異值分解是一個線性變換,對矩陣A進行奇異值分解能夠當作是用一組正交基先進行旋轉\((V^T e)\),再進行座標縮放\((\sum V^T e)\),最後再進行座標旋轉\((U\sum V^T e)\),通過這三步操做,正交基能夠變換成A,下面是一個簡單的例子,用MATLAB能夠對任意矩陣進行奇異值分解,而且輸出三個矩陣。
(如下因爲編輯問題,會出現幾個\(\sum^T\)的T出如今\(\sum\)上面)
對於任意的矩陣都能進行因子分解,這顯然是SVD最大的好處,但關鍵是如何求解三個因子矩陣呢?
已知\(A=U\sum V^T\),則有
又由於U是正交陣,所以有
左右各乘以\(U^{-1}\),能夠獲得
也就是U是矩陣\(AA^T\)的特徵向量,\((\sum\sum^T)\)是特徵值。
與求解U相似,經過\(AA^T\)來求解,最終能夠獲得
也就是V是矩陣\(A^TA\)的特徵向量,\((\sum^T\sum)\)是特徵值
\(\sum\)裏的元素成爲奇異值,從3.3.1和3.3.2能夠看出,對角矩陣\(\sum\)的奇異值是\(AA^T\)和\(A^TA\)的特徵值的平方根,而且奇異值必定不小於0.如下是簡單的證實:
令\(\lambda\)是\(A^TA\)的一個特徵值,x是對應的特徵向量,則
而奇異值\(\sigma\)是\(\lambda\)的平方根,所以也大於等於0.
PCA的目標是求協方差矩陣\(X^TX\)的特徵向量和特徵值,而協方差矩陣的特徵向量就是矩陣X奇異值分解後的右奇異向量V,用下圖來講明PCA與SVD的關係
所以,通過PCA處理獲得的新數據,其實就是對數據X作奇異值分解,而後乘上右奇異矩陣,或者左奇異矩陣乘上對角矩陣!
PCA是一種降維技術,主要用在特徵提取。對於PCA,有兩種方式:直接對數據的協方差矩陣進行特徵向量的求解;對數據進行奇異值分解。實際上,後者會更優於前者。由於求解協方差矩陣的特徵值以及特徵向量時,有時會出現特徵值爲虛數,那麼這時候算法會失效,而SVD求解出來的奇異值必定是非負數。除此以外,其實能夠把PCA看作是對SVD的一種包裝,若是實現了SVD,那麼PCA也就實現了,並且更好的是,用SVD能夠獲得兩個方向的PCA,而直接分解協方差矩陣,只能獲得一個方向的PCA。