opencv——PCA(主要成分分析)數學原理推導

唯有自己強大發表於2021-05-28

引言:

最近一直在學習主成分分析(PCA),所以想把最近學的一點知識整理一下,如果有不對的還請大家幫忙指正,共同學習。

首先我們知道當資料維度太大時,我們通常需要進行降維處理,降維處理的方式有很多種,PCA主成分分析法是一種常用的一種降維手段,它主要是基於方差來提取最有價值的資訊,雖然降維之後我們並不知道每一維度的資料代表什麼意義,但是它將主要的資訊成分保留了下來,那麼PCA是如何實現的呢?

本文詳細推導了PCA的數學原理,最後以例項進行演算。


PCA的數學原理

(一)降維問題

大家都知道,PCA主要是用來將高維資料降為低維資料,並保留主要成分的。但是降維的現實意義是什麼呢?如何保留主要成分呢?

一般情況下,在資料探勘和機器學習中,資料被表示為向量。例如某個淘寶店2020年全年的流量及交易情況可以看成一組記錄的集合,其中每一天的資料是一條記錄,格式如下:

( 瀏覽量, 訪客數, 下單數, 成交數, 成交金額)T=(500,240,25,13,2312.15)T

我們對這組5維向量進行降維分析:

從經驗我們可以知道,“瀏覽量”和“訪客數”往往具有較強的相關關係,而“下單數”和“成交數”也具有較強的相關關係。這裡我們非正式的使用“相關關係”這個詞,可以直觀理解為“當某一天這個店鋪的瀏覽量較高(或較低)時,我們應該很大程度上認為這天的訪客數也較高(或較低)”。這種情況表明,如果我們刪除瀏覽量或訪客數其中一個指標,我們應該期待並不會丟失太多資訊。因此我們可以刪除一個,以降低機器學習演算法的複雜度。

這就是降維的樸素思想描述,可以有助於直觀理解降維的動機和可行性,但並不具有操作指導意義。

那麼我們到底刪除哪一列損失的資訊才最小?亦或根本不是單純刪除幾列,而是通過某些變換將原始資料變為更少的列但又使得丟失的資訊最小?到底如何度量丟失資訊的多少?如何根據原始資料決定具體的降維操作步驟?

?要想回答這些問題,就要一步一步分析,推導PCA背後的數學原理。

(二)向量的表示及基變換

既然我們面對的資料被抽象為一組向量,那麼下面有必要研究一些向量的數學性質。而這些數學性質將成為後續匯出PCA的理論基礎。

1️⃣內積與投影

兩個維數相同的向量的內積被定義為(高中知識):

                                         (a1,a2,,an)T(b1,b2,,bn)T=a1b1+a2b2++anbn

內積運算將兩個向量對映為一個實數。其計算方式非常容易理解,但是其意義並不明顯。下面我們分析內積的幾何意義。

假設A和B是兩個2維向量(為了簡單起見),A=(x1,y1)B=(x2,y2)。則在二維平面上A和B可以用兩條發自原點的有向線段表示,見下圖:

                                                   

 

設A與B的夾角是a,則A在B上的投影為|A|cos(a)
我們將內積表示為另一種我們熟悉的形式:

                                                            AB=|A||B|cos(a)

 2️⃣基的定義

我們都知道一個二維向量可以對應二維笛卡爾直角座標系中從原點出發的一個有向線段。例如下面這個向量:

                                                        

很容易就能看得出來,這個向量表示為(3,2)。不過我們常常忽略,只有一個(3,2)本身是不能夠精確表示一個向量的。我們仔細看一下,這裡的3實際表示的是向量在x軸上的投影值是3,在y軸上的投影值是2。也就是說我們其實隱式引入了一個定義:以x軸和y軸上正方向長度為1的向量為標準。那麼一個向量(3,2)實際是說在x軸投影為3而y軸的投影為2。注意投影是一個向量,所以可以為負。

更正式的說,向量(x,y)實際上表示線性組合:

                                                                                          x(1,0)T+y(0,1)T

 不難證明所有二維向量都可以表示為這樣的線性組合。此處(1,0)和(0,1)叫做二維空間中的一組基。所以,要準確描述向量,首先要確定一組基,然後給出在基所在的各個直線上的投影值,就可以了

我們之所以預設選擇(1,0)和(0,1)為基,當然是比較方便,例如,(1,1)和(-1,1)也可以成為一組基。一般來說,我們希望基的模是1,因為從內積的意義可以看到,如果基的模是1,那麼就可以方便的用向量點乘基而直接獲得其在新基上的座標了!實際上,對應任何一個向量我們總可以找到其同方向上模為1的向量,只要讓兩個分量分別除以模就好了(單位化)。例如,上面的基可以變為。那麼(3,2)在新基的座標就是。下圖給出了新的基以及(3,2)在新基上座標值的示意圖:

                                                        

另外這裡要注意的是,我們列舉的例子中基是正交的(即內積為0,或直觀說相互垂直),但可以成為一組基的唯一要求就是線性無關,非正交的基也是可以的。不過因為正交基有較好的性質,所以一般使用的基都是正交的。

