1. 准確的PCA和概率解釋(Exact PCA and probabilistic interpretation)
PCA 用於對具有一組連續正交分量(Orthogonal component 譯注: 或譯為正交成分,下出現 成分 和 分量 是同意詞)的多變量數據集進行方差最大化的分解。 在 scikit-learn 中, PCA
被實現為一個變換器對象, 通過 fit
方法可以擬合出 n 個成分, 並且可以將新的數據投影(project, 亦可理解為分解)到這些成分中。
在應用SVD(奇異值分解) 之前, PCA 是在為每個特征聚集而不是縮放輸入數據。可選參數 whiten=True
使得可以將數據投影到奇異(singular)空間上,同時將每個成分縮放到單位方差。 如果下游模型對信號的各向同性作出強假設,這通常是有用的,例如,使用RBF內核的 SVM 算法和 K-Means 聚類算法。
以下是iris數據集的一個示例,該數據集包含4個特征,通過PCA降維后投影到方差最大的二維空間上:
PCA
對象還提供了 PCA 算法的概率解釋,其可以基於可解釋的方差量給出數據的可能性。PCA對象實現了在交叉驗證(cross-validation)中使用 score 方法:
示例:
- Comparison of LDA and PCA 2D projection of Iris dataset
- Model selection with Probabilistic PCA and Factor Analysis (FA)
2. 增量PCA (Incremental PCA)
PCA
對象非常有用, 但 針對大型數據集的應用, 仍然具有一定的限制。 最大的限制是 PCA
僅支持批處理,這意味着所有要處理的數據必須放在主內存。 IncrementalPCA
對象使用不同的處理形式, 即允許部分計算以小型批處理方式處理數據的方法進行, 而得到和 PCA
算法差不多的結果。 IncrementalPCA
可以通過以下方式實現核外(out-of-core)主成分分析:
- 基於從本地硬盤或網絡數據庫中連續獲取的數據塊之上, 使用
partial_fit
方法。 - 在 memory mapped file (通過
numpy.memmap
創建)上使用 fit 方法。
IncrementalPCA
類為了增量式的更新 explainedvariance_ratio ,僅需要存儲估計出的分量和噪聲方差。 這就是為什么內存使用量依賴於每個批次的樣本數量,而不是數據集中需要處理的樣本總量。
在應用SVD之前,IncrementalPCA
就像PCA
一樣,為每個特征聚集而不是縮放輸入數據。
示例
3. 基於隨機化SVD的PCA
通過丟棄具有較低奇異值的奇異向量的分量,將數據降維到低維空間並保留大部分方差信息是非常有意義的。
例如,如果我們使用64x64像素的灰度級圖像進行人臉識別,數據的維數為4096,在這樣大的數據上訓練含RBF內核的支持向量機是很慢的。此外我們知道這些數據固有維度遠低於4096,因為人臉的所有照片都看起來有點相似。樣本位於較低維度的流體上(例如約200維)。 PCA算法可以用於線性變換數據,同時降低維數並同時保留大部分可描述的方差信息。
在這種情況下,使用可選參數 svd_solver='randomized'
的 PCA
是非常有用的。既然我們將要丟棄大部分奇異值,那么僅僅就實際轉換中所需的奇異向量進行計算就可以使得 PCA 計算過程變得異常有效。
例如:以下顯示了來自 Olivetti 數據集的 16 個樣本肖像(以 0.0 為中心)。右側是前 16 個奇異向量重畫的肖像。因為我們只需要使用大小為 和
的數據集的前 16 個奇異向量, 使得計算時間小於 1 秒。
注意:使用可選參數 svd_solver='randomized'
,在 PCA
中我們還需要給出輸入低維空間大小 n_components
。
我們注意到, 如果 且
, 對於PCA中的實現,隨機
PCA
的時間復雜度是:, 而不是
。
就內部實現的方法而言, 隨機 PCA
的內存占用量和 , 而不是
成正比。
注意:選擇參數 svd_solver='randomized'
的 PCA
的 inverse_transform
的實現, 並不是對應 transform
的逆變換(即使 參數設置為默認的 whiten=False
)
示例:
參考資料:
- “Finding structure with randomness: Stochastic algorithms for constructing approximate matrix decompositions” Halko, et al., 2009
4. 核 PCA
KernelPCA
是 PCA 的擴展,通過使用核方法實現非線性降維(dimensionality reduction) (參閱 成對的矩陣, 類別和核函數)。 它具有許多應用,包括去噪, 壓縮和結構化預測( structured prediction ) (kernel dependency estimation(內核依賴估計))。 KernelPCA
支持 transform
和 inverse_transform
。
示例:
5. 稀疏主成分分析 ( SparsePCA 和 MiniBatchSparsePCA )
SparsePCA
是 PCA 的一個變體,目的是提取能最大程度得重建數據的稀疏分量集合。
小批量稀疏 PCA ( MiniBatchSparsePCA
) 是一個 SparsePCA
的變體,它速度更快但准確度有所降低。對於給定的迭代次數,通過迭代該組特征的小塊來達到速度的增加。
Principal component analysis(主成分分析) (PCA
) 的缺點在於,通過該方法提取的成分具有獨占的密度表達式,即當表示為原始變量的線性組合時,它們具有非零系數,使之難以解釋。在許多情況下,真正的基礎分量可以被更自然地想象為稀疏向量; 例如在面部識別中,每個分量可能自然地映射到面部的某個部分。
稀疏的主成分產生更節約、可解釋的表達式,明確強調了樣本之間的差異性來自哪些原始特征。
以下示例說明了使用稀疏 PCA 提取 Olivetti 人臉數據集中的 16 個分量。可以看出正則化項產生了許多零。此外,數據的自然結構導致了非零系數垂直相鄰 (vertically adjacent)。該模型並不具備純數學意義的執行: 每個分量都是一個向量 , 除非人性化地的可視化為 64x64 像素的圖像,否則沒有垂直相鄰性的概念。下面顯示的分量看起來局部化(appear local)是數據的內在結構的影響,這種局部模式使重建誤差最小化。有一種考慮到鄰接性和不同結構類型的導致稀疏的規范(sparsity-inducing norms),參見 [Jen09] 對這種方法進行了解。有關如何使用稀疏 PCA 的更多詳細信息,請參閱下面的示例部分。
請注意,有多種不同的計算稀疏PCA 問題的公式。 這里使用的方法基於 [Mrl09] 。對應優化問題的解決是一個帶有懲罰項(L1范數的) 的 PCA 問題(dictionary learning(字典學習)):
稀疏推導(sparsity-inducing) 規范也可以當訓練樣本很少時,避免從噪聲中擬合分量。可以通過超參數
alpha
來調整懲罰程度(或稱稀疏度)。值較小會導致溫和的正則化因式分解,而較大的值將許多系數縮小到零。
注意 雖然本着在線算法的精神, MiniBatchSparsePCA
類不實現 partial_fit
, 因為在線算法是以特征為導向,而不是以樣本為導向。
示例:
參考資料:
- [Mrl09] “Online Dictionary Learning for Sparse Coding” J. Mairal, F. Bach, J. Ponce, G. Sapiro, 2009
- [Jen09] “Structured Sparse Principal Component Analysis” R. Jenatton, G. Obozinski, F. Bach, 2009