一文讀懂主成分分析

在我的研究生統計理論課上使用的教科書開頭,作者(喬治·卡塞拉和羅傑·伯格)在序言中解釋了他們為什麼選擇寫教科書:

"當有人發現您正在寫教科書時,將提出兩個問題中的一個或兩個。 第一個是"為什麼要寫書?",第二個是"您的書與書本有何不同?"第一個問題很容易回答。 您之所以寫書是因為您對當今存在的其它教科書不完全滿意。"

我在這裡運用作者的邏輯。 主成分分析(PCA)是在統計和數據科學領域中需要了解的一種重要技術……但是,當為我的聯大學生們上一堂課時,我發現在線資源過於技術化,無法完全滿足我們的需求 ,和/或提供有衝突的信息。 可以肯定地說,我對此處的教科書不完全滿意。

因此,我想將PCA的"什麼","何時","如何"和"為什麼"放在一起,並鏈接到一些有助於進一步解釋該主題的資源。具體來說,我想介紹這種方法的原理,內在的數學原理,一些最佳實踐以及該方法的潛在缺點。

雖然我想使PCA儘可能容易訪問,但是我們將介紹的算法是非常技術性的。 熟悉以下部分或全部內容將使本文和PCA作為一種更易於理解的方法:矩陣運算/線性代數(矩陣乘法,矩陣轉置,矩陣逆,矩陣分解,特徵向量/特徵值)和統計/機器學習( 標準化,方差,協方差,獨立性,線性迴歸,特徵選擇)。 我在整篇文章中都嵌入了這些主題的插圖的鏈接,但希望這些鏈接可以起到提醒作用,而不是閱讀本文所必需的閱讀內容。

什麼是PCA?

假設您要預測2017年美國的國內生產總值(GDP)。您擁有許多可用信息:2017年第一季度的美國GDP,2016年全年的美國GDP, 2015年,依此類推。 您具有任何公開可用的經濟指標,例如失業率,通貨膨脹率等。 您有2010年的美國人口普查數據估算每個行業的美國人數量,而美國社區調查數據則在每次普查之間都會更新這些估算值。 你知道眾議院和參議院有多少成員屬於每個政黨。 您可以收集股價數據,一年中進行的IPO數量以及有多少CEO似乎正在競購公職。 儘管要考慮的變量太多,但這只是表面問題。

TL; DR-您需要考慮很多變量。

如果您以前使用過很多變量,那麼您就會知道這會帶來問題。 您瞭解每個變量之間的關係嗎? 您是否有太多變量,以至於有可能使模型無法適應數據,或者可能違反了使用哪種建模策略的假設?

您可能會問這樣一個問題:"如何使用我收集的所有變量,只關注其中的幾個?"從技術上講,您想"減小特徵空間的維數。"通過減小在特徵空間中維數,要考慮的變量之間的關係較少,並且過擬合的可能性也較小。 (注意:這並不意味著過度擬合等不再是問題,而是我們朝著正確的方向發展!)

毫不奇怪,減小特徵空間的尺寸稱為"降維"。有很多方法可以實現降維,但是這些技術大多數都屬於兩類之一:

  • 功能消除
  • 特徵提取

消除特徵的功能聽起來像是:我們通過消除特徵來減少特徵空間。 在上面的GDP示例中,我們可能會刪除所有變量,而不是考慮所有變量,但我們認為這三個變量可以最好地預測美國的國內生產總值。 特徵消除方法的優點包括簡單和保持變量的可解釋性。

但不利的是,您無法從刪除的變量中獲得任何信息。 如果僅使用去年的GDP,根據美國社區調查最新數字得出的製造業就業人口比例以及失業率來預測今年的GDP,那麼我們將錯過任何可能對模型產生影響的變量。 通過消除特徵,我們還完全消除了刪除變量所帶來的好處。

