主成分分析(PCA)與SVD奇異值分解


 


先說下PCA的主要步驟:
假設原始數據是10(行,樣例數,y1-y10)*10(列,特征數x1-x10)的(10個樣例,每樣例對應10個特征)
(1)、分別求各特征(列)的均值並對應減去所求均值。
(2)、求特征協方差矩陣。
對角線上是方差,非對角線是協方差;協方差為0時兩者獨立,其絕對值越大,兩者對彼此的影響越大。
(3)、求協方差陣的特征值和特征向量。
(4)、將特征值按照從大到小排序,選擇其中最大的k個。將其對應的k個特征向量分別作為列向量組成特征向量矩陣。
(5)、將樣本點投影到選取的k個特征向量上。這里需要捋一捋,若原始數據中樣例數為m,特征數為n,減去均值后的樣本矩陣仍為MatrixDATA(m,n); 協方差矩陣是C(n,n);特征向量矩陣為EigenMatrix(n,k); 投影可得: FinalDATA(m,k)=MatrixDATA(m,n) * EigenMatrix(n,k) 。
這樣,原始數據就由原來的n維特征變成了k維,而k維數據是原數據的線性組合。
作者:Hana
鏈接:https://www.zhihu.com/question/38417101/answer/94338598
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

下面需要把特征協方差陣和投影單獨拎出來說一下:
1、為什么求特征協方差的特征向量就是最理想的k維向量?
2、投影的過程意義在於?

【對於第一點】 可以通過最大方差理論解釋。處理信號時,信噪比定義為10倍lg信號與噪聲功率之比,這個用非周期的數字信號平均功率來解釋比較直觀(模擬信號只要做積分即可),在觀測時間序列有N個時間點,將每個時間點的幅值的平方作和,再將總和除以點數N,信噪比其實就是信號與噪聲的方差比。而一般認為,信號具有較大的方差(包含信息),噪聲具有較小的方差。所以我們認為的最好的k個特征應該盡可能的包含有用信號,亦即信號損失盡可能小。故在將n維特征轉換為k維后,取的是前k個較大方差的特征方向。下面 我們來看一下投影的詳細過程(圖片引自JerryLead blog)
u是直線的斜率也是直線的方向向量,而且是單位向量。樣本點x在u上的投影點距離遠點的距離是兩向量內積,

這里u為單位向量,故內積即為投影的長度。
考慮m個樣本點都做u上的投影,故樣本在u上投影后的點的方差(只考慮u方向,參照原點)可以計算如下:

前面樣本點經過預處理,每一維特征均值為0,故投影到u上的樣本點(只有一個到原點的距離值)的均值仍然是0。方差計算如下



u為單位向量,中間部分
其實相當於樣本的特征協方差矩陣,這里我要詳細的解釋一下為什么。

