主成分分析(PCA)原理詳解

主成分分析(PCA)原理詳解

來自專欄人工智慧9 人贊了文章

目錄:

  1. 相關背景
  2. 數據降維
  3. PCA原理詳解

3.1 PCA的概念

3.2 協方差

3.3 特徵值與特徵向量

3.4 SVD分解原理

3.5 PCA演算法兩種實現方法

(1) 基於特徵值分解協方差矩陣實現PCA演算法

(2) 基於SVD分解協方差矩陣實現PCA演算法

4. PCA實例

5. PCA的理論推導

6. 選擇降維後的維度K(主成分的個數)

1.相關背景

在許多領域的研究與應用中,通常需要對含有多個變數的數據進行觀測,收集大量數據後進行分析尋找規律。多變數大數據集無疑會為研究和應用提供豐富的信息,但是也在一定程度上增加了數據採集的工作量。更重要的是在很多情形下,許多變數之間可能存在相關性,從而增加了問題分析的複雜性。如果分別對每個指標進行分析,分析往往是孤立的,不能完全利用數據中的信息,因此盲目減少指標會損失很多有用的信息,從而產生錯誤的結論。

因此需要找到一種合理的方法,在減少需要分析的指標同時,盡量減少原指標包含信息的損失,以達到對所收集數據進行全面分析的目的。由於各變數之間存在一定的相關關係,因此可以考慮將關係緊密的變數變成儘可能少的新變數,使這些新變數是兩兩不相關的,那麼就可以用較少的綜合指標分別代表存在於各個變數中的各類信息。主成分分析與因子分析就屬於這類降維演算法。

2. 數據降維

降維就是一種對高維度特徵數據預處理方法。降維是將高維度的數據保留下最重要的一些特徵,去除雜訊和不重要的特徵,從而實現提升數據處理速度的目的。在實際的生產和應用中,降維在一定的信息損失範圍內,可以為我們節省大量的時間和成本。降維也成為應用非常廣泛的數據預處理方法。

降維具有如下一些優點:

  • 使得數據集更易使用。
  • 降低演算法的計算開銷。
  • 去除雜訊。
  • 使得結果容易理解。

降維的演算法有很多,比如奇異值分解(SVD)、主成分分析(PCA)、因子分析(FA)、獨立成分分析(ICA)。

3. PCA原理詳解

3.1 PCA的概念

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

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

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

由於得到協方差矩陣的特徵值特徵向量有兩種方法:特徵值分解協方差矩陣、奇異值分解協方差矩陣,所以PCA演算法有兩種實現方法:基於特徵值分解協方差矩陣實現PCA演算法、基於SVD分解協方差矩陣實現PCA演算法。

既然提到協方差矩陣,那麼就簡單介紹一下方差和協方差的關係。然後概括介紹一下特徵值分解矩陣原理、奇異值分解矩陣的原理。概括介紹是因為在我之前的《機器學習中SVD總結》文章中已經詳細介紹了特徵值分解原理和奇異值分解原理,這裡就不再重複講解了。可以看我的

《機器學習中SVD總結》文章。地址:機器學習中SVD總結

3.2 協方差和散度矩陣

樣本均值:

ar{x}=frac{1}{n}sum_{i=1}^{N}{x_{i}}

樣本方差:

S^{2}=frac{1}{n-1}sum_{i=1}^{n}{left( x_{i}-ar{x} 
ight)^2}

樣本X和樣本Y的協方差:

egin{align*} Covleft( X,Y 
ight)&=Eleft[ left( X-Eleft( X 
ight) 
ight)left( Y-Eleft( Y 
ight) 
ight) 
ight] \ &=frac{1}{n-1}sum_{i=1}^{n}{(x_{i}-ar{x})(y_{i}-ar{y})} end{align*}

由上面的公式,我們可以得到以下結論:

(1) 方差的計算公式是針對一維特徵,即針對同一特徵不同樣本的取值來進行計算得到;而協方差則必須要求至少滿足二維特徵;方差是協方差的特殊情況。

(2) 方差和協方差的除數是n-1,這是為了得到方差和協方差的無偏估計。

協方差為正時,說明X和Y是正相關關係;協方差為負時,說明X和Y是負相關關係;協方差為0時,說明X和Y是相互獨立。Cov(X,X)就是X的方差。當樣本是n維數據時,它們的協方差實際上是協方差矩陣(對稱方陣)。例如,對於3維數據(x,y,z),計算它的協方差就是:

Cov(X,Y,Z)=left[ egin{matrix} Cov(x,x) & Cov(x,y)&Cov(x,z) \ Cov(y,x)&Cov(y,y)&Cov(y,z) \ Cov(z,x)&Cov(z,y)&Cov(z,z) end{matrix} 
ight]

散度矩陣定義為:

散度矩陣

對於數據X的散度矩陣為 XX^T 。其實協方差矩陣和散度矩陣關係密切,散度矩陣就是協方差矩陣乘以(總數據量-1)。因此它們的特徵值特徵向量是一樣的。這裡值得注意的是,散度矩陣是SVD奇異值分解的一步,因此PCA和SVD是有很大聯繫。

3.3 特徵值分解矩陣原理

(1) 特徵值與特徵向量

如果一個向量v是矩陣A的特徵向量,將一定可以表示成下面的形式:

Av=lambda v

其中,λ是特徵向量v對應的特徵值,一個矩陣的一組特徵向量是一組正交向量。

(2) 特徵值分解矩陣

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

A=QSigma Q^{-1}

其中,Q是矩陣A的特徵向量組成的矩陣,Sigma則是一個對角陣,對角線上的元素就是特徵值。

具體了解這一部分內容看我的《機器學習中SVD總結》文章。地址:機器學習中SVD總結

3.4 SVD分解矩陣原理

奇異值分解是一個能適用於任意矩陣的一種分解的方法,對於任意矩陣A總是存在一個奇異值分解:

A=USigma V^{T}

假設A是一個m*n的矩陣,那麼得到的U是一個m*m的方陣,U裡面的正交向量被稱為左奇異向量。Σ是一個m*n的矩陣,Σ除了對角線其它元素都為0,對角線上的元素稱為奇異值。 V^{T} 是v的轉置矩陣,是一個n*n的矩陣,它裡面的正交向量被稱為右奇異值向量。而且一般來講,我們會將Σ上的值按從大到小的順序排列。

SVD分解矩陣A的步驟:

(1) 求AA^T 的特徵值和特徵向量,用單位化的特徵向量構成 U。

(2) 求 A^TA 的特徵值和特徵向量,用單位化的特徵向量構成 V。

(3) 將 AA^T 或者 A^TA 的特徵值求平方根,然後構成 Σ。

具體了解這一部分內容看我的《機器學習中SVD總結》文章。地址:機器學習中SVD總結

3.5 PCA演算法兩種實現方法

(1) 基於特徵值分解協方差矩陣實現PCA演算法

輸入:數據集 X=left{ x_{1},x_{2},x_{3},...,x_{n} 
ight} ,需要降到k維。

1) 去平均值(即去中心化),即每一位特徵減去各自的平均值。

2) 計算協方差矩陣 frac{1}{n}XX^T,註:這裡除或不除樣本數量n或n-1,其實對求出的特徵向量沒有影響。

3) 用特徵值分解方法求協方差矩陣frac{1}{n}XX^T 的特徵值與特徵向量。

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

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

總結:

1)關於這一部分為什麼用 frac{1}{n}XX^T ,這裡面含有很複雜的線性代數理論推導,想了解具體細節的可以看下面這篇文章。

CodingLabs - PCA的數學原理

2)關於為什麼用特徵值分解矩陣,是因為 frac{1}{n}XX^T 是方陣,能很輕鬆的求出特徵值與特徵向量。當然,用奇異值分解也可以,是求特徵值與特徵向量的另一種方法。

舉個例子:

X=left( egin{matrix} -1 & -1 &0&2&0\ -2&0&0&1&1 end{matrix} 
ight)

以X為例,我們用PCA方法將這兩行數據降到一行。

1)因為X矩陣的每行已經是零均值,所以不需要去平均值。

2)求協方差矩陣:

C=frac{1}{5}left( egin{matrix} -1&-1&0&2&0\ -2&0&0&1&1 end{matrix} 
ight) left( egin{matrix} -1&-2\ -1&0\ 0&0\ 2&1\ 0&1 end{matrix} 
ight) = left( egin{matrix} frac{6}{5}&frac{4}{5}\ frac{4}{5}&frac{6}{5} end{matrix} 
ight)