但是,特徵提取不會遇到此問題。 假設我們有十個獨立變量。 在特徵提取中,我們創建了十個"新"自變量,其中每個"新"自變量是十個"舊"自變量中每個變量的組合。 但是,我們以特定的方式創建這些新的自變量,並根據它們對我們的因變量的預測程度對這些新變量進行排序。

您可能會說:"降維在哪裡起作用?"好吧,我們保留了儘可能多的新自變量,但是我們刪除了"最不重要的"。因為我們按新變量的好壞程度對其進行了排序來預測我們的因變量,我們知道哪個變量是最重要和最不重要的。 但是-這就是關鍵-因為這些新的獨立變量是我們舊變量的組合,所以即使刪除一個或多個"新"變量,我們仍然保留舊變量中最有價值的部分!

主成分分析是一種特徵提取技術,因此它以特定的方式組合了我們的輸入變量,然後我們可以刪除"最不重要"的變量,同時仍保留所有變量中最有價值的部分! 另外一項好處是,PCA之後的每個"新"變量都彼此獨立。 這是有好處的,因為線性模型的假設要求我們的自變量彼此獨立。 如果我們決定用這些"新"變量擬合線性迴歸模型(請參見下面的"主要成分迴歸"),則必須滿足此假設。

我什麼時候應該使用PCA?

  • 您是否要減少變量的數量,但無法識別變量以將其完全排除在考慮範圍之外?
  • 您是否要確保變量相互獨立?
  • 您是否願意讓自變量難以解釋?

如果您對所有三個問題的回答均為"是",則PCA是一種很好的使用方法。 如果對問題3回答"否",則不應使用PCA。

PCA如何工作?

此後的部分討論了PCA為何起作用,但在進入算法之前提供簡短摘要可能對上下文有幫助:

· 我們將計算一個矩陣,該矩陣總結我們的變量如何相互關聯。

· 然後,我們將該矩陣分解為兩個獨立的部分:方向和幅度。 然後,我們可以瞭解數據的"方向"及其"大小"(或每個方向的"重要性"如何)。 以下來自setosa.io小程序的屏幕截圖顯示了此數據中的兩個主要方向:"紅色方向"和"綠色方向"。在這種情況下,"紅色方向"更為重要。 我們稍後將討論為什麼會這樣,但是考慮到點的排列方式,您能看到為什麼"紅色方向"比"綠色方向"看起來更重要嗎?(提示:最合適的線適合什麼? 這個數據看起來像什麼?)

一文讀懂主成分分析

Our original data in the xy-plane. (Source.)

· 我們將轉換原始數據,使其與這些重要方向(原始變量的組合)保持一致。 下面的屏幕截圖(同樣來自setosa.io)與上面的數據完全相同,但是經過了轉換,現在x軸和y軸分別是"紅色方向"和"綠色方向"。 像這兒?

一文讀懂主成分分析

Our original data transformed by PCA. (Source.)

· 儘管此處的可視示例是二維的(因此我們有兩個"方向"),但請考慮一下我們的數據具有更大維度的情況。 通過確定哪些"方向"最"重要",我們可以通過刪除"最不重要"的"方向"來將數據壓縮或投影到較小的空間。通過將數據投影到較小的空間,我們正在減少 特徵空間的維數…但是由於我們已經沿這些不同的"方向"轉換了數據,因此我們確保將所有原始變量保留在模型中!

在這裡,我逐步介紹了執行PCA的算法。 我試圖避免過於技術化,但是這裡不可能忽略細節,因此我的目標是儘可能明確地介紹所有內容。 下一部分將更深入地介紹算法的工作原理。

