PCA降维简介
PCA全稱為principal component analysis,即主成成分分析,用于降維。對數據進行降維有很多原因。比如:
?????? 1:使得數據更易顯示,更易懂
?????? 2:降低很多算法的計算開銷
?????? 3:去除噪聲
一:基本數學概念
1:方差
均值太簡單了,不說了。方差是各個數據分別與其和的平均數之差的平方的和的平均數,用字母D表示。計算公式如下:
? (少了個平方)
 
?其中x-為均值,也可以表示為EX,則方差計算又可寫成:
 
2:協方差及協方差矩陣
協方差用于衡量兩個變量的總體誤差情況,可以說方差是協方差的一種特殊情況,即當兩個變量是相同的情況
計算公式:
 
而協方差矩陣是一個矩陣,其每個元素是各個向量元素之間的協方差。是從標量隨機變量到高維度隨機變量的自然推廣。
計算公式:
 
二:PCA的概念簡介
主成分分析?(?Principal ComponentAnalysis,?PCA)或者主元分析。是一種掌握事物主要矛盾的統計分析方法,它可以從多元事物中解析出主要影響因素,揭示事物的本質,簡化復雜的問題。計算主成分的目的是將高維數據投影到較低維空間。給定n個變量的?m?個觀察值,形成一個m*n的數據矩陣,?n通常比較大。對于一個由多個變量描述的復雜事物,人們難以認識,那么是否可以抓住事物主要方面進行重點分析呢?如果事物的主要方面剛好體現在幾個主要變量上,我們只需要將這幾個變量分離出來,進行詳細分析。但是,在一般情況下,并不能直接找出這樣的關鍵變量。這時我們可以用原有變量的線性組合來表示事物的主要方面,?PCA就是這樣一種分析方法。
PCA?主要用于數據降維,對于一系列例子的特征組成的多維向量,多維向量里的某些元素本身沒有區分性,比如某個元素在所有的例子中都為1,或者與1差距不大,那么這個元素本身就沒有區分性,用它做特征來區分,貢獻會非常小。所以我們的目的是找那些變化大的元素,即方差大的那些維,而去除掉那些變化不大的維,從而使特征留下的都是“精品”,而且計算量也變小了。
一個簡單的例子:
??????對于一個訓練集,100個對象模板,特征是10維,那么它可以建立一個100*10的矩陣,作為樣本。求這個樣本的協方差矩陣,得到一個10*10的協方差矩陣,然后求出這個協方差矩陣的特征值和特征向量,應該有10個特征值和特征向量,我們根據特征值的大小,取前四個特征值所對應的特征向量,構成一個10*4的矩陣,這個矩陣就是我們要求的特征矩陣,100*10的樣本矩陣乘以這個10*4的特征矩陣,就得到了一個100*4的新的降維之后的樣本矩陣,每個特征的維數下降了。
??????當給定一個測試的特征集之后,比如1*10維的特征,乘以上面得到的10*4的特征矩陣,便可以得到一個1*4的特征,用這個特征去分類。
??????以上概念均來自于百度百科—解釋的非常清楚。
三:PCA在matlab中的計算
??????這部分主要如何在matlab中對數據進行降維,主要包括兩種方法,傳統步驟為先求該矩陣(m*n)的協方差矩陣,然后求出協方差矩陣的特征值和特征向量,此時用原數據乘以特征向量就可以實現降維了。另外一種方法就是通過奇異值分解進行求解,這也是Andrew Ng的教學視頻求解方法。這兩種方法本質上是一樣的。
??????一般情況下,對于給定的樣本數據,我們需要對數據進行mean normalization and feature scaling.這里我們先利用matlab函數進行pca操作而不進行數據預處理,之后再介紹數據預處理方法和利用預處理后的數據進行降維處理。
1:Matlab中函數描述:<來自百度百科>
COEFF = princomp(X)performs principalcomponents analysis (PCA) on the n-by-p data matrix X, and returns theprincipal component coefficients, also known as loadings. Rows of X correspondto observations, columns to variables. COEFF is a p-by-p matrix, each columncontaining coefficients for one principal component. The columns are in orderof decreasing component variance.
在n行p列的數據集X上做主成分分析。返回主成分系數。X的每行表示一個樣本的觀測值,每一列表示特征變量。COEFF是一個p行p列的矩陣,每一列包含一個主成分的系數,列是按主成分變量遞減順序排列。(按照這個翻譯很難理解,其實COEFF是X矩陣所對應的協方差陣V的所有特征向量組成的矩陣,即變換矩陣或稱投影矩陣,COEFF每列對應一個特征值的特征向量,列的排列順序是按特征值的大小遞減排序)
princomp centers X by subtracting off column means, but does notrescale the columns of X. To perform principal components analysis withstandardized variables, that is, based on correlations, useprincomp(zscore(X)). To perform principal components analysis directly on acovariance or correlation matrix, use pcacov.
計算PCA的時候,MATLAB自動對列進行了去均值的操作,但是并不對數據進行規格化,如果要規格化的話,用princomp(zscore(X))。另外,如果直接有現成的協方差陣,用函數pcacov來計算。<這里的規格化我們在后面介紹>
[COEFF,SCORE] = princomp(X)returnsSCORE, the principal component scores; that is, the representation of X in theprincipal component space. Rows of SCORE correspond to observations, columns tocomponents.
返回的SCORE是對主分的打分,也就是說原X矩陣在主成分空間的表示。SCORE每行對應樣本觀測值,每列對應一個主成份(變量),它的行和列的數目和X的行列數目相同。(SCORE就是原數據集減去均值然后再乘以特征向量后的結果,即我們需要的數據)
[COEFF,SCORE,latent] = princomp(X)returnslatent, a vector containing the eigenvalues of the covariance matrix of X.
返回的latent是一個向量,它是X所對應的協方差矩陣的特征值向量。
[COEFF,SCORE,latent,tsquare] = princomp(X)returns tsquare, which contains Hotelling's T2 statistic foreach data point.
返回的tsquare,是表示對每個樣本點Hotelling的T方統計量(我也不很清楚是什么東東)。
The scores are the data formed by transforming the original datainto the space of the principal components. The values of the vector latent arethe variance of the columns of SCORE. Hotelling's T2 is a measure of themultivariate distance of each observation from the center of the data set.
所得的分(scores)表示由原數據X轉變到主成分空間所得到的數據。latent向量的值表示SCORE矩陣每列的方差。Hotelling的T方是用來衡量多變量間的距離,這個距離是指樣本觀測值到數據集中心的距離。
When n <= p, SCORE(:,n:p) and latent(n:p) are necessarilyzero, and the columns of COEFF(:,n:p) define directions that are orthogonal toX.
[...] = princomp(X,'econ')returnsonly the elements of latent that are not necessarily zero, and thecorresponding columns of COEFF and SCORE, that is, when n <= p, only thefirst n-1. This can be significantly faster when p is much larger than n.
當維數p超過樣本個數n的時候,用[...] = princomp(X,'econ')來計算,這樣會顯著提高計算速度(比如當樣本數為10,n為30000時,此時得到的協方差矩陣為30000*30000,計算速度會非常慢,用此函數會快很多)
(1):舉例
[plain]?view plaincopyprint?
 
 
[plain]?view plaincopyprint?
(2):降維數目k的確定
我們一般需要計算特征向量的貢獻率來確定最終降維的數目k,貢獻率即最前面的k個特征值所占的比重大于90%(不是定值)以上即可。Matlab中使用以下函數
[plain]?view plaincopyprint??
2:數據預處理
一般的樣本數據差異都很大,因此對結果的影響很大。因此一般都需要對數據進行meannormalization and feature scaling.以下為數據預處理的兩種常用方法
?
(1)min-max標準化(Min-Max Normalization)
也稱為離差標準化,是對原始數據的線性變換,使結果值映射到[0 - 1]之間。轉換函數如下:
其中max為樣本數據的最大值,min為樣本數據的最小值。這種方法有個缺陷就是當有新數據加入時,可能導致max和min的變化,需要重新定義。
?
(2)Z-score標準化方法
這種方法給予原始數據的均值(mean)和標準差(standard deviation)進行數據的標準化。經過處理的數據符合標準正態分布,即均值為0,標準差為1,轉化函數為:
其中mu為所有樣本數據的均值,sigm為所有樣本數據的標準差。
對于Z-score標準化方法,matlab中直接使用zscore(X)就可以返回X-score預處理的結果。min-max歸一化:mapminmax(X,0, 1);?這樣就可以了。(mapminmax是版本的一個bug,建議自己寫代碼)。
如:
[plain]?view plaincopyprint?3:pca的計算方法——針對Z-score標準化的結果
這里特地針對的是Z-score歸一化的結果,因為Z-score歸一化后數據的均值為0,此時我們發現用princomp和svd得到的結果是一樣的。
(1).直接將上面改為[pc,score, latent, tsquare]princomp(zscore(ingredients));注意這里的score為直接使用zscore(ingredients)*pc得到的結果,沒有減去均值了。(不適合mapminmax歸一化)
 
(2)奇異值分解(svd)
奇異值分解,也是先求數據集的協方差,然后用svd對協方差進行分解,其中S即為特征向量,V即為特征值。
[plain]?view plaincopyprint?上面求得的結果是一樣的。
按照奇異值分解的定義,S是cov_ingredients_svd*cov_ingredients_svd‘的特征向量,但我們也會發現其是X'*X的特征向量(怎么證明見下面鏈接),D是S的轉置。。。。
當然我們可以直接[s,v,d]=svd(X) 得到的d就是X’*X的特征向量。你還會發現其實現在的V就是主方向上的向量表示Xrot = X*S所對應的協方差矩陣,且是對角矩陣
詳細見:http://blog.csdn.net/lu597203933/article/details/46423711
注意:這里svd針對的z-score歸一化的結果,其實不歸一化,得到特征值、特征向量與用princomp(ingredients)得到的結果也是一樣的。這里采用z-score只是仿造了Andrew Ng的結果。
當數據滿足Z-score歸一化時:
用得到的結果就是協方差。
4:降維結果
對于數據源X為m*n的矩陣,其中m為樣本數,n為特征數,此時我們保留特征向量pc或者S的前k列,然后使用X乘以它就將X變為了m*k列了。即Ureduce=U(:,1:k);Z = X*Ureduce
5:重構
由于U是正定矩陣,即ATA=E,所以Xapprox=Z*UreduceT(UreduceT為Ureduce的轉置)
?
注意:(1)一般來說,PCA降維后的每個樣本的特征的維數,不會超過訓練樣本的個數,因為超出的特征是沒有意義的。
因為降維其實就是轉換到其他的樣本空間重新表示特征, 對于30個樣本, 29個維度已經足以表示所有的30個樣本, 這樣的話用29個維度和80個維度, 理論上來說沒有區別,因為后邊的超過30的維度都是浪費的。
 
