R語言從入門到精通:Day14(PCA & tSNE)

  • 2019 年 11 月 11 日
  • 筆記

實際工作中要處理的變數之間的關係往往是錯綜複雜的。處理這些多變數數據的最大挑戰之一就是資訊過度複雜,若數據集有100個變數,如何了解其中所有的交互關係呢?即使只有20個變數,當試圖理解各個變數與其他變數的關係時,也需要考慮190對相互關係。主成分分析等方法是用來探索和簡化多變數複雜關係的常用方法。在這裡我們重點介紹兩種簡化多變數複雜關係,即降維的方法:主成分分析和t-SNE(t-Distributed Stochastic Neighbor Embedding)。(測試數據和程式碼見文末客服二維碼

PCA

主成分分析(Principle component analysis, PCA)前面我們已經用兩期教程跟大家講過理論和實際繪圖(在線主成分分析Clustvis主成分分析繪圖)。今天,我們就從PCA的數理統計層面入手,去講講完整的PCA應該怎麼操作。

總體而言,PCA是一種數據降維技巧,它能將大量相關變數轉化為一組很少的不相關變數,這些無關變數就稱為主成分。例如,使用PCA可將30個相關(很可能冗餘)的環境變數轉化為5個無關的成分變數,並且儘可能地保留原始數據集的資訊。主成分是觀測變數的線性組合。形成線性組合的權重都是通過最大化各主成分所解釋的方差來獲得,同時還要保證各主成分間不相關。(本文中介紹的兩種方法都需要大樣本來支撐穩定的結果,但是多大樣本量才足夠也是一個複雜 的問題。目前,數據分析師常使用經驗法則:「因子分析需要5~10倍於變數數的樣本數。」)

R的基礎安裝包提供了PCA的函數,即函數princomp(),前面我們也曾經講過。這裡我們將重點介紹psych包中提供的函數。它們提供了比基礎函數更豐富和有用的選項。主成分分析往往要經過一些常見的步驟,如:數據預處理、選擇模型、判斷要選擇的主成分數目、選擇主成分、旋轉主成分、解釋結果、計算主成分得分。下面的例子將會詳細解釋每一個步驟。

示例數據集USJudgeRatings包含了律師對美國高等法院法官的評分。數據框包含43個觀測,12 個變數。由於示例數據本身規範無缺失值,所以直接選擇主成分分析作為分析模型,下面是判斷需要多少個主成分。判斷主成分數目的準則一般有:

1,根據先驗經驗和理論知識判斷主成分數;

2,根據要解釋變數方差的積累值的閾值來判斷需要的主成分數;

3,通過檢查變數間k×k的相關係數矩陣來判斷保留的主成分數。

利用函數fa.parallel(),你可以同時對三種特徵值判別準則進行評價。該函數繪製的圖片如圖1。圖中虛線表明選擇一個主成分即可保留數據集的大部分資訊。

圖1,判斷主成分數目

下一步是使用函數principal()挑選出相應的主成分。函數principal()可以根據原始數據矩陣或者相關係數矩陣做主成分分析。格式為:

principal(r, nfactors=, rotate=, scores=)  

其中:參數r是相關係數矩陣或原始數據矩陣;參數nfactors設定主成分數(默認為1);參數rotate指定旋轉的方法(默認最大方差旋轉);scores設定是否需要計算主成分得分(默認不需要)。示例數據的分析結果(1個主成分)如圖2。

圖2,提取主成分結果

圖中,PC1欄包含了成分載荷,指觀測變數與主成分的相關係數。如果提取不止一個主成分,那麼 還將會有PC2、PC3等欄。成分載荷(component loadings)可用來解釋主成分的含義。此處可以看到,第一主成分(PC1)與每個變數都高度相關,也就是說,它是一個可用來進行一般性評價的維度。h2欄指成分公因子方差,即主成分對每個變數的方差解釋度。u2欄指成分唯一性,即方差無法被主成分解釋的比例(1–h2)。SS loadings行包含了與主成分相關聯的特徵值,指的是與特定主成分相關聯的標準化後的方差值(本例中,第一主成分的值為10)。最後,Proportion Var行表示的是每個主成分對整個數據集的解釋程度。此處可以看到,第一主成分解釋了11個變數92%的方差。

下面在看一個主成分數目不為1的例子,Harman23.cor數據集包含305個女孩的8個身體測量指標。本例中,數據集由變數的相關係數組成,而不是原始數據集(如圖3)。

圖3,Harman23.cor數據集

圖4說明這次需要選擇兩個主成分。

圖4,Harman23.cor的主成分數目分析

圖5展示了兩個主成分的提取結果。

圖5,Harman23.cor的主成分提取

現在的問題是這些主成分的內在含義是什麼呢?我們可以通過主成分旋轉將成分載荷陣變得更容易解釋,旋轉方法有兩種:使選擇的成分保持不相關(正交旋轉),和讓它們變得相關(斜交旋轉)。最流行的正交旋轉是方差極大旋轉,它試圖對載荷陣的列進行去噪,使得每個成分只由一組有限的變數來解釋(即載荷陣每列只有少數幾個很大的載荷,其他都是很小的載荷)。現在對Harman23.cor使用方差極大旋轉(結果如圖6)。

圖6,主成分旋轉的結果

列的名字都從PC變成了RC,以表示成分被旋轉。觀察RC1欄的載荷,你可以發現第一主成分主要由前四個變數來解釋(長度變數)。RC2欄的載荷表示第二主成分主要由變數5到變數8來解 釋(容量變數)。但是我們的最終目標是用一組較少的變數替換一組較多的相關變數,因此,你還需要獲取每個觀測在成分上的得分。

回到第一個例子,我們根據原始數據中的11個評分變數提取了一個主成分。利用函數principal(),你很容易獲得每個調查對象在該主成分上的得分,利用相關係數矩陣得到的主成分分析結果的主成分得分計算方法有所不同,但也比較簡單(欲尋程式碼,見文末客服二維碼)。

tSNE

到這裡,主成分分析的部分就基本結束,顯然主成分分析是一種線性相關的分析方法,而下面要介紹的t-SNE則適用於非線性關係,它的主要用處為降維,一般將高維數據轉化為二維數據並繪製圖形,便於我們觀察變數之間的關係。目前t-SNE主要應用在影像處理(醫學影像處理等)、文本比對等領域,在生物資訊學也有很廣闊的應用前景。在R語言中,包Rtsne整合了t-SNE演算法。下面是兩個簡單的例子。第一個例子涉及到了數據集irisi。數據集中的五個變數如圖7。

圖7,數據集irisi中五個變數

下面我們利用函數Rtsne()將除了species之外的四個變數降為兩個維度,並利用顏色標示變數species,繪製出降維後的數據。

圖8,數據集irisi降維結果

圖中可以看到降維之後的三個物種比較理想的聚合在一起,但是也有部分離群的數據點。(如果你運行了後台的程式碼,你會發現你的圖形並不是和圖8完全一樣,這是t-SNE的特點決定的,不必驚慌。)

如果數據集本身沒有給出數據點的分類,t-SNE的降維結果也可以用於分類,在後台我們提供data.txt作為示例數據,利用函數Rtsne處理之後,繪製對應的影像結果如圖9。

圖9. 測試數據的處理結果

同樣的,你的圖形可能不太一樣。同時,你也會發現,t-SNE演算法在數據量增大之後的計算時間顯著增加(t-SNE演算法的複雜度也是一個不容忽視的問題)。

在後台程式碼中,我們提供了利用data.txt降維後的數據進行聚類並繪圖的程式碼,在下次教程,我們會詳細講解有關的聚類方法,大家可以先自己熟悉起來。