【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

周旨
• 阅读 798

原文链接:http://tecdat.cn/?p=22492

最近我们被客户要求撰写关于主成分分析PCA的研究报告,包括一些图形和统计输出。
降维技术之一是主成分分析 (PCA) 算法,该算法将可能相关变量的一组观察值转换为一组线性不相关变量。在本文中,我们将讨论如何通过使用 R编程语言使用主成分分析来减少数据维度分析葡萄酒数据

高维数据集的处理可能是一个复杂的问题,因为我们需要更高的计算资源,或者难以控制机器学习模型的过度拟合等。为避免此类问题,您可以降低数据集的维数。降维将数据从高维空间转移到低维空间,使数据的低维表示只保留原始数据的重要方面。

 
【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据 

这是将三维数据集转换为三个二维数据集的可视化:该图说明了一个三维特征空间被分成三个二维特征空间,之后,如果发现相关,特征的数量可以进一步减少。

 

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

主成分分析(PCA)

主成分分析(PCA)是最流行的线性降维算法之一。它是一种基于投影的方法,通过将数据投影到一组正交(垂直)轴上来转换数据。

 

“PCA 的工作条件是,当高维空间中的数据映射到低维空间中的数据时,低维空间中数据的方差或散布应该最大。”

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

假设我们必须将数据点的二维表示转换为一维表示。因此,我们将尝试在它们上找到一条直线并投影数据点。(直线是一维的)。选择直线的可能性有很多。

假设蓝色线将是我们的新维度。如果你看到蓝线(连接红点在蓝线上的投影),即每个数据点与直线的垂直距离就是投影误差。所有数据点的误差之和将是总投影误差。

我们的新数据点将是那些原始蓝色数据点的投影(红色点)。正如我们所看到的,我们通过将二维数据点投影到一维空间(即直线)上,将它们转换为一维数据点。

您从本质上将数据的维度从二维减少到一维。一维空间(也就是直线)是二维坐标系的子空间。

蓝线是使用数学优化构建的,以尽可能地沿该线最大化数据点之间的方差,数据在二维空间中沿蓝线具有最大方差。

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

我们称这条线为我们的第一个主成分。自然,线上的点仍然比原始 2D 空间中的点更接近,因为您正在失去区分它们的维度。但在很多情况下,通过降维实现的简化超过了信息的损失,损失可以部分或全部重构。

在我们之前的示例中,我们只有一个主成分。一旦进入更高维空间,您可能会使用多个主成分,因为由一个主成分解释的方差通常不足。主成分是相互正交的向量。这意味着它们形成 90 度角。在数学上,正交向量是独立的,这意味着由第二个主成分解释的方差与第一个主成分的方差不重叠。因此,它们尽可能有效地表示信息。第一个主成分将捕获大部分方差;第二个主成分将捕获第一个未解释的方差的第二大部分,依此类推。

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

实际上,主成分是通过确保特征之间没有信息重叠来尽可能有效地表示数据及其差异的特征组合。原始特征通常显示出显着的冗余,这也是主成分分析在降维方面如此有效的主要原因。

R语言主成分分析(PCA)葡萄酒可视化:主成分得分散点图和载荷图

我们将使用葡萄酒数据集进行主成分分析。

数据

数据包含177个样本和13个变量的数据框;vintages包含类标签。这些数据是对生长在意大利同一地区但来自三个不同栽培品种的葡萄酒进行化学分析的结果:内比奥罗、巴贝拉和格里格诺葡萄。来自内比奥罗葡萄的葡萄酒被称为巴罗洛。

这些数据包含在三种类型的葡萄酒中各自发现的几种成分的数量。

# 看一下数据
head(no)

输出

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

转换和标准化数据

对数转换和标准化,将所有变量设置在同一尺度上。

# 对数转换
no_log <- log(no)

# 标准化
log_scale <- scale(no_log)
head(log_scale)

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

主成分分析(PCA)

使用奇异值分解算法进行主成分分析

prcomp(log_scale, center=FALSE)
summary(PCA)

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

基本图形(默认设置)

带有基础图形的主成分得分和载荷图

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], # 设置标签的位置

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

此外,我们还可以在分数图中的组别上添加95%的置信度椭圆。


点击标题查阅往期内容

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

高维数据惩罚回归方法:主成分回归PCR、岭回归、lasso、弹性网络elastic net分析基因数据

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

左右滑动查看更多

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

01

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

02

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

03

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

04

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

置信度椭圆图函数

## 椭圆曲线图
                        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 # 标题文字的大小
)

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据



【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据

点击文末 “阅读原文”

获取全文完整资料。

本文选自《R语言主成分分析(PCA)葡萄酒可视化:主成分得分散点图和载荷图》。

点击标题查阅往期内容

数据分享|R语言用主成分分析(PCA)PCR回归进行预测汽车购买信息可视化
R语言主成分分析(PCA)葡萄酒可视化:主成分得分散点图和载荷图主成分分析PCA谱分解、奇异值分解SVD预测分析运动员表现数据和降维可视化用回归和主成分分析PCA 回归交叉验证分析预测城市犯罪率数据
R语言k-means聚类、层次聚类、主成分(PCA)降维及可视化分析鸢尾花iris数据集
R语言有限混合模型(FMM,finite mixture model)EM算法聚类分析间歇泉喷发时间
R语言用温度对城市层次聚类、kmean聚类、主成分分析和Voronoi图可视化
R语言k-Shape时间序列聚类方法对股票价格时间序列聚类
R语言中的SOM(自组织映射神经网络)对NBA球员聚类分析
Python、R对小说进行文本挖掘和层次聚类可视化分析案例
R语言复杂网络分析:聚类(社区检测)和可视化
R语言中的划分聚类模型
基于模型的聚类和R语言中的高斯混合模型
r语言聚类分析:k-means和层次聚类
SAS用K-Means 聚类最优k值的选取和分析
R语言k-Shape时间序列聚类方法对股票价格时间序列聚类
基于LDA主题模型聚类的商品评论文本挖掘
R语言中实现层次聚类模型
用R语言进行网站评论文本挖掘聚类
R语言鸢尾花iris数据集的层次聚类分析
R语言对用电负荷时间序列数据进行K-medoids聚类建模和GAM回归
R语言聚类算法的应用实例
基于模型的聚类和R语言中的高斯混合模型

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
4年前
PhoneGap设置Icon
参考:http://cordova.apache.org/docs/en/latest/config\_ref/images.html通过config.xml中的<icon标签来设置Icon<iconsrc"res/ios/icon.png"platform"ios"width"57"height"57"densi
Stella981 Stella981
4年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这