1. 程式人生 > >基於svd(奇異值分解)主成成分分析

基於svd(奇異值分解)主成成分分析

原文地址https://blog.csdn.net/u013737526/article/details/73175982

本文僅截取了一部分


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。