主成分分析( PCA )與 白化( whitening )
1.相關背景 在許多領域的研究與應用中,通常需要對含有多個變數的資料進行觀測,收集大量資料後進行分析尋找規律。多變數大資料集無疑會為研究和應用提供豐富的資訊,但是也在一定程度上增加了資料採集的工作量。更重要的是在很多情形下,許多變數之間可能存在相關性,從而增加了問題分析的複雜性。如果分別對每個指標進行分析,分析往往是孤立的,不能完全利用資料中的資訊,因此盲目減少指標會損失很多有用的資訊,從而產生錯誤的結論。
因此需要找到一種合理的方法,在減少需要分析的指標同時,儘量減少原指標包含資訊的損失,以達到對所收集資料進行全面分析的目的。由於各變數之間存在一定的相關關係,因此可以考慮將關係緊密的變數變成儘可能少的新變數,使這些新變數是兩兩不相關的,那麼就可以用較少的綜合指標分別代表存在於各個變數中的各類資訊。主成分分析與因子分析就屬於這類降維演算法。
主要思想:通過拋棄攜帶資訊量較少的維度對資料進行降維處理,從而加速機器學習程序。
- 資料降維
降維就是一種對高維度特徵資料預處理方法。降維是將高維度的資料保留下最重要的一些特徵,去除噪聲和不重要的特徵,從而實現提升資料處理速度的目的。在實際的生產和應用中,降維在一定的資訊損失範圍內,可以為我們節省大量的時間和成本。降維也成為應用非常廣泛的資料預處理方法。
降維具有如下一些優點:
- 使得資料集更易使用。
- 降低演算法的計算開銷。
- 去除噪聲。
- 使得結果容易理解。 降維的演算法有很多,比如奇異值分解(SVD)、主成分分析(PCA)、因子分析(FA)、獨立成分分析(ICA)。
- 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演算法.
3.2 協方差和散度矩陣
樣本均值:

樣本方差:

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

由上面的公式,我們可以得到以下結論:
(1) 方差的計算公式是針對一維特徵,即針對同一特徵不同樣本的取值來進行計算得到;而協方差則必須要求至少滿足二維特徵;方差是協方差的特殊情況。
(2) 方差和協方差的除數是n-1,這是為了得到方差和協方差的無偏估計。
協方差為正時,說明X和Y是正相關關係;協方差為負時,說明X和Y是負相關關係;協方差為0時,說明X和Y是相互獨立。Cov(X,X)就是X的方差。當樣本是n維資料時,它們的協方差實際上是協方差矩陣(對稱方陣)。例如,對於3維資料(x,y,z),計算它的協方差就是:

散度矩陣定義為:

。其實協方差矩陣和散度矩陣關係密切,散度矩陣就是協方差矩陣乘以(總資料量-1)。因此它們的特徵值和特徵向量是一樣的。這裡值得注意的是,散度矩陣是SVD奇異值分解的一步,因此PCA和SVD是有很大聯絡。
3.3 特徵值分解矩陣原理
(1) 特徵值與特徵向量
如果一個向量v是矩陣A的特徵向量,將一定可以表示成下面的形式:

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

則是一個對角陣,對角線上的元素就是特徵值。
3.4 SVD分解矩陣原理
奇異值分解是一個能適用於任意矩陣的一種分解的方法,對於任意矩陣A總是存在一個奇異值分解:

