【模式識別】PCA原理、推導及實現


主成分分析

主成分分析(Principal Component Analysis, PCA) 是一種線性的特征提取方法,同時也是一種線性的降維(dimensionality reduction)方法.

PCA的原理推導可以從兩方面進行\(\begin{cases} 最大化方差法 \\最小平方誤差\end{cases}\),其中最小平方誤差法是通過求解一個線性函數實現對樣本中每個點的擬合,所以設定的優化目標函數是到樣本中所有元素的距離的總和最小;最大化方差法就是找到一組基向量,使得當原數據變換到以該組基向量組成的坐標中時可以保留最多的原始信息,而原始信息的多少是通過方差來衡量。

下文通過最大化方差法來推導步驟和原理。

1.前提知識:矩陣的線性變換

以坐標(1,1)(2,2)(3,3)為例,若將這三個數據點變換到以(\(\frac 1{\sqrt{2}},\frac 1{\sqrt{2}}\))(\(-\frac {1}{\sqrt{2}},\frac {1}{\sqrt{2}}\))為基的坐標中,則相應的坐標該是多少?(這種也叫在新的基空間中的投影值是多少?)

在原坐標空間中,基底是(1,0)(0,1),所以這幾個數據點的坐標表示如下:

\[\begin{pmatrix} 1&0\\ 0&1\end{pmatrix}\begin{pmatrix} 1&2&3\\1&2&3\end{pmatrix}=\begin{pmatrix} 1&2&3\\1&2&3\end{pmatrix} \]

當空間的基底變為(\(\frac 1{\sqrt{2}},\frac 1{\sqrt{2}}\))(\(-\frac {1}{\sqrt{2}},\frac {1}{\sqrt{2}}\))時,則原數據點的坐標在此空間中可以表示為:

\[\begin{pmatrix} \frac 1{\sqrt{2}}&-\frac 1{\sqrt{2}}\\ \frac 1{\sqrt{2}}&\frac 1{\sqrt{2}}\end{pmatrix}\begin{pmatrix} 1&2&3\\1&2&3\end{pmatrix}=\begin{pmatrix} 0&0&0\\\frac 2{\sqrt{2}}&\frac 4{\sqrt{2}}&\frac 6{\sqrt{2}}\end{pmatrix} \]

從上述的計算可以看出,某原始數據點(用列向量表示)左乘一個基矩陣(用行向量表示),所得結果就是原始數據點在新的基坐標空間中的坐標表示(用列向量表示)或者叫投影值。

其實用向量內積來看的話,某數據點向量(坐標)與空間中的基向量分別作內積,則與每一個基向量都會得到一個內積的標量,而把這幾個標量組合起來表示成向量形式,就是該數據點在這個基向量空間中的坐標表示(投影)

將以上形式推廣,若有m個數據向量(列向量),有n個基向量,則這m個數據向量在這n個基向量的空間中的坐標表示(投影值)可以這樣計算:

\[\begin{pmatrix} K_1\\ K_2\\K_3\\\vdots\\K_n\end{pmatrix}\begin{pmatrix}P_1& P_2&P_3&\cdots&P_m \end{pmatrix}=\begin{pmatrix} K_1P_1&K_1P_2&\cdots&K_1P_m\\ K_2P_1&K_2P_2&\cdots&K_2P_m\\K_3P_1&K_3P_2&\cdots&K_3P_m\\\vdots&\vdots&\ddots&\vdots\\K_nP_1&K_nP_2&\cdots&K_nP_m\end{pmatrix}=A \]

若將上述計算所得矩陣記為A,則m個數據在新的n維空間中的坐標(投影)為矩陣A的列向量。

由上述也可以得到矩陣相乘的物理解釋:兩個矩陣相乘的意義是就是將右邊矩陣中的每一個列向量變換到左邊矩陣中以每一行行向量為基所表示的空間中去,也即矩陣乘法就是一種線性變換。

上述的矩陣相乘是一種線性變換,如果將左乘的基矩陣的基的個數減少,那么將原數據變換到該空間時,相應的 維數也會減少,這就是降維。注意:這里的減少基的個數是將Ki減少,而不是將Ki所代表的行向量的維數減少,要是行向量的維數減少了那就不能和原數據作內積了。

