Principal Components Analysis (PCA) | 主成份分析| R 統計
文章推薦指數: 80 %
Principal Components Analysis (PCA) | 主成份分析| R 統計 · 主成分分析屬於非監督是式學習法,即處理一組沒有回應變數Y(目標變數)的一群X變數(X1,X2,…,X ...
跳至主內容區
主成份分析(principalcomponentsanalysis,PCA)的應用非常廣泛,可以簡化資料維度資訊,用最精簡的主成份特徵來解釋目標變數的最大變異,避免共線性與過度配適等問題。
而主成份分析的計算過程會使用到線性代數中的特徵值與特徵向量技術。
本學習筆記會介紹主成份分析的基礎以及R套件的函數用法。
PrincipalComponentsAnalysis主成份分析簡介
主成分分析屬於非監督是式學習法,即處理一組沒有回應變數Y(目標變數)的一群X變數(\(X_{1},X_{2},…,X_{n}\)),即沒標籤的資料集(unlabeleddata)。
主成份分析的主要目的為:降低資料維度。
一方面可以避免共線性問題發生,一方面別是當資料維度非常大量時,可以減少運算並避免過度配適等問題產生。
本篇文章主要會分成以下幾個部分
載入所需套件
資料準備
主成份分析
萃取主成分
R語言內建的PCA函數
1.載入所需套件
library(tidyverse)#datamanipulationandvisualization
library(gridExtra)#plotarrangement
12
library(tidyverse)#datamanipulationandvisualizationlibrary(gridExtra)#plotarrangement
2.資料準備
我們主要使用R內建數據USArrests。
data("USArrests")
head(USArrests,10)
#MurderAssaultUrbanPopRape
#Alabama13.22365821.2
#Alaska10.02634844.5
#Arizona8.12948031.0
#Arkansas8.81905019.5
#California9.02769140.6
#Colorado7.92047838.7
#Connecticut3.31107711.1
#Delaware5.92387215.8
#Florida15.43358031.9
#Georgia17.42116025.8
1234567891011121314
data("USArrests")head(USArrests,10) #MurderAssaultUrbanPopRape#Alabama13.22365821.2#Alaska10.02634844.5#Arizona8.12948031.0#Arkansas8.81905019.5#California9.02769140.6#Colorado7.92047838.7#Connecticut3.31107711.1#Delaware5.92387215.8#Florida15.43358031.9#Georgia17.42116025.8
3.PrincipalComponentsAnalysis主成份分析
目的為使用較少的變數來解釋最多的變異。
當遇上大量變數時,可以透過主成份分析將資料維度有效縮減,以利後續資料探勘與分析工作。
我們希望透過主成份分析來達成:運用最少的代表性資料維度來有效摘要大部分的資料資訊或變異(能捕捉到越多資料變異越好)。
principalcomponentsanalysis主成份分析計算
假設我們的dataset由n個觀測值和p個維度所組成,而主成份分析(PCA)所找出的維度將是p個維度的線性組合。
第一個主成份(\(Z_{1}\))到第p個主成份(\(Z_{p}\))可透過以下公式來表示:
$$Z_{1}=\phi_{11}X_{1}+\phi_{21}X_{2}+…+\phi_{p1}X_{p}$$
…
$$Z_{p}=\phi_{1p}X_{1}+\phi_{2p}X_{2}+…+\phi_{pp}X_{p}$$
其中,
\(\phi_{ji}\)稱為每一個主成分\(Z_{i}\)的負荷向量(loadingvector)(由\(\phi_{1i},\phi_{2i},…,\phi_{pi}\)所組成)。
為標準化數值,不同主成分間的負荷向量可互相比較。
每個主成份\(Z_{i}\)的\(\phi_{ji}\)是透過最大化對應主成份\(Z_{i}\)的的解釋變異而得。
\(\sum_{j=1}^p\phi_{ji}^2=1\),表示各主成分由不同比重的原始維度所組成。
每個主成分的負荷向量\(\phi_{ji}\)(loadingvector)都是相互垂直的向量(\(\phi_{1}\perp\phi_{2}\perp….\perp\phi_{p}\)),即表示各主成分彼此間的解釋變異為互相獨立的。
我們可以使用線性代數的技術來計算每一個主成分的負荷向量(loadingvector):
資料標準化。
計算個原始維度兩兩間的共變異矩陣(covariancematrix)。
其中,共變異數計算公式如下:
$$cov(X,Y)=\frac{1}{N-1}\sum_{i=1}^N(x_{i}-\bar{x})(y_{i}-\bar{y})$$
計算共變異矩陣的特徵值(eigenvalues)與特徵向量(eigenvectors)。
而對應由大到小排列的特徵值的特徵向量,依序分別為解釋最大變異的主成分\(Z_{1}\)到解釋變異最小的主成分\(Z_{p}\)的負荷向量。
萃取主成分。
Step1:資料維度標準化
主成份分析的第一步就是進行資料的標準化,標準化的好處是,可以消除不同指標間的單位度量衡差異。
待分析出不同主成份後,可以互相比較不同主成份間的平均值。
我們將各維度(欄)進行標準化(centering)。
*而scale的方式就是(x–mean(x))/sd(x)。
scaled_df
12345678910
scaled_dfhead(scaled_df) #MurderAssaultUrbanPopRape#[1,]1.242564080.7828393-0.5209066-0.003416473#[2,]0.507862481.1068225-1.21176422.484202941#[3,]0.071633411.47880320.99898011.042878388#[4,]0.232349380.2308680-1.0735927-0.184916602#[5,]0.278268231.26281441.75892342.067820292#[6,]0.025714560.39885930.86080851.864967207
step2:我們可以使用cov()函數來計算兩兩變數的共變異數矩陣\(p\timesp\)如下。
arrests.cov
1234567
arrests.covarrests.cov#MurderAssaultUrbanPopRape#Murder1.000000000.80187330.069572620.5635788#Assault0.801873311.00000000.258871700.6652412#UrbanPop0.069572620.25887171.000000000.4113412#Rape0.563578830.66524120.411341241.0000000
step3:計算矩陣的特徵值(eigenvalues)與特徵向量(eigenvectors)。
eigen()函數產出的物件包含兩部分:
$values:排序過後的特徵值。
$vectors:對應不同特徵值的特徵向量。
arrests.eigen
123456789101112
arrests.eigenarrests.eigen#eigen()decomposition#$values#[1]2.48024160.98976520.35656320.1734301##$vectors#[,1][,2][,3][,4]#[1,]-0.53589950.4181809-0.34123270.64922780#[2,]-0.58318360.1879856-0.2681484-0.74340748#[3,]-0.2781909-0.8728062-0.37801580.13387773#[4,]-0.5434321-0.16731860.81777790.08902432
step4:我們將萃取首兩大主成分1和主成分2作為我們說明的例子。
#Extracttheloadings
(phi
1234567
#Extracttheloadings(phi#[,1][,2]#[1,]-0.53589950.4181809#[2,]-0.58318360.1879856#[3,]-0.2781909-0.8728062#[4,]-0.5434321-0.1673186
因為R計算的特徵向量預設為指向負值,且我們知道特徵向量是獨特的值,只要是在同一方向上,不管是正向還是負向純量縮放,都是相同的。
為了方便說明,我們將特徵向量乘上純量-1。
phi
123456789
phirow.names(phi)colnames(phi)phi#PC1PC2#Murder0.5358995-0.4181809#Assault0.5831836-0.1879856#UrbanPop0.27819090.8728062#Rape0.54343210.1673186
檢視以上萃取的主成分向量,我們可以做出以下推論:
主成分1(PC1):代表各大犯罪(包含謀殺、突擊、強姦)的犯罪發生率因子。
主成分2(PC2):代表為城市化水平因子。
有了對主成分的基本了解後,我們將各觀測值投影到各主成分向量上,並計算各觀測值的各主成分分數(principalcomponentscores)。
#CalculatePrincipalComponentsscores
PC1
123456789101112131415
#CalculatePrincipalComponentsscoresPC1PC2 #CreatedataframewithPrincipalComponentsscoresPChead(PC) #StatePC1PC2#1Alabama0.9756604-1.1220012#2Alaska1.9305379-1.0624269#3Arizona1.74544290.7384595#4Arkansas-0.1399989-1.1085423#5California2.49861281.5274267#6Colorado1.49934070.9776297
接著,我們將各國對應的主成分維度繪製成二維的平面圖。
#PlotPrincipalComponentsforeachState
par(family="黑體-繁中黑")
ggplot(PC,aes(PC1,PC2))+
modelr::geom_ref_line(h=0)+
modelr::geom_ref_line(v=0)+
geom_text(aes(label=State),size=3)+
xlab("PC1:rateofseriouscrime,重大犯罪發生率")+
ylab("PC2:urbanization,都市化程度")+
ggtitle("FirstTwoPrincipalComponentsofUSArrestsData")+
theme(text=element_text(family="黑體-繁中黑"))
12345678910
#PlotPrincipalComponentsforeachStatepar(family="黑體-繁中黑")ggplot(PC,aes(PC1,PC2))+modelr::geom_ref_line(h=0)+modelr::geom_ref_line(v=0)+geom_text(aes(label=State),size=3)+xlab("PC1:rateofseriouscrime,重大犯罪發生率")+ylab("PC2:urbanization,都市化程度")+ggtitle("FirstTwoPrincipalComponentsofUSArrestsData")+theme(text=element_text(family="黑體-繁中黑"))
在PC1重大犯罪率維度上,Florida,Navada,California具有高重大犯罪率,而NorthDakota,Vermont的重大犯罪率則較低。
在PC2都市化程度維度上,Hawaii,NewJersey為高度都市化城市,而NorthCalifornia,Mississippi的都市化程度則較低。
而接近中心點的城市如Indiana,Virginia則表示在兩維度表現皆為平均值。
4.萃取主成分
透過以上計算過程我們能夠產出p個主成分向量,但是卻會有以下疑問:
該如何決定萃取的主成分數目?
萃取的主成分又構成資料變異的多少比例?
以下我們將介紹常用的指標PVE(TheProportionofVarianceExplained)以及以利用該指標所繪出的資訊曲線圖,來輔助我們判斷每一個主成分解釋變異比例以及合適的萃取數。
TheProportionofVarianceExplained(PVE)
第m個主成分解釋的變異量佔比計算公式如下:
$$PVE=\frac{\sum_{i=1}^n(\sum_{j=1}^p\phi_{jm}x_{ij})^2}{\sum_{j=1}^p\sum_{i=1}^nx_{ij}^2}$$
即為第m個主成分的特徵值除上所有主成分特徵值加總。
PVE
123
PVEround(PVE,2)#[1]0.620.250.090.04
從上面計算結果,我們可知第一個主成分解釋變異佔比為62%,第二主成分解釋變異占比為25%。
而首兩個主成分總解釋變異便佔了87%。
我們可繪出各主成分所對應的解釋變異佔比以及累積佔比圖。
#PVE(akascree)plot
PVEplot
1234567891011121314151617181920
#PVE(akascree)plotPVEplotqplot(c(1:4),PVE)+geom_line()+xlab("PrincipalComponent")+ylab("PVE")+ggtitle("ScreePlot")+ylim(0,1) #CumulativePVEplotcumPVEqplot(c(1:4),cumsum(PVE))+geom_line()+xlab("PrincipalComponent")+ylab(NULL)+ggtitle("CumulativeScreePlot")+ylim(0,1) grid.arrange(PVEplot,cumPVE,ncol=2)
決定主成分萃取數
會視不同的分析目的和情形而定。
一般來說,會根據每個主成分解釋變異百分比變化圖或累積圖,找出解釋絕大部分變異的最少主成分,約為線條出現「肘彎」轉折點處。
比如說根據累積圖(上圖右),我們發現第三和第四主成分解釋的變異都有限,不如前兩個主成分,因此我們挑選解釋變異佔比前兩大主成分,兩主成分總構成約87%的變異。
5.R語言內建的PCA函數
在前面幾個步驟,我們為了熟悉主成分的計算邏輯,手動計算資料的共變異矩陣與矩陣對應的特徵值與特徵向量,但並不適合複雜的PCA運算。
這邊將介紹一個R簡化PCA運算常用的套件:stats套件中的prcomp()函數。
prcomp()函數可以被用來快速處理上述幾個PCA相關運算。
幾個重要參數包括:
center:預設值為TRUE。
表示將資料平均值置中為0。
scale:預設值為TRUE。
表示將資料標準差壓縮為1。
pca_result
123456789101112131415
pca_resultpca_result #Standarddeviations(1,..,p=4):#[1]1.57487830.99486940.59712910.4164494##Rotation(nxk)=(4x4):#PC1PC2PC3PC4#Murder-0.53589950.4181809-0.34123270.64922780#Assault-0.58318360.1879856-0.2681484-0.74340748#UrbanPop-0.2781909-0.8728062-0.37801580.13387773#Rape-0.5434321-0.16731860.81777790.08902432 names(pca_result)#[1]"sdev""rotation""center""scale""x"
我們可將pca_result結果全部列出或列出list名稱names(pca_result)或透過pca_result$xxx單獨呼叫list物件,對照了解以下資訊。
sdev:表示每個主成分的標準差。
pca_result$sdev
#[1]1.57487830.99486940.59712910.4164494
12
pca_result$sdev#[1]1.57487830.99486940.59712910.4164494
rotation:每個主成分的負荷向量(loadingvector)。
也因為R預設特徵向量指向負向,我們調整將特徵向量乘上純量-1。
經調整後,便和我們先前手動計算的結果相同了。
pca_result$rotation
#PC1PC2PC3PC4
#Murder-0.53589950.4181809-0.34123270.64922780
#Assault-0.58318360.1879856-0.2681484-0.74340748
#UrbanPop-0.2781909-0.8728062-0.37801580.13387773
#Rape-0.5434321-0.16731860.81777790.08902432
pca_result$rotation
1234567891011121314
pca_result$rotation#PC1PC2PC3PC4#Murder-0.53589950.4181809-0.34123270.64922780#Assault-0.58318360.1879856-0.2681484-0.74340748#UrbanPop-0.2781909-0.8728062-0.37801580.13387773#Rape-0.5434321-0.16731860.81777790.08902432 pca_result$rotationpca_result$rotation#PC1PC2PC3PC4#Murder0.5358995-0.41818090.3412327-0.64922780#Assault0.5831836-0.18798560.26814840.74340748#UrbanPop0.27819090.87280620.3780158-0.13387773#Rape0.54343210.1673186-0.8177779-0.08902432
center,scale:每一個主成分在資料標準化前的平均數與標準差。
pca_result$center
#MurderAssaultUrbanPopRape
#7.788170.76065.54021.232
pca_result$scale
#MurderAssaultUrbanPopRape
#4.35551083.33766114.4747639.366385
123456
pca_result$center#MurderAssaultUrbanPopRape#7.788170.76065.54021.232pca_result$scale#MurderAssaultUrbanPopRape#4.35551083.33766114.4747639.366385
另外,我們也可以從結果取得每一個國家(每一個觀察值)的主成分分數。
(但記得,如同特徵向量之處理,主成分分數也要乘上純量-1)。
pca_result$x
123456789
pca_result$xhead(pca_result$x)#PC1PC2PC3PC4#Alabama0.9756604-1.12200120.43980366-0.154696581#Alaska1.9305379-1.0624269-2.019500270.434175454#Arizona1.74544290.7384595-0.054230250.826264240#Arkansas-0.1399989-1.1085423-0.113422170.180973554#California2.49861281.5274267-0.592541000.338559240#Colorado1.49934070.9776297-1.08400162-0.001450164
如果要印出二維主成分圖,可以使用stat套件中的biplot()函數。
常用參數包括:
choice:預設為使用第一和第二欄來繪製(choice=1:2)。
如果想要調整繪製x,y軸,比如說繪製第三和第四主成分則可將參數設定為choices=3:4。
biplot(x=pca_result)#default為第一和第二欄
1
biplot(x=pca_result)#default為第一和第二欄
跟先前比較不同之處,圖中的標記的紅色向量分別表示各變數對主成分的作用的方向。
另外,我們也可以算出每個主成分解釋變異量。
(VE
12
(VE#[1]2.48024160.98976520.35656320.1734301
計算PVE。
結果跟先前手動計算相同。
PVE
123
PVEround(PVE,2)##[1]0.620.250.090.04
總結
主成分分析的應用非常廣泛,不僅可搭配迴歸、羅吉斯回歸、分群演算法一併使用,來有效降低維度。
或是說,在查看分群結果時,我們可透過fviz_cluster()或plot.kmeans()函數將多維資料呈現在二維平面用的即是主成分分析方法(請參考「分群分析Clustering|PartitionalClustering」)。
更多統計模型筆記連結:
LinearRegression|線性迴歸模型|usingAirQualityDataset
RegularizedRegression|正規化迴歸–Ridge,Lasso,ElasticNet|R語言
LogisticRegression羅吉斯迴歸|part1–資料探勘與處理|統計R語言
LogisticRegression羅吉斯迴歸|part2–模型建置、診斷與比較|R語言
DecisionTree決策樹|CART,ConditionalInferenceTree,RandomForest
RegressionTree|迴歸樹,Bagging,BootstrapAggregation|R語言
RandomForests隨機森林|randomForest,ranger,h2o|R語言
GradientBoostingMachinesGBM|gbm,xgboost,h2o|R語言
HierarchicalClustering階層式分群|Clustering資料分群|R統計
PartitionalClustering|切割式分群|Kmeans,Kmedoid|Clustering資料分群
PrincipalComponentsAnalysis(PCA)|主成份分析|R統計
參考:
歐萊禮 R資料科學
文章導覽列
⟵PartitionalClustering切割式分群|Kmeans,Kmedoid|Clustering資料分群黑毛屋kurogeya|吃的到高級日本和牛的涮涮鍋|台北信義新光三越A4⟶
在《PrincipalComponentsAnalysis(PCA)|主成份分析|R統計》中有1則留言
請教一下,文中提及主成分分析可搭配迴歸、羅吉斯回歸等演算法。
如將訓練資料集的輸入變數進行PCA,然後萃取前5個主成分進行建模(多元迴歸),之後的測試資料集是不是要自行萃取前5個主成分才能帶入模型;或是要使用訓練資料集的PCA前5個主成分的權重來計算出測試資料集的5個主成分,然後再用多元回歸模型進行預測?
再麻煩您解惑,謝謝。
回覆
發佈留言取消回覆發佈留言必須填寫的電子郵件地址不會公開。
必填欄位標示為*留言顯示名稱*
電子郵件地址*
個人網站網址
Currentye@r*
Leavethisfieldempty
搜尋關鍵字:
近期文章
JB’sDiner|陽光、綠意、自然度假風美式早午餐|台北天母
邀月兒|適合放鬆小酌的迷人高級餐酒館|台北民生社區富錦街
信義誠品咖啡EsliteCafé|美美的優雅的文青咖啡廳|台北信義區
小鼎膾|新鮮美味的高品質日式丼飯、海鮮料理|台北信義BellavitaB2
GradientBoostingMachinesGBM|gbm,xgboost,h2o|R語言
彙整
2019年8月
2019年4月
2019年3月
2019年2月
2019年1月
2018年12月
2018年10月
2018年9月
2018年8月
2018年7月
2018年5月
延伸文章資訊
- 1主成分分析(Principal Components Analysis) - RPubs
主成分分析是一種通過降維技術把多個變數化成少數幾個主成分的方法。這些主成分能夠反映原始變數的絕大部分資訊,它們通常表示為原始變數的線性組合。
- 2R 主成分分析PCA 教學:使用ade4 套件 - Office 指南
在R 中有很多不同的套件都可以用來處理主成分分析,這裡我們介紹使用 ade4 套件進行分析,再以 factoextra 套件繪製圖形的流程。 安裝R 套件. 這裡我們需要的套件除了 ade4 ...
- 3Principal Components Analysis (PCA) | 主成份分析| R 統計
Principal Components Analysis (PCA) | 主成份分析| R 統計 · 主成分分析屬於非監督是式學習法,即處理一組沒有回應變數Y(目標變數)的一群X變數(X1,X...
- 4手把手的機器學習新手教學與R語言實作:主成份分析— PCA ...
基本介紹. “手把手的機器學習新手教學與R語言實作:主成份分析— PCA (Principle component analysis)” is published by Shan-Jyun Wu.
- 5R语言教程|带你搞清楚主成分分析(PCA)并完成分析 - 知乎专栏
既然主成分分析主要是选取解释变量方差最大的主成分,故先需要计算变量两两之间协方差,根据协方差与方差的关系,位于协方差矩阵对角线上的数值即为相应 ...