還記得樣本的特征協方差矩陣嗎?特征協方差矩陣中非對角線元素的求法為cov(x1,x2) = E{[(x1-E(x1)][x2-E(x2)]},也就是兩個特征所對應的樣本值序列分別減去各自均值后的乘積的均值(因為是無偏估計,這里計算均值是除以m-1而非m)。
理一理我們手頭上的數據: m個樣例; n個特征

在求特征協方差矩陣時的x1,x2,....xn是對應的特征列。是Data中的列,這里不要和行

搞混淆哦,如果我們要求特征x1的方差D(x1)=\frac{1}{m} \sum_{i=1}^{m}{x_{1}^{(i)}  } {x_{1}^{(i)}  }; 特征x1,x2的協方差Cov(x1,x2)=\frac{1}{m} \sum_{i=1}^{m}{x_{1}^{(i)} } {x_{2}^{(i)} } 。其余以此類推。再看 注意這里最為重要,需要理解。 公式中是列向量與行向量的乘積(結果是一個矩陣),對m個矩陣做\sum_{}^{}{} 結果是一個矩陣。我們不妨試着將這個矩陣乘開看一看是什么鬼。

我們再來看下面的推導:

\lambda 表示\frac{1}{m}  \sum_{i=1}^{m}{\left( x^{(i)T}u  \right)^{2}  },\Sigma 表示\frac{1}{m} \sum_{i=1}^{m}{x^{(i)} } {x^{(i)T} } .那么式子\frac{1}{m}  \sum_{i=1}^{m}{\left( x^{(i)T}u  \right)^{2}  }=u^{T} \left( \frac{1}{m} \sum_{i=1}^{m}{x^{(i)} } {x^{(i)T} }  \right) u就可以寫成: \lambda =u^{T} \Sigma u

u是單位向量,u^{T} u=1,對 \lambda =u^{T} \Sigma u式兩邊左乘u有,u\lambda =\lambda u=uu^{T} \Sigma u=\Sigma u也就是

\lambda u=\Sigma u\Sigma 是我們的特征協方差矩陣,故\lambda 也就是該矩陣的特征值u就是特征向量。故\frac{1}{m}  \sum_{i=1}^{m}{\left( x^{(i)T}u  \right)^{2}  }=u^{T} \left( \frac{1}{m} \sum_{i=1}^{m}{x^{(i)} } {x^{(i)T} }  \right) u的最大值就是 u^{T} \Sigma u的最大值,也就是\lambda 的最大值。

PCA最終保留的前k個特征值就是對應的前k大的方差的特征方向。

【對於第二點】 可以看到投影過程為: FinalDATA(m,k)=MatrixDATA(m,n) * EigenMatrix(n,k)

試思考:1,矩陣右乘列向量-- 得到新的列向量為矩陣各列的線性組合
2,矩陣A右乘矩陣B(k列)-- 得到新的矩陣,該矩陣每一列均為A矩陣各列做k次不同的線性組合的結果。這也就是樓上說的新的特征(k列)是原特征(n列)線性組合的結果。如果非要看新的k維是原來的特征如何得到的,可以把特征協方差矩陣的特征向量求取出來,對應看出如何做的線性組合。
關於線性組合與投影:為什么投影可以用線性組合或者說是矩陣相乘來實現呢?
這里涉及坐標空間的變換,把數據從原空間投影到選擇的k維特征空間中。這里解釋起來比較多,姑且就理解為一種線性映射吧,有時間再來補充。實際上k<n故
把數據從原空間投影到選擇的k維特征空間中會損失掉一部分的信息(后n-k個特征向量對應的信息),這也是主成分分析降維的結果。
 
 

奇異值與主成分分析(PCA):

主成分分析在上一節里面也講了一些,這里主要談談如何用SVD去解PCA的問題。PCA的問題其實是一個基的變換,使得變換后的數據有着最大的方差。方差的大小描述的是一個變量的信息量,我們在講一個東西的穩定性的時候,往往說要減小方差,如果一個模型的方差很大,那就說明模型不穩定了。但是對於我們用於機器學習的數據(主要是訓練數據),方差大才有意義,不然輸入的數據都是同一個點,那方差就為0了,這樣輸入的多個數據就等同於一個數據了。以下面這張圖為例子:

這個假設是一個攝像機采集一個物體運動得到的圖片,上面的點表示物體運動的位置,假如我們想要用一條直線去擬合這些點,那我們會選擇什么方向的線呢?當然是圖上標有signal的那條線。如果我們把這些點單純的投影到x軸或者y軸上,最后在x軸與y軸上得到的方差是相似的(因為這些點的趨勢是在45度左右的方向,所以投影到x軸或者y軸上都是類似的),如果我們使用原來的xy坐標系去看這些點,容易看不出來這些點真正的方向是什么。但是如果我們進行坐標系的變化,橫軸變成了signal的方向,縱軸變成了noise的方向,則就很容易發現什么方向的方差大,什么方向的方差小了。

一般來說,方差大的方向是信號的方向,方差小的方向是噪聲的方向,我們在數據挖掘中或者數字信號處理中,往往要提高信號與噪聲的比例,也就是信噪比。對上圖來說,如果我們只保留signal方向的數據,也可以對原數據進行不錯的近似了。

PCA的全部工作簡單點說,就是對原始的空間中順序地找一組相互正交的坐標軸,第一個軸是使得方差最大的,第二個軸是在與第一個軸正交的平面中使得方差最大的,第三個軸是在與第1、2個軸正交的平面中方差最大的,這樣假設在N維空間中,我們可以找到N個這樣的坐標軸,我們取前r個去近似這個空間,這樣就從一個N維的空間壓縮到r維的空間了,但是我們選擇的r個坐標軸能夠使得空間的壓縮使得數據的損失最小。

還是假設我們矩陣每一行表示一個樣本,每一列表示一個feature,用矩陣的語言來表示,將一個m * n的矩陣A的進行坐標軸的變化,P就是一個變換的矩陣從一個N維的空間變換到另一個N維的空間,在空間中就會進行一些類似於旋轉、拉伸的變化。

而將一個m * n的矩陣A變換成一個m * r的矩陣,這樣就會使得本來有n個feature的,變成了有r個feature了(r < n),這r個其實就是對n個feature的一種提煉,我們就把這個稱為feature的壓縮。用數學語言表示就是:

但是這個怎么和SVD扯上關系呢?之前談到,SVD得出的奇異向量也是從奇異值由大到小排列的,按PCA的觀點來看,就是方差最大的坐標軸就是第一個奇異向量,方差次大的坐標軸就是第二個奇異向量…我們回憶一下之前得到的SVD式子:

在矩陣的兩邊同時乘上一個矩陣V,由於V是一個正交的矩陣,所以V轉置乘以V得到單位陣I,所以可以化成后面的式子

將后面的式子與A * P那個m * n的矩陣變換為m * r的矩陣的式子對照看看,在這里,其實V就是P,也就是一個變化的向量。這里是將一個m * n 的矩陣壓縮到一個m * r的矩陣,也就是對列進行壓縮,如果我們想對行進行壓縮(在PCA的觀點下,對行進行壓縮可以理解為,將一些相似的sample合並在一起,或者將一些沒有太大價值的sample去掉)怎么辦呢?同樣我們寫出一個通用的行壓縮例子:

這樣就從一個m行的矩陣壓縮到一個r行的矩陣了,對SVD來說也是一樣的,我們對SVD分解的式子兩邊乘以U的轉置U’

這樣我們就得到了對行進行壓縮的式子。可以看出,其實PCA幾乎可以說是對SVD的一個包裝,如果我們實現了SVD,那也就實現了PCA了,而且更好的地方是,有了SVD,我們就可以得到兩個方向的PCA,如果我們對A’A進行特征值的分解,只能得到一個方向的PCA。

 


免責聲明!

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



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