線性降維:主成分分析PCA原理分析與仿真驗證


鶯嘴啄花紅溜,燕尾點波綠皺。
指冷玉笙寒,吹徹小梅春透。
依舊,依舊,人與綠楊俱瘦。
——《如夢令·春景》 秦觀

1、背景

隨着信息技術的發展,數據量呈現爆照式增長,高維海量數據給傳統的數據處理方法帶來了嚴峻的挑戰,因此,開發高效的數據處理技術是非常必要的。數據降維是解決維度災難的一種有效方法,之所以對數據進行降維是因爲:

  1. 在原始的高維空間中,包含有冗餘信息以及噪音信息,在實際應用例如圖像識別中造成了誤差,降低了準確率;而通過降維,我們希望減少冗餘信息所造成的誤差,提高識別(或其他應用)的精度。
  2. 希望通過降維算法來尋找數據內部的本質結構特徵。

主成分分析(Principal Component Analysis,PCA)是一種常見的線性降維方法,廣泛應用於圖像處理、人臉識別、數據壓縮、信號去噪等領域。

2、算法思想與原理

設原數據大小爲 N×MN\times M ,經過PCA降維後的數據大小爲 N×KN \times K,其中 K<MK<M
PCA的中心思想是:將高維數據投影到具有最大方差的低維空間中

2.1 從不同角度理解PCA

PCA原理可以從不同角度來理解:

  1. 從空間變換的角度來看,這裏我們把 NN 稱爲數據維度,MM 稱爲原子個數,因此,PCA也可以直白的理解爲將 NN 維空間中相關性較大的 MM 個原子組成的空間壓縮成相關性最小的 KK 個原子組成的空間。
  2. 從分類的角度來看,這裏我們把 NN 稱爲樣本數量,MM 稱爲樣本類數,因此,PCA也可以普通的理解爲將 MM 個樣本類別重新整理成具有最大區分度的 KK 個類別。
  3. 從信號表示的角度來看,這裏我們把 NN 稱爲單個信號長度,MM 稱爲信號數量,因此,PCA也可以粗略的理解爲將 MM 個很相似的信號通過適當的投影(或者說變換\映射)用 KK 個信號來簡單的表示原來的。就比如說一隻貓的叫聲爲“喵喵喵~”,另一隻貓的叫聲也爲“喵喵喵~”,雖然他們的叫聲會存在一定的差異,但是對於人類來說幾乎是一樣的,這兩隻貓發出的聲音信號可以直接用一個信號來表示。
  4. 從特徵提取的角度來說,這裏我們把 NN 稱爲數據維度,MM 稱爲特徵數量,因此,PCA也可以近似的理解爲將數據集中 MM 個特徵用 KK 個特徵來表示,其中去掉的 MKM-K 個特徵是無關緊要的。

2.2 PCA直觀思想

爲了方便理解,下面以一個具體實例來說明PCA的這種思想。
假設某地的房子面積和總價在理想情況下符合如下正比關係:

表1. 理想房子面積與總價關係

這些數據在二維平面中可以表示爲:

圖1. 理想房子面積與總價關係

然而在實際中並非如此,由於各種原因總會產生一些波動,有可能會是如表2所示的關係。

表2. 實際房子面積與總價關係

同樣的,這些數據在二維平面中可以表示爲:

圖2. 實際房子面積與總價關係

若把表一中的數據當作一個矩陣來看,就變成:

表3. 表1中數據的矩陣形式

從表1中的數據來看,在理想情況下,房子面積和總價符合正比關係,也就是說房子面積和總價具有很大的相關性,若把它當成一個 2×52\times 5 的矩陣的話,它的秩爲1,這說明用表1中的10個數據來描述房子面積和總價的這種關係顯得有些冗餘,我們只需要一行數據(55個)就可以描述清楚這種關係。在實際情況中,表2中的兩行數據雖然不滿足完全的正比關係,但是它們也非常接近正比關係,因此,他們之間的相關性也是非常大的。那麼我們如何將 X\bm{X} 中的數據用一行數(也就是從二維降到一維)來表示呢?由前面相關性分析可知,應該是要進行“去相關性”操作,也就是要使兩行數據通過一個變換,使其相關性變小。