開始之前,您應該將表格數據組織為n行,並可能包含p + 1列,其中一列對應於您的因變量(通常表示為Y),p列對應於一個自變量(通常以矩陣表示) X)。

  • 如果存在Y變量並將其作為數據的一部分,則按照上面的定義將數據分為Y和X(我們將主要使用X。)(注意:如果沒有Y的列,那沒關係-跳到 下一點!)
  • 取自變量X的矩陣,對於每列,從每個條目中減去該列的平均值。 (這確保每列的平均值為零。)
  • 決定是否標準化。 給定X列,具有較高方差的特徵是否比具有較低方差的特徵更重要,或者特徵的重要性與方差無關? (在這種情況下,重要性表示要素對Y的預測程度。)如果要素的重要性與要素的方差無關,則將列中的每個觀察值除以該列的標準差。 (這與步驟2相結合,對X的每一列進行了標準化,以確保每一列具有均值為零和標準偏差1。)將居中(並可能經過標準化)的矩陣稱為Z。
  • 取矩陣Z,對其進行轉置,然後將轉置後的矩陣乘以Z。
  • 這可能是最困難的步驟-在這裡堅持我。)計算特徵向量及其對應的ZᵀZ特徵值。 在大多數計算程序包中,這很容易做到—實際上,ZᵀZ的特徵分解是將ZᵀZ分解為PDP⁻¹,其中P是特徵向量的矩陣,D是對角矩陣,特徵值在對角線上,各處均為零 其他。 D對角線上的特徵值將與P中的相應列相關聯-即D的第一元素為λ₁,而對應的特徵向量為P的第一列。這對於D中的所有元素及其中的相應特徵向量均成立 P。我們將始終能夠以這種方式計算PDP¹。 (獎金:對於感興趣的人,我們總是可以以這種方式計算PDPsemi¹,因為ZᵀZ是對稱的正半定矩陣。)
  • 取特徵值λ1,λ2,...,λp並將其從最大到最小排序。 為此,請對P中的特徵向量進行相應排序。 (例如,如果λ2是最大特徵值,則取P的第二列並將其放在第一列的位置。)根據計算包的不同,這可以自動完成。 將此特徵向量的分類矩陣稱為P *。 (P *的列應與P的列相同,但順序可能不同。)請注意,這些特徵向量彼此獨立。
  • 計算Z * = ZP *。 這個新矩陣Z *是X的居中/標準化版本,但是現在每個觀察值都是原始變量的組合,其中權重由特徵向量確定。 另外,由於P *中的特徵向量彼此獨立,因此Z *的每一列也彼此獨立!
一文讀懂主成分分析

An example from setosa.io where we transform five data points using PCA. The left graph is our original data X; the right graph would be our transformed data Z*.

注意此圖中的兩件事:

  • 這兩個圖表顯示了完全相同的數據,但是右圖反映了轉換後的原始數據,因此我們的軸現在是主要組成部分。
  • 在兩個圖中,主成分彼此垂直。 實際上,每個主成分將始終與其他所有主成分正交(也稱為官方數學術語為"正交")。 (不相信我嗎?嘗試破壞小程序!)

因為我們的主成分彼此正交,所以它們在統計上彼此線性獨立……這就是為什麼我們的Z *列彼此線性獨立的原因!

最後,我們需要確定要保留多少個特徵或要刪除多少個特徵。 有三種常見的方法可以確定這一點,下面將對其進行討論,然後給出一個明確的示例:

  • 方法1:我們任意選擇要保留的尺寸。 也許我想在二維上直觀地表示事物,所以我可能只保留兩個特徵。 這取決於用例,對於要選擇多少功能並沒有嚴格的規定。
  • 方法2:計算每個要素解釋的方差比例(以下簡要說明),選擇一個閾值,然後添加要素,直到達到該閾值。 (例如,如果要解釋模型可能解釋的總變異性的80%,請添加具有最大解釋變異率的要素,直到解釋變異率達到或超過80%。)
  • 方法3:這與方法2密切相關。計算每個要素的解釋方差比例,按解釋的方差比例對要素進行排序,並繪製保留更多要素的累計方差比例。 (此圖稱為碎石圖,如下所示。)通過確定添加新特徵的點相對於先前特徵有明顯下降的方差,然後選擇直到該點的特徵,可以選擇要包含的特徵數。 。 (我稱這種方法為"查找肘部"方法,因為在卵石圖中查看"彎曲"或"肘部"可以確定出現最大方差下降的原因。)

