R语言ggplot2 | PCA分析及其可视化

主成分分析

  • 主成分分析(PCA)的基本介绍
  • PCA常用的参数
    • 标准化
    • 特征值和特征向量
    • 载荷
    • 得分
  • R语言实现PCA分析
    • 逐步计算PCA分析中的参数
    • prcomp函数
    • princomp函数
  • 自定义函数实现PCA分析及其可视化

  咱们常提到的PCA分析全称是Principal Components Analysis,即主成分分析,这是降维中最常见的一种方法。我相信,数据维度大家应该都比较清楚,这里就不再一一赘述。因此,与大家分享下PCA分析的基本知识,以及如何利用R语言计算PCA的相关参数,最后我把数据处理及其可视化的整个过程打包成函数,便于新手直接套用,同时也希望能给已经入门的同学在学习自定义函数的过程提供一定的帮助。

主成分分析(PCA)的基本介绍

  首先,我们要清楚明白什么是降维?直白的说就是把数据的维度降下来,用相对低维的向量来表征高维度数据的特征。其次,为什么要做降维呢,降维有什么必要性以及好处使得我们需要适用数据更低的维度表示?大背景是因为大数据时代,多维的数据越来越普遍,比如组学和微生物OTU的数据,数据维度都成千上万,处理起来太复杂。通过降维的方法找出最具代表性的主成分,便于后续对样本进行区分和数据处理。

数据降维的必要性

  • 降低高维数据的处理难度,便于后续计算和分析;(也就是说,100个维度通过降维形成几个主要维度,并用其来表征100个维度做后续的分析)
  • 去除噪音和冗余数据,减少主要信息的损失;(维度降下来意味着只保留最主要的规律和信息,那些细小的相关性是噪音的影响)
  • 保证计算的准确性和效率;(维度越高相对来说的确精度越低,一是数据度量本身的不准确性增加,二是计算时比如浮点数或者舍入等情况越多的发生)

  另外,PCA是一种无监督算法,意味着我们不需要标签就能对数据进行降维;降维后,由于失去了标签,我们可能无法理解每个维度的含义;但至少减少了数据维度,使得计算机能更好的识别和计算。也就是说,PCA把原来高维的数据(多个特征)用低维(少量特征值)来代替,新的维度是原先高维度的线性组合,这些组合变量(方差最大)尽可能代表原来的变量,而且彼此之间互不相关,因此对于一些冗余的数据有很好的表现。(如果大家想了解降维的一些原理,推荐大家阅读PCA基本原理)

PCA常用的参数

PCA分析中需要用到几个常用参数,标准化(scale)、特征值(eigen value)、特征向量(eigen vector)、载荷(loading)、得分(score):

标准化

如果是针对环境因子,各变量之间存在不同量纲,标准化可以较好地解决这个问题;其次,有些数据的数值比较大,标准化后可以较好地避免较大的数值对主成分的贡献过大。尽管如此,标准化也不是十全十美的。标准化会导致各变量之间的权重相等,这可能会产生一些负面结果。特别是,如果变量中有噪音的话,标准化无形中把噪音和信息的权重变得相同,但PCA是无法区分噪音和信号。因此,在这种情形下,我们就不需要标准化了。

特征值和特征向量

特征值表示标量部分,一般为某个主成分的方差,其相对比例可理解为方差解释度或贡献度 ;特征值从第一主成分逐渐减小。特征向量为对应主成分的线性转换向量(线性回归系数),特征向量与原始矩阵的矩阵积为主成分的得分。特征向量是单位向量,其平方和为1。

由于比较抽象,借助该文如何正确理解特征值与特征向量。“从线性代数的角度出发,如果把矩阵看作n维空间下的一个线性变换,这个变换有很多的变换方向,我们通过特征值分解得到的前N个特征向量,就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向,就可以近似这个矩阵(变换)。其中的N个变化方向,就是这个矩阵最重要的“特征”。

清楚特征的概念后,进一步如何理解特征值与特征向量?如果把矩阵看作是位移,那么特征值 = 位移的速度特征向量 = 位移的方向

特征向量在一个矩阵的作用下作伸缩运动,伸缩的幅度由特征值确定。特征值大于1时,所有属于此特征值的特征向量变长;特征值属于(0, 1),特征向量缩短;特征值小于0,特征向量则反向延长

载荷

因子载荷矩阵并不是主成分的特征向量,即不是主成分的系数。主成分系数的求法:各自因子载荷向量除以各自因子特征值的算数平方根

得分

是指主成分的得分,其求法:矩阵与特征向量的积。