數學裏通常用方差和協方差來描述數據的相關性,方差定義如下:
Var(x)=1Ni=1N(xiE(x))2Var({\bm{x}}) = \frac{1}{N}\sum\limits_{i = 1}^N {{{\left( {{x_i} - E({\bm{x}})} \right)}^2}}

其中 E(x)=1Ni=1N(xi)E({\bm{x}}) = \frac{1}{N}\sum\limits_{i = 1}^N {\left( {{x_i}} \right)}爲向量 x\bm{x} 的期望。

很明顯,方差是描述一個向量(維度)內數據的分散程度(相關性)的度量,若如果數據是像表3一樣的矩陣形式呢?那麼就用協方差來描述數據之間的相關性:

Cov(x,y) = 1Ni=1N(xi E(x))(yiE(y))=E[(xE(x))(yE(y))Cov( \bm{x},\bm{y}) \ =\ \frac{1}{N}\sum ^{N}_{i=1}( x_{i} \ -E(\bm{x}))( y_{i} -E(\bm{y})) =E[( \bm{x}-E(\bm{x}))( \bm{y}-E(\bm{y}))

數量高於2個的 NN 維數據通常用協方差矩陣來表示:

C =(cov(x,x)cov(x,y)cov(y,x)cov(y,y)) \bm{C}\ =\begin{pmatrix} cov(\bm{x},\bm{x}) & cov( \bm{x},\bm{y})\\ cov( \bm{y},\bm{x}) & cov( \bm{y},\bm{y}) \end{pmatrix}

假設數據已經經過中心化處理,數據矩陣 X\bm{X} 的協方差矩陣就可以寫成:

CX =(cov(X1,X1)cov(X1,X2)cov(X2,X1)cov(X2,X2)) \bm{C_{\bm{X}}}\ =\begin{pmatrix} cov(\bm{X}_{1},\bm{X}_{1}) & cov(\bm{X}_{1},\bm{X}_{2})\\ cov( \bm{X}_{2},\bm{X}_{1}) & cov( \bm{X}_{2},\bm{X}_{2}) \end{pmatrix}

其中,X1\bm{X}_{1}X2\bm{X}_{2} 分別爲 X\bm{X} 的第一行和第二行。
在這個例子中,協方差具體表示什麼意義呢?

圖3. 協方差的意義

如圖3所示,將各個數據點分別對橫軸和縱軸做投影,其中綠色線與橫軸的交點爲數據在橫軸上的投影,藍線與縱軸的交點爲數據在縱軸上的投影。那麼橫軸上交點的分散程度(方差)就對應了 C\bm{C} 中的 cov(x,x)cov(\bm{x},\bm{x}),而縱軸上的交點的分散程度就對應了 C\bm{C} 中的 cov(y,y)cov(\bm{y},\bm{y})cov(y,xcov( \bm{y},\bm{x} 則表示 x\bm{x}y\bm{y} 之間的相關程度。

那麼由PCA的中心思想:將高維數據投影到具有最大方差的低維空間中,我們就可以知道只要將數據投影到方差最大的低維(KK 維)空間中就行,那麼如何找到方差最大的低維空間呢?如圖4所示,數據不僅可以投影到橫軸和縱軸,還可以360度旋轉,投影到任何直線(1維空間)上,對於圖4中的 pc1pc1 方向和 pc2pc2 方向,可以直觀的看出來肯定要投影到 pc1pc1 方向要好一點,因爲投影之後的數據點更分散。

數據投影到一個維度越分散在一定程度上就說明兩類數據的相關性越小,這就指導我們一條思路:只需要將 CX\bm{C_{\bm{X}}} 中的兩個協方差 cov(X1,X2)cov(\bm{X}_{1},\bm{X}_{2})cov(X2,X1)cov(\bm{X}_{2},\bm{X}_{1}) 變成0就可以了,這就意味着將 CX\bm{C_{\bm{X}}} 變成對角矩陣就行了。

圖4. 如何選擇投影方向?

我們發現 CX\bm{C_{\bm{X}}} 是一個對稱矩陣,自然就會想到特徵值分解。

CX\bm{C_{\bm{X}}}M\bm{M} 階對稱矩陣,則必有正交矩陣 P\bm{P}使得:
P1CXP=PTCXP=Λ{{\bm{P}}^{ - 1}}{{\bm{C}}_{\bm{X}}}{\bm{P}} = {{\bm{P}}^{\rm T}}{{\bm{C}}_{\bm{X}}}{\bm{P}} = {\bm{\Lambda }}
其中 Λ\bm{\Lambda } 是以 CX\bm{C_{\bm{X}}}M\bm{M} 個特徵值爲對角元

因此我們只要找到這個正交矩陣 P\bm{P} 和它對應的特徵值,然後取前 KK 個最大的特徵值及其對應的特徵向量就可以了,這實際上就是進行特徵值分解:
CX=PTΛP{{\bm{C}}_{\bm{X}}} = {{\bm{P}}^{\rm T}}{\bm{\Lambda P}}

當然也可以通過奇異值分解來解決問題:
CX=UΣV{{\bm{C}}_{\bm{X}}} = {\bm{U\Sigma V}}

經過奇異值分解後得到的 Σ\bm{\Sigma} 中最大的 KK 個奇異值及其對應的 U\bm{U} 中的 KK 個列向量組成的矩陣就是變換矩陣。如果用右奇異矩陣 U\bm{U} 的話就是對 X\bm{X} 的列進行降維了。

求協方差矩陣 CX=XXT{{\bm{C}}_{\bm{X}}} = {{\bm{X}}}{\bm{X}^{\rm T}} (這裏實際上是散度矩陣,是協方差矩陣的 N1N-1 倍)的複雜度爲 O(MN2)O\left( {M{N^2}} \right),當數據維度過大時,還是很耗時的,此時用奇異值分解有一定的優勢,比如有一些SVD的實現算法可以先不求出協方差矩陣也能求出右奇異矩陣 V\bm{V},也就是說,PCA算法可以不用做特徵分解而是通過SVD來完成,這個方法在樣本量很大的時候很有效。

至於爲什麼協方差矩陣經過特徵值(奇異值)分解後前 KK 個最大特徵值對應的分量就是方差最大的 KK 維空間呢?這裏給出一個簡單的理解方法,數學證明就不貼出來了。KK 個特徵值與KK 個特徵向量構成了一個 KK 維空間,而特徵值正是衡量每一維空間所佔的分量的,特徵值越大,說明這一維度所包含的信息量越大,權重就越大。前 KK 個最大特徵值組成的空間當然是權重最大的,從而矩陣 X\bm{X} 投影到這 KK 維空間中足夠分散,也就是說方差足夠大。

2.3 PCA的理論推導

這裏引用一下

這裏是引用主成分分析(PCA)原理總結這篇博客的證明。

1

2.4 PCA實例求解

還是以某地房子面積與總價的問題作爲例子來總結PCA算法步驟。

步驟1. 數據去中心化:

步驟2:計算散度矩陣(協方差矩陣)

步驟3:對協方差矩陣進行特徵值(奇異值分解):

步驟4:取最大的 KK 個特徵值與特徵向量構成一個 變換矩陣 PK\bm{P}_K(這裏 K=1K=1):

步驟5:將原始數據投影到 KK 維空間:
Y=PKTX{\bm{Y}} = {\bm{P}}_K^{\rm T}{\bm{X}}

我們可以看到最後結果,那條投影線跟我們直觀感受的一樣:

3. PCA的應用

PCA在特徵工程、計算機視覺、人臉識別、去噪等領域有很廣泛的應用。這裏僅僅測試一下PCA在圖像壓縮上的效果。matlab代碼如下:

function [P,r] = fun_pca(X,K)
% 輸入:
% X:經過中心化處理的數據
% K: 需要降低到的維度
% 輸出:
% P: 投影矩陣
% r:前K個奇異值佔所有奇異值的比

Cov = X*X';
[u,s] = svd(Cov) ;
P = u(:,1:K) ;
s = diag(s) ;
r = sum(abs(s(1:K)))/sum(abs(s)) ;
end
PCA for image compression

clear
img = imread('xinhuan.jpg');
img = im2double(img);
 
K=50;
% 保留主成分個數
img_matrix = [img(:,:,1),img(:,:,2),img(:,:,3)] ;
% 將RGB三通道圖像合併成一個矩陣
img_matrix_mean = img_matrix - mean(img_matrix) ;
% 求均值
Proj = fun_pca(img_matrix_mean,K) ;
% 用PCA算法獲得投影矩陣P
img_K = Proj'*img_matrix_mean ;
% 壓縮到K維後的圖像
    
%% 圖像重建
img_rec = Proj*img_K ;
% 圖像解壓縮
img_rec = img_rec + mean(img_matrix) ;
% 重建後的圖像加上均值
c_n = size(img_matrix,2)/3 ;
img_rec = cat(3,img_rec(:,1:c_n),img_rec(:,c_n+1:2*c_n),img_rec(:,2*c_n+1:end)) ;

figure(1)
subplot(1,2,1)
imshow(img),title('原圖')
subplot(1,2,2)
imshow(img_rec),title(strcat('壓縮後的圖像(', '奇異值數量:10)'))
SVD for image compression

clear
img = imread('xinhuan.jpg');
img = im2double(img);
K = 10 ;
for i = 1:3
    [u,s,v] = svd(img(:,:,i)) ;
    s = diag(s) ;
    r = sum(abs(s(1:K)))/sum(abs(s)) ;
    s = diag(s(1:K)) ;
    W(:,:,i) = u(:,1:K)*s*v(:,1:K)' ;
end
figure(1)
subplot(2,2,1)
imshow(img),title('原圖')
subplot(2,2,2)
imshow(P),title(strcat('壓縮後的圖像(', '奇異值數量:10)'))

奇異值分解圖像壓縮:

圖5. SVD重構的圖像與原圖對比

PCA圖像壓縮:

圖6. PCA重構的圖像與原圖對比

從圖5和圖6基本看不出來PCA和SVD壓縮圖像有多大區別,其特徵值貢獻比差異很大確不能說明什麼問題,圖像重建質量可以使用峯值信噪比(PSNR)來評價,感興趣的可以去試一試。

4. 討論

PCA的主要優點有:

1)僅僅需要以方差衡量信息量,不受數據集以外的因素影響。

2)各主成分之間正交,可消除原始數據成分間的相互影響的因素。

3)計算方法簡單,主要運算是特徵值分解,易於實現。

PCA算法的主要缺點有:

1)主成分各個特徵維度的含義具有一定的模糊性,不如原始樣本特徵的解釋性強。

2)方差小的非主成分也可能含有對樣本差異的重要信息,因降維丟棄可能對後續數據處理有影響。

往期精選:

最大比率發射(Maximum Ratio Transmission, MRT)

線性降維:主成分分析PCA原理分析與仿真驗證

5G+AI:有哪些新的研究方向和新範式?

簡述3D點雲配准算法

5G爲人工智能與工業互聯網賦能|79頁高清PPT

智能算法|以動物命名的算法

一份超全面的機器學習公共數據集

矩陣填充|奇異值閾值算法

可重構/大規模智能反射表面reconfigurable/large intelligent surface綜述

迭代硬閾值類算法總結||IHT/NIHT/CGIHT/HTP

軟閾值迭代算法(ISTA)和快速軟閾值迭代算法(FISTA)

伍德伯裏矩陣恆等式(Woodbury matrix identity)

壓縮感知:一種新型亞採樣技術

更多精彩內容請關注訂閱號優化與算法和加入QQ討論羣1032493483獲取更多資料

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