盒子
盒子

理解主成分分析

###主成分分析

1. 生活中的主成分

主成分分析(principal component analysis)是将多指标化为少数几个综合指标的一种统计分析方法,这种降维的技术而生成的主成分,能够反映原始变量的绝大部分信息,通常表示为原始变量的线性组合。

就是将高维的数据投影到低维上来,当然,投影的方法就是,找出最能够代表原始数据的投影,就是数据不能太失真

举个例子:

中学生身体四项指标的主成分分析

30名学生,测量其 身高(X1)、体重(X2),胸围(X3)和坐高(X4)。对这30名中学生身体四项指标数据做主成分分析。

数据格式

> data
    X1 X2 X3 X4
1  148 41 72 78
2  139 34 71 76
3  160 49 77 86

...
30 139 31 68 74

这里我们可以想象一下,生活中有些同学身材魁梧,有些同学身材瘦小,怎么将魁梧瘦小量化描述下?

我们还是要用身高,体重等几个指标一同描述,很不方便,可不可以用一个指标,叫魁梧程度,数值的大小的相对应的同时表示身高高矮,体重大小,事实上PCA就是这样一个东西。若干特征太冗余了,这些特征其实内部又有很大的联系,那么为什么不用少数几个指标去综合描述这些内部有联系的原始特征呢?这些能概括性地描述好几个特征的指标,就叫做主成分。

接着,我们回到数学模型角度去深入了解下主成分分析,一般的话身高啊,体重啊这些特征是以矩阵形式呈现的,进行主成分分析就要对这些矩阵进行处理。这里就要用到协方差矩阵,特征值,特征向量。究竟协方差矩阵,特征值,特征向量和主成分有什么关系?

2. 协方差矩阵,特征值和特征向量

我们知道描述一维数据数字特征的是方差,标准差,那二维数据呢?

协方差是描述两个变量之间的相关程度的量。

协方差的结果有什么意义呢?如果结果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义),那必须的~结果为负值就说明负相关的,如果为0,也是就是统计上说的“相互独立”

而协方差矩阵则包含了维度之间的协方差,也有单个维度本身的方差。

怎么从样本数据中得到协方差?样本数据一般是Nxd的矩阵,记为S,表示有N个样本,d个特征,那我们其实就可以得到一个dxd的协方差矩阵,计算的公式如下


ex4dataonly

有了协方差矩阵之后,我没就可以进行两个步骤来对样本进行“瘦身”了,去除些冗余,我们来看看表示样本特征的协方差矩阵。某个特征与另一个特征关联很大,那么协方差就越远离0,(协方差为零表示两个特征不相关),而某个特征自身的方差越大,表示自己的“能量”越大(反过来考虑,方差很小,快接近于零了,那么就是说所有的样本该特征没有明显的区分能力,比如说特征玉米树上结的玉米个数,除了极个别,基本上都是2个,方差几乎为零了,那还算什么特征,如何进行以后的不同玉米品种进行分类),该特征就越具有说服力。所以,我们的目的是让方差尽量大,协方差尽量为零,这不就是对角阵吗?

不就可以通过求协方差矩阵的特征值和特征向量来求。

描述相关程度的协方差矩阵的特征值和特征向量可以描述在特征向量方向随机变量的相关度。每个特征值对应的特征向量表示在这个方向特征向量的缩放程度。

一个变换(矩阵)可由它的所有特征向量完全表示,而每一个向量所对应的特征值,就代表了矩阵在这一向量上的贡献率——说的通俗一点就是能量(power)

然后我们在这些特征值中选些值比较大的,假设选了p个(p<d),那么有p个特征值组成新的对角阵,对应的特征向量组成了特征向量矩阵P1,大小为dXp。这个P1其实就是投影矩阵。可以证明的,证明略。S(NXd)的没一行是一个样本,P1的每一列是一个特征向量,右乘P1,相当于每个样本以P1的特征向量为基进行线性变换。

至此,得到的新矩阵为NXp,实现了降维,而这p个特征就是主成分,形成了p维的新特征空间。

3. PCA的R语言实现

在R中,可以用stats包中的prcomp函数及princmp()函数进行主成分分析。这里我们只介绍下prcomp函数

prcomp(formula, data = NULL, subset, na.action, ...)

prcomp(x, retx = TRUE, center = TRUE, scale = FALSE,
      tol = NULL, ...)

参数介绍:

formula:在公式方法中设定的没有因变量的公式,用来指明数据分析用到的数据框汇中的列
data:包含在formula中指定的数据的数据框对象,
subset:向量对象,用来指定分析时用到的观测值,其为可选参数
na.action:指定处理缺失值的函数
x:在默认的方法下,指定用来分析的数值型或者复数矩阵
retx:逻辑变量,指定是否返回旋转变量
center:逻辑变量,指定是否将变量中心化
scale:逻辑变量,指定是否将变量标准化
tol:数值型变量,用来指定精度,小于该数值的值将被忽略。
  • 可以用summary()函数查询关于每个主成分的重要信息
    summary(object,loadings=F,cutoff=0.1,…)
    object是由prcomp得到的对象,loadings是逻辑变量,当loadings=T表示显示loadings的内容,loadings=F是表示不显示
  • 使用loadings()函数产看每个变量对主成分的贡献度
    loadings(x)
    x是由函数prcomp()或factanal()得到的对象
  • 针对princomp()对象的plot方法。该方法可以绘制展示每个主成分与其自身方差贡献度相关性的悬崖碎石图。
    plot()
  • 用双标图将主成分可视化,画出数据关于主成分的散点图和原坐标在主成分下的向量
    biplot(model,choices=1:2,scale=1,pc.biplot=F,…)
    model是由prcomp()得到的对象,choices是选择的主成分,缺省值是第1,第2主成分。pc.biplot是逻辑变量,缺省值为F,当pc.biplot=T,用Gabriel提出的方法绘图。
  • predict函数是预测主成分的值,
    predict(object,newdata,…)
    object是由prcomp()得到的对象,newdata是由预测值构成的数据框,当newdata缺省时,预测已有数据的主成分值。

实例:
数据我们采用caret包,里面的tecator数据,Each sample contains finely chopped pure meat with different moisture, fat and protein contents.

library(caret)
data(tecator)
sbsorp_data_frame = data.frame(absorp)

pr <- prcomp(sbsorp_data_frame,scale = TRUE)
eff_dim <-head(pr$x)#show the principal component 
summary(pr)    
plot(pr)

summary函数得到的一些信息,可以看出其中第一个成分占据了大部分。

2

plot画出的柱状图

1

投影矩阵的一部分如下:

3