stats | 数据降维之主成分分析(PCA)
在使用数据建模时,过多的变量会增加计算复杂性,同时也使结果解释变得困难。主成分分析(Principal Components Analysis,PCA)通过对原变量进行线性组合生成新的变量,可以使得纳入模型中的变量数大大减少,从而在保留大部分信息的前提下达到数据降维的目的。
1 理论基础
记样本的数据矩阵为
,其中表示矩阵的第行、第列元素;表示矩阵的总行数,即样本数;表示矩阵的总列数,即变量数;表示矩阵的第行;表示矩阵的第列。
1.1 从协方差矩阵求主成分
协方差矩阵
样本矩阵的协方差矩阵
为:
可将
记作。
特征向量与特征根
记协方差矩阵
的特征根由小到大排列分别为、、...、,对应的单位特征向量分别为、、...、,这些特征向量彼此正交。
主成分矩阵
样本矩阵的第
个主成分为:
记
,则主成分矩阵。
贡献率
表示第个主成分的贡献率。
1.2 从相关系数矩阵求主成分
样本矩阵的相关系数矩阵
为:
其中,
为协方差矩阵中的元素。
同样,按照类似于1.1中的步骤,将协方差矩阵
替换成相关系数矩阵,也可以得到主成分,称为标准化样本主成分。
2 R中的相关函数
示例数据:
data = USArrests
2.1 cov()
/cor()
cov()
函数可计算协方差矩阵:
cov(data)
## Murder Assault UrbanPop Rape
## Murder 18.970465 291.0624 4.386204 22.99141
## Assault 291.062367 6945.1657 312.275102 519.26906
## UrbanPop 4.386204 312.2751 209.518776 55.76808
## Rape 22.991412 519.2691 55.768082 87.72916
cov()
函数可计算相关系数矩阵:
cor(data)
## Murder Assault UrbanPop Rape
## Murder 1.00000000 0.8018733 0.06957262 0.5635788
## Assault 0.80187331 1.0000000 0.25887170 0.6652412
## UrbanPop 0.06957262 0.2588717 1.00000000 0.4113412
## Rape 0.56357883 0.6652412 0.41134124 1.0000000
2.2 eigen()
eigen()
函数用于计算矩阵的特征根和特征向量:
eigen(cov(data))
## eigen() decomposition
## $values
## [1] 7011.114851 201.992366 42.112651 6.164246
##
## $vectors
## [,1] [,2] [,3] [,4]
## [1,] -0.04170432 0.04482166 0.07989066 0.99492173
## [2,] -0.99522128 0.05876003 -0.06756974 -0.03893830
## [3,] -0.04633575 -0.97685748 -0.20054629 0.05816914
## [4,] -0.07515550 -0.20071807 0.97408059 -0.07232502eigen(cor(data))
## eigen() decomposition
## $values
## [1] 2.4802416 0.9897652 0.3565632 0.1734301
##
## $vectors
## [,1] [,2] [,3] [,4]
## [1,] -0.5358995 0.4181809 -0.3412327 0.64922780
## [2,] -0.5831836 0.1879856 -0.2681484 -0.74340748
## [3,] -0.2781909 -0.8728062 -0.3780158 0.13387773
## [4,] -0.5434321 -0.1673186 0.8177779 0.08902432
相关系数矩阵的特征根之和恰好为变量数
。
2.3 prcomp()
prcomp()
函数是通过协方差矩阵进行主成分分析的,它的语法结构如下:
prcomp(x, retx = TRUE, center = TRUE,scale. = FALSE,tol = NULL, rank. = NULL, ...)
retx:是否输出因子载荷矩阵。
在进行主成分分析时,通常需要对样本数据进行标准化,而prcomp()
函数的中心化参数center
的默认值是TRUE,而标准化参数scale.
的默认值为FALSE,使用时一般需设置scale. = TRUE
:
pca_1 <- prcomp(data, scale. = T)
输出结果的数据结构如下:
查看因子载荷矩阵:
pca_1$rotation
## PC1 PC2 PC3 PC4
## Murder -0.5358995 0.4181809 -0.3412327 0.64922780
## Assault -0.5831836 0.1879856 -0.2681484 -0.74340748
## UrbanPop -0.2781909 -0.8728062 -0.3780158 0.13387773
## Rape -0.5434321 -0.1673186 0.8177779 0.08902432
查看主成分的标准差:
pca_1$sdev
## [1] 1.5748783 0.9948694 0.5971291 0.4164494
查看各样本的主成分得分(即转换后的变量值):
head(pca_1$x)
## PC1 PC2 PC3 PC4
## Alabama -0.9756604 1.1220012 -0.43980366 0.154696581
## Alaska -1.9305379 1.0624269 2.01950027 -0.434175454
## Arizona -1.7454429 -0.7384595 0.05423025 -0.826264240
## Arkansas 0.1399989 1.1085423 0.11342217 -0.180973554
## California -2.4986128 -1.5274267 0.59254100 -0.338559240
## Colorado -1.4993407 -0.9776297 1.08400162 0.001450164
绘制碎石图:
screeplot(pca_1, type = "l")
如果并不是样本矩阵的所有变量都参与主成分分析,则可以使用下列语法结构中的formula
参数指明参与主成分分析的变量:
prcomp(formula, data = NULL, subset, na.action, ...)
示例:
pca_2 <- prcomp(~ Murder + Assault + UrbanPop, data = data, scale = T)
pca_2$rotation
## PC1 PC2 PC3
## Murder -0.6672955 0.30345520 0.6801703
## Assault -0.6970818 0.06713997 -0.7138411
## UrbanPop -0.2622854 -0.95047734 0.1667309
2.4 princomp()
princomp()
函数是通过相关系数矩阵进行主成分分析的,该函数也比prcomp()
函数更加常用,它的语法结构如下:
princomp(x, cor = FALSE, scores = TRUE,covmat = NULL,subset = rep_len(TRUE, nrow(as.matrix(x))),fix_sign = TRUE, ...)
使用princomp()
时一般需要设置cor = TRUE
:
pca_3 <- princomp(data, cor = T)
输出结果的数据结构如下:
查看因子载荷可以使用loadings()
函数:
loadings(pca_3)
##
## Loadings:
## Comp.1 Comp.2 Comp.3 Comp.4
## Murder 0.536 0.418 0.341 0.649
## Assault 0.583 0.188 0.268 -0.743
## UrbanPop 0.278 -0.873 0.378 0.134
## Rape 0.543 -0.167 -0.818
##
## Comp.1 Comp.2 Comp.3 Comp.4
## SS loadings 1.00 1.00 1.00 1.00
## Proportion Var 0.25 0.25 0.25 0.25
## Cumulative Var 0.25 0.50 0.75 1.00
绘制碎石图:
screeplot(pca_3, type = "l")
与prcomp()
函数一样,它也有如下语法结构:
princomp(formula, data = NULL, subset, na.action, ...)
示例:
pca_4 <- princomp(~ Murder + Assault + UrbanPop, data = data, cor = T)
loadings(pca_4)
##
## Loadings:
## Comp.1 Comp.2 Comp.3
## Murder 0.667 0.303 0.680
## Assault 0.697 -0.714
## UrbanPop 0.262 -0.950 0.167
##
## Comp.1 Comp.2 Comp.3
## SS loadings 1.000 1.000 1.000
## Proportion Var 0.333 0.333 0.333
## Cumulative Var 0.333 0.667 1.000
stats | 数据降维之主成分分析(PCA)相关推荐
- 在线作图丨数据降维方法①——主成分分析PCA
PCA是什么? 主成分分析算法(PCA)是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的信息量最大(方差最大),以此使用较少的数据维度, ...
- pca 累积方差贡献率公式_机器学习数据降维方法:PCA主成分分析
PCA在机器学习中很常用,是一种无参数的数据降维方法.PCA步骤: 将原始数据按列组成n行m列矩阵X 将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值 求出协方差矩阵 求出协方差矩阵的 ...
- 对pca降维后的手写体数字图片数据分类_python机器学习API介绍13: 数据降维及主成分分析...
数据降维概述:数据降维是机器学习领域中重要的内容,所谓的降维就是采用某种映射方法,将高维空间中的数据点映射到低维的空间中.其本质是学习一个映射函数f: x->y.其中x是原始数据点的表述,目前多 ...
- 机器学习-降维之主成分分析PCA算法原理及实战
主成分分析 前言 近年来,随着互联网和信息行业的发展,数据已经渗透到各行各业,成为重要的生产因素如数据记录和属性规模的急剧增长.社会已经进入大数据时代,数据越多越好似乎已经成为公理.然而,数据量并不是 ...
- 西瓜书+实战+吴恩达机器学习(十八)降维(主成分分析 PCA)
文章目录 0. 前言 1. 主成分分析PCA 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔,我会非常开心的~ 0. 前言 维数灾难:在高维情形下出现的数据样本稀疏.距离计算困难等问题. 缓解 ...
- python图像压缩主成分分析实例_python机器学习API介绍13: 数据降维及主成分分析...
数据降维概述:数据降维是机器学习领域中重要的内容,所谓的降维就是采用某种映射方法,将高维空间中的数据点映射到低维的空间中.其本质是学习一个映射函数f: x->y.其中x是原始数据点的表述,目前多 ...
- python主成分分析法降维_【数据降维】主成分分析法
主要内容本系列马上就要进入建模的阶段了,但是在这之前还有一些准备工作要做,能让我们最终得到的分析结果更好,数据降维便是其中之一. 数据降维实际上是对输入特征的一次精简.通常来说当我们已经通过数据处理得 ...
- 主成分的java版_数据降维:主成分分析法
前言 什么叫做主成分分析法,我们先看一张图椭圆的图,如果让你找一条线,使得椭圆上所有点在该线上映射的点最分散,保留下来的信息最多,你会怎么选择这条线?若是下图,会选择水平线,这是用一维的方式去尽可能多 ...
- 数据降维:主成分分析法
前言 什么叫做主成分分析法,我们先看一张图椭圆的图,如果让你找一条线,使得椭圆上所有点在该线上映射的点最分散,保留下来的信息最多,你会怎么选择这条线?若是下图,会选择水平线,这是用一维的方式去尽可能多 ...
最新文章
- -shape 填充 圆角矩形 圆形 环形
- trunc( mysql写法_使用oracle的trunc和dbms
- 【C11】float
- 从一个点云里面创建一个深度图
- Bootstrap系列 -- 36. 向上弹起的下拉菜单
- 质量故事(1)---“请三思而后行!不要轻易下结论”
- Git开发错了分支,利用git的暂存完成代码转移到正确的分支
- 锐捷认证客户端常见问题解决及简介
- linux vim个人配色方案
- 软件测试——Postman Script脚本功能
- 最小二乘支持向量机——LSSVM
- 计算机操作系统 实验五:动态分区分配方式的模拟
- 利用VMWare和软路由多播实现校园网带宽叠加
- Dell R730 xd “CPU 2 M23 VPP PG voltage is outside of range“故障
- S5P6818 芯片手册 DMA 章节 理论篇 重排
- 基波、谐波、谐波次数
- Object.entries()方法的使用和实现
- Oracle ASMM和AMM
- esp8266,esp32中的SPI FLASH 访问模式(QIO QOUT DIO DOUT)
- Win7+Win8双系统安装教程!零风险超简单2
热门文章
- 企业五年后卓越或者死亡,数据战略是关键!
- Java Web学习总结(29)——Java Web中的Filter和Interceptor比较
- Jquery学习总结(4)——高效Web开发的10个jQuery代码片段
- mac 黑窗口连接mysql_mac系统下mysql环境变量设置及远程连接
- python 批量查询网页导出结果_李亚涛:python批量查询网页收录情况并计算收录率...
- java下拉模糊查询_select2 智能补全模糊查询select2的下拉选择框使用
- 从零手动实现简易Tomcat
- 2016年度十大新兴技术出炉,你最看好哪个?
- 在shop++二次开发中金额数据类型BigDecimal转换,注意细节。
- [PHP]如何在百度(BAE)和新浪(SAE)的云平台使用PHP连接MySQL并返回结果数据