Principal components analysis(PCA) 主成分分析

本文主要參考資料:

CS229 lecture notes by Andrew Ng
UFLDL主成分分析 by Andrew Ng
《機器學習實戰》第13章“使用PCA來簡化數據”

1. 運用背景

在機器學習中,PCA是一種常用的方法。其目的是將 n 維的原始數據近似的用 k 維來表示,而且近似表示後對數據的損失儘可能的小。我們可以假設原始的 n 維數據 x(i) 是由 k 維數據添加一些噪聲後形成的,而PCA要做的就是找到這個 k 維表示。

舉例來說,如果一份數據集代表車輛的特徵,包括最大速度、扭矩等。其中有兩個特徵 xixj 均代表車輛的最大數據,但其中一個的單位是 km/h, 另外一個是 m/s。那麼這兩個特徵就是強相關的,在將這份數據用於監督學習算法時,僅保留其中一個特徵即可。PCA要做的就是自動的發現並去除這種冗餘。

另外一份真實數據是有關飛行員的,描述飛行員有兩個特徵,第一個特徵 xi 表示這個飛行員的技能,另外一個特徵 xj 代表飛行員對飛行的熱愛程度。調查發現,由於該種機型非常難以操控,因此只有對飛行非常熱愛的飛行員才擁有高超的駕駛技術。因此特徵 xi 和特徵 xj 是強相關的。而相比於上一個例子來說,這種強相關是人難以發現的,需要PCA算法來自動發現這種冗餘的特徵。如下圖所示,我們需要算法來自動的計算出 u1 方向,該方向是擁有最大方差的投影方向,與其正交的 u2 方向則擁有很小的數據方差,可以被當做噪聲。

這裏寫圖片描述

2. 數據預處理

  1. 計算均值,使用下列公式,計算的結果是一個n維向量,向量中的每個元素是所有樣本的相應特徵的均值。
    μ=1mi=1mx(i)
  2. 對每一個樣本x(i) ,計算其特徵中心化後的結果,即
    x(i)=x(i)μ
  3. 計算第 j 維特徵的方差(jϵ[1,n]
    σ2j=1mi=1m(x(i)j)2
  4. 對於每一個樣本x(i) ,另其每一維特徵除以相應特徵的標準差,使得每種特徵的範圍相同。即
    x(i)j=x(i)jσj

步驟1-2是零均值化數據,如果原始數據的均值爲0,則可以省略該步驟,如時間序列數據、音頻數據。步驟3-4對每一維特徵的方差歸一化,確保不同尺度的特徵可以在分類中有相同的作用。如果數據爲圖像數據,每一個像素點是一個特徵,特徵的尺度都在0-255之內,則不需要做3-4步。

3.算法步驟

解決方法是尋找單位向量 u 使得數據在該方向上的投影的方差能夠最大化。形象的說,原始數據的每一維特徵有一定的方差,我們想要選擇一個方向 u 使得數據大致分佈在該方向上,在該方向的投影數據能夠保留儘可能多的方差。

假設原始數據的特徵是二維的,並且已經經過均值歸零化處理和方差歸一化處理,如下圖所示。
這裏寫圖片描述

當選擇一個新的投影反向 u 後,我們將原始數據點向方向 u 進行投影操作。
這裏寫圖片描述

我們可以看到投影后的數據仍然保持着較大的方差,數據點距離原點較遠。相反,如果按照下面的方式選擇投影方向,則投影后數據點之間的不同很少被保留下來,數據點普遍向原點靠近。

這裏寫圖片描述

假設基向量 u 爲單位向量,則向量 x 投影到 u 後的長度爲 xTu 。假設 x(i) 是一個數據點,則向方向 u 上的投影點相對於原點的距離爲 xTu 。PCA的目的是最大化這一投影距離:
這裏寫圖片描述

根據線性代數的知識,在 ||u||2=1 的條件下求該式最大化情況下的 u ,則 uΣ=1mmi=1x(i)x(i)T 的特徵向量,而 Σ 正好是數據的協方差矩陣(在均值爲0的條件下)。

有關於協方差矩陣的相關知識可以參考這兩篇文章:
1. http://www.cnblogs.com/chaosimple/p/3182157.html
2. http://www.cnblogs.com/cezorzhao/archive/2013/01/11/xiefangcha.html

Σ 協方差矩陣的特徵向量按列排放構成矩陣 U 如下:
這裏寫圖片描述

其中,u1 是主特徵向量(對應最大的特徵值),u2 是次特徵向量,以此類推。另計λ1,λ2,λ3...λn 爲相應的特徵值。

旋轉數據

可以將 x(u1,u2) 基表示爲:

xrot=UTx=[uT1xuT2x]

一般而言,運算UTx 表示旋轉到基 u1,u2...un 之上的訓練數據。矩陣 U 有正交性,即滿足 UTU=UUT=I ,所以如果想將旋轉後的向量xrot 還原爲原始數據 x ,將其左乘矩陣 U 即可。

Uxrot=UUTx=x

數據降維

這裏寫圖片描述

還原近似數據

這裏寫圖片描述

選擇主成分個數

這裏寫圖片描述

對圖像數據應用PCA算法

爲使PCA算法能夠有效工作,通常我們希望所有的特徵x1,x2,x3,...,xn 都有相似的取值範圍(並且均值接近於0)。如果你曾在其他應用中使用過PCA算法,你可能也知道有必要單獨對每個特徵進行預處理,即通過估算每個特徵 xj 的均值和方差,而後將其取值範圍規整爲零均值和單位方差。但是對於大部分圖像而言,卻不需要進行這樣的預處理。假設在自然圖像上訓練算法,此時特徵 xj 代表的是相似 j 的值。所謂“自然圖像”,不嚴格的說,是指人或動物在他們一生中所見的那種圖像。

在自然圖像上進行訓練時,對每一個像素單獨估計均值和方差的意義不大,因爲理論上圖像上任一部分的統計特性都應該和其他部分相同,圖像的這種特性稱爲平穩性。

具體而言,爲使PCA算法正常工作,我們通常要滿足以下要求:
(1)特徵的均值大致爲0
(2)不同特徵的方差彼此相似。

對於自然圖片,即使不進行方差歸一化操作,條件(2)也滿足,故而我們不再進行任何方差歸一化操作(對於音頻數據,如聲譜、文本數據、詞袋向量等,我們通常也不進行方差歸一化)。實際上,PCA算法對輸入數據具有縮放不變性,無論輸入數據被如何放大(或縮小),返回的特徵向量都不改變。更正式的說:如果將每個特徵x都乘以某個正數(即所有特徵量被放大或縮小相同的倍數),PCA的輸出特徵向量都將不會發生改變。

既然我們不做方差歸一化,那麼唯一還需要進行的規整化操作就是均值規整化,其目的是保證所有特徵的均值都在0附近。根據應用,在大多數條件下,我們並不關注所輸入圖像的整體明亮程度。比如在對象識別任務中,圖像的整體明亮程度並不會影響圖像中存在的是什麼物體。更爲正式的說,我們隊圖像塊的平均亮度值不感興趣,所以可以減去這個值來進行均值規整話。

具體的步驟是,如果 x(i)ϵRn 代表16*16的圖像塊的亮度(灰度)值(n=256),可用如下算法來對每幅圖像進行零均值化操作:

μ(i):=1nj=1nxij

x(i)j:=x(i)jμ(i),(forallj)

即對某幅圖像求其所有像素的均值,再令該圖像的所有像素減去這個均值。

注意:1)對每個輸入圖像塊 x^{(i)} 都要單獨直行上面兩個步驟,2)這裏的 μ(i) 指的是圖像塊 x(i) 的平均亮度值。尤其需要注意的是,這和爲每個像素 xj 單獨估算均值是兩個完全不同的概念。

如果你處理的圖像是非自然圖像(比如,手寫文字,或者白背景正中擺放單獨物體),其他規整化操作就值得考慮了,而那種做法最合適也取決於具體應用場合。但對自然圖像而言,對每幅圖像進行上述的零均值規整化,是默認而合理的處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章