親們早安、午安、晚安,上一篇主成分分析法(PCA)等降維(dimensionality reduction)算法-Python主要是了解了PCA的原理和基于Python的基本算法實現,本文主要是學習scikit-learn (sklearn)中關于降維(dimensionality reduction)的一些模型,側重于PCA在sklearn中的實現。
在sklearn中的Dimensionality Reduction中,包含的降低特征維度的方法包括主成分分析法PCA(這里面又包括不同類型的PCA方法,一般的PCA,KernelPCA, SparsePCA, TruncatedSVD, IncrementalPCA )、因子分析法FA(factor analysis)、獨立成分分析ICA等
1、主成分分析法PCA
1)Exact PCA?
這個方法主要是利用上一篇主成分分析法(PCA)等降維(dimensionality reduction)算法-Python中的方法,基于奇異值分解(Singular Value Decomposition)來線性降維到低維度的空間。
啥?怎么跑出來個奇異值分解SVD?這是線性代數里的名詞,關于線性代數的知識,推薦查看網易公開課里的麻省理工線性代數課程,里面有關于SVD的詳細計算。當然,如果想知道SVD的幾何意義,我覺得We Recommend a Singular Value Decomposition非常好,圖文并茂,極力推薦,由此也進一步理解了主成分分析PCA。
(1)SVD
首先考慮對角矩陣如M,如果M與一個向量(x,y)相乘如圖1,表示將(x,y)進行長度的變化如圖2:
根據圖2的變化可知,對角矩陣M的作用是將水平垂直網格作水平拉伸(或者反射后水平拉伸)的線性變化。
如果M是圖3中的對稱矩陣,那么它和向量(x,y)相乘后,也可以找到一組網格線(如圖4)
看著圖4有點蒙圈,貌似不是簡單的線性變化,辣么,先把圖4中左邊圖旋轉45度,然后再乘以M,然后得到下面的情況:
圖5表明,先旋轉45度,然后再和M相乘,此時又可以只進行簡單的拉伸變化。
對比圖4-5,當原始矩陣乘以對稱矩陣時,不一定還是進行線性變化(只在一個方向進行伸縮變化),除非這個映射時,兩邊的正交網絡是一致的。
再比如更加一般的非對稱非對角矩陣M(如圖6):
觀察圖7,對于任意一個向量,當一個一般矩陣M作用在其上面時,很難只是做線性變化。但是,我們可以如圖7最下面一行的變化,找一組網格,找兩個正交向量來表示向量。
對角矩陣Σ對角線上的取值σ_1,σ_2就是矩陣M的奇異值。
綜上所述:奇異值分解SVD幾何意義:對于任何的一個矩陣,我們要找到一組兩兩正交單位向量序列,是的矩陣作用在此向量序列后得到新的向量序列保持兩兩正交。奇異值的幾何意義:這組變化后的新的向量序列的長度。從圖10中看到,奇異值分解和特征值求解很相似,但是特征值必須是方陣才存在,但任何矩陣都可以進行奇異值分解。
好啦,奇異值分解SVD差不多搞清楚了,為啥要進行奇異值分解,其實它表現的就像PCA的意義那樣,用這些關鍵較少數量的奇異值(奇異向量)來表示原來可能比較龐大的東東,因此,在圖像壓縮等方向應用的比較多。如下:
比如,圖11是一個15*25的圖片,其像素組成是圖12中的M矩陣
結果計算發現,圖12中M的非零奇異值只有三個:σ1= 14.72;σ2= 5.22;σ3= 3.31
那么,根據上面奇異值幾何意義,其實圖11中的圖片是可以用這三個奇異值向量來表示的:M=u1σ1v1^T+u2σ2v2^T+u3σ3v3^T,,這一將原來可能要對375個像素點的計算變為123個像素點的計算。還有個問題需要強調,可能實際圖片不像圖11中那樣純粹,可能存在噪聲,如圖13(圖中出現的那些灰色的地方表示噪聲)
圖13中像素矩陣得到的奇異值為:σ1= 14.15;σ2= 4.67;σ3= 3.00;σ4= 0.21;σ5= 0.19...
σ15= 0.05等,但是看到還是前三個特征值比較大,因此,繼續用σ1,σ2,σ3表示該圖片,其他的奇異值舍去,最終得到新的圖片見圖14,顯然圖14中噪聲變少了。
關于SVD的這個奇異的理解(同時包含PCA于SVD的聯系),下面知乎大牛的解釋可能更清楚點:
(2)簡單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->表示最終要保留的主成分特征數,如果不設置,則保留全部特征
whiten->是否進行白化,默認為false。啥是白化?因為我們在PCA中,保留主要的特征來計算決策,因此難免有誤差,為了降低誤差,通過白化來降低特征值之間的相關性,使其協方差矩陣變為對角矩陣。具體,來自知乎大牛關于PCA白化的解釋很詳細,請參考下圖17:
在PCA中,原始數據如圖17最左邊的紅色圖表示;然后用原始矩陣減去均值,然后求解協方差矩陣,將數據依據協方差矩陣方差最大的軸進行旋轉,得到圖17中部綠色顯示內容;然后進行白化whiten,就是白化操作的輸入是特征基準上的數據,然后對每個維度除以其特征值來對數值范圍進行歸一化。如果數據服從多變量的高斯分布,那么經過白化后,數據的分布將會是一個均值為零,且協方差相等的矩陣(及單位協方差矩陣),如圖17中最右邊藍色圖示。
svd_solver->指定奇異值分解SVD的方法,由于特征分解是奇異值分解SVD的一個特例,一般的PCA庫都是基于SVD實現的。有4個可以選擇的值:{‘auto’, ‘full’, ‘arpack’, ‘randomized’}。randomized一般適用于數據量大(數據量超過500*500),數據維度多同時主成分比例又較低(低于80%)的PCA降維,它使用了一些加快SVD的隨機算法。 full則是傳統意義上的SVD,使用了scipy庫對應的實現。arpack和randomized的適用場景類似,區別是randomized使用的是scikit-learn自己的SVD實現,而arpack直接使用了scipy庫的sparse SVD實現。默認是auto,即PCA類會自己去在前面講到的三種算法里面去權衡,選擇一個合適的SVD算法來降維。一般來說,使用默認值就夠了。
舉栗子1:
篇幅有限(其實是能力+精力有限,捂臉),sklearn中的PCA模型先介紹到這里,以后再深入研究。希望內容對大家有所幫助,也希望大牛不吝賜教。