原文链接:http://tecdat.cn/?p=22492
降维技术之一是主成分分析 (PCA) 算法,该算法将可能相关变量的一组观察值转换为一组线性不相关变量。在本文中,我们将讨论如何通过使用 R编程语言使用主成分分析来减少数据维度分析葡萄酒数据(查看文末了解数据获取方式)。
主成分分析PCA降维方法和R语言分析葡萄酒可视化实例
高维数据集的处理可能是一个复杂的问题,因为我们需要更高的计算资源,或者难以控制机器学习模型的过度拟合等。为避免此类问题,您可以降低数据集的维数。降维将数据从高维空间转移到低维空间,使数据的低维表示只保留原始数据的重要方面。
这是将三维数据集转换为三个二维数据集的可视化:该图说明了一个三维特征空间被分成三个二维特征空间,之后,如果发现相关,特征的数量可以进一步减少。
主成分分析(PCA)
主成分分析(PCA)是最流行的线性降维算法之一。它是一种基于投影的方法,通过将数据投影到一组正交(垂直)轴上来转换数据。
“PCA 的工作条件是,当高维空间中的数据映射到低维空间中的数据时,低维空间中数据的方差或散布应该最大。”
假设我们必须将数据点的二维表示转换为一维表示。因此,我们将尝试在它们上找到一条直线并投影数据点。(直线是一维的)。选择直线的可能性有很多。
假设蓝色线将是我们的新维度。如果你看到蓝线(连接红点在蓝线上的投影),即每个数据点与直线的垂直距离就是投影误差。所有数据点的误差之和将是总投影误差。
我们的新数据点将是那些原始蓝色数据点的投影(红色点)。正如我们所看到的,我们通过将二维数据点投影到一维空间(即直线)上,将它们转换为一维数据点。
您从本质上将数据的维度从二维减少到一维。一维空间(也就是直线)是二维坐标系的子空间。
蓝线是使用数学优化构建的,以尽可能地沿该线最大化数据点之间的方差,数据在二维空间中沿蓝线具有最大方差。
我们称这条线为我们的第一个主成分。自然,线上的点仍然比原始 2D 空间中的点更接近,因为您正在失去区分它们的维度。但在很多情况下,通过降维实现的简化超过了信息的损失,损失可以部分或全部重构。
在我们之前的示例中,我们只有一个主成分。一旦进入更高维空间,您可能会使用多个主成分,因为由一个主成分解释的方差通常不足。主成分是相互正交的向量。这意味着它们形成 90 度角。在数学上,正交向量是独立的,这意味着由第二个主成分解释的方差与第一个主成分的方差不重叠。因此,它们尽可能有效地表示信息。第一个主成分将捕获大部分方差;第二个主成分将捕获第一个未解释的方差的第二大部分,依此类推。
实际上,主成分是通过确保特征之间没有信息重叠来尽可能有效地表示数据及其差异的特征组合。原始特征通常显示出显着的冗余,这也是主成分分析在降维方面如此有效的主要原因。
R语言主成分分析(PCA)葡萄酒可视化:主成分得分散点图和载荷图
我们将使用葡萄酒数据集进行主成分分析。
数据
数据包含177个样本和13个变量的数据框;vintages包含类标签。这些数据是对生长在意大利同一地区但来自三个不同栽培品种的葡萄酒进行化学分析的结果:内比奥罗、巴贝拉和格里格诺葡萄。来自内比奥罗葡萄的葡萄酒被称为巴罗洛。
这些数据包含在三种类型的葡萄酒中各自发现的几种成分的数量。
# 看一下数据 head(no)
输出
转换和标准化数据
对数转换和标准化,将所有变量设置在同一尺度上。
# 对数转换 no_log <- log(no) # 标准化 log\_scale <- scale(no\_log) head(log_scale)
主成分分析(PCA)
使用奇异值分解算法进行主成分分析
prcomp(log_scale, center=FALSE) summary(PCA)
基本图形(默认设置)
带有基础图形的主成分得分和载荷图
plot(scores\[,1:2\], # x和y数据 pch=21, # 点形状 cex=1.5, # 点的大小 legend("topright", # legend的位置 legend=levels(vint), # 图例显示 plot(loadings\[,1:2\], # x和y数据 pch=21, # 点的形状 text(loadings\[,1:2\], # 设置标签的位置
此外,我们还可以在分数图中的组别上添加95%的置信度椭圆。
点击标题查阅往期内容
高维数据惩罚回归方法:主成分回归PCR、岭回归、lasso、弹性网络elastic net分析基因数据
01
02
03
04
置信度椭圆图函数
## 椭圆曲线图 elev=0.95, # 椭圆概率水平 pcol=NULL, # 手工添加颜色,必须满足长度的因素 cexsize=1, # 点大小 ppch=21, # 点类型,必须满足因素的长度 legcexsize=2, # 图例字体大小 legptsize=2, # 图例点尺寸 ## 设定因子水平 if(is.factor(factr) { f <- factr } else { f <- factor(factr, levels=unique(as.character(factr))) } intfactr <- as.integer(f) # 设置与因子水平相匹配的整数向量 ## 获取椭圆的数据 edf <- data.frame(LV1 = x, LV2=y, factr = f) # 用数据和因子创建数据框 ellipses <- dlply(edf, .(factr), function(x) { Ellipse(LV1, LV2, levels=elev, robust=TRUE, draw=FALSE) #从dataEllipse()函数中按因子水平获取置信度椭圆点 }) ## 获取X和Y数据的范围 xrange <- plotat(range(c(as.vector(sapply(ellipses, function(x) x\[,1\])), min(x), max(x)))) ## 为图块设置颜色 if(is.null(pcol) != TRUE) { # 如果颜色是由用户提供的 pgcol <- paste(pcol, "7e", sep="") # 增加不透明度 # 绘图图形 plot(x,y, type="n", xlab="", ylab="", main="" abline(h=0, v=0, col="gray", lty=2) #在0添加线条 legpch <- c() # 收集图例数据的矢量 legcol <- c() # 收集图例col数据的向量 ## 添加点、椭圆,并确定图例的颜色 ## 图例 legend(x=legpos, legend=levels(f), pch=legpch, ## 使用prcomp()函数的PCA输出的轴图示 pcavar <- round((sdev^2)/sum((sdev^2))
基础图形
绘制主成分得分图,使用基本默认值绘制载荷图
plot(scores\[,1\], # X轴的数据 scores\[,2\], # Y轴的数据 vint, # 有类的因素 pcol=c(), # 用于绘图的颜色(必须与因素的数量相匹配) pbgcol=FALSE, #点的边框是黑色的? cexsize=1.5, # 点的大小 ppch=c(21:23), # 点的形状(必须与因子的数量相匹配) legpos="bottom right", # 图例的位置 legcexsize=1.5, # 图例文字大小 legptsize=1.5, # 图例点的大小 axissize=1.5, # 设置轴的文字大小 linewidth=1.5 # 设置轴线尺寸 ) title(xlab=explain\[\["PC1"\]\], # PC1上解释的方差百分比 ylab=explain\[\["PC2"\]\], # PC2解释的方差百分比 main="Scores", # 标题 cex.lab=1.5, # 标签文字的大小 cex.main=1.5 # 标题文字的大小 plot(loadings\[,1:2\], # x和y数据 pch=21, # 点的形状 cex=1.5, # 点的大小 # type="n", # 不绘制点数 axes=FALSE, # 不打印坐标轴 xlab="", # 删除x标签 ylab="" # 删除y标签 ) pointLabel(loadings\[,1:2\], #设置标签的位置 labels=rownames(PCAloadings), # 输出标签 cex=1.5 # 设置标签的大小 ) # pointLabel将尝试将文本放在点的周围 axis(1, # 显示x轴 cex.axis=1.5, # 设置文本的大小 lwd=1.5 # 设置轴线的大小 ) axis(2, # 显示y轴 las=2, # 参数设置文本的方向,2是垂直的 cex.axis=1.5, # 设置文本的大小 lwd=1.5 # 设置轴线的大小 ) title(xlab=explain\[\["PC1"\]\], # PC1所解释的方差百分比 ylab=explain\[\["PC2"\]\], # PC2解释的方差百分比 cex.lab=1.5, # 标签文字的大小 cex.main=1.5 # 标题文字的大小 )