在使用数据建模时,过多的变量会增加计算复杂性,同时也使结果解释变得困难。主成分分析(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)相关推荐

  1. 在线作图丨数据降维方法①——主成分分析PCA

    PCA是什么? 主成分分析算法(PCA)是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的信息量最大(方差最大),以此使用较少的数据维度, ...

  2. pca 累积方差贡献率公式_机器学习数据降维方法:PCA主成分分析

    PCA在机器学习中很常用,是一种无参数的数据降维方法.PCA步骤: 将原始数据按列组成n行m列矩阵X 将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值 求出协方差矩阵 求出协方差矩阵的 ...

  3. 对pca降维后的手写体数字图片数据分类_python机器学习API介绍13: 数据降维及主成分分析...

    数据降维概述:数据降维是机器学习领域中重要的内容,所谓的降维就是采用某种映射方法,将高维空间中的数据点映射到低维的空间中.其本质是学习一个映射函数f: x->y.其中x是原始数据点的表述,目前多 ...

  4. 机器学习-降维之主成分分析PCA算法原理及实战

    主成分分析 前言 近年来,随着互联网和信息行业的发展,数据已经渗透到各行各业,成为重要的生产因素如数据记录和属性规模的急剧增长.社会已经进入大数据时代,数据越多越好似乎已经成为公理.然而,数据量并不是 ...

  5. 西瓜书+实战+吴恩达机器学习(十八)降维(主成分分析 PCA)

    文章目录 0. 前言 1. 主成分分析PCA 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔,我会非常开心的~ 0. 前言 维数灾难:在高维情形下出现的数据样本稀疏.距离计算困难等问题. 缓解 ...

  6. python图像压缩主成分分析实例_python机器学习API介绍13: 数据降维及主成分分析...

    数据降维概述:数据降维是机器学习领域中重要的内容,所谓的降维就是采用某种映射方法,将高维空间中的数据点映射到低维的空间中.其本质是学习一个映射函数f: x->y.其中x是原始数据点的表述,目前多 ...

  7. python主成分分析法降维_【数据降维】主成分分析法

    主要内容本系列马上就要进入建模的阶段了,但是在这之前还有一些准备工作要做,能让我们最终得到的分析结果更好,数据降维便是其中之一. 数据降维实际上是对输入特征的一次精简.通常来说当我们已经通过数据处理得 ...

  8. 主成分的java版_数据降维:主成分分析法

    前言 什么叫做主成分分析法,我们先看一张图椭圆的图,如果让你找一条线,使得椭圆上所有点在该线上映射的点最分散,保留下来的信息最多,你会怎么选择这条线?若是下图,会选择水平线,这是用一维的方式去尽可能多 ...

  9. 数据降维:主成分分析法

    前言 什么叫做主成分分析法,我们先看一张图椭圆的图,如果让你找一条线,使得椭圆上所有点在该线上映射的点最分散,保留下来的信息最多,你会怎么选择这条线?若是下图,会选择水平线,这是用一维的方式去尽可能多 ...

最新文章

  1. -shape 填充 圆角矩形 圆形 环形
  2. trunc( mysql写法_使用oracle的trunc和dbms
  3. 【C11】float
  4. 从一个点云里面创建一个深度图
  5. Bootstrap系列 -- 36. 向上弹起的下拉菜单
  6. 质量故事(1)---“请三思而后行!不要轻易下结论”
  7. Git开发错了分支,利用git的暂存完成代码转移到正确的分支
  8. 锐捷认证客户端常见问题解决及简介
  9. linux vim个人配色方案
  10. 软件测试——Postman Script脚本功能
  11. 最小二乘支持向量机——LSSVM
  12. 计算机操作系统 实验五:动态分区分配方式的模拟
  13. 利用VMWare和软路由多播实现校园网带宽叠加
  14. Dell R730 xd “CPU 2 M23 VPP PG voltage is outside of range“故障
  15. S5P6818 芯片手册 DMA 章节 理论篇 重排
  16. 基波、谐波、谐波次数
  17. Object.entries()方法的使用和实现
  18. Oracle ASMM和AMM
  19. esp8266,esp32中的SPI FLASH 访问模式(QIO QOUT DIO DOUT)
  20. Win7+Win8双系统安装教程!零风险超简单2

热门文章

  1. 企业五年后卓越或者死亡,数据战略是关键!
  2. Java Web学习总结(29)——Java Web中的Filter和Interceptor比较
  3. Jquery学习总结(4)——高效Web开发的10个jQuery代码片段
  4. mac 黑窗口连接mysql_mac系统下mysql环境变量设置及远程连接
  5. python 批量查询网页导出结果_李亚涛:python批量查询网页收录情况并计算收录率...
  6. java下拉模糊查询_select2 智能补全模糊查询select2的下拉选择框使用
  7. 从零手动实现简易Tomcat
  8. 2016年度十大新兴技术出炉,你最看好哪个?
  9. 在shop++二次开发中金额数据类型BigDecimal转换,注意细节。
  10. [PHP]如何在百度(BAE)和新浪(SAE)的云平台使用PHP连接MySQL并返回结果数据