因為每個特徵值大致都是其對應特徵向量的重要性,所以解釋的方差比例是您保留的特徵的特徵值之和除以所有特徵的特徵值之和。

一文讀懂主成分分析

Scree Plot for Genetic Data. (Source.)

考慮此卵石圖用於遺傳數據。 (來源:此處。)紅線表示每個要素所解釋的方差比例,其計算方法是將該主成分的特徵值除以所有特徵值的總和。 通過僅包括主成分1來解釋的方差比例是λ1 /(λ1 +λ2 +…+λp),大約為23%。 僅包括主成分2所解釋的變化比例為λ2 /(λ1 +λ2 +…+λp),或約19%。

通過同時包括主成分1和2來解釋的方差比例為(λ1 +λ2)/(λ1 +λ2 +…+λp),大約為42%。 這是黃線出現的地方; 黃線表示累積的方差比例,如果您包括該點之前的所有主要成分,則說明該比例。 例如,PC2上方的黃點表示包括主成分1和2將解釋模型中總方差的大約42%。

現在讓我們來看一些示例:

  • 方法1:我們任意選擇要包含的多個主要組件。 假設我想在模型中保留五個主要組成部分。 在上面的遺傳數據案例中,這五個主要成分可解釋總變異性的約66%,這可通過包括所有13個主要成分來解釋。
  • 方法2:假設我想包括足夠的主成分以解釋所有13個主成分所解釋的總變異性的90%。 在上面的遺傳數據案例中,我將包括前10個主要成分,並從Z *中刪除最後三個變量。
  • 方法3:在這裡,我們要"查找肘部"。在上面的卵石圖中,我們看到在主成分2和主成分3之間解釋的可變性比例有很大下降。在這種情況下,我們可能包括 前兩個功能並刪除其餘功能。 如您所見,此方法有點主觀,因為"彎頭"沒有精確的數學定義,在這種情況下,我們將包括一個僅能解釋總變異性42%的模型。

(注意:有些碎石圖在Y軸上具有特徵向量的大小,而不是方差的比例。這會得出相等的結果,但是需要用戶手動計算方差的比例。此處可以看到一個示例。 )

刪除要刪除的轉換變量後,就完成了! 那就是PCA。

但是,例如,為什麼 PCA起作用?

雖然PCA是一種技術很強的方法,依賴於深入的線性代數算法,但考慮到它卻是一種相對直觀的方法。

  • 首先,協方差矩陣ZᵀZ是一個矩陣,其中包含對Z中每個變量與Z中每個其他變量的關係的估計。瞭解一個變量與另一個變量如何關聯非常有力。
  • 其次,特徵值和特徵向量很重要。 特徵向量代表方向。 考慮將數據繪製在多維散點圖上。 然後,您可以將單個特徵向量視為數據散點圖中的特定"方向"。 特徵值表示幅度或重要性。 特徵值越大,方向越重要。
  • 最後,我們假設特定方向上的更多可變性與解釋因變量的行為相關。 大量的可變性通常表示信號,而較小的可變性通常表示噪聲。 因此,在特定方向上存在更大的可變性,理論上表明我們想要檢測的重要事物。 (setosa.io PCA小程序是處理數據並說服自己為什麼有意義的一種好方法。)

因此,PCA是一種彙集了以下內容的方法:

  • 衡量每個變量如何相互關聯的一種方法。 (協方差矩陣。)
  • 數據分散的方向。 (特徵向量)
  • 這些不同方向的相對重要性。 (特徵值。)

PCA結合了我們的預測變量,並允許我們丟棄相對不重要的特徵向量。

PCA有擴展嗎?

是的,在合理的空間範圍內,我所能解決的還不止這些。 我最常看到的一個是主成分迴歸,我們將未轉換的Y迴歸到我們未刪除的Z *子集上。 (這是Z *列的獨立性出現的地方;通過將Z *上的Y迴歸,我們知道必須滿足自變量所要求的獨立性。但是,我們仍然需要檢查其他假設。)