3️⃣基變換(降維變換)

 下面我們找一種簡便的方式來表示基變換。我們可以用矩陣相乘的形式簡潔的表示這個變換:

                                                               

稍微推廣一下,如果我們有m個二維向量,只要將二維向量按列排成一個兩行m列矩陣,然後用“基矩陣”乘以這個矩陣,就得到了所有這些向量在新基下的值。例如(1,1),(2,2),(3,3),想變換到剛才那組基上,則可以這樣表示:

                                           

於是一組向量的基變換被幹淨的表示為矩陣的相乘。

一般的,如果我們有M個N維向量,想將其變換為由R個N維向量表示的新空間中,那麼首先將R個基按行組成矩陣A,然後將向量按列組成矩陣B,那麼兩矩陣的乘積AB就是變換結果,其中AB的第m列為A中第m列變換後的結果

其數學表示式為:

                                                 

 其中,pi表示為R個N維行向量。aj表示M個N維列向量。(基按行排列,向量按列排列,R決定了變換後資料的維數。)

因此我們可以發現,當R小於N時,N維資料變換到更低維度的空間中去,變換後的維度取決於基的數量。因此這種矩陣相乘的表示也可以表示降維變換。

最後,上述分析同時給矩陣相乘找到了一種物理解釋:兩個矩陣相乘的意義是將右邊矩陣中的每一列列向量變換到左邊矩陣中每一行行向量為基所表示的空間中去。更抽象的說,一個矩陣可以表示一種線性變換。

 4️⃣協方差矩陣(優化目標)

我們已經知道了如果基的數量少於向量本身的維數,則可以達到降維的效果。但是我們還沒有回答一個最最關鍵的問題:如何選擇基才是最優的。或者說,如果我們有一組N維向量,現在要將其降到K維(K小於N),那麼我們應該如何選擇K個基才能最大程度保留原有的資訊?

為了避免過於抽象的討論,我們仍以一個具體的例子展開。假設我們的資料由五條記錄組成,將它們表示成矩陣形式:

                                                                                     

 

其中每一列為一條資料記錄,而一行為一個欄位。為了後續處理方便,我們首先將每個欄位內所有值都減去欄位均值(一行取均值),其結果是將每個欄位都變為均值為0。

                                                                               

 

我們可以看下五條資料在平面直角座標系內的樣子:

                                                     

?如果我們必須使用一維來表示這些資料(降維),又希望儘量保留原始的資訊,該如何選擇?

這個問題實際上是要在二維平面中選擇一個方向,將所有資料都投影到這個方向所在直線上,用投影值表示原始記錄。這是一個實際的二維降到一維的問題。

那麼如何選擇這個方向(或者說基)才能儘量保留最多的原始資訊呢?一種直觀的看法是:希望投影后的投影值儘可能分散。

以上圖為例,可以看出如果向x軸投影(做垂線),那麼最左邊的兩個點會重疊在一起,中間的兩個點也會重疊在一起,於是本身四個各不相同的二維點投影后只剩下兩個不同的值了,這是一種嚴重的資訊丟失,同理,如果向y軸投影也會重疊。所以看來x和y軸都不是最好的投影選擇。我們直觀目測,如果向通過第一象限和第三象限的斜線投影,則五個點在投影后還是可以區分的。

下面,我們用數學方法表述這個問題。

5️⃣方差(表示分散程度)

我們希望投影后投影值儘可能分散,而這種分散程度,可以用數學上的方差來表述。因此,一個欄位的方差可以看做是每個元素與欄位均值的差的平方和的均值,即:

                                                                           

由於上面我們已經將每個欄位的均值都化為0了,因此方差可以直接用每個元素的平方和除以元素個數表示:

                                                                                   

於是上面的問題被形式化表述為:尋找一個一維基,使得所有資料變換為這個基上的座標表示後,方差值最大。

6️⃣協方差(表示相關性)

對於上面二維降成一維的問題來說,找到那個使得方差最大的方向就可以了。不過對於更高維,我們還需要尋找其他的投影方向。比如三維降到二維問題。與之前相同,首先我們希望找到一個方向使得投影后方差最大,這樣就完成了第一個方向的選擇,繼而我們選擇第二個投影方向。

要讓兩個欄位儘可能表示更多的原始資訊,我們還是不希望它們之間存在(線性)相關性的,因為相關性意味著兩個欄位不是完全獨立,必然存在重複表示的資訊。

數學上可以用兩個欄位的協方差表示其相關性,由於已經讓每個欄位均值為0,則:

                                                                                 

可以看到,在欄位均值為0的情況下,兩個欄位的協方差簡潔的表示為其內積除以元素數m。

當協方差為0時,表示兩個欄位完全獨立。為了讓協方差為0,我們選擇第二個基時只能在與第一個基正交的方向上選擇。因此最終選擇的兩個方向一定是正交的。