2.PCA算法推導

  • 問題的提出:減少哪幾個基可以使數據盡可能多的保留原始信息?或者用什么來衡量原始信息保留的多少?

  • 在最大可分性中,用原數據左乘基矩陣后所得新的坐標數據(即投影值)的分散程度來表示。我們希望投影(線性變換)后的投影值可以盡可能的分散,因為要是有投影值(坐標值)重合了,那就代表着該數據點的信息被重復表示了,浪費掉了。從信息熵角度來看,就是熵越大,數據所含的信息也就越多。

  • 那么用什么來表示數據的分散程度呢?

    • 單個向量可以用方差來表示,多個向量可以用協方差來表示。有關方差和協方差細節見【方差\協方差\協方差矩陣】小節。

      當協方差為0的時候,也即表示兩個變量之間不相關。在PCA降維時,就是選擇幾個基,當原始數據變換到該組基上時,使得各變量之間的協方差為零而變量自身的方差卻很大。為了讓協方差為0,選擇第二個基的時候,與第一個基正交,第三個與第二個正交,這樣兩兩正交的基,最后的相關性就是0。

      綜上,如果要使某n維向量數據降維為一維,也即要找到一個基向量,那么就應該找到那個使得投影值的方差最大的基向量;如果要使某n維向量數據降維為k維,也即要找到k個基向量,那么就應該找到使得協方差矩陣中對角線上元素值最大,並且其他位置元素為零的k個基向量,因為協方差對角線上的元素就是投影后數據自己的方差,要保證最大,這樣才可以盡可能多的表示原始數據信息,而其他位置的元素都是與其他向量之間的協方差要為零,因為不為零的話,兩個向量之間相關,有重復表示的信息。

下面在計算協方差等時,是已經零均值化了的,零均值化問題見【方差\協方差\協方差矩陣】

記原始數據矩陣為P,記我們要尋找的一組基向量組成的矩陣為K,記將原始數據P經過矩陣K降維后所得投影矩陣為X,即X=KP。而我們所希望的使協方差矩陣對角線上的元素最大化,其余位置元素為0的協方差矩陣,就是投影后的矩陣X的協方差矩陣cov(X),而\(cov(X)=\frac 1{m-1}XX^T(零均值化后)\)所以我們的優化目標就是使得矩陣\(\frac 1{m-1}XX^T\)的非對角元素為0,對角線上元素從大到小的排列

  • 那么什么樣的矩陣K與原始數據矩陣P相乘得到的X的協方差可以有這樣的效果呢?
    • 記原始數據矩陣P的協方差為cov(P),則有\(cov(P)=\frac 1{m-1}PP^T\),看下面的推導:

\[ \begin{aligned} cov(X)&=\frac 1{m-1}XX^T\\ & =\frac 1{m-1}KP(KP)^T \\ & =\frac 1{m-1}KPP^TK^T\\ & =K\frac 1{m-1}PP^TK^T\\ & = Kcov(P)K^T \\ \end{aligned} \]

如上所見,我們要找的由基向量組成的矩陣K,就是使原數據的協方差矩陣變為投影后數據的協方差矩陣的變換矩陣。而投影后矩陣的協方差我們所期望的是,它的非對角元素全為零,對角線元素的值從大到小的排列(因為我們選出的基向量要使得投影后數據的方差盡可能的大嘛,而對角線元素就是方差)。故我們要找的矩陣K就是要使協方差矩陣cov(P)對角化,並且使對角線元素按從大到小的順序排列的矩陣。即我們可直接求出協方差矩陣cov(P)的特征值和特征向量,由它的特征值組成的矩陣就是一個對角陣,而對應的特征向量即可作為變換矩陣K。所以有下面的分解因為協方差矩陣cov(P)是實對稱矩陣,所以根據【特征值分解】就有正交矩陣Q和對角矩陣\(\Lambda\)使得式

\[\Lambda=Q^Tcov(P)Q \]

成立,其中的Q就是由協方差矩陣cov(P)求出的特征向量組成的矩陣,\(\Lambda\)為由特征值組成的對角矩陣。故選擇k個基向量,就是選擇矩陣cov(P)的最大的幾個特征值對應的特征向量。 所以有如下步驟。