由于本人非数学和统计学专业,关于PCA分析中一些专业词汇的解释没办法做到位。尽我所能来给大家简化和解读了,为了让大家有一个更准确和更深刻的理解,附上一些比较专业的解读希望能够给大家提供一定的帮助。

当然,最主要的还是讲R语言的部分。如何利用R语言完成PCA分析才是咱们今天的重头戏~

R语言实现PCA分析

逐步计算PCA分析中的参数

#逐步计算主要参数
library(tidyverse)
#使用自带数据集"iris"#特征分解
eigen <- scale(iris[,-5])%>% # scale()对数据进行标准化cor()%>% # cor()对矩阵进行相关性分析eigen() # eign()对数据矩阵进行光谱分解,得到特征值和特征向量
eigen#提取特征值
eigen$values#特征向量提取
eigen$vectors#计算标准化的主成分得分
scale(iris[,-5])%*%eigen$vectors%>%head()

在这里插入图片描述

接下来,我们介绍两个被广泛用于PCA分析的函数,分别为prcomp函数princomp函数~

prcomp函数

prcomp函数的用法简单,与常规的求取特征值和特征向量不同的是,prcomp函数是对变量矩阵(相关矩阵)采用SVD方法计算其奇异值(原理上是特征值的平方根)。具体的函数参数命令如下:

?prcomp

在这里插入图片描述
在这里插入图片描述
例子如下:

#相关矩阵分解
iris.pca <- prcomp(iris[,-5],scale. = T, #scale.=T表示标准化rank. = 4, #rank.指定最大秩的数字retx=T) #retx一个逻辑值,指示返回已旋转的变量
iris.pca#查看结果
summary(iris.pca) #方差解释度iris.pca$sdev #主成分的标准偏差iris.pca$rotation #可变载荷矩阵iris.pca$x #所有样本每个轴的得分

在这里插入图片描述

princomp函数

princomp以计算相关矩阵或者协方差矩阵的特征值为主。具体的函数参数命令如下:

?princomp

在这里插入图片描述
在这里插入图片描述
例子如下:

# prcomp()的用法
iris.pc <- princomp(iris[,-5],cor=T,scores = T)
iris.pcsummary(iris.pc) #各主成份的解释量iris.pc$loading #可变载荷矩阵head(iris.pc$score) #所有样本各轴的得分screeplot(iris.pc,type="lines") #方差分布图head(predict(iris.pc)) #预测biplot(iris.pc,scale=F) #直接把x与rotation绘图,而非标准化

在这里插入图片描述
由碎石图可以看出,第三个主成分之后,图线变化趋于平稳,因此可以选择前三个主成分做分析(由于这里只有4列变量,所以效果并不明显)。另外,根据上面主成分解释量的结果来看,其实选前两轴数据进行分析即可(因为轴一解释了73%,轴2解释了22.9%)。
在这里插入图片描述
根据轴1和轴2的数据绘制了PCA的降维分析图。
在这里插入图片描述

自定义函数实现PCA分析及其可视化

为了更便捷且更完美地执行PCA分析,我利用基础prcomp函数以及R包ggbiplot中的ggbiplot函数构建了一个新函数 (定义名为:ggplot_PCA)。其他内容就不再赘述,具体看代码吧~

# 自定义函数
# 设置了两个参数,对象数据及主成分数量
ggplot_PCA <- function(data, components = c(1:2)) { #函数主体library(ggbiplot) #加载ggbiplot包使用ggbiplot函数library(ggplot2)
# 重新排序分组信息
data[, 1] <- factor(data[, 1], levels = unique(data[, 1]))
# 除去物种信息名,只保留数值型数据进一步做PCA分析
data_PCA <- data[c(2:ncol(data))]
# 利用prcomp函数进行PCA分析
iris.pca <- prcomp(data_PCA,
center = TRUE, # 中心化和标准化
scale. = TRUE)# 这里大家可以help一下ggbiplot函数查阅一下对应参数用法
# 具体参数过多,这里就不一一细讲,有问题的可以在推文留言ggbiplot(iris.pca, choices = components,
obs.scale = 1, var.scale = 1,
ellipse = F, groups = data[, 1], # 注意这里即可,刚刚是定义了
#数据集第一列的分组信息,这里保持一致即可,其他参数可以直接使用
ellipse.prob = 0.95, circle = F,
varname.size = 5, varname.adjust = 1.5,
var.axes = T) +geom_point(aes(shape = groups, colour = groups), size = 3) +geom_hline(yintercept = 0, colour = "black", linetype = "longdash", size = 1) +geom_vline(xintercept = 0, colour = "black", linetype = "longdash", size = 1) +scale_color_discrete(name = '') +theme(legend.direction = "horizontal", legend.position = "top") +stat_ellipse(type = "t", size = 1, geom = "polygon", alpha = 0.2, aes(fill = groups), level = 0.85) +stat_ellipse(type = "t", size = 1, aes(colour = groups), level = 0.85) +guides(groups = FALSE) +theme(text = element_text(size = 15)) +ggtitle("PCA") +theme(plot.title = element_text(hjust = 0.5))}# 由于上述定义的函数中对应数据集的第一列为分组信息
# 这里构建一个以第一列为分组信息的新数据集
data <- data.frame(groups=iris$Species, iris[1:4])# 查看数据结构
str(data)# 以轴1和轴2绘图
ggplot_PCA(data,components = c(1:2))

