主成分分析


1  主成分分析

  1. 主成分简介
    • 主成分分析(Principal component analysis) 是将多指标化为少数几个综合指标的一种统计 分析方法, 由Pearson(1901)年提出, 后来被Hotelling(1933) 进一步发展。
    • 主成分分析是一种通过降维技术把多个变量化为少数几个主成分的方法。
  2. 散点图
    x<-rnorm(10000)
    y<-x+rnorm(10000)
    plot(x,y)
    

    princompscatter.png

  3. 基本理论
    • 设  X=(X1,,Xp)  是  p  维随机变量, 他们之间可能存在线性关系
    • 通过线性变换, 得到  p  个线性无关的随机变量  Z1,,Zp  , 称这些新得到的 随机变量为  X1,,Xp  的主成分
    • 设  α=(α1,,αp)  为  p  维空间的单位向量, 记所有单位变量 的集合为  R0={α|αTα=1}
  4. 线性变换

    考虑如下的线性变化

    Z1=αT1X.Z2=αT2X.Zp=αTpX

    可以得到

    Var(Zi)Cov(Zi,Zj)==αTiΣαi,i=1,,pαTiΣαj,ij=1,,p,ij
  5. 寻找第一主成分
    • 我们希望  Z1  的方差达到最大, 为什么??
    • α1  是下述约束最优化问题的解
      maxαTα=1αTΣα
    • 所得的解向量记为  α1 ,
    • 可以证明  α1  是  Σ  的最大特征根  λ1  对应的特征向量
    • 此时称  Z1=αT1X  为第一主成分
  6. 求解过程
    • 建立Lagrange 目标函数
      maxφ(α)=αTΣαλ(αTα1)
    • 关于  α  和  λ  求导得
      φ(α)α=2Σα2λα=0αTα=1

    • 简化为
      {Σα=λααTα=1
    • 用  aT  左乘 第一式两边, 得  αTΣα=λαTα=λ  , 即有
      D(Z1)=αTΣα=λ

      说明  Z1  的方差记为矩阵  Σ  的特征根,欲使  Var(Z1)  达到最大,只需取其 最大特征根  λ1

    • 同时可以得出
      (ΣλI)α=0

      即  α  为  λ  对应的特征向量

  7. 结果分析
    • 这样得出得  λ  为  Σ  的特征根,
    • 设  λ1λ2λp  为  Σ  的  p  个特征根,
    • 取  λ=λ1  为最大的特征根, 并求出对应 λ1  的特征根  α1  ,我 们就可以得到第一主成分
    Z1=αT1X
  8. 寻找第二主成分

    类似地, 希望

    • Z2  的方差达到最大,
    • 并且要求  Cov(Z1,Z2)=0 ,

    由于  α1  是  λ1  的特征向量, 所以选择的  α2  与  α1  正交。

    1. 类似于前面的推导

      α2  为  Σ  的第二大特征根  λ2  对应的特征向量, 称  Z2=αT2X  为第二主成分

    2. 推论

      设有  p  个随机变量  X1,X2,,Xp  均为正态随机变量, 则他们的主成分  Z1,Z2,,Zp  是相互独立的

  9. 主成分的基本性质
    • j=1pλj=j=1pσ2j  其中  σ2j=D(Xj),j=1,,p
    • ρij=λiαijσj, i,j=1,,p  其中  ρij=ρ(Zi,Xj)  是主成分  Zi  与原始随机变量  Xj 的相关系数, 称为因子负荷量,  αij  是  Σ  的第  i  个最大特征根对应的特征向量的 第  j 个分量
    • j=1pσ2jρ2ij=λi, i=1,,p
    • i=1pρ2ij=1,j=1,2,,p  即  Xj  对  Z1,Z2,,Zp  的全部相关系数的平方和为1
  10. 贡献率
    • 称总方差中第  i  个主成分方差所占的比例  λij=1pλj  为主成分  Zi  的贡献率, 第一主成分的贡献率最大
    • 称前m个主成分的贡献率之和  i=1mλii=1pλi  为累积贡献 率, 表征  Z1,,Zm  解释  X1,,Xp  的能力
  11. 实际数据分析时主成分分析(样本主成分)

    在实际分析中,  Σ  为未知矩阵,

    • 设  Xi=(xi1,xi2,,xip),i=1,,n  为来自总体  X  的样本
    • 协方差阵的估计
      S=1n1i=1n(XiX¯)(XiX¯)T=(sij)p×p

      在实际分析中, 用  S  代替  Σ  求解特征根和特征向量, 得出主成分和相应的因子 载荷

  12. 消除量纲的影响

    在实际的处理中量纲对主成分会有一定的影响

    • 由于不同的度量方式会使得协方差阵不同, 此时量纲不同导致最后所得主成分会有一定的不 同, 建议对原始数据进行标准化变换, 此时相当于从相关系数阵出发, 求解主成分分析
      Xij=XijX¯jsj,i=1,,n,j=1,,p

      变换后的数据, 均值为0, 标准差为1, 也称为 Zcore 变换

    • 用变换后的标准化变量  Xi1,Xi2,,Xip,i=1,2,,n  代 替以前的  Xij,i=1,,n,j=1,,p  , 进行主成分分析, 此时分析结果与量纲 无关
    • 从标准化后的数据计算所得的样本协方差矩阵即为样本相关系数矩阵  R^

2 主成分分析实现(Using R)

  1. princomp 函数(R) 的使用
    • 在R中实现出成分分析的函数为 princomp , 是principle components 的简记形式
    • 矩阵或数据框(data.frame) 作为函数的变量, 选项 "cor=TRUE" 可以约定对相关系数阵 进行主成分分析
    • 示例,对30名同学的身高(sg), 体重(tz), 胸围(xw), 坐高(zg),继续主成分分析
  2. 代码和输出结果
    #进行主成分分析
    student.pr<-princomp(student,cor=TRUE)
    summary(student.pr,loadings=TRUE)
    
    Importance of components:
                           Comp.1 Comp.2 Comp.3 Comp.4
    Standard deviation      1.882 0.5598 0.2818 0.2571
    Proportion of Variance  0.885 0.0783 0.0199 0.0165
    Cumulative Proportion   0.885 0.9636 0.9835 1.0000
    
    Loadings:
       Comp.1 Comp.2 Comp.3 Comp.4
    sg  0.497  0.543 -0.450  0.506
    tz  0.515 -0.210 -0.462 -0.691
    xw  0.481 -0.725  0.175  0.461
    zg  0.507  0.368  0.744 -0.232
    
  3. 结果分析
    • 前两个主成分的累积贡献率达到了0.96,另外两个主成分可以省去
    • 根据summary中loadings(载荷)的内容, 可以算出
      Z1Z2=0.497sg0.515tz0.481xw0.507zg=0.543sg0.210tz0.725xw+0.368zg
    1. 结果的解释
      • 第一主成分对应系数的符号都相同, 值在0.5附近, 反应了中学生身材的魁梧程度, 我们 称 第一个主成分为大小因子,
      • 第二主成分是高度和围度的差, 第二主成分大的同学表明该同学 "细高", 第二主成分较 小的同学 “矮胖”, 因此称第二主成分为体型因子。
      • 主成分有相 应的解释或含义, 纯属偶然

3 主成分分析实现(Using Matlab)

  1. 函数 princomp 的使用
    • 函数: princomp(X)
    • 格式: [pc,score,variance]=princomp(X)
    • 输入: X 为标准化之后的变量, 这样进行的主成分实际上是对于相关系数阵进行的,标准化 变化函数为 zscore
    • 输出结果
      • pc 主分量  i  的系数, 也成为因子系数, 载荷矩阵  |pc|=1
      • score 主分量下的得分值, 得分矩阵和数据矩阵X的阶数相同, 实际上是用主成分把初始 矩阵进行线性变换后的矩阵
      • variance 对应列的方差向量, 即X的特征根, 容易计算方差所占的百分比–贡献率和累 积贡献率
  2. 实例分析
    1. 中学生身体四项指标的主成分分析

      在某中学随机抽取30名同学, 测量其身高, 体重, 胸围, 和坐高, 试对这30名tongue的4项 指标数据进行主成分分析

    2. matlab 程序
      student=csvread('d:/home/course/mathmodel/data/student.csv');
      [Loadings,score,variance]=princomp(score(student))
      cumsum(variance)'/4
      plot(1:4,variance)
      
  3. 分析结果
    Loadings =
        0.4970   -0.5432   -0.4496   -0.5057
        0.5146    0.2102   -0.4623    0.6908
        0.4809    0.7246    0.1752   -0.4615
        0.5069   -0.3683    0.7439    0.2323
    variance =
        3.5411    0.3134    0.0794    0.0661
    cumsum(variance)'/4=
        0.8853    0.9636    0.9835    1.0000
    


你可能感兴趣的:(R语言,统计学,数学建模)