降維技術之一是主成分分析 (PCA) 算法,該算法将可能相關變量的一組觀察值轉換為一組線性不相關變量。在本文中,我們将讨論如何通過使用 R程式設計語言使用主成分分析來減少資料次元分析葡萄酒資料(檢視文末了解資料擷取方式)。
主成分分析PCA降維方法和R語言分析葡萄酒可視化執行個體
主成分分析PCA降維方法和R語言分析葡萄酒可視化執行個體
,時長04:30
高維資料集的處理可能是一個複雜的問題,因為我們需要更高的計算資源,或者難以控制機器學習模型的過度拟合等。為避免此類問題,您可以降低資料集的維數。降維将資料從高維空間轉移到低維空間,使資料的低維表示隻保留原始資料的重要方面。
這是将三維資料集轉換為三個二維資料集的可視化:該圖說明了一個三維特征空間被分成三個二維特征空間,之後,如果發現相關,特征的數量可以進一步減少。
主成分分析(PCA)
主成分分析(PCA)是最流行的線性降維算法之一。它是一種基于投影的方法,通過将資料投影到一組正交(垂直)軸上來轉換資料。
“PCA 的工作條件是,當高維空間中的資料映射到低維空間中的資料時,低維空間中資料的方差或散布應該最大。”
假設我們必須将資料點的二維表示轉換為一維表示。是以,我們将嘗試在它們上找到一條直線并投影資料點。(直線是一維的)。選擇直線的可能性有很多。
假設藍色線将是我們的新次元。如果你看到藍線(連接配接紅點在藍線上的投影),即每個資料點與直線的垂直距離就是投影誤差。所有資料點的誤差之和将是總投影誤差。
我們的新資料點将是那些原始藍色資料點的投影(紅色點)。正如我們所看到的,我們通過将二維資料點投影到一維空間(即直線)上,将它們轉換為一維資料點。
您從本質上将資料的次元從二維減少到一維。一維空間(也就是直線)是二維坐标系的子空間。
藍線是使用數學優化建構的,以盡可能地沿該線最大化資料點之間的方差,資料在二維空間中沿藍線具有最大方差。
我們稱這條線為我們的第一個主成分。自然,線上的點仍然比原始 2D 空間中的點更接近,因為您正在失去區分它們的次元。但在很多情況下,通過降維實作的簡化超過了資訊的損失,損失可以部分或全部重構。
在我們之前的示例中,我們隻有一個主成分。一旦進入更高維空間,您可能會使用多個主成分,因為由一個主成分解釋的方差通常不足。主成分是互相正交的向量。這意味着它們形成 90 度角。在數學上,正交向量是獨立的,這意味着由第二個主成分解釋的方差與第一個主成分的方差不重疊。是以,它們盡可能有效地表示資訊。第一個主成分将捕獲大部分方差;第二個主成分将捕獲第一個未解釋的方差的第二大部分,依此類推。
實際上,主成分是通過確定特征之間沒有資訊重疊來盡可能有效地表示資料及其差異的特征組合。原始特征通常顯示出顯着的備援,這也是主成分分析在降維方面如此有效的主要原因。
R語言主成分分析(PCA)葡萄酒可視化:主成分得分散點圖和載荷圖
我們将使用葡萄酒資料集進行主成分分析。
資料
資料包含177個樣本和13個變量的資料框;vintages包含類标簽。這些資料是對生長在意大利同一地區但來自三個不同栽培品種的葡萄酒進行化學分析的結果:内比奧羅、巴貝拉和格裡格諾葡萄。來自内比奧羅葡萄的葡萄酒被稱為巴羅洛。
這些資料包含在三種類型的葡萄酒中各自發現的幾種成分的數量。
- # 看一下資料
- head(no)
輸出
轉換和标準化資料
對數轉換和标準化,将所有變量設定在同一尺度上。
1. # 對數轉換
2. no_log <- log(no)
3.
4. # 标準化
5. log\_scale <- scale(no\_log)
6. head(log_scale)
主成分分析(PCA)
使用奇異值分解算法進行主成分分析
1. prcomp(log_scale, center=FALSE)
2. summary(PCA)
基本圖形(預設設定)
帶有基礎圖形的主成分得分和載荷圖
1. plot(scores\[,1:2\], # x和y資料
2. pch=21, # 點形狀
3. cex=1.5, # 點的大小
4.
5. legend("topright", # legend的位置
6. legend=levels(vint), # 圖例顯示
7.
8. plot(loadings\[,1:2\], # x和y資料
9. pch=21, # 點的形狀
10.
11. text(loadings\[,1:2\], # 設定标簽的位置
此外,我們還可以在分數圖中的組别上添加95%的置信度橢圓。
置信度橢圓圖函數
1. ## 橢圓曲線圖
2. elev=0.95, # 橢圓機率水準
3. pcol=NULL, # 手工添加顔色,必須滿足長度的因素
4. cexsize=1, # 點大小
5. ppch=21, # 點類型,必須滿足因素的長度
6. legcexsize=2, # 圖例字型大小
7. legptsize=2, # 圖例點尺寸
8.
9. ## 設定因子水準
10. if(is.factor(factr) {
11. f <- factr
12. } else {
13. f <- factor(factr, levels=unique(as.character(factr)))
14. }
15. intfactr <- as.integer(f) # 設定與因子水準相比對的整數向量
16.
17. ## 擷取橢圓的資料
18. edf <- data.frame(LV1 = x, LV2=y, factr = f) # 用資料和因子建立資料框
19. ellipses <- dlply(edf, .(factr), function(x) {
20.
21. Ellipse(LV1, LV2, levels=elev, robust=TRUE, draw=FALSE) #從dataEllipse()函數中按因子水準擷取置信度橢圓點
22. })
23. ## 擷取X和Y資料的範圍
24. xrange <- plotat(range(c(as.vector(sapply(ellipses, function(x) x\[,1\])), min(x), max(x))))
25. ## 為圖塊設定顔色
26. if(is.null(pcol) != TRUE) { # 如果顔色是由使用者提供的
27. pgcol <- paste(pcol, "7e", sep="") # 增加不透明度
28.
29. # 繪圖圖形
30. plot(x,y, type="n", xlab="", ylab="", main=""
31. abline(h=0, v=0, col="gray", lty=2) #在0添加線條
32. legpch <- c() # 收集圖例資料的矢量
33. legcol <- c() # 收集圖例col資料的向量
34. ## 添加點、橢圓,并确定圖例的顔色
35. ## 圖例
36. legend(x=legpos, legend=levels(f), pch=legpch,
37. ## 使用prcomp()函數的PCA輸出的軸圖示
38. pcavar <- round((sdev^2)/sum((sdev^2))
基礎圖形
繪制主成分得分圖,使用基本預設值繪制載荷圖
1. plot(scores\[,1\], # X軸的資料
2. scores\[,2\], # Y軸的資料
3. vint, # 有類的因素
4. pcol=c(), # 用于繪圖的顔色(必須與因素的數量相比對)
5. pbgcol=FALSE, #點的邊框是黑色的?
6. cexsize=1.5, # 點的大小
7. ppch=c(21:23), # 點的形狀(必須與因子的數量相比對)
8. legpos="bottom right", # 圖例的位置
9. legcexsize=1.5, # 圖例文字大小
10. legptsize=1.5, # 圖例點的大小
11. axissize=1.5, # 設定軸的文字大小
12. linewidth=1.5 # 設定軸線尺寸
13. )
14. title(xlab=explain\[\["PC1"\]\], # PC1上解釋的方差百分比
15. ylab=explain\[\["PC2"\]\], # PC2解釋的方差百分比
16. main="Scores", # 标題
17. cex.lab=1.5, # 标簽文字的大小
18. cex.main=1.5 # 标題文字的大小
19.
20. plot(loadings\[,1:2\], # x和y資料
21. pch=21, # 點的形狀
22. cex=1.5, # 點的大小
23. # type="n", # 不繪制點數
24. axes=FALSE, # 不列印坐标軸
25. xlab="", # 删除x标簽
26. ylab="" # 删除y标簽
27. )
28. pointLabel(loadings\[,1:2\], #設定标簽的位置
29. labels=rownames(PCAloadings), # 輸出标簽
30. cex=1.5 # 設定标簽的大小
31. ) # pointLabel将嘗試将文本放在點的周圍
32. axis(1, # 顯示x軸
33. cex.axis=1.5, # 設定文本的大小
34. lwd=1.5 # 設定軸線的大小
35. )
36. axis(2, # 顯示y軸
37. las=2, # 參數設定文本的方向,2是垂直的
38. cex.axis=1.5, # 設定文本的大小
39. lwd=1.5 # 設定軸線的大小
40. )
41. title(xlab=explain\[\["PC1"\]\], # PC1所解釋的方差百分比
42. ylab=explain\[\["PC2"\]\], # PC2解釋的方差百分比
43.
44. cex.lab=1.5, # 标簽文字的大小
45. cex.main=1.5 # 标題文字的大小
46. )
資料擷取
在下面公衆号背景回複“葡萄酒資料”,可擷取完整資料。
本文選自《R語言主成分分析(PCA)葡萄酒可視化:主成分得分散點圖和載荷圖》。