很久以前寫過一篇 PCA 的小白教程,不過由於當時對 PCA 的理解流於表面,所以只是介紹了一下 PCA 的算法流程。今天在數圖課上偶然聽到 PCA 在圖像壓縮上的應用,突然明白了一點實質性的東西,這里趁熱記錄一波。
PCA 算法
首先還是簡單回顧下 PCA 的算法流程。
我們把樣本數據 \(x\) 歸一化后,計算其協方差矩陣 \(C_x\),然后計算 \(C_x\) 的特征向量,構造出一個特征向量矩陣 \(A\),最后把 \(x\) 通過該矩陣映射到一個新的空間,得到的向量 \(y\) 就是能體現 \(x\) 主要成分的向量了。
PCA 在做什么
那么,這種空間映射有什么意義呢?問題要回到協方差矩陣 \(C_x\) 上。我們知道,協方差矩陣是一個對稱矩陣,在線性代數中,對稱矩陣的特征向量是相互正交的。而我們把 \(x\) 通過這個特征向量矩陣映射到 \(y\),其實就是把原來的數據由最初的 \([e_1, e_2, \dots, e_n]\) 的單位坐標系,調整到這些正交的特征向量組成的坐標系下,如下圖所示:
這種坐標變換的意義又在哪呢?
如果仔細分析,我們就會發現,這些新得到的向量 \(y\) 的均值為 \(0\),而且它們的協方差矩陣為:
這里,\(A\) 是由 \(C_x\) 的特征向量組成的矩陣,它的第一行表示最大特征值對應的特征向量,第二行表示第二大特征值對應的特征向量。\(C_y\) 對角線上的 \(\lambda_k\) 代表 \(C_x\) 的特征值,而且是按照從大到小排序的(\(\lambda_1 > \lambda_2 > \dots > \lambda_n\))。
這個新的協方差矩陣有一個很重要的性質,除了對角線上的元素,其他元素通通是 0。要知道,協方差矩陣中,對角線上的元素表示方差,非對角線上的元素表示協方差。這說明,經過 PCA 處理后,我們把原本的數據 \(x\),轉變成各個分量之間沒有任何關系(協方差為 0)的數據 \(y\)!我認為這正是 PCA 的精髓所在,也是我們使用 PCA 算法的根本目標。
另外,PCA 還經常用於降維處理,那么為什么 PCA 的降維效果會那么好?
首先要明確一點,降維不是隨便都能降的,最好的降維方法是要盡量保留重要的信息,而忽略次要的信息。在 PCA 中,我們一般是對協方差矩陣的特征值按從大到小排序,然后舍棄一些比較小的特征值(以及這些特征值對應的特征向量),這樣重新計算得到 \(y\) 后,它的協方差矩陣可能是這個樣子的:
(我們舍棄掉了 \(n-k\) 個特征向量,將數據由 \(n\) 維降到 \(k\) 維)
要知道,這些特征值(或者說方差)都是按照從大到小排序的,也就是說,我們在降維時,舍棄掉了那些特征值比較小的分量。這么做是符合常理的,因為數據的方差越大,證明分布越廣,這樣,我們還原這些數據的難度是越大的,而方差越小,證明數據分布越集中,還原它們的難度就越小(方差為 0 的話,用一個數就可以代表所有樣本了)。所以,降維時,我們盡量保留那些方差大的數據,而忽略那些方差小的。本文開篇的圖中給出一個形象的解釋,我們把一個二維的數據映射到一維時,也是優先映射到方差大的那一維上,這樣,原數據的分布規律可以最大限度的保留下來,信息的保留也是最完整的。