3.PCA算法步驟

設原始數據有m條,每條數據有n個特征,則可以得到PCA降維的算法步驟:

  1. 輸入要降維的原始數據矩陣P,行為n(特征個數),列為m(樣本個數);
  2. 計算每一行的均值,組合成向量\(\mu\);[注意對於矩陣P來說,它的每一行都是不同的樣本對應的相同位置的特征,我們求均值時,是求相同特征類型的均值,而不是求某一個樣本的所有特征的均值,這一點在[方差\協方差\協方差矩陣]小節有說明.總的來說我們就是要求協方差矩陣,而求協方差矩陣就要這樣求特征的均值,而不是樣本的均值]
  3. 求取協方差矩陣\(cov(P)=\frac 1{m-1}(P-\hat\mu)(P-\hat\mu)^T\);(若已經零均值化了,則不用減去均值,看下文補充)
  4. 求協方差矩陣cov(P)的特征值和特征向量;
  5. 將所求出的特征向量單位化,並將特征向量根據其所對應的特征值的大小按從大到小排序;
  6. 選取前k個特征值對應的特征向量組成矩陣K;
  7. \(X=K^T(P-\hat\mu)\)即為降為k維后的數據。(選出的特征向量的個數即為降維后的維數,由矩陣的線性變化那部分知識知道,數據矩陣P要和特征向量相乘,所以要轉置K)

補充:未零均值化的協方差計算:具體的也可看【方差\協方差\協方差矩陣】

\[設P=\begin{pmatrix}P_{11}& P_{12}&\cdots&P_{1m}\\ P_{21}&P_{22}&\cdots&P_{2m}\\ \vdots&\vdots&&\vdots\\ P_{n1}&P_{n2}&\cdots&P_{nm}\end{pmatrix} =\begin{pmatrix}P_{1}\\ P_{2}\\ \vdots\\ P_{n}\end{pmatrix}  設\hat\mu=\begin{pmatrix}\mu_{1}&\mu_{1}&\cdots&\mu_{1}\\ \mu_{2}&\mu_{2}&\cdots&\mu_{2}\\ \vdots&\vdots&&\vdots\\ \mu_{n}&\mu_{n}&\cdots&\mu_{n}\end{pmatrix}\\ 則計算協方差矩陣,cov(P)=\frac 1{m-1}(P-\hat\mu)(P-\hat\mu)^T\\ =\frac1{m-1}\begin{pmatrix}P_{11}-\mu_1& P_{12}-\mu_1&\cdots&P_{1m}-\mu_1\\ P_{21}-\mu_2&P_{22}-\mu_2&\cdots&P_{2m}-\mu_2\\ \vdots&\vdots&&\vdots\\ P_{n1}-\mu_n&P_{n2}-\mu_n&\cdots&P_{nm}-\mu_n\end{pmatrix}\begin{pmatrix}P_{11}-\mu_1& P_{21}-\mu_2&\cdots&P_{n1}-\mu_n\\ P_{12}-\mu_1&P_{22}-\mu_2&\cdots&P_{n2}-\mu_n\\ \vdots&\vdots&&\vdots\\ P_{1m}-\mu_1&P_{2m}-\mu_2&\cdots&P_{nm}-\mu_n\end{pmatrix}\\ =\frac1{m-1}\begin{pmatrix}\sum_{i=1}^m(P_{1i}-\mu_1)(P_{1i}-\mu_1)&\sum_{i=1}^m(P_{1i}-\mu_1)(P_{2i}-\mu_2)&\cdots&\sum_{i=1}^m(P_{1i}-\mu_1)(P_{ni}-\mu_n)\\\sum_{i=1}^m(P_{2i}-\mu_2)(P_{1i}-\mu_1)&\sum_{i=1}^m(P_{2i}-\mu_2)(P_{2i}-\mu_2)&\cdots&\sum_{i=1}^m(P_{2i}-\mu_2)(P_{ni}-\mu_n)\\ \vdots&\vdots&&\vdots\\\sum_{i=1}^m(P_{ni}-\mu_n)(P_{1i}-\mu_1)&\sum_{i=1}^m(P_{ni}-\mu_n)(P_{2i}-\mu_2)&\cdots&\sum_{i=1}^m(P_{ni}-\mu_n)(P_{ni}-\mu_n) \end{pmatrix}\\ =\begin{pmatrix}cov(P_1,P_1)&cov(P_1,P_2)&\cdots&cov(P_1,P_n)\\ cov(P_2,P_1)&cov(P_2,P_2)&\cdots&cov(P_2,P_n)\\\vdots&\vdots&\ddots&\vdots\\ cov(P_n,P_1)&cov(P_n,P_2)&\cdots&cov(P_n,P_n)\end{pmatrix} \]