(2)如果你需要對測試樣本降維,一般情況下,使用matlab自帶的方式,肯定需要對測試樣本減去一個訓練樣本均值,因為你在給訓練樣本降維的時候減去了均值,所以測試樣本也要減去均值,然后乘以coeff這個矩陣,就獲得了測試樣本降維后的數據。比如說你的測試樣本是1*1000000,那么乘上一個1000000*29的降維矩陣,就獲得了1*29的降維后的測試樣本的降維數據。
此外:PCA的變換矩陣是協方差矩陣,K-L變換的變換矩陣可以有很多種(二階矩陣、協方差矩陣、總類內 ...),所以PCA變換是一種特殊的K-L變換
參考文獻:
1:百度百科:方差:http://baike.baidu.com/view/172036.htm?
協方差:http://baike.baidu.com/view/121095.htm?fr=aladdin
協方差矩陣:http://baike.baidu.com/view/1304423.htm?fr=aladdin
pca:http://baike.baidu.com/view/852194.htm
2:數據歸一化:
(1)http://www.cnblogs.com/chaosimple/archive/2013/07/31/3227271.html
(2)http://blog.csdn.net/memray/article/details/9023737
3:http://blog.csdn.net/watkinsong/article/details/8234766?PCA降維算法總結以及matlab實現PCA(個人的一點理解)
4:http://blog.csdn.net/watkinsong/article/details/38536463?PCA降維算法詳解以及代碼示例
總結
 
                            
                        - 上一篇: 2D-PCA
- 下一篇: LDP (Local Derivativ
