数据可视化 — PCA

【概念】

  • 分类:根据一些给定的已知类别标号的样本,训练某种学习机器,使其能够对未知类别的样本进行分类。属于监督学习。
    聚类:事先不知道任何样本的类别符号,通过算法将未知类别的样本划分为若干类别,把相似的东西聚到一起。研究如何在没有训练的情况下把样本划分为若干类,属于无监督学习。

  • PCA主成分分析(线性降维)
    原理:将多个变量通过线性变换以选出较少个数重要变量的一种多元统计分析方法, 属于无监督学习算法之一,对数据集降维到2个维度,再可视化。
    降维目的:辅助可视化工作,用保留数据本质特征的低维矩阵来描述高维数据。方便可视化探索+减轻维度诅咒+缓解共线性。

以下四种主成分分析方法:
① t-SNE:t-distributed stochastic neighbor embedding
② UMAP:uniform manifold approximation and projection
③ SOM: self-organizing maps
④ LLE: locally linear embedding

准备工作:导入所需包:

library(pacman)
pacman::p_load(mclust,GGally,factoextra,dplyr)

例:真伪钞
【1】查看数据

  • 查看mclust包中的banknote数据集:
 mclust::banknote %>% View()
  • 将banknote数据集以矩阵方式展示:
note<-mclust::banknote %>% as_tibble()
等同于:
note<-as_tibble(mclust::banknote)
note

用ggpairs( ) 绘制相关关系图矩阵,查看各自变量之间的相关关系

ggpairs(note, mapping = aes(color = Status))+
   theme_bw() 
将Status列的值映射为不同颜色,并去掉灰色背景

* 完善参数
 ggpairs(note,aes(col=Status),
        upper=list(continuous="density"),  
        lower=list(continuous="points"),  
        diag=list(continuous="densityDiag"))+ 
  theme_bw()
 右上方为相关系数和显著性检验结果图,左下方为散点图,对角线为密度图。

ggscatmat( )也可绘制连续变量相关关系矩阵图,画图更快

  • 左下方为散点图,右上方为相关系数,对角线为密度图,运算速度快于ggpairs。
ggscatmat(note, columns = 2:ncol(note),     
          color = "Status", 
          alpha = 0.8,    
          corMethod = "pearson") 

取note数据集的第2列至最后一列,将Status列的值映射为不同的颜色,alpha调整透明度,
corMethod, 表示指定相关系数的计算方法,默认"pearson",还有"kendall"、 "spearman"。

ggscatmat(note,color="Status")

ggscatmat(note,color="Status",columns=2:7)       ##指定列

https://mp.weixin.qq.com/s/gVmgE3JiSRFQpCxXIKpDzg

  • title、 xlab、 ylab、指定标题和坐标轴名称
  • 2个连续变量使用continuous参数,一个变量连续一个离散用combo参数,2个离散变量用discrete参数画图。

plot类型:

通过5个参数控制plot类型:continuous、combo、discret、 na、mapping

  1. continuous:x、y都是连续变量

upper和lower参数,可以是 "point"、 "smooth"、"smooth_loess"、"density"、 "cor"、 "blank"
diag参数,可以是 "densityDiag"、 "barDiag"、 "blankDiag"

  1. combo: 变量一个连续,一个离散

只能用于upper和lower,不能用于diag,离散变量只能计数,不能映射坐标,所以可能存在坐标翻转。可以是 "box"、"box_no_facet"、 "dot"、 "dot_no_facet"、"facethist"、 "facetdensity"、"denstrip"、 "blank"

  1. discrete:x、y都是离散变量

upper和lower参数,可以是 "facetbar"、"ratio"、 "blank"
diag参数,可以是 "barDiag"、"blankDiag"

  1. na :指定变量为na的情况,、

upper和lower参数,可以是 "na"、"blank"
diag参数,可以是 "naDiag"、"blankDiag"

  1. mapping: 表示aes()映射,若指定mapping参数,则叠加到x,y上去。

默认
upper = list(continuous = "cor", combo = "box_no_facet", discrete = "box")
lower = list(continuous = "point", combo = "facetthist", discrete = "facetbar")
diag = list(continuous = "density", discrete = "barDiag")

【PCA分析】

  • 导入所需包:

library("tidyverse")
library("mclust")

【1】对数据进行标准化处理

  • scale函数可进行数据的中心化和标准化,中心化就是将数据减去均值后得到的,标准化则是在中心化后的数据基础上再除以数据的标准差。

  • 参数解释:
    x—即需要标准化的数据
    center—表示是否进行中心化(异常点多时不使用)
    scale—表示是否进行标准化

  • 例:对dplyr包note数据集中除开Status列的数据做主成分分析:

pca<-dplyr::select(note, -Status)%>%
   prcomp(center = T, scale = T,rank=4)
summary(pca)
pca$sdev           ##特征值开方,各主成分标准差
pca$rotation      ##特征向量,回归系数
pca&x               ##样本得分score,即样本数据在新坐标轴上的投影

get_eigenvalue( )函数

m<-get_eigenvalue(pca.1)
m

提取主成分的特征值,结果如下:
第一列eigenvalue是特征值
第二列variance.percent是可解释变异的比例
第三列cumulative.variance.percent是累计可解释变异的比例

prcomp函数

  • 是对变量矩阵(相关矩阵)采用SVD方法计算其奇异值(原理上是特征值的平方根),函数帮助中描述为函数结果中的sdev。
    prcomp函数输入参数:变量矩阵(x),中心化(center=T),标准化(scale=T),主成份个数(rank)。
    prcomp函数输出:sdev(各主成份的奇异值),rotation(特征向量,回归系数),x(score得分矩阵)

  • 可以使用summary( )函数获取不同主成分对数据差异的贡献和主成分与原始变量的关系:
    ① 主成分标准差的平方为特征值,其含义为每个主成分可以解释的数据差异。
    计算方式为

eigenvalues = (pca$sdev)^2

② 特征值=主成分标准差的平方,表示每个主成分可以解释的数据差异的比例。

percent_var = eigenvalues*100/sum(eigenvalues)
summary(pca)

Importance of components(组成元素的重要性)
Standard deviation (标准差)
Proportion of Variance(方差比例)
Cumulative Proportion (累计比例)

  • 选择主成分的数目:
  1. 选择的主成分足以解释的总方差大于80% (方差比例碎石图),一般取“cumulative proportion累计比例”到80%以上,成功的降维需要保证在前几个为数不多的主成分对数据差异的解释可以达到80-90%。
    2.从前面的协方差矩阵可以看到,自动定标(scale)的变量的方差为1 (协方差矩阵对角线的值)。待选择的主成分为方差大于1的主成分,即其解释的方差大于原始变量。
str(pca)     查看结构
pca$sdev     查看特征值的开方,各主成分的标准差
pca$rotation 特征向量,回归系数
pca$x        样本得分score,此处为PC1-PC6共样本数据在新的坐标轴上的投影
get_eigenvalue( )函数,提取主成分的特征值

【2】用图形展示:

help.search("fviz_pca_biplot")     ## 查询函数属于哪个包

PCA的双标图,查看新的坐标轴与原向量之间的关系,蓝色为原来的线,黑线为新坐标轴。
 fviz_pca_biplot(pca, 
                label = "var")

fviz_pca_var(pca)      ## 加入了圆圈范围

方差比例碎石图,帮助查看新变量贡献度;eigenvalue-pc1到pc6特征值的大小,一般选择总方差大于80%的成分
 fviz_screeplot(pca, 
               geom = "bar", 
               addlabels = T, 
               choice = "eigenvalue")

柱状图,高度为特征值所占的比例
 fviz_screeplot(pca, 
               addlabels = T,choice = "variance")

fviz_eig(pca.1, addlabels = TRUE, ylim = c(0, 50))

选择前两个主成分,加入因变量,并画图

##pca$x是样本数据在新坐标轴上的坐标,前两维可以反映大多数方差,所以取前两维数据画图即可,即pca$x[,1]和pca$x[,2]
notePCA<- note%>%
   mutate(PCA1=PCA$x[,1],PCA2=PCA$x[,2]

ggplot(notePCA,aes(PCA1,PCA2,color=Status))+
    geom_point()

【3】 检验机器学习效果

1.建立实验点--两张钞票,数据集为newNotes

 newNotes <- tibble(
  Length = c(214, 216),
  Left = c(130, 128),
  Right = c(132, 129),
  Bottom = c(12, 7),
  Top = c(12, 8),
  Diagonal = c(138, 142)
)

2.预测,转化为tibble数据框,predict() 将新数据集newNotes 应用到已经训练好的PCA模型上,得到newPCA模型

newPCA <- predict(pca, newNotes) %>% 
  as_tibble() 

3.把原钞票数据和新增两张钞票的数据在PC1和PC2为坐标的轴中画出来

ggplot(notePCA, aes(PCA1, PCA2, col = Status)) + 
  geom_point() +
  stat_ellipse(level = 0.90) +      
  geom_point(data = newPCA, aes(PC1,PC2),col = "black", size = 4)                 

原数据以真假钞标志进行颜色区分,elipse画两个圈,真假钞两块的大致势力范围,新增数据以黑白较大的圆点,在图中画出来。

你可能感兴趣的:(数据可视化 — PCA)