3)求協方差矩陣的特徵值與特徵向量。

求解後的特徵值為:

lambda_{1}=2,lambda_{2}=frac{2}{5}

對應的特徵向量為:

c_{1} left( egin{matrix} 1\ 1 end{matrix} 
ight) , c_{2} left( egin{matrix} -1\ 1 end{matrix} 
ight)

其中對應的特徵向量分別是一個通解, c_{1}c_{2} 可以取任意實數。那麼標準化後的特徵向量為:

 left( egin{matrix} frac{1}{sqrt{2}}\ frac{1}{sqrt{2}} end{matrix} 
ight) ,  left( egin{matrix} -frac{1}{sqrt{2}}\ frac{1}{sqrt{2}} end{matrix} 
ight)

4)矩陣P為:

P=left( egin{matrix} frac{1}{sqrt{2}}&frac{1}{sqrt{2}}\ -frac{1}{sqrt{2}}&frac{1}{sqrt{2}}\ end{matrix} 
ight)

5)最後我們用P的第一行乘以數據矩陣X,就得到了降維後的表示:

Y=left( egin{matrix} frac{1}{sqrt{2}} & frac{1}{sqrt{2}} end{matrix} 
ight) left( egin{matrix} -1 & -1& 0&2&0\ -2&0&0&1&1 end{matrix} 
ight) = left( egin{matrix} -frac{3}{sqrt{2}} & - frac{1}{sqrt{2}} &0&frac{3}{sqrt{2}} & -frac{1}{sqrt{2}} end{matrix} 
ight)

數據矩陣X降維投影結果

注意:如果我們通過特徵值分解協方差矩陣,那麼我們只能得到一個方向的PCA降維。這個方向就是對數據矩陣X從行(或列)方向上壓縮降維。

(2) 基於SVD分解協方差矩陣實現PCA演算法

輸入:數據集 X=left{ x_{1},x_{2},x_{3},...,x_{n} 
ight} ,需要降到k維。

1) 去平均值,即每一位特徵減去各自的平均值。

2) 計算協方差矩陣。

3) 通過SVD計算協方差矩陣的特徵值與特徵向量。

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

5) 將數據轉換到k個特徵向量構建的新空間中。

在PCA降維中,我們需要找到樣本協方差矩陣 XX^T 的最大k個特徵向量,然後用這最大的k個特徵向量組成的矩陣來做低維投影降維。可以看出,在這個過程中需要先求出協方差矩陣 XX^T,當樣本數多、樣本特徵數也多的時候,這個計算還是很大的。當我們用到SVD分解協方差矩陣的時候,SVD有兩個好處:

1) 有一些SVD的實現演算法可以先不求出協方差矩陣 XX^T 也能求出我們的右奇異矩陣V。也就是說,我們的PCA演算法可以不用做特徵分解而是通過SVD來完成,這個方法在樣本量很大的時候很有效。實際上,scikit-learn的PCA演算法的背後真正的實現就是用的SVD,而不是特徵值分解。

2)注意到PCA僅僅使用了我們SVD的左奇異矩陣,沒有使用到右奇異值矩陣,那麼右奇異值矩陣有什麼用呢?

假設我們的樣本是m*n的矩陣X,如果我們通過SVD找到了矩陣 X^TX 最大的k個特徵向量組成的k*n的矩陣 V^T ,則我們可以做如下處理:

X_{m*k}^{}=X_{m*n}V_{n*k}^{T}

可以得到一個m*k的矩陣X,這個矩陣和我們原來m*n的矩陣X相比,列數從n減到了k,可見對列數進行了壓縮。也就是說,左奇異矩陣可以用於對行數的壓縮;右奇異矩陣可以用於對列(即特徵維度)的壓縮。這就是我們用SVD分解協方差矩陣實現PCA可以得到兩個方向的PCA降維(即行和列兩個方向)。

4. PCA實例

(1)PCA的Python實現:

##Python實現PCAimport numpy as npdef pca(X,k):#k is the components you want #mean of each feature n_samples, n_features = X.shape mean=np.array([np.mean(X[:,i]) for i in range(n_features)]) #normalization norm_X=X-mean #scatter matrix scatter_matrix=np.dot(np.transpose(norm_X),norm_X) #Calculate the eigenvectors and eigenvalues eig_val, eig_vec = np.linalg.eig(scatter_matrix) eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)] # sort eig_vec based on eig_val from highest to lowest eig_pairs.sort(reverse=True) # select the top k eig_vec feature=np.array([ele[1] for ele in eig_pairs[:k]]) #get new data data=np.dot(norm_X,np.transpose(feature)) return dataX = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])print(pca(X,1))

