本文約6000字,建議閱讀10 分鐘
本文帶你了解PCA的基本數學原理及工作原理。
概述
主成分分析PCA(Principal Component Analysis)是一種常用的數據分析方法。PCA通過線性變換将原始數據變換為一組各維度線性無關的表示,可用于提取數據的主要特征分量,常用于高維數據的降維。
本文用直觀和易懂的方式叙述PCA的基本數學原理,不會引入嚴格的數學推導。希望讀者在看完這篇文章後能更好地明白PCA的工作原理。
一、降維概述
1.1 數組和序列(Series)的維度
對于數組和序列(Series)來說,維度就是shape()函數返回的結果,shape()函數中返回了幾個數字,就是幾維(也有人看array()開頭或者結尾連續中括号的數量)。
不分行列的數組叫一維數組,此時shape返回單一的維度上的數據個數。有行列之分的數組叫二維數組,也稱為表。一張表最多有二個維度,複數的表構成了更高維度的表。當一個數組中存在2張3行4列的表時,shape返回的是更高維度的行和列。當數組中存在2組2張3行4列的表時,數據就是4維,shape返回(2,2,3,4)。
數組中的每一張表,都可以是一個特征矩陣或一個DataFrame,這些結構永遠隻有一張表,所以一定有行列,其中行是樣本,列是特征。針對每一張表,維度指的是樣本的數量或特征的數量,一般無特别說明,指的都是特征的數量。除了索引之外,一個特征是一維,兩個特征是二維,n個特征是n維。
1.2 圖像中的維度
對圖像來說,維度就是圖像中特征向量的數量。特征向量可以理解為是坐标軸,一個特征向量定義一條直線,是一維;兩個相互垂直的特征向量定義一個平面,即一個直角坐标系,就是二維;三個相互垂直的特征向量定義一個空間,即一個立體直角坐标系,就是三維;三個以上的特征向量相互垂直,定義人眼無法看見,也無法想象的高維空間。
1.3 降維解釋
降維算法中的“降維”,指的是降低特征矩陣中特征的數量。降維的目的是為了讓算法運算更快,效果更好,但其實還有另一種需求:數據可視化。圖像和特征矩陣的維度是可以相互對應的,即一個特征對應一個特征向量,對應一條坐标軸。所以,三維及以下的特征矩陣,是可以被可視化的,這可以幫助我們很快地理解數據的分布,而三維以上特征矩陣的則不能被可視化,數據的性質也就比較難理解。
二、PCA概述
2.1 PCA入門
PCA(Principal Component Analysis)是一種常用的數據分析方法。PCA通過線性變換将原始數據變換為一組各維度線性無關的表示,可用于提取數據的主要特征分量,常用于高維數據的降維。
本節希望用直觀和易懂的方式叙述PCA的基本數學原理,不引入嚴格的數學推導。希望讀者在看完這篇文章後能更好地明白PCA的工作原理。
在降維過程中,會減少特征的數量,這意味着删除數據,數據量變少則模型可以獲取的信息量會變少,模型的表現可能會因此受影響。同時,在高維數據中,必然有一些特征是不帶有有效的信息的(比如噪音),或者有一些特征帶有的信息和其他一些特征是重複的(比如一些特征可能會線性相關)。希望能夠找出一種辦法來幫助我們衡量特征上所帶的信息量,在降維的過程中,生成既可以減少特征的數量,又保留大部分有效信息(将那些帶有重複信息的特征合并,并删除那些帶無效信息的特征等等)的新特征矩陣。
在特征選擇方法中有一種方法是方差過濾,即如果一個特征的方差很小,則意味着這個特征上很可能有大量取值都相同,那這一個特征的取值對樣本而言就沒有意義(即不帶有效信息)。從方差的這種應用可以推斷出,如果一個特征的方差很大,則說明這個特征上帶有大量的信息。因此,在降維中,PCA使用的信息量衡量指标就是樣本方差,方差越大,特征所帶的信息量越多。
Var代表一個特征的方差,n代表樣本量,xi代表一個特征中的每個樣本取值,代表這一列樣本的均值。(方差計算公式中除的是n-1,是為了得到樣本方差的無偏估計)
2.2 PCA降維過程
圖1的示例中解釋了主成分工作方法,其中實際數據顯示在2D空間中,其中X軸和Y軸用于繪制數據。
圖1 主成分分析的工作方法
圖2說明了在拟合主組件後的外觀。第一個主成分包含數據中的最大方差,第二個主成分正交于第一個主成分,因為我們知道所有的主成分都是互相正交的。我們可以用第一個主成分本身來表示整個數據。實際上,這便是用更少的維數表示數據的優勢所在,可以節省空間,也可以獲取數據中的最大方差,用于下一階段的監督學習。這是計算主成分的核心優勢。
圖2 拟合主組件後的外觀
為了方便可視化和理解,先來看一組簡單的二維數據降維過程。
圖3 二維數據降維過程
假設現在有一組簡單的數據,有特征x1和x2,三個樣本數據的坐标點分别為(1,1),(2,2),(3,3)。我們可以讓x1和 x2分别作為兩個特征向量,很輕松地用一個二維平面來描述這組數據。這組數據現在每個特征的均值都為2,方差則等于:
每個特征的數據一模一樣,因此方差也都為1,數據的方差總和是2。現在我們的目标是:隻用一個特征向量來描述這組數據,即将二維數據降為一維數據,并且盡可能地保留信息量,即讓數據的總方差盡量靠近2。
于是,我們将原本的直角坐标系逆時針旋轉45°,形成了新的特征向量x1*和x2*組成的新平面,在這個新平面中,三個樣本數據的坐标點可以表示為(√2,0),(2√2,0),(3√2,0)。可以注意到,x2*上的數值此時都變成0,x2*的均值為0,x2*的方差也為0,因此x2*明顯不帶有任何有效信息。此時,x1*特征上的數據均值是2√2,而方差則可表示成:
此時,根據信息含量的排序,取信息含量最大的一個特征,因為我們想要的是一維數據,所以可以将x2*删除,同時也删除圖中的x2*特征向量,剩下的x1*就代表了曾經需要兩個特征來代表的三個樣本點。通過旋轉原有特征向量組成的坐标軸來找到新特征向量和新坐标平面,将三個樣本點的信息壓縮到了一條直線上,實現了二維變一維,并且盡量保留原始數據的信息。一個成功的降維,就實現了。
接下來,可以推廣n維特征矩陣的降維步驟和方法:
第一步:輸入原數據,結構為(m,n),找出原本的n個特征向量構成的n維空間V;
第二步:決定降維後的特征數量:k;
第三步:通過某種變化,找出n個新的特征向量,以及他們構成的新n維空間V*;
第四步:将原始數據映射到新的空間V*中;
第五步:選取前k個信息量最大的特征,删除沒有被選中的特征,将n維空間降為k維。
在第三步中,我們用來找出n個新特征向量,讓數據能夠被壓縮到少數特征上并且總信息量不損失太多的過程就是矩陣分解。PCA使用方差作為信息量的衡量指标,并且特征值分解來找出空間V。降維時,它會通過一系列數學推導(比如說,産生協方差矩陣)将特征矩陣X分解為以下三個矩陣,其中Q和Q-1是正交矩陣,P是一個對角矩陣(除了對角線上有值其他位置都是0的矩陣),其對角線上的元素就是方差。降維完成之後,PCA找到的每個新特征向量就叫做“主成分”,而被丢棄的特征向量被認為信息量很少,這些信息很可能就是噪音(降維算法的矩陣計算量比較大,運行比較緩慢)。
特别注意:
我們知道,PCA是将已存在的特征進行壓縮,降維完畢後的特征不是原本的特征矩陣中的任何一個特征,而是通過某些方式組合起來的新特征。通常來說,在新的特征矩陣生成之前,我們無法知曉PCA都建立了怎樣的新特征向量,新特征矩陣生成之後也不具有可解釋性。新特征雖然帶有原始數據的信息,卻已經不是原數據上代表着的含義了。因此,以PCA為代表的降維算法是一種特征創造的方法。
所以,PCA一般不适用于探索特征和标簽之間的關系的模型(如線性回歸等),因為無法解釋的新特征和标簽之間的關系不具有意義。在線性回歸模型中,一般使用特征選擇。
2.3 PCA算法數學步驟
基于上述的總體理論講述,接下來具體闡述“數學推導”中的算法步驟和過程。
設有m條n維數據:
1)将原始數據按列組成n行m列矩陣
;
2)将
的每一行(代表一個屬性字段)進行零均值化,即減去這一行的均值得到新的矩陣X;
3)求出協方差矩陣
;
4)求出協方差矩陣的特征值及對應的特征向量;
5)将特征向量按對應特征值大小從上到下按行排列成矩陣,取前k行組成矩陣Q;
6)Y = QK即為降維到k維後的數據。
(這裡的核心問題是協方差矩陣的特征值分解)
例題:已知現在有一個二維矩陣,如下所示,請降至一維。
解:
1)原始數據是兩行五列矩陣,其中n=2,m=5;
2)這是一個已經去掉均值的矩陣。其中每一行是一個維度,而每一列是一個樣本。去均值的運算是針對每一個維度進行的運算,也就是說每一行減去這一行的均值;
3)計算協方差矩陣P。
由于已經進行了去均值化,所以可以直接求取協方差矩陣。需要注意的是,協方差矩陣計算的是每一個維度之間的協方差,不是計算樣本之間的協方差,所以本例中的協方差矩陣P為一個2×2的實對稱矩陣。
(把C換成P)
4)協方差矩陣的特征值及對應的特征向量;
通過求解方程:
可以得到兩個特征值,對應得到标準化的特征向量如下:
5)構建變換矩陣Q并降維;
到這裡隻需要将變換矩陣與原始矩陣相乘既可以完成降維的工作,在進行降維的過程中有兩個容易出現的易錯點。首先,特征向量的先後順序要按照特征值的大小順序進行排列;其次,如果原始數據的矩陣每一行是一個維度,每一列是一個樣本的話,這個時候變換矩陣中的每一行是一個特征向量,如下變換矩陣Q。
(P換成Q)
同時,我們可以驗證協方差矩陣P(實對稱矩陣)的對角化。
6)最後用Q的第一行乘以X矩陣,就得到了降維後的表示:
降維投影結果如下圖所示:
圖4 降維投影結果
2.4 選擇主成分個數(即k的值)
那麼該如何選擇k,即保留多少個PCA主成分呢?在上述簡單的二維實驗中,保留第一個成分看起來是自然的選擇。對于高維度數據來說,k值的确定就比較複雜:如果k的值過大,數據壓縮率不高,在極限情況 k = n 時,等于是在使用原始數據;相反地,如果k過小,那數據的近似誤差太大。
決定k值時,通常會考慮不同k值可保留的方差百分比。具體來說,如果 k = n 時,那麼得到的結果是對數據的完美近似,也就是保留了100%的方差,即原始數據的所有變化都被保留下來;相反,如果 k = 0 時,那等于是使用零向量來逼近輸入數據,也就是隻有0%的方差被保留下來。
一般而言,設c1,c2,…,cn表示協方差矩陣P的特征值(按由大到小順序排列),使得cj為對應于特征向量的特征值。那麼,如果我們保留前k個成分,則保留的方差百分比可以表示為:
2.5 sklearn中參數的解釋
(1)n_components
在sklearn中,重要參數n_components是降維後的維度,即降維後需要保留的特征數量,降維流程中第二步裡需要确認的k值,當參數n_components中不填寫任何值,則默認返回min(X.shape)個特征,沒有減少特征的個數。一般來說,不會使用這種輸入方式。但卻可以使用這種輸入方式來畫出累計可解釋方差貢獻率曲線,以此選擇最好的n_components的取值。
累積可解釋方差貢獻率曲線是一條以降維後保留的特征個數為橫坐标,降維後新特征矩陣捕捉到的可解釋方差貢獻率為縱坐标的曲線,能夠幫助我們決定n_components最好的取值。
即
表示降維後每個新特征向量上所帶的信息量大小(又叫可解釋性方差,sklearn中用屬性explained_variance_表示),
表示特征向量所占的信息量占原始數據總信息量的百分比(又叫可解釋方差貢獻率,sklearn中用屬性explained_variance_ratio_表示)。
除了輸入整數,n_components還有哪些選擇呢?數學大神Minka, T.P.找出了讓PCA用最大似然估計自選超參數的方法,輸入n_components=‘mle’作為n_components的參數輸入,就可以調用這種方法。
輸入[0,1]之間的浮點數,并且讓參數svd_solver =‘full’,表示希望降維後的總解釋性方差占比大于n_components指定的百分比,即是說,希望保留百分之多少的信息量。比如說,如果我們希望保留97%的信息量,就可以輸入n_components=0.98,PCA會自動選出能夠讓保留的信息量超過97%的特征數量。
(2)重要參數SVD_solver
在解釋svd_solver參數之前,我們首先來闡述一下SVD算法,SVD和主成分分析PCA都屬于矩陣分解算法的一部分,都是通過分解特征矩陣來進行降維。
SVD奇異值分解 |
若A是一個m*n的矩陣,且
可用等式
進行表示,則該過程被稱之為奇異值分解SVD。
中第i列的向量被稱為關于的左奇異向量,
中第i列的向量被稱為關于
的右奇異向量。 |
由上述分析可知,PCA的核心問題是協方差矩陣
的特征值分解,SVD的核心問題在于對
進行特征值分解。很明顯,PCA和SVD所解決的問題非常相似,都是對一個實對稱矩陣進行特征值分解。(實對稱矩陣:如果有n階矩陣A,其矩陣的元素都為實數,且矩陣A的轉置等于其本身(
,i和j為元素的腳标),則稱A為實對稱矩陣,實對稱矩陣一定可以對角化)
講完SVD算法,就有一個疑問了,參數svd_solver是奇異值分解器的意思,為什麼PCA算法會有有關奇異值分解的參數?
我們之前曾經提到過,PCA和SVD涉及了大量的矩陣計算,兩者都是運算量很大的模型,但其實SVD算法可以不計算協方差矩陣等複雜過程,直接求出新特征空間和降維後的特征矩陣。
簡而言之,SVD在矩陣分解中的過程比PCA簡單快速,雖然兩個算法都走一樣的分解流程,但SVD可以直接算出
。但是SVD的信息量衡量指标比較複雜,“奇異值”理解起來也比“方差”來得困難。因此,sklearn将降維流程拆成了兩部分:一部分是計算特征空間
,由SVD完成,而矩陣U和Σ雖然會被計算出來,但完全不會被用到。另一部分是映射數據和求解新特征矩陣,由PCA完成,即之前PCA中Y = QX 的Q用
來代替,實現了用SVD的性質減少計算量而信息量的評估指标是方差的目的。具體流程如下圖:
圖5 SVD矩陣分解流程
接下來,我們回歸參數svd_solver的講解。
參數svd_solver是在降維過程中,用來控制矩陣分解的一些細節的參數。有四種模式可選:"auto", "full", "arpack","randomized",默認”auto"。
auto |
基于X.shape和n_components的默認策略來選擇分解器:如果輸入數據的尺寸大于500x500且要提取的特征數小于數據最小維度min(X.shape)的80%,就啟用效率更高的randomized方法。否則,啟用full方法精确完整的SVD将被計算,arpack截斷将會在矩陣被分解完成後有選擇地随機發生。 |
full |
生成精确完整的SVD,适合數據量比較适中,計算時間充足的情況,生成的精确完整的SVD的結構為:
|
arpack |
運行截斷奇異值分解,分解時就将特征數量降到n_components中輸入的數值k,可以加快運算速度,适合特征矩陣很大的時候,但一般用于特征矩陣為稀疏矩陣的情況,此過程包含一定的随機性質。截斷後的SVD分解出的結構為:
|
randomized |
适合特征矩陣巨大,計算量十分龐大的情況,要比“full”方法計算快很多。 |
(3)重要屬性components_
通過SVD和PCA的合作,在矩陣分解時不使用PCA本身的特征值分解,而使用奇異值分解來減少計算量。sklearn實現了一種計算更快更簡單,效果卻很好的“合作降維“。在sklearn中,矩陣U和Σ雖然會被計算出來(同樣也是一種比起PCA來說簡化非常多的數學過程,不産生協方差矩陣),但完全不會被用到,也無法調取查看或者使用,因此我們可以認為,U和Σ在fit()之後就被遺棄了。奇異值分解追求的僅僅是
,隻要有了
,就可以計算出降維後的特征矩陣。在transform()過程之後,fit()中奇異值分解的結果
就并會被保存在屬性components_當中,并可以調用查看。
結論
PCA是将已存在的特征進行壓縮,降維完畢後的特征不是原本的特征矩陣中的任何一個特征,而是通過某些方式組合起來的新特征。在新的特征矩陣生成之前,無法知曉PCA都建立了怎樣的新特征向量,新特征矩陣生成之後也不具有可解釋性。新特征雖然帶有原始數據的信息,卻已經不是原數據上代表着的含義了。因此,以PCA為代表的降維算法是一種特征創造的方法。
PCA一般不适用于探索特征和标簽之間的關系的模型(如線性回歸等),因為無法解釋的新特征和标簽之間的關系不具有意義。在線性回歸模型中,一般使用特征選擇。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!