至此,我們得到了降維問題的優化目標:將一組N維向量降為K維(K大於0,小於N),其目標是選擇K個單位(模為1)正交基,使得原始資料變換到這組基上後,各欄位兩兩間協方差為0,而欄位的方差則儘可能大(在正交的約束下,取最大的K個方差)

7️⃣協方差矩陣(將方差和協方差統一表示)

上面雖然我們確定了優化目標,但是很難直接去實現它。因為它只說要什麼,但根本沒有說怎麼做。所以我們要繼續在數學上研究計算方案。

我們看到,最終要達到的目的與欄位內方差及欄位間協方差有密切關係。因此我們希望能將兩者統一表示,仔細觀察發現,兩者均可以表示為內積的形式,而內積又與矩陣相乘密切相關。

假設我們只有a和b兩個欄位,那麼我們將它們按行組成矩陣X:

                                                                             

然後我們用X乘以X的轉置,並乘上係數1/m:

                                                 

 

我們可以發現對角線上的兩個元素分別是兩個欄位的方差,而其它元素是a和b的協方差。兩者被統一到了一個矩陣的。

 

 根據矩陣相乘的運演算法則,這個結論很容易被推廣到一般情況:

設我們有m個n維資料記錄,將其按列排成n乘m的矩陣X,設則C是一個對稱矩陣,其對角線分別個各個欄位的方差,而第i行j列和j行i列元素相同,表示i和j兩個欄位的協方差

8️⃣協方差矩陣對角化

 根據上述推導,我們發現要達到優化目標(方差最大,協方差為0),等價於將協方差矩陣對角化:即除對角線外的其它元素化為0,並且在對角線上將元素按大小從上到下排列,這樣我們就達到了優化目的。

我們進一步看下原矩陣的協方差矩陣基變換後矩陣的協方差矩陣的關係:

設原始資料矩陣X對應的協方差矩陣為C,而P是一組基按行組成的矩陣,設Y=PX,則YXP做基變換後的資料。設Y的協方差矩陣為D,我們推導一下DC的關係:

                                                                                   

到此優化目標變成了尋找一個矩陣P,滿足PCPT是一個對角矩陣,並且對角元素按從大到小依次排列,那麼P的前K行就是要尋找的基,用P的前K行組成的矩陣乘以X就使得X從N維降到了K維並滿足上述優化條件

最後一步!!

由上文知道,協方差矩陣C是一個是對稱矩陣,線上性代數上,實對稱矩陣有一系列非常好的性質:

1)實對稱矩陣不同特徵值對應的特徵向量必然正交。

2)設特徵向量λλ重數為r,則必然存在r個線性無關的特徵向量對應於λ,因此可以將這r個特徵向量單位正交化。

由上面兩條可知,一個n行n列的實對稱矩陣一定可以找到n個單位正交特徵向量,設這n個特徵向量為e1,e2,,en,我們將其按列組成矩陣:

                                                                         

則對協方差矩陣C有如下結論:

                                                 

 其中Λ為對角矩陣,其對角元素為各特徵向量對應的特徵值(可能有重複)。

?至此我們完成了整個PCA的數學原理討論!!?


 PCA例項 

為了鞏固上面的理論,我們在這一節給出一個具體的PCA例項。

PCA演算法

總結一下PCA的演算法步驟:

設有m條n維資料。

1)將原始資料按列組成n行m列矩陣X

2)將X的每一行(代表一個屬性欄位)進行零均值化,即減去這一行的均值

3)求出協方差矩陣

4)求出協方差矩陣的特徵值及對應的特徵向量

5)將特徵向量按對應特徵值大小從上到下按行排列成矩陣,取前k行組成矩陣P

6)Y=PX即為降維到k維後的資料

 例項:

  總結:

根據上面對PCA的數學原理的解釋,對PCA的理解有一個更深入的認知。PCA本質上是將方差最大的方向作為主要特徵,並且在各個正交方向上將資料“離相關”,也就是讓它們在不同正交方向上沒有相關性。

因此,PCA也存在一些限制,例如它可以很好的解除線性相關,但是對於高階相關性就沒有辦法了,對於存在高階相關性的資料,可以考慮Kernel PCA,通過Kernel函式將非線性相關轉為線性相關,另外,PCA假設資料各主特徵是分佈在正交方向上,如果在非正交方向上存在幾個方差較大的方向,PCA的效果就大打折扣了。

最後需要說明的是,PCA是一種無引數技術,也就是說面對同樣的資料,如果不考慮清洗,誰來做結果都一樣,沒有主觀引數的介入,所以PCA便於通用實現,但是本身無法個性化的優化。

 

參考博文:(9條訊息) PCA(主成分分析)-------原理,推導,步驟、例項、程式碼_xxty1122的部落格-CSDN部落格_pca主成分分析

                   Object Orientation, Principal Component Analysis & OpenCV | Robospace (wordpress.com)

                   opencv學習之路(39)、PCA - 進擊的小猴子 - 部落格園 (cnblogs.com)

                                                          

相關文章