主成分分析(PCA)简介
主成分分析(Principal Components Analysis, PCA)是一個簡單的機器學習算法,可以通過基礎的線性代數知識推導。
假設在Rn空間中我們有m個點{x(1),…,x(m)},我們希望對這些點進行有損壓縮。有損壓縮表示我們使用更少的內存,但損失一些精度去存儲這些點。我們希望損失的精度盡可能少。
一種編碼這些點的方式是用低維表示。對于每個點x(i)∈Rn,會有一個對應的編碼向量c(i)∈Rl。如果l比n小,那么我們便使用了更少的內存來存儲原來的數據。我們希望找到一個編碼函數,根據輸入返回編碼,f(x)=c;我們也希望找到一個解碼函數,給定編碼重構輸入,x≈g(f(x)).
PCA由我們選擇的解碼函數而定。具體地,為了簡化解碼器,我們使用矩陣乘法將編碼映射回Rn,即g(c)=Dc,其中D∈Rn*l是定義解碼的矩陣。
目前為止所描述的問題,可能會有多個解。因為如果我們按比例地縮小所有點對應的編碼向量ci,那么我們只需按比例放大D:,i,即可保持結果不變。為了使問題有唯一解,我們限制D中所有列向量都有單位范數(unit norm)。
計算這個解碼器的最優編碼可能是一個困難的問題。為了使編碼問題簡單一些,PCA限制D的列向量彼此正交(注意,除非l=n,否則嚴格意義上D不是一個正交矩陣)。
為了將這個基本想法變為我們能夠實現的算法,首先我們需要明確如果根據每一個輸入x得到一個最優編碼c*。一種方法是最小化原始輸入向量x和重構向量g(c*)之間的距離。我們使用范數來衡量它們之間的距離。在PCA算法中,我們使用L2范數:
我們可以用平方L2范數替代L2范數,因為兩者在相同的值c上取得最小值。這是因為L2范數是非負的,并且平方運算在非負值上是單調遞增的。
主成分分析(PCA):PCA算法提供了一種壓縮數據的方式,也可以將PCA視為學習數據表示的無監督學習算法。PCA學習一種比原始輸入維數更低的表示。它也學習了一種元素之間彼此沒有線性相關的表示。PCA可以通過協方差矩陣得到。主成分也可以通過奇異值分解(SVD)得到。
在多元統計分析中,PCA是一種分析、簡化數據集的技術。主成分分析經常用于減少數據集的維數,同時保持數據集中的對方差貢獻最大的特征。這是通過保留低階主成分,忽略高階主成分做到的。這樣低階成分往往能夠保留住數據的最重要方面。但是,這也不是一定的,要視具體應用而定。由于主成分分析依賴所給數據,所以數據的準確性對分析結果影響很大。
主成分分析由卡爾?皮爾遜于1901年發明,用于分析數據及建立數理模型。其方法主要是通過對協方差矩陣進行特征分解,以得出數據的主成分(即特征向量)與它們的權值(即特征值)。PCA是最簡單的以特征量分析多元統計分布的方法。其結果可以理解為對原數據中的方差做出解釋:哪一個方向上的數據值對方差影響最大?換而言之,PCA提供了一種降低數據維度的有效方法;如果分析者在原數據中除掉最小的特征值所對應的成分,那么所得的低維度數據必定是最優化的(也即,這樣降低維度必定是失去訊息最少的方法)。主成分分析在分析復雜數據時尤為有用,比如人臉識別。
PCA是最簡單的以特征量分析多元統計分布的方法。通常情況下,這種運算可以被看作是揭露數據的內部結構,從而更好的解釋數據的變量的方法。如果一個多元數據集能夠在一個高維數據空間坐標系中被顯現出來,那么PCA就能夠提供一幅比較低維度的圖像,這幅圖像即為在訊息最多的點上原對象的一個”投影”。這樣就可以利用少量的主成分使得數據的維度降低了。
PCA的數學定義是:一個正交化線性變換,把數據變換到一個新的坐標系統中,使得這一數據的任何投影的第一大方差在第一個坐標(稱為第一主成分)上,第二大方差在第二個坐標(第二主成分)上,依次類推。
定義一個n*m的矩陣,XT為去平均值(以平均值為中心移動至原點)的數據,其行為數據樣本,列為數據類別(注意,這里定義的是XT而不是X)。則X的奇異值分解為X=WΣVT,其中m*m矩陣W是XXT的本征矢量矩陣,Σ是m*n的非負矩形對角矩陣,V是n*n的XTX的本征矢量矩陣。據此,YT=XTW=VΣTWTW=VΣT,當m<n-1時,V在通常情況下不是唯一定義的,而Y則是唯一定義的。W是一個正交矩陣,YT是XT的轉置,且YT的第一列由第一主成分組成,第二列由第二主成分組成,依次類推。
為了得到一種降低數據維度的有效辦法,我們可以利用WL把X映射到一個只應用前面L個向量的低維空間中去:Y=WLTX=ΣLVT,其中ΣL=IL*mΣ,且IL*m為L*m的單位矩陣。X的單向量矩陣W相當于協方差矩陣的本征矢量C=XXT, XXT=WΣΣTWT.
在歐幾里得空間給定一組點數,第一主成分對應于通過多維空間平均點的一條線,同時保證各個點到這條直線距離的平方和最小。去除掉第一主成分后,用同樣的方法得到第二主成分。依次類推。在Σ中的奇異值均為矩陣XXT的本征值的平方根。每一個本征值都與跟它們相關的方差是成正比的,而且所有本征值的總和等于所有點到它們的多維空間平均點距離的平方和。PCA提供了一種降低維度的有效辦法,本質上,它利用正交變換將圍繞平均點的點集中盡可能多的變量投影到第一維中去,因此,降低維度必定是失去訊息最少的方法。PCA具有保持子空間擁有最大方差的最優正交變換的特性。然而,當與離散余弦變換相比時,它需要更大的計算需求代價。非線性降維技術相對于PCA來說則需要更高的計算要求。
PCA對變量的縮放很敏感。如果我們只有兩個變量,而且它們具有相同的樣本方差,并且成正相關,那么PCA將涉及兩個變量的主成分的旋轉。但是,如果把第一個變量的所有值都乘以100,那么第一主成分就幾乎和這個變量一樣,另一個變量只提供了很小的貢獻,第二主成分也將和第二個原始變量幾乎一致。這就意味著當不同的變量代表不同的單位(如溫度和質量)時,PCA是一種比較武斷的分析方法。一種使PCA不那么武斷的方法是使用變量縮放以得到單位方差。
通常,為了確保第一主成分描述的是最大方差的方向,我們會使用平均減法進行主成分分析。如果不執行平均減法,第一主成分有可能或多或少的對應于數據的平均值。另外,為了找到近似數據的最小均方誤差,我們必須選取一個零均值。
主成分分析的屬性和限制:主成分分析的結果取決于變量的縮放。主成分分析的適用性受到由它的派生物產生的某些假設的限制。
主成分分析和信息理論:通過使用降維來保存大部分數據信息的主成分分析的觀點是不正確的。確實如此,當沒有任何假設信息的信號模型時,主成分分析在降維的同時并不能保證信息的不丟失,其中信息是由香農熵來衡量的。基于假設得x=s+n也就是說,向量x是含有信息的目標信號s和噪聲信號n之和,從信息論角度考慮主成分分析在降維上是最優的。
主成分分析(PCA)是一種能夠極大提升無監督特征學習速度的數據降維算法。更重要的是,理解PCA算法,對實現白化算法有很大的幫助,很多算法都先用白化算法作預處理步驟。假設你使用圖像來訓練算法,因為圖像中相鄰的像素高度相關,輸入數據是有一定冗余的。具體來說,假如我們正在訓練的16*16灰度值圖像,記為一個256維向量x∈R256,其中特征值xj對應每個像素的亮度值。由于相鄰像素間的相關性,PCA算法可以將輸入向量轉換為一個維數低很多的近似向量,而且誤差非常小。
選擇主成分個數:決定k值時,我們通常會考慮不同k值可保留的方差百分比。具體來說,如果k=n,那么我們得到的是對數據的完美近似,也就是保留了100%的方差,即原始數據的所有變化都被保留下來;相反,如果k=0,那等于是使用零向量來逼近輸入數據,也就是只有0%的方差被保留下來。一般而言,設λ1,λ2,…,λn表示Σ的特征值(按由大到小順序排列),使得λj為對應于特征向量uj的特征值。那么如果我們保留前k個成分,則保留的方差百分比可計算為:
以處理圖像數據為例,一個慣常的經驗法則是選擇k以保留99%的方差。對其它應用,如不介意引入稍大的誤差,有時也保留90-98%的方差范圍。
對圖像數據應用PCA算法:為使PCA算法能有效工作,通常我們希望所有的特征x1,x2,…,xn都有相似的取值范圍(并且均值接近于0)。如果你曾在其它應用中使用過PCA算法,你可能知道有必要單獨對每個特征做預處理,即通過估算每個特征xj的均值和方差,而后將其取值范圍規整化為零均值和單位方差。但是,對于大部分圖像類型,我們卻不需要進行這樣的預處理。假定我們將在自然圖像上訓練算法,此時特征xj代表的是像素j的值。所謂”自然圖像”,不嚴格的說,是指人或動物在他們一生中所見的那種圖像。
注:通常我們選取含草木等內容的戶外場景圖片,然后從中隨機截取小圖像塊(如16*16像素)來訓練算法。在實踐中我們發現,大多數特征學習算法對訓練圖片的確切類型并不敏感,所以大多數用普通照相機拍攝的圖片,只要不是特別的模糊或帶有非常奇怪的人工痕跡,都可以使用。
在自然圖像上進行訓練時,對每一個像素單獨估計均值和方差意義不大,因為(理論上)圖像任一部分的統計性質都應該和其它部分相同,圖像的這種特性被稱作平穩性(stationarity)。
具體而言,為使PCA算法正常工作,我們通常需要滿足以下要求:(1)、特征的均值大致為0;(2)、不同特征的方差值彼此相似。對于自然圖片,即使不進行方差歸一化操作,條件(2)也自然滿足,故而我們不再進行任何方差歸一化操作(對音頻數據,如聲譜,或文本數據,如詞袋向量,我們通常也不進行方差歸一化)。實際上,PCA算法對輸入數據具有縮放不變性,無論輸入數據的值被如何放大(或縮小),返回的特征向量都不改變。更正式的說:如果將每個特征向量x都乘以某個正數(即所有特征量被放大或縮小相同的倍數),PCA的輸出特征向量都將不會發生變化。
既然我們不做方差歸一化,唯一還需進行的規整化操作就是均值規整化,其目的是保證所有特征的均值都在0附近。根據應用,在大多數情況下,我們并不關注所輸入圖像的整體明亮程度。比如在對象識別任務中,圖像的整體明亮程度并不會影響圖像中存在的是什么物體。更為正式地說,我們對圖像塊的平均亮度值不感興趣,所以可以減去這個值來進行均值規整化。具體的步驟是,如果x(i)∈Rn代表16x16的圖像塊的亮度(灰度)值(n=256),可用如下算法來對每幅圖像進行零均值化操作:
?
請注意:(1)、對每個輸入圖像塊x(i)都要單獨執行上面兩個步驟;(2)、這里的μ(i)是指圖像塊x(i)的平均亮度值。尤其需要注意的是,這和為每個像素xj單獨估算均值是兩個完全不同的概念。
如果你處理的圖像并非自然圖像(比如,手寫文字,或者白背景正中擺放單獨物體),其他規整化操作就值得考慮了,而哪種做法最合適也取決于具體應用場合。但對自然圖像而言,對每幅圖像進行上述的零均值規整化,是默認而合理的處理。以上內容主要摘自:?《深度學習中文版》、維基百科、UFLDL
GitHub:?https://github.com/fengbingchun/NN_Test?
總結
以上是生活随笔為你收集整理的主成分分析(PCA)简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中extern的使用
- 下一篇: CUDA Samples: Image