PCA算法是怎么跟協方差矩陣/特征值/特征向量勾搭起來的?


PCA, Principle Component Analysis, 主成份分析, 是使用最廣泛的降維算法.
......
(關於PCA的算法步驟和應用場景隨便一搜就能找到了, 所以這里就不說了. )


假如你要處理一個數據集, 數據集中的每條記錄都是一個$d$維列向量. 但是這個$d$太大了, 所以你希望把數據維度給降下來, 既可以去除一些冗余信息, 又可以降低處理數據時消耗的計算資源(用computation budget 來描述可能更形象).

用稍微正式點的語言描述:

  • 已知:一個數據集\(D\), 記錄(或者樣本, 或input pattern)\(x_i \in D\)\(d\)維列向量.
  • 目標:將每個\(x \in D\) 映射到另一個\(p\)維空間, \(p < d\)(雖然等於也是可以的, 但沒什么意義). 得到一個新的數據集\(Z\), 對\(Z\)的要求是盡量保存\(D\)中的有效信息.

那么, 問題就來了. 如何將一個\(d\)維向量映射成一個\(p\)維向量? 答案是基變換. 然而基變換方式不是唯一的, 如何確保變換是最優的? 這就由優化目標"盡量保存原數據集中的信息" 決定了: 最好的基變換能保存最多的信息. 注意了, 這里的比較都是在同一個\(p\)下進行的, 也就是說, 參與競爭的基集(basis set)們, 都把\(d\)\(D\)映射到了一個新的\(p\)\(Z\).

那么, (不好意思, 又一個那么. 這不是第一個, 當然也不是最后一個. 是的, 我喜歡用這個詞.), 現在面臨的問題是, 如何衡量信息的多少? 我並不懂信息科學, 只知道一點, 信息在差異中存在. 如果全是相同的東西, 量再多,它的信息量也沒有多少. PCA算法采用方差(variance)來度量信息量.

那么, 如何用variance來度量數據集\(D\)包含的信息量呢? 一個基(basis)一個基地衡量. 數據集在某個基上的投影值(也是在這個基上的坐標值)越分散, 方差越大, 這個基保留的信息也就越多. 不嚴格的來一句, 一個基集保留下的信息量是每個基保留下的信息量的和.

基於上面的理念, 或者說假設, 我們已經有一種可以有效地找出最優基集的方法了: 貪心算法---先找出保留信息量最大的基向量, 然后是第二大的, 然后然后, 直到找滿\(p\)個基向量.

接下來, 將上面的分析用數學語言描述出來.
\(v\)為一個用於變換的基. \(D\)中的某一條記錄\(x\)\(v\)上的投影長度(即坐標值)為: $$proj(x, v) = \frac {v^Tx}{||v||}$$
假如\(v\)為單位向量, 則:$$proj(x, v) = v^Tx$$
所以, 為了方便計算, 我們對\(v\)有了一個約束條件: \(v\)為單位向量. 這個太好說了, normalize 一下就行了.

於是, 整個\(D\)\(v\)上的投影長度可以打包表示為:\(Xv\), 其中, \(X\)是一個\(m \times d\)的矩陣, 每一行是一條記錄, \(m\)\(D\)中的記錄總數目. 在數據預處理時, 我們先將\(X\)每一列的均值變為0: 先算出每一列的均值, 得到均值向量\(\mu\), 然后從每一條記錄\(x_i\)中減去\(\mu\): \(x_i \gets x_i - \mu\). 最后用這些預處理后的\(x_i\)組成\(X\).
現在, 我們來計算\(D\)\(v\)上的信息量, 即所有數據在\(v\)上的投影長度的方差:

\[\mu (X, v) = 0 \]

\[info(D, v) = \sigma^2(X, v) = \frac 1m \sum_{i=1}^m (v^Tx_i - \mu)^2 = \frac 1m (Xv)^T Xv = \frac 1m v^T X^T X v \]

仔細看\(X^T X\)這個東西, 因為做過均值化處理, \(\frac 1m X^T X\), 成為了原數據集\(D\)的協方差矩陣, 用\(C\)表示. 所以

\[info(D, v) = \sigma^2(X, v) = v^T C v \]

這就是我們需要最大化的目標函數. 不過, 再回想一下, 我們之前為了方便計算還加了一個條件進來: \(v\)是一個單位向量, 即\(v^Tv = 1\). 把這個條件也加到目標函數里去:

\[f(v) = v^T C v - \lambda (v^T v - 1) \]

所以, 這才是我們最終需要優化的目標函數.
now, 求使\(f(v)\)最大的\(v\). \(f(v)\)取得條件極值的必要條件為:
(這個矢量函數求偏導的過程類似於神經網絡BP算法求偏導過程, 以后在另一篇文章單獨推導.)

\[\frac {\partial f}{\partial v} = 2Cv - 2\lambda v = 0 \]

\[Cv = \lambda v \]

所以, \(v\)\(C\)的特征向量. 它保存的信息量為:

\[info(D, v) = v^TCv = v^T \lambda v = \lambda v^Tv = \lambda \]

於是, 奇跡就這么出現了: 信息量保存能力最大的基向量一定是\(D\)的協方差矩陣的特征向量, 並且這個特征向量保存的信息量就是它對應的特征值.

接下來的戲碼你們應該都知道了: 用單位正交陣將\(C\)對角化(\(C\)是對稱矩陣, 天生如此);特征值降序排列, 以排名前\(p\)個特征值對應的特征向量作為新的基集. (這個做法看起來很自然, 但若細細思量, 會發現這一步是PCA算法里水最深的一步, 至少我現在還沒真正理解為何要這么做, 聽qw學長說要用什么Rayleigh商).

剩下的問題, 比如降維后損失了多少信息, 也很明白了, 就不多講了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM