理解主成分分析 (PCA)

理解主成分分析 (PCA)

18 人贊了文章

原創聲明:本文為 SIGAI 原創文章,僅供個人學習使用,未經允許,不得轉載,不能用於商業目的。

導言

主成分分析法 (PCA) 是一種常用的數據分析手段。對於一組不同維度 之間可能存在線性相關關係的數據,PCA能夠把這組數據通過正交變換變 成各個維度之間線性無關的數據。經過 PCA 處理的數據中的各個樣本之間的關係往往更直觀,所以它是一種非常常用的數據分析和預處理工具。PCA 處理之後的數據各個維度之間是線性無關的,通過剔除方差較小的那些維 度上的數據我們可以達到數據降維的目的。在本文中,我們將介紹 PCA的原理、應用以及缺陷。

為什麼要有 PCA

如果數據之中的某些維度之間存在較強的線性相關關係,那麼樣本在這 兩個維度上提供的信息有就會一定的重複,所以我們希望數據各個維度之間是不相關的 (也就是正交的)。此外,出於降低處理數據的計算量或去除噪 聲等目的,我們也希望能夠將數據集中一些不那麼重要 (方差小) 的維度剔除掉。例如在下圖中,數據在 x 軸和 y 軸兩個維度上存在著明顯的相關性, 當我們知道數據的 x 值時也能大致確定 y 值的分布。但是如果我們不是探 究數據的 x 坐標和 y 坐標之間的關係,那麼數據的 x 值和 y 值提供的信息 就有較大的重複。在綠色箭頭標註的方向上數據的方差較大,而在藍色箭頭方向上數據的方差較小。這時候我們可以考慮利用藍色和綠色的箭頭表示的單位向量來作為新的基底,在新的坐標系中原來不同維度間線性相關的數據變成了線性不相關的。由於在藍色箭頭方向上數據的方差較小,在需要 降低數據維度的時候我們可以將這一維度上的數據丟棄並且不會損失較多的信息。如果把丟棄這一維度之後的數據重新變化回原來的坐標系,得到的數據與原來的數據之間的誤差不大。這被稱為重建誤差最小化。PCA 就是進行這種從原坐標繫到新的坐標系的變換的。

圖 1: 示意圖

如何計算PCA

數據經過 PCA 變換之後的各個維度被稱為主成分,各個維度之間是線 性無關的。為了使變換後的數據各個維度提供的信息量從大到小排列,變換後的數據的各個維度的方差也應該是從大到小排列的。數據經過 PCA 變換 之後方差最大的那個維度被稱為第一主成分。

我們先來考慮如何計算第一主成分。假設每一條原始數據是一個 m 維 行向量,數據集中有 n 條數據。這樣原始數據就可以看作一個 n 行 m 列的 矩陣。我們將其稱為 X,用 x^{(i)} 代表數據集中的第 i 條數據(也就是 X 的第 i 和行向量)。這裡為了方便起見,我們認為原始數據的各個維度的均值都是 0。當原始數據的一些維度的均值不為 0 時我們首先讓這一維上的數據分別減去這一維的均值,這樣各個維度的均值就都變成了 0。為了使 X 變化 到另一個坐標系,我們需要讓 X 乘以一個 m × m 的正交變換矩陣 W。W 視為由列向量< W_{1},W_{2} ,..., W_{m} >組成。我們讓X和W進行矩陣相乘之後就可以原始數據變換到新的坐標系中。

T = XW

為了使變換不改變數據的大小,我們讓 W 中的每個列向量 wi 的長度都為 1,也就是 ||W_{i}|| = 1。T 中的各個列向量為 < t_{1},t_{2},...,t_{m} >。為了使第一主 成分 (t1) 的方差最大,

上述最優化問題中 w1 的長度被限制為 1,為了求解 w1,我們將其變成如下的形式:

因為當 C 是一個不為零的常數時,?

這時候求解出的是 w1 的方向。我們只要在這個方向上長度取長度為 1的向量就得到了結果。 frac{W_{1}^{T}x^{T}xW_{1}}{W_{1}^{T}W_{1}} 是一個非常常見的瑞利熵,其更一般的形式是

這裡的 M 是一個厄米特矩陣 (Hermitian Matrix),在本文中我們可以將其 認為是一個實對稱矩陣;x 是一個長度不為零的列向量。求解瑞利熵的最值 需要對實對稱矩陣的對角化有一定的了解。這裡的 XT X 很顯然是一個實 對稱矩陣。對一個實對稱矩陣進行特徵值分解,我們可以得到:

這裡的 D 是一個對角矩陣,對角線上的元素是特徵值;P =< P_{1},P_{2},...,P_{n} >, 每個 P_{i} 都是一個長度為 1 的特徵向量,不同的特徵向量之間正交。我們將 特徵值分解的結果帶回瑞利熵中可以得到

這裡的yi = pi·x。令αi = frac{y_{i}^{2}}{Sigma_{k}y_{k}^{2}} ,這時有0≥αi≤1且 Sigma_{i}a_{1} =1。 這樣 frac{x^{T}M_{x}}{X_{T}X} = Sigma_{i}lambda_{i}alpha_{i} 就構成了一個一維凸包。根據凸包的性質我們可以知道,當最大的 λi 對應的 αi = 1 時整個式子有最大值。所以當 x 的為最大的 特徵值對應的特徵向量時瑞利熵有最大值,這個最大值就是最大的特徵值。 根據這個結論我們就可以知道 w1 就是 X^{T}X 的最大的特徵值對應的特徵向 量,第一主成分 t1 = Xw1。這樣我們就得到了計算第一主成分的方法。接 下來我們繼續考慮如何計算其他的主成分。因為 W 是一個正交矩陣,所以

因為 wk 和 w1, w2, ..wk?1 正交,?

為了使第 k 個主成分在與前 k - 1 個主成分線性無關的條件下的方差最大, 那麼 wk 應該是第 k 大的特徵值對應的特徵向量。經過這些分析我們就能發 現變換矩陣 W 中的每個列向量就是 X^{T}X 的各個特徵向量按照特徵值的大 小從左到右排列得到的。

接下來我們對如何計算 PCA 做一個總結:

1. 把每一條數據當一個行向量,讓數據集中的各個行向量堆疊成一個矩陣。

  1. 將數據集的每一個維度上的數據減去這個維度的均值,使數據集每個 ?維度的均值都變成 0,得到矩陣 X。 ?
  2. 計算方陣 X^{T}X 的特徵值和特徵向量,將特徵向量按照特徵值由大到 小的順序從左到右組合成一個變化矩陣 W。為了降低數據維度,我們 可以將特徵值較小的特徵向量丟棄。 ?
  3. 計算 T = XW,這裡的 T 就是經過 PCA 之後的數據矩陣。 ?

除了這種方法之外,我們還可以使用奇異值分解的方法來對數據進行 PCA處理,這裡不再詳細介紹。

PCA 的應用

首先我們來看一下 PCA 在數據降維方面的應用。我們在 MNIST 數據 集上進行了測試。我們對 MNIST 的測試集中的每一幅 28×28 的圖片的變成 一個 784 維的行向量,然後把各幅圖片拼接成的行向量堆疊一個 784×10000 的數據矩陣。對這個數據矩陣進行 PCA 處理。處理得到的特徵值的分布如 下圖。通過圖片我們可以看出前面一小部分的特徵值比較大,後面的特徵值

圖 2: MNIST 數據集特徵值的分布

都比較接近於零。接下來我們取前 200,300 個主成分對數據進行重建。我 們發現使用前 200 個主成分重建的圖像已經能夠大致分辨出每個數字,使 用前 300 個主成分重建的圖像已經比較清晰。根據實驗我們可以發現 PCA 能夠在丟失較少的信息的情況下對數據進行降維。

PCA 在自然語言處理方面也有比較多的應用,其中之一就是用來計算 詞向量。word2vec 是 Google 在 2013 年提出了一個自然語言處理工具包,

圖 3: 原始圖像

圖 4: 使用前 200 個主成分重建的圖像

圖 5: 使用前 300 個主成分重建的圖像

其思想是用一個向量來表示單詞,意思和詞性相近的單詞對應的向量之間 的距離比較小,反之則單詞之間的距離比較大。word2vec 原本是使用神經網路計算出來的,本文中的 PCA 也可以被用於計算詞向量。具體的做法為: 構建一個單詞共生矩陣,然後對這個矩陣進行 PCA 降維,將降維得到的數 據作為詞向量。使用這種方法構造出的詞向量在單獨使用時效果雖然不如 使用神經網路計算出的詞向量,但是將神經網路構造出來的詞向量和使用 PCA 降維得到的詞向量相加之後得到的詞向量在表示詞語意思時的效果要 好於單獨使用神經網路計算出來的詞向量。

圖 6: 一個共生矩陣的例子 圖片來自於斯坦福大學公開課 cs224n 課件

PCA 的缺陷

雖然 PCA 是一種強大的數據分析工具,但是它也存在一定的缺陷。一 方面,PCA 只能對數據進行線性變換,這對於一些線性不可分的數據是不利 的。為了解決 PCA 只能進行線性變換的問題,Sch?lkopf, Bernhard 在 1998 年提出了 Kernel PCA。Kernel PCA 在計算 M = X^{T}X 的時候不是直接進行相乘,而是使 ar{m_{ij}} =Φ(xi)TΦ(xj)=K(xi,xj)}。這裡的K(xi,xj)是一個與支持向量機中類似的核函數。這樣就能夠對數據進行非線性變換。另一方面,PCA 的結果容易受到每一維數據的大小的影響,如果我們對每一維數據乘以一個不同的權重因子之後再進行 PCA降維,得到的結果可能與直接進行PCA降維得到的結果相差比較大。對於這個問題,Leznik 等人在論文Estimating Invariant Principal Components Using Diagonal Regression 中給出了一種解決方案。除此之外,PCA 要求數每一維的均值都是0,在將原始數據的每一維的均值都變成0時可能會丟失掉一些信息。雖然PCA有這些缺陷,但是如果合理的利用,PCA 仍然不失為一種優秀的數據分析 和降維的手段。

參考文獻

  1. Pearson, K. (1901). 」On Lines and Planes of Closest Fit to Systems of Points in Space」.stat.smmu.edu.cn/histor. Philosophical Magazine. 2 (11):559–572. ?
  2. Principal component analysis(主成分分析). en.wikipedia.org/wiki/P ?
  3. Rayleigh quotient(瑞利熵). en.wikipedia.org/wiki/R. ?
  4. Hermitian matrix(厄米特矩陣). en.wikipedia.org/wiki/H. ?
  5. Yann LeCun. [MNIST 數據集] (yann.lecun.com/exdb/mni). ?
  6. Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg Corrado, Je rey Dean.(2013)」Distributed Representations of Words and Phrases and their Compositionality」.arxiv.org/pdf/1310.45 arxiv.org. ?
  7. Sch?lkopf, Bernhard (1998). 」Nonlinear Component Analysis as a Kernel Eigenvalue Problem」. Neural Computation. 10: 1299–1319. doi:10.1162/089976698300017467. ?
  8. Leznik, M; Tofallis, C. 2005 [uhra.herts.ac.uk/bitstr Estimating Invariant Principal Components Using Diagonal Regres-?sion.] ?

推薦閱讀

[1] 機器學習-波瀾壯闊40年 SIGAI 2018.4.13.

[2] 學好機器學習需要哪些數學知識?SIGAI 2018.4.17.

[3] 人臉識別演算法演化史 SIGAI 2018.4.20.

[4] 基於深度學習的目標檢測演算法綜述 SIGAI 2018.4.24.

[5] 卷積神經網路為什麼能夠稱霸計算機視覺領域? SIGAI 2018.4.26.

[6] 用一張圖理解SVM的脈絡 SIGAI 2018.4.28.

[7] 人臉檢測演算法綜述 SIGAI 2018.5.3.

[8] 理解神經網路的激活函數 SIGAI 2018.5.5.

[9] 深度卷積神經網路演化歷史及結構改進脈絡-40頁長文全面解讀 SIGAI 2018.5.8.

[10] 理解梯度下降法 SIGAI 2018.5.11.

[11] 循環神經網路綜述—語音識別與自然語言處理的利器 SIGAI 2018.5.15

[12] 理解凸優化 SIGAI 2018.5.18

[13]【實驗】理解SVM的核函數和參數 SIGAI 2018.5.22

[14] 【SIGAI綜述】行人檢測演算法 SIGAI 2018.5.25

[15] 機器學習在自動駕駛中的應用—以百度阿波羅平台為例(上) SIGAI 2018.5.29

[16] 理解牛頓法 SIGAI 2018.5.31

[17]【群話題精華】5月集錦—機器學習和深度學習中一些值得思考的問題 SIGAI 2018.6.1

[18] 大話Adaboost演算法 SIGAI 2018.6.2

[19] FlowNet到FlowNet2.0:基於卷積神經網路的光流預測演算法SIGAI 2018.6.4

原創聲明

本文為 SIGAI 原創文章,僅供個人學習使用,未經允許,不得轉載,不能用於商業目的。

更多乾貨請關注V X公眾號:SIGAI

推薦閱讀:

用SQL替代機器學習,這是新時代的「電風扇吹香皂盒」嗎?
談談數據科學
PC端數據埋點的設計思路
如何使用線性回歸探索數據?數據分析初學者指南
資源 | 100+個自然語言處理數據集大放送,再不愁找不到數據!

TAG:數據分析 | 機器學習 | 數據挖掘 |