1. PCA簡介
PCA作為降維最重要的方法之一,在數據壓縮消除冗余和數據噪音消除等領域都有廣泛的應用。PCA的思想就是將高維數據投影到低維,一般基於兩個標准選擇投影方向:
- 基於最小投影距離
樣本點到投影超平面的距離足夠近
- 基於最大投影方差
樣本點投影在超平面上的方差足夠大,能夠竟可能的分開,即方差最大方向的分解
ps:什么情況下需要進行降維?
數據集特征數較多,導致數據在每個特征維度上的分布稀疏;
特征自相關。
2.PCA算法流程
1) 對所有的樣本進行中心化: 樣本的每個特征減去該特征均值;
2) 計算樣本的協方差矩陣;
3) 對協方差矩陣進行特征值分解;
4) 取出最大的n'個特征值對應的特征向量, 將所有的特征向量標准化后,組成特征向量矩陣;
5) 用特征向量矩陣乘以樣本集中的每一個樣本x(i),轉化為新的樣本,即為降維后的輸出樣本。
ps:實際上sklearn中PCA算法,並不是對協方差矩陣進行特征分解,因為當樣本數和樣本特征數都較多的時候,計算協方差矩陣的計算量會很大。所以,sklearn中的PCA采用的是SVD(奇異值分解),在不求解協方差矩陣的情況下,得到右奇異矩陣V。也就是說PCA算法可以不用做特征分解,而是做SVD來完成,這個方法在樣本量很大的時候很有效。
3. sklearn中PCA參數
class sklearn.decomposition.
PCA
(n_components=None, copy=True, whiten=False, svd_solver='auto', tol=0.0, iterated_power='auto', random_state=None)
n_components:這個參數可以幫我們指定希望PCA降維后的特征維度數目。
-
- 最常用的做法是直接指定降維到的維度數目,此時n_components是一個大於等於1的整數;
- 我們也可以指定主成分的方差和所占的最小比例閾值,讓PCA類自己去根據樣本特征方差來決定降維到的維度數,此時n_components是一個(0,1]之間的數;
- 我們還可以將參數設置為'mle'(極大似然估計), 此時PCA類會用MLE算法根據特征的方差分布情況自己去選擇一定數量的主成分特征來降維;
- 我們也可以用默認值,即不輸入n_components,此時n_components=min(樣本數,特征數)。
copy: 表示是否在運行算法時,將原始數據復制一份。默認為True,則運行PCA算法后,原始數據的值不會有任何改變。因為是在原始數據的副本上進行運算的。
whiten: 白化。所謂白化,就是對降維后的數據的每個特征進行標准化,讓方差都為1。對於PCA降維本身來說,一般不需要白化。如果你PCA降維后有后續的數據處理動作,可以考慮白化。默認值是False,即不進行白化。
svd_solver:即指定奇異值分解SVD的方法,由於特征分解是奇異值分解SVD的一個特例,一般的PCA庫都是基於SVD實現的。有4個可以選擇的值:{‘auto’, ‘full’, ‘arpack’, ‘randomized’}。
-
- 'randomized' 一般適用於數據量大,數據維度多同時主成分數目比例又較低的PCA降維,它使用了一些加快SVD的隨機算法。
- 'full' 則是傳統意義上的SVD,使用了scipy庫對應的實現。
- 'arpack' 和randomized的適用場景類似,區別是randomized使用的是scikit-learn自己的SVD實現,而arpack直接使用了scipy庫的sparse SVD實現。當svd_solve設置為'arpack'時,保留的成分必須少於特征數,即不能保留所有成分。
- 默認是'auto',即PCA類會自己去在前面講到的三種算法里面去權衡,選擇一個合適的SVD算法來降維。一般來說,使用默認值就夠了。
注意:當設置 n_components == 'mle'時,需要和參數svd_solver一起使用,且svd_solver需要選擇 'full' 參數;即pca = PCA(n_components = 'mle',svd_solver='full');同時要保證輸入數據的樣本數多於特征數才可執行成功。
另外,有兩個PCA類的成員值得關注。第一個是explained_variance_,它代表降維后的各主成分的方差值,方差值越大,則說明越是重要的主成分。第二個是explained_variance_ratio_,它代表降維后的各主成分的方差值占總方差值的比例,這個比例越大,則越是重要的主成分。
參考:https://www.cnblogs.com/pinard/p/6239403.html
https://www.cnblogs.com/pinard/p/6243025.html