PCA是實驗中很常用的工具,一般用來做降維,它的實現有很多很多種,其中牽涉相當多的細節,筆者在實現PCA時常常有困惑,爲什麼查到的各種代碼總有一些不同的trick,有時候對樣本提前歸一化?有時候又要減均值?這些操作對於PCA降維效果到底有什麼影響?這篇文章從PCA白化入手,探究這些trick背後的原因。
1 Whitening (白化)
白化1有兩種,一種是PCA Whitening,一種是ZCA Whitening,它主要目標是降低數據的冗餘性,我們希望通過白化過程使得學習算法的輸入具有如下性質:
- 特徵之間相關性較低;
- 所有特徵具有相同的方差。
2 Standardize(標準化)
標準化有多種實現方式,其目標是使數據均值爲0,方差爲1,使得不同維度的特徵具有同等重要性。因爲不同維度的特徵代表的信息不同,數值變化範圍會有較大差異,如果統一衡量將可能影響判斷。
在PCA中融入standardize就是PCA whitening。
2.1 舉例說明Standardize重要性
那麼standardize有什麼好處?看一個來自StackExchange的例子2:
用一個特徵來描述一棵樹,它是二維的,第一維是高度height,第二維是切面周長girth,我們要根據這個二維特徵,來推斷一棵樹的體積volume是low還是high(設大於20爲high)。
我們分以下三種情況來分析:
2.1.1 Different measure
先看一種比較極端的情況,讓height的單位是mile,girth的單位是feet,1mile=5280feet=1.6km,也就是說,height的值將是很小的小數,我們假設height取值範圍是[0,0.05],而girth的值取值範圍可以假設爲[20,50],一個樹的height那一維的特徵從0.04變爲0.05,相對於girth已經可以小的忽略不計了,但是它在自己的取值範圍上變化了
分析主成分
Comp.1 Comp.2
Standard deviation 3.0871086 1.014551e-03
Loadings: tree.height -1
tree.girth 1
畫圖分析,其中灰色的low/high指的是volume,紅線height和girth的走勢是根據loading畫出的,loading指的是原始特徵在component上保留的方差,可以看出,height的方差主要反映在component2上,girth的方差反映在component1上,而由於height的重要性被girth完全壓制,故在圖中可以看到,volume的low/high完全靠girth來決定,girth越大,volume越大,height的信息完全沒有起到作用。而我們知道事實上,一棵樹的體積肯定跟高度是有關係的。
2.1.2 Same measure without standarized
進一步地,讓height和girth單位一致,即都是feet。
分析其主成分:
Comp.1 Comp.2
Standard deviation 6.5088696 2.5407042
Loadings: tree.height -0.956 0.293
tree.girth -0.293 -0.956
從圖中可以看出,height的紅線較長,代表volume對height較敏感。因爲component1的方差大,即變化範圍大,而原始數據height那一維的數據的方差較多地反映在component1上,因此height起到較大影響。這是因爲一棵樹的height變化範圍比girth變化範圍大。但是實際上,根據樹的體積計算公式,我們知道,樹的girth應該起較大作用。
2.1.3 Standarized
至此,來看看standardize的結果。
分析其主成分:
Comp.1 Comp.2
Standard deviation 0.2275561 0.06779544
Loadings: tree.height 0.203 -0.979
tree.girth 0.979 0.203
由圖可以看出,girth對volume的判斷起到較大作用,符合客觀事實。
3 PCA whitening
假設我們已經通過公式
下式就是PCA whitening操作,計算
下式驗證白化後的數據方差爲1.
下圖3中:左邊是原始數據,中間是standardize的結果,右邊是PCA whitening的結果,我們可以看到數據散開,主成份沒有明顯的長短軸,差異性被進一步挖掘。
- 白化介紹 ↩
- Standardize的解釋 ↩
- 《Pattern Recognition and Machine Learning》 ↩