结果如下, 美观清晰!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35175.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩转数据可视化之R语言ggplot2:(十六)使用ggplot2编程(函数式绘图)

【R语言数据科学可视化篇】 🌸个人主页:JOJO数据科学📝个人介绍:统计学top3高校统计学硕士在读💌如果文章对你有帮助,欢迎✌关注、👍点赞、✌收藏、👍订阅专栏✨本文收录于【R语言数据科学】本系列主要介绍R语言在数据科学领域的应用包括: R语言编程基础、R语言可…

[R语言]数据可视化包ggplot2教程及实例

前言 ggplot是一个拥有一套完备语法且容易上手的绘图系统&#xff0c;在Python和R中都能引入并使用&#xff0c;在数据分析可视化领域拥有极为广泛的应用。本篇从R的角度介绍如何使用ggplot2包&#xff0c;首先给几个我觉得最值得推荐的理由&#xff1a; 采用“图层”叠加的设…

R语言中强大的作图软件包ggplot2

R语言两大底层绘图系统 grid 图形系统可以很容易地控制图形基础单元&#xff0c;给予编程者创作图形极大的灵活性。grid 图形系 统还可以产生可编辑的图形组件&#xff0c;这些图形组件可以被复用和重组&#xff0c;并能通过 grid.layout()等函数&#xff0c; 把图形输出到指定…

R语言绘图之ggplot2包

6月份一直在忙期末考试&#xff0c;今天来迅速的学习下ggplot2包的简单绘图。 R的基础包里面也有很多画图函数&#xff0c;例如plot();barplot();qqplot(); 但是还有大名鼎鼎的ggplot2包&#xff0c;用这个包的函数画出的图比较漂亮&#xff0c;而且使用灵活。 在ggplot的官…

数据分析——R语言中ggplot2用法(1)

备忘录地址&#xff08;用来查询一些参数&#xff09; https://www.maths.usyd.edu.au/u/UG/SM/STAT3022/r/current/Misc/data-visualization-2.1.pdf R语言软件参数 R3.6.0 安装包、导入包 install.package(ggplot) library(ggplot)首先加载数据集 这里用的是示例数据&am…

R语言:ggplot2包详解及各类精美图形绘制

文章目录 1.1 Ggplot2介绍1.2 Ggplot2特点默认值迭代高级元素 1.3 Ggplot2映射组件layerScalecoordtheme 1.4 Ggplot2自带数据集1.5 Ggplot2组成部分1.6 美观性参数1.7 多子图绘制1.8 图形类型与函数1.9 曲线拟合1.10 箱线图1.11 频率直方图与密度曲线1.12 柱状图1.13 时间序列…

R语言学习—— ggplot2函数

最近在自学R语言&#xff0c;但是从纯粹的理论开始学习太慢了而且没有实操不太行&#xff0c;所以目前是在实际应用中查漏补缺&#xff0c;遇到什么临时学什么&#xff0c;然后把笔记都一一记录下啦。分享出来一边是方便自己查找&#xff0c;另一方面也是想方便和我一样入门的菜…

R语言可视化【ggplot2】

R语言可视化【ggplot2】 文章的文字/图片/代码部分/全部来源网络或学术论文或课件&#xff0c;文章会持续修缮更新&#xff0c;仅供学习使用。 目录 R语言可视化【ggplot2】 一、可视化介绍 二、不同情况适用的图形 类别比较&#xff1a; 数值关系&#xff1a; 数据分布…

马斯克成立XAI公司: 探索宇宙的真实本质