4.PCA的一些補充

總的來說,PCA就只需要計算訓練樣本的協方差矩陣的特征值和特征向量,然后由這些特征向量得到一組基向量構成新的坐標系,然后將特征向量在這些基向量上投影即可達到降維的目的。

  • 協方差矩陣計算得到的特征值和特征向量都是實數嗎?要是有復數怎么比大小?
    • 因為協方差矩陣是一個實對稱矩陣,所以特征值都是實數,並且由於協方差矩陣是半正定矩陣,所以其所有的特征值都是大於等於0的實數,其特征向量也是實數。此外,上文也提到了,在選擇基向量(也即后文中的特征向量)的時候,為了讓協方差非對角元素為零,所以第一個基向量與第二個正交,以此類推,選的所有的基向量是兩兩正交的,也即最后的K矩陣是個正交矩陣。(或者說,相同特征值對應的特征向量可以正交化處理,所以是正交的),也即由主成分分析法得到的新的坐標系是一個直角坐標系。
  • 如果將所有的特征向量都選上了,那么經過PCA變換就沒了降維,但是還仍有去除相關性的方法,因為PCA變換后的數據的協方差是一個對角陣。所以說經過PCA變換就會消除樣本集在各個特征之間的相關性。

  • 用降維后的數據還原原始數據:

    • 由上文也可以知道,最后我們選好的基矩陣K是一個正交矩陣,所以從變換\(X=K^T(P-\hat\mu)\)求出P為:

\[ K^TP-K^T\hat\mu=X\\ K^TP=X+K^T\hat\mu\\ P=K(X+K^T\hat\mu) =KX+\hat\mu \]

  • PCA降維,降到多少維度才合適?
    • 因為投影值的方差等於特征值,所以當一個特征值為0,那么它所對應的特征向量在保持原始數據的分布信息方面完全不起作用。同理,當特征值也非常小的時候,我么也有認為該特征向量起的作用也很小,所以,為了保留一個合理的比例的方差,常用的經驗法則是:若累計的特征值之和超過所有的特征值之和的90%,那么就在此停止。有時也用0.85和0.95.

5.PCA的MATLAB實現

function [new_data,check] = PCA(data,dimension)
%% PCA降維和去相關性的實現
%輸入:data為要降維的數據矩陣,行應該為特征個數,列為樣本個數;
       %dimension為要降到多少維度,降得維度一般為保持求出的特征值之和的90%;
%輸出:輸出new_data為降維后的數據;
       %輸出check為降維后的數據的協方差矩陣,計算所得應該是個對角陣,用來檢查計算過程的准確性;
%%
%計算均值,注意是計算行向量的均值
[row,column]=size(data);
mu=zeros(row,1);
for i=1:row
    mu(i)=mean(data(i,:));
end

%減去均值,data_mu代表零均值后的數據
data_mu=zeros(row,column);
for i=1:row
    for j=1:column
        data_mu(i,j)=data(i,j)-mu(i);
    end
end

%計算協方差矩陣,cov_data為零均值后的數據的協方差矩陣
cov_data=(data_mu*data_mu')/(length(data_mu)-1);
%計算協方差矩陣的特征值與特征向量
[eigenvector,eigenvalue]=eig(cov_data);%eigenvector,eigenvalue分別為特征向量(列)和特征值
%按照特征值從大到小的順序排列,選出對應的特征向量
[~,index]=sort(diag(eigenvalue),'descend');
basevector=eigenvector(:,index(1:dimension));
%則可以得到降維后的數據new_data
new_data=basevector'*data_mu;
%計算一下降維后的數據的協方差是不是對角陣
check=cov(new_data');
end


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM