1. 程式人生 > >【Scikit-Learn 中文文件】分解成分中的訊號(矩陣分解問題)

【Scikit-Learn 中文文件】分解成分中的訊號(矩陣分解問題)

2.5.1.3. PCA 使用隨機SVD

通過丟棄具有較低奇異值的奇異向量成分,將資料降維到低維空間並保留大部分方差是非常有意義的。

例如,如果我們使用64x64畫素的灰度級影象進行人臉識別,資料的維數為4096, 在這樣大的資料上訓練含RBF核心的支援向量機是很慢的。 此外我們知道資料本質上的維度遠低於4096,因為人臉的所有照片都看起來有點相似。 樣本位於許多的很低維度(例如約200維)。PCA演算法可以用於線性變換資料,同時降低維數並同時保留大部分方差。

在這種情況下,使用可選引數 svd_solver='randomized' 的 PCA 是非常有用的。 因為我們將要丟棄大部分奇異值,所以對我們將保留並實際執行變換的奇異向量進行近似估計的有限的計算更有效。

例如:以下顯示了來自 Olivetti 資料集的 16 個樣本肖像(以 0.0 為中心)。 右側是前 16 個奇異向量重畫為肖像。因為我們只需要使用大小為 n_{samples} = 400 和 n_{features} = 64 \times 64 = 4096 的資料集的前 16 個奇異向量, 使得計算時間小於 1 秒。

orig_img pca_img

注意:使用可選引數 svd_solver='randomized' ,在 PCA 中我們還需要給出輸入低維空間大小 n_components 。

如果我們注意到: n_{\max} = \max(n_{\mathrm{samples}}, n_{\mathrm{features}}) 且 n_{\min} = \min(n_{\mathrm{samples}}, n_{\mathrm{features}}), 對於PCA中實施的確切方式,隨機 PCA 的時間複雜度是:O(n_{\max}^2 \cdot n_{\mathrm{components}}) , 而不是 O(n_{\max}^2 \cdot n_{\min}) 。

對於確切的方式,隨機 PCA 的記憶體佔用量正比於 2 \cdot n_{\max} \cdot n_{\mathrm{components}} , 而不是 n_{\max}\cdot n_{\min}

注意:選擇引數 svd_solver='randomized'

 的 PCA,在執行 inverse_transform 時, 並不是 transform 的確切的逆變換操作(即使 引數設定為預設的 whiten=False