尊敬的读者朋友们&#xff0c;欢迎来到CSDN&#xff01;我是CSDN博主&#xff0c;今天非常高兴为大家带来这篇文章&#xff0c;我们将一起探索马斯克成立xAI公司的意义和目标&#xff0c;以及这个活动的丰富内容。让我们一起踏上这场奇幻之旅&#xff01; 【引言】 在科技界的…

2023年十大科技趋势预测【集锦:机构和GPT们的科技趋势预测,欢迎大家前来围观,看看谁预测得准~~~】

目录 2023年十大科技趋势预测——Claude+ 2023年十大科技趋势预测——GPT-4 1. 量子计算

不止ChatGPT,谷歌云 AI 方案早已厉兵秣马!

【本文由Cloud Ace整理发布&#xff0c;更多内容请访问 Cloud Ace 官网】 近日 ChatGPT 爆火&#xff0c;掀起热议&#xff0c;能聊天能写代码&#xff0c;还能写策划稿&#xff0c;AI 似乎已逐渐变得无所不能。 不过在 AI 对话上&#xff0c;谷歌早在17年就提出了 Dialogflow …

同声传译例子

效果&#xff1a; 准备开源中… 包括&#xff1a; 前端后端架构数据处理模型原理模型训练模型推理测试集评价方法&脚本部分数据

微信小程序 -- 获取语音,并将语音转为文字(插件:微信同声传译)

实现的功能是获取语音&#xff0c;并将语音转为文字&#xff0c;实现效果如下&#xff1a; 1. 小程序后台添加插件&#xff1a;微信同声传译 登录小程序后台&#xff1a;https://mp.weixin.qq.com 11. 设置 -> 第三方设置 -> 添加插件 12. 输入“微信同声传译”&#…

小程序使用微信同声传译进行语言播报(数字播报问题)

小程序使用微信同声传译进行语言播报&#xff08;数字播报问题&#xff09; 需求是产品提的 代码是我写的&#xff08;没办法&#xff0c;卑微打工人&#xff09; 废话不多说直接开始吧 首先在微信微信公众平台插件管理引入插件&#xff08;微信同声传译插件地址&#xff09;…

微信公众平台-设置-第三方设置-插件-搜不到微信同声传译插件

给小程序添加插件&#xff0c;按照官方的方法在插件那里搜不到微信同声传译插件 只好去微信服务平台搜一下 找到了微信同声传译&#xff0c;登录后选择给哪个小程序添加&#xff0c;添加成功后去小程序的微信公众平台看已经添加成功了&#xff0c;而且是已通过状态。

电影、音频同声传译教程(免费实现)

实现思路 实时语音转写&#xff08;需要申请一个在线的语音转写api接口&#xff09;实时文字翻译&#xff08;需要申请一个即时翻译的api接口&#xff09; 实现 申请阿里云的语音转写api 阿里云网址&#xff1a;https://cn.aliyun.com/ 注册&#xff1a;用支付宝扫码注册即…

python实现免费同声传译 (离线语音识别+免费翻译接口+系统声音录制)

前言 前段时间碰到个英文面试&#xff0c;结果差点因为听不懂美式发音的python&#xff08;派送&#xff09;而GG了。。。我一直说的都是"派森"。。。所以就有个想法&#xff0c;英文电话会议的时候是不是可以做一个实时翻译的小工具&#xff0c;这样就可以给我这样…

uni-app 微信同声传译,实现AI语音功能(语音转文字,文字转语音,英汉互译

uni-app 微信同声传译&#xff0c;实现AI语音功能&#xff08;语音转文字&#xff0c;文字转语音&#xff0c;英汉互译&#xff09; 一&#xff1a;添加插件1、登录微信公众号平台&#xff0c;进入左边导航栏的设置&#xff0c;选择第三方设置&#xff0c;&#xff0c;添加插件…

小程序之定位语音识别=>插件:微信同声传译

说明:文章部分内容及图片出自网络&#xff0c;如有侵权请与我本人联系(主页有公众号:小攻城狮学前端) 作者&#xff1a;小只前端攻城狮、 主页&#xff1a;小只前端攻城狮的主页、 首发&#xff1a;掘金 GitHub&#xff1a;P-J27、 CSDN&#xff1a;PJ想做前端攻城狮 著作权归作…

关于使用微信同声传译报错的问题

最近开发微信小程序&#xff0c;需要用到语音识别的功能&#xff0c;于是就用了微信官方的微信同声传译的插件&#xff0c;但是使用的时候报错了&#xff0c;我使用了云开发&#xff0c;后来经过这是误报&#xff0c;可以忽略&#xff0c;类似的报错也是可以忽略的