上面代碼實現了對數據X進行特徵的降維。結果如下:

(2)用sklearn的PCA與我們的PCA做個比較:

##用sklearn的PCAfrom sklearn.decomposition import PCAimport numpy as npX = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])pca=PCA(n_components=1)pca.fit(X)print(pca.transform(X))

結果如下:

搞了半天結果不是很一樣啊!分析一下吧!

sklearn中的PCA是通過svd_flip函數實現的,sklearn對奇異值分解結果進行了一個處理,因為ui*σi*vi=(-ui)*σi*(-vi),也就是u和v同時取反得到的結果是一樣的,而這會導致通過PCA降維得到不一樣的結果(雖然都是正確的)。具體了解可以看參考文章9或者自己分析一下sklearn中關於PCA的源碼。

5. PCA的理論推導

PCA有兩種通俗易懂的解釋:(1)最大方差理論;(2)最小化降維造成的損失。這兩個思路都能推導出同樣的結果。

我在這裡只介紹最大方差理論:

在信號處理中認為信號具有較大的方差,雜訊有較小的方差,信噪比就是信號與雜訊的方差比,越大越好。樣本在u1上的投影方差較大,在u2上的投影方差較小,那麼可認為u2上的投影是由雜訊引起的。

因此我們認為,最好的k維特徵是將n維樣本點轉換為k維後,每一維上的樣本方差都很大。

比如我們將下圖中的5個點投影到某一維上,這裡用一條過原點的直線表示(數據已經中心化):

假設我們選擇兩條不同的直線做投影,那麼左右兩條中哪個好呢?根據我們之前的方差最大化理論,左邊的好,因為投影后的樣本點之間方差最大(也可以說是投影的絕對值之和最大)。

計算投影的方法見下圖:

圖中,紅色點表示樣例,藍色點表示在u上的投影,u是直線的斜率也是直線的方向向量,而且是單位向量。藍色點是在u上的投影點,離原點的距離是<x,u>(即 X^TU 或者 U^TX )。

6. 選擇降維後的維度K(主成分的個數)

如何選擇主成分個數K呢?先來定義兩個概念:

選擇不同的K值,然後用下面的式子不斷計算,選取能夠滿足下列式子條件的最小K值即可。

其中t值可以由自己定,比如t值取0.01,則代表了該PCA演算法保留了99%的主要信息。當你覺得誤差需要更小,你可以把t值設置的更小。上式還可以用SVD分解時產生的S矩陣來表示,如下面的式子:

Reference:

(1) blog.csdn.net/zhongkele

(2) 機器學習之PCA主成分分析 - steed灬 - 博客園

(3) 簡單易學的機器學習演算法——主成分分析(PCA)

(4) 機器學習實戰之PCA - 笨鳥多學 - 博客園

(5) 機器學習中的數學(5)-強大的矩陣奇異值分解(SVD)及其應用 - LeftNotEasy - 博客園

(6) 從PCA和SVD的關係拾遺

(7) CodingLabs - PCA的數學原理

(8) PCA(主成分分析)python實現

(9) 主成分分析PCA(Principal Component Analysis)在sklearn中的應用及部分源碼分析

我的個人微信公眾號:Microstrong

微信公眾號ID:MicrostrongAI

公眾號介紹:Microstrong(小強)同學主要研究機器學習、深度學習、圖像處理、計算機視覺相關內容,分享在學習過程中的讀書筆記!期待您的關注,歡迎一起學習交流進步!

個人博客:

Microstrong - CSDN博客?

blog.csdn.net


推薦閱讀:

人工智慧重新定義全球銀行業的未來!銀行從業者的噩夢?
人工智慧的發展呼喚人類的理性與善良
【翻譯】德雷夫斯:為什麼海德格爾式的人工智慧失敗了,如何修復它則需要讓它變得更海德格爾式
首個教育部印發的人工智慧行動計劃:規劃三步走,大學有三任務
大數據時代的新變數

TAG:數據挖掘 | 機器學習 | 人工智慧 |