n的矩陣,它裡面的正交向量被稱為右奇異值向量。而且一般來講,我們會將Σ上的值按從大到小的順序排列。 SVD分解矩陣A的步驟:
(1) 求 的特徵值和特徵向量,用單位化的特徵向量構成 U。
(2) 求 的特徵值和特徵向量,用單位化的特徵向量構成 V。
(3) 將 或者 的特徵值求平方根,然後構成 Σ。
3.5 PCA演算法兩種實現方法
(1) 基於特徵值分解協方差矩陣實現PCA演算法
輸入:資料集,需要降到k維。
-
去平均值(即去中心化),即每一位特徵減去各自的平均值。、
-
計算協方差矩陣 ,注:這裡除或不除樣本數量n或n-1,其實對求出的特徵向量沒有影響。
-
用特徵值分解方法求協方差矩陣 的特徵值與特徵向量。
-
對特徵值從大到小排序,選擇其中最大的k個。然後將其對應的k個特徵向量分別作為行向量組成特徵向量矩陣P。
-
將資料轉換到k個特徵向量構建的新空間中,即Y=PX。
總結:
1)關於這一部分為什麼用 ,這裡面含有很複雜的線性代數理論推導,想了解具體細節的可以看下面這篇文章。 CodingLabs - PCA的數學原理
是方陣,能很輕鬆的求出特徵值與特徵向量。當然,用奇異值分解也可以,是求特徵值與特徵向量的另一種方法。
舉個例子:

以X為例,我們用PCA方法將這兩行資料降到一行。
1)因為X矩陣的每行已經是零均值,所以不需要去平均值。
2)求協方差矩陣:

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

對應的特徵向量為:

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

4)矩陣P為:

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

結果如圖1所示:

注意:如果我們通過特徵值分解協方差矩陣,那麼我們只能得到一個方向的PCA降維。這個方向就是對資料矩陣X從行(或列)方向上壓縮降維。
4. PCA例項
(1)PCA的Python實現:
##Python實現PCA import numpy as np def 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 data X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) print(pca(X,1)) 複製程式碼
上面程式碼實現了對資料X進行特徵的降維。結果如下:

(2)用sklearn的PCA與我們的PCA做個比較:
##用sklearn的PCA from sklearn.decomposition import PCA import numpy as np X = 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)) 複製程式碼


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

在訊號處理中認為訊號具有較大的方差,噪聲有較小的方差,信噪比就是訊號與噪聲的方差比,越大越好。樣本在u1上的投影方差較大,在u2上的投影方差較小,那麼可認為u2上的投影是由噪聲引起的。
因此我們認為,最好的k維特徵是將n維樣本點轉換為k維後,每一維上的樣本方差都很大。
比如我們將下圖中的5個點投影到某一維上,這裡用一條過原點的直線表示(資料已經中心化)

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

圖中,紅色點表示樣例,藍色點表示在u上的投影,u是直線的斜率也是直線的方向向量,而且是單位向量。藍色點是在u上的投影點,離原點的距離是<x,u>
6. 選擇降維後的維度K(主成分的個數)
如何選擇主成分個數K呢?先來定義兩個概念:

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

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

Reference:
(1) 主成分分析(PCA)原理詳解
http://blog.csdn.net/zhongkelee/article/details/44064401
(2) 機器學習之PCA主成分分析 - steed灬 - 部落格園
https://www.cnblogs.com/steed/p/7454329.html
(3) 簡單易學的機器學習演算法——主成分分析(PCA)
https://blog.csdn.net/google19890102/article/details/27969459
(4) 機器學習實戰之PCA - 笨鳥多學 - 部落格園
https://www.cnblogs.com/zy230530/p/7074215.html
(5) 機器學習中的數學(5)-強大的矩陣奇異值分解(SVD)及其應用 - LeftNotEasy - 部落格園
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html
(6) 從PCA和SVD的關係拾遺
https://blog.csdn.net/Dark_Scope/article/details/53150883
(7) CodingLabs - PCA的數學原理
http://blog.codinglabs.org/articles/pca-tutorial.html
(8) PCA(主成分分析)python實現
https://www.jianshu.com/p/4528aaa6dc48
(9) 主成分分析PCA(Principal Component Analysis)在sklearn中的應用及部分原始碼分析
https://www.cnblogs.com/lochan/p/7001907.html
作者:Microstrong0305 來源:CSDN 原文:https://blog.csdn.net/program_developer/article/details/80632779 版權宣告:本文為博主原創文章,轉載請附上博文連結!