我見過的另一個常見的變體是內核PCA。

結論

希望本文對您有所幫助! 請查看以下一些資源,以更深入地討論PCA。 讓我知道您的想法,尤其是在有改進建議的情況下。

我要感謝我的朋友Ritika Bhasker,Joseph Nelson和Corey Smith的建議和修改。 您應該在Medium上檢查Ritika和Joseph,他們的職位比我的職位更具娛樂性。 (Corey過於專注於不讓他的博士學位研究sc眾取寵。)

我還想給setosa.io小程序以極大的幫助,以直觀直觀地顯示PCA。

編輯:感謝Michael Matthews在上面的步驟7中注意到Z *公式中的錯字。 他正確地指出Z * = ZP ,而不是ZᵀP。 也要感謝Chienlung Cheung在上面的步驟8中注意到另一種錯字,並指出我已經將"特徵向量"與"特徵值"混為一談。

參考資源:

這是我用來撰寫此PCA文章的資源列表,以及我通常認為對理解PCA有用的其他資源。 如果您知道任何可以很好地包含在此列表中的資源,請發表評論,我會添加它們。

非學術文章和資源

  • Setosa.io的PCA小程序。 (一個小程序,使您可以直觀地看到主要成分是什麼,以及數據如何影響主要成分。)
  • 對PCA算法和算法本身的構建塊的半學術性演練。
  • 總之,這個StackExchange問題的最佳答案是出色的。
  • CrossValidated問答,討論PCA是否存在參數假設。 (擾流警報:PCA本身是非參數方法,但是使用PCA之後的迴歸或假設檢驗可能需要參數假設。)
  • 沒有Wikipedia鏈接,資源列表很難完成,對嗎? (儘管Wikipedia的目標不大,但它在頁面底部具有可靠的其他鏈接和資源列表。)

代碼資源

  • sklearn庫中的PCA的Python文檔。
  • PCA在AnalyticsVidhya上的解釋。
  • 在Python中用一些很酷的方法實現PCA。
  • 比較在R中實現PCA的方法。

學術教科書和文章

  • James,Witten,Hastie和Tibshirani撰寫的第6版《統計學習入門》。 (在第6.3、6.7和10.2章中對PCA進行了廣泛的介紹,這本書假定讀者具有線性迴歸的知識,但考慮到所有因素,它很容易理解。)
  • 賓夕法尼亞州立大學STAT 505(應用的多元統計分析)課程的註釋。 (我發現賓州州立大學的在線統計課程說明令人難以置信,這裡的" PCA"部分特別有用。)
  • 線性代數及其應用,第四版,David Lay著。 (第7.5章介紹了PCA。)
  • Google Research的Jonathon Shlens撰寫的主成分分析教程。
  • 卡內基梅隆大學的Cosma Shalizi撰寫了有關主成分分析的章節草案。
  • 應用預測模型中有關數據預處理的一章在第3.3節中介紹了主成分分析(帶視覺效果!)。 (向傑伊·盧卡斯推薦)!
  • 《統計學習的要素》,第10版,由Hastie,Tibshirani和Friedman撰寫。 (PCA在第3.5、14.5和18.6章中進行了廣泛介紹。該書假設線性迴歸,矩陣代數和微積分的知識,並且比《統計學習入門》具有更多的技術性,但是鑑於共同作者,二者遵循相似的結構 )

切向資源

  • 線性代數YouTube系列的精髓(包括一個與特徵向量和特徵值有關的視頻,該視頻與PCA尤其相關;與tim Book在一起,以使我意識到這一不可思議的資源。)


(本文翻譯自Matt Brems的文章《A One-Stop Shop for Principal Component Analysis》,參考:https://towardsdatascience.com/a-one-stop-shop-for-principal-component-analysis-5582fb7e0a9c)


分享到:


相關文章: