PCA主成分分析理解


一、理論概述

1)問題引出

先看如下幾張圖:

  從上述圖中可以看出,如果將3個圖的數據點投影到x1軸上,圖1的數據離散度最高,圖3其次,圖2最小。數據離散性越大,代表數據在所投影的維度上具有越高的區分度,這個區分度就是信息量。如果我們用方差來形容數據的離散性的話,就是數據方差越大,表示數據的區分度越高,也就是蘊含的信息量是越大的。

  基於這個知識,如果對數據進行降維的話,圖1投影到x1軸上面,數據的離散度最大;圖2投影到x2軸上離散度最大,圖3呢?圖3需要找到一個新的坐標軸,使其投影到上面的數據方差最大,如下圖所示:

從上面圖中可以看出,在新的坐標軸上進行投影的話,圖3可以選擇一個離散度最大的軸進行投影,在盡量保留最多信息量的情況下,進行了數據降維。

 

如何找到這樣的坐標軸呢?

經過數學上的推導的可以知道,特征值對應的特征向量就是理想中想取得正確的坐標軸,而特征值就等於數據在旋轉之后的坐標上對應維度上的方差。也就是說,直接求出矩陣A的特征值及其對應的特征向量,就能找到旋轉后正確的坐標軸。例如取前k個最大特征值對應的特征向量作為新軸的話,就是將數據降維到k維空間,特征值描述對應特征向量方向上包含的信息量,前k個特征值之和除以總的特征值之和,就是降維后保留原信息的比例。

 

補充知識:何為一個向量在另外一個向量上的投影?

如上圖所示,u向量在v向量上的投影就是從u向量向v向量方向上做垂線,其長度就是原點到垂點的距離,方向與v向量方向一致,公式表示如下:

從公式上看,其投影后的長度就等於u的長度乘以cosθ,也就是原點到垂點的距離,向量表示就是v所示方向上的單位向量乘以投影后的長度即可。

2)PCA思想

PCA的主要思想是將n維特征映射到k維上,這k維是全新的正交特征也被稱為主成分,是在原有n維特征的基礎上重新構造出來的k維特征。PCA的工作就是從原始的空間中順序地找一組相互正交的坐標軸,新的坐標軸的選擇與數據本身是密切相關的。其中,第一個新坐標軸選擇是原始數據中方差最大的方向,第二個新坐標軸選取是與第一個坐標軸正交的平面中使得方差最大的,第三個軸是與第1,2個軸正交的平面中方差最大的。依次類推,可以得到n個這樣的坐標軸。通過這種方式獲得的新的坐標軸,我們發現,大部分方差都包含在前面k個坐標軸中,后面的坐標軸所含的方差幾乎為0。於是,我們可以忽略余下的坐標軸,只保留前面k個含有絕大部分方差的坐標軸。事實上,這相當於只保留包含絕大部分方差的維度特征,而忽略包含方差幾乎為0的特征維度,實現對數據特征的降維處理。

 

如何得到這些包含最大差異性的主成分方向呢?

通過計算數據矩陣的協方差矩陣,然后得到協方差矩陣的特征值與特征向量,選擇特征值最大(即方差最大)的k個特征所對應的特征向量組成的矩陣。這樣就可以將數據矩陣轉換到新的空間當中,實現數據特征的降維。

如上圖所示,二維空間中最多可以找到兩個特征值與特征向量,注意這里面的特征向量的維度依然跟原數據空間一致,因為還是原數據空間的向量。如果原數據是3維的,則特征向量還是3維的,但是可以找到兩個最大的特征值及其對應的特征向量,然后原數據就可以在這兩個特征向量所表示的空間上進行映射了,從而將原數據由3維降到2維。

 

如何得到協方差矩陣的特征值特征向量?

PCA算法有兩種實現方法:基於特征值分解協方差矩陣實現PCA算法、基於SVD分解協方差矩陣實現PCA算法

 

二、特征值分解矩陣

 

對於矩陣A,有一組特征向量v,將這組向量進行正交化單位化,就能得到一組正交單位向量。特征值分解,就是將矩陣A分解為如下式:

 

 

其中,Q是矩陣A的特征向量組成的矩陣,\Sigma則是一個對角陣,對角線上的元素就是特征值,里面的特征值是由大到小排列的,這些特征值所對應的特征向量就是描述這個矩陣變換方向(從主要的變化到次要的變化排列)。

具體步驟如下:

輸入:數據集X={x1,x2,x3...,xn},需要降到k維。
1) 去平均值(即去中心化),即每一位特征減去各自的平均值。、

2) 計算協方差矩陣,最后協方差矩陣可以處以樣本數。

3) 用特征值分解方法求協方差矩陣的特征值與特征向量。

4) 對特征值從大到小排序,選擇其中最大的k個。然后將其對應的k個特征向量分別作為行向量組成特征向量矩陣P。

5) 將數據轉換到k個特征向量構建的新空間中,即Y=PX


舉例如下:

總結:特征值分解可以得到特征值與特征向量,特征值表示的是這個特征到底有多么重要,而特征向量表示這個特征是什么。不過,特征值分解也有很多的局限,比如說變換的矩陣必須是方陣。

 

三、SVD(Singular Value Decomposition)分解,也叫奇異值分解

利用特征值分解提取特征矩陣是一個容易理解且便於實現的方法。但是為什么還存在奇異值分解呢?特征值分解最大的問題是只能針對方陣,即n*n的矩陣。而在實際的應用中,我們分解的大部分都不是方陣。奇異值分解是一個能適用於任意矩陣的一種分解的方法,對於任意矩陣A總是存在一個奇異值分解:

A是m*n的矩陣。

U是m*m的正交矩陣,U里面的正交向量被稱為左奇異向量。

Σ是m*n的對角陣,對角線以外的元素都為0,對角線上的元素稱為奇異值,奇異值一般從大到小排列。

VT是n*n的正交矩陣,它是V的轉置矩陣,它里面的正交向量被稱為右奇異值向量。

 

如何求解左奇異向量、右奇異向量、奇異值呢?

由上面的奇異值分解等式,我們是不知道如何拆分矩陣A的。我們可以把奇異值和特征值聯系起來。

首先,我們用矩陣A的轉置乘以A,得到一個方陣,用這樣的方陣進行特征分解,得到的特征值和特征向量滿足下面的等式:

  

這里的vi就是我們要求的右奇異向量。

其次,我們將A和A的轉置做矩陣的乘法,得到一個方陣,用這樣的方陣進行特征分解,得到的特征和特征向量滿足下面的等式:

 

這里的ui就是左奇異向量。

 

證明如下

∵  A=UΣVT          AT=VΣTUT

∴ ATA=VΣTUTUΣVT=VΣTΣVT=VΣ2VT 

因為V是正交矩陣,所以VT=V-1,參考上面(二)特征值分解的公式可知,V就是ATA的特征向量,奇異值的平方就等於ATA的特征值 

 

SVD分解后維度似乎並沒有減少,如何應用呢?

在奇異值分解矩陣中Σ里面的奇異值按從大到小的順序排列,奇異值從大到小的順序減小的特別快。在很多情況下,前10%甚至1%的奇異值的和就占了全部的奇異值之和的99%以上。也就是說,剩下的90%甚至99%的奇異值幾乎沒有什么作用。因此,我們可以用前面r個大的奇異值來近似描述矩陣,於是奇異值分解公式可以寫成如下

其中r是一個遠遠小於m和n的數,右邊的三個矩陣相乘的結果將會使一個接近A的矩陣。如果r越接近於n,則相乘的結果越接近於A。如果r的取值遠遠小於n,從計算機內存的角度來說,右邊三個矩陣的存儲內存要遠遠小於矩陣A的。所以在奇異值分解中r的取值很重要,就是在計算精度和時間空間之間做選擇。

 

SVD的應用:

1)降維。

 通過奇異值分解的公式,我們可以很容易看出來,原來矩陣A的特征有n維。經過SVD分解后,可以用前r個非零奇異值對應的奇異向量表示矩陣A的主要特征,這樣就把矩陣A進行了降維。

2)壓縮。

通過奇異值分解的公式,我們可以看出來,矩陣A經過SVD分解后,要表示原來的大矩陣A,我們只需要存儲U、Σ、V三個較小的矩陣即可。而這三個較小規模的矩陣占用內存上也是遠遠小於原有矩陣A的,這樣SVD分解就起到了壓縮的作用。

SVD的優點:

1)有些SVD算法可以不先求協方差矩陣,而直接求出右奇異矩陣V,在樣本量很大的情況下非常有效,節省了計算。

2)特征值分解分解方法其實只是用到了SVD中的左奇異矩陣,而沒有用到右奇異矩陣。左奇異矩陣可以多行數進行降維(參考特征值分解的例子),右奇異矩陣可以對列數降維,也就是說SVD既可以對函數降維還可以對列數降維。

 

 

參考文獻:https://blog.csdn.net/program_developer/article/details/80632779


免責聲明!

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



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