主成分分析PCA For R(工事中)

作者: Jason数据分析生信教室 | 来源:发表于2019-06-07 13:43 被阅读4次

    5月31日 12:00 小雨

    1.主成分分析原理

    翻了很多帖子没有一个可以直接看懂的,每个帖子的说法用词虽然略微不一样,切入点都差不多,感觉都是从一个地方抄过来稍加修改而已。特别是从协方差忽然就切入特征值特征向量,让数学门外汉摸不着头脑。

    参考书:<多変量解析II 主成分分析 理論とRによる演習>

    关键词:
    1.协方差矩阵
    2.特征向量,特征值
    
    • 主成分分析的目的:
      很简单:降低维度(去噪)👉将一组N维数据降成K维(K小于N)
      原始数据Z在主成分向量l上的投影X最大
      X=Z*l (Z已知,求l以及l相对应的X)
      这里就产生了两个条件(如下)

    • 为了达到这个目的就得满足两个条件

    1. 投影X最大(为了实现最小数据损失)
    2. 主成分向量l必须是单位直交向量
    • 为了求上述方程的解,就使用到了拉格朗日定理,经过推导(详细略)最后相当于将原始数据Z的协方差矩阵对角化,并求出协方差矩阵的特征值和特征向量。

    这样就把协方差矩阵和特征值特征向量之间的关系给连起来了。原来并不是人家说的不明白,是自己数学知识不够,之前没听说过拉格朗日定理。详细推导过程了解一下就好,完全没有必要记住甚至钻牛角尖。只要明白为什么求主成分忽然变成了求协方差矩阵的特征值和特征向量就好

    • 理解协方差矩阵
      协方差矩阵本质就是一个相关系数矩阵

    • 求协方差矩阵的特征值和特征向量
      原始数据的标准化数据乘以各特征向量就是各组数据在主成分上的投影,也就是各组数据的主成分得点。(PCA score)

    • Loading Score
      概念有点晕,可以理解成原始数据各维度和每个主成分的相关度。
      计算:特征值开方以后乘以特征向量。

    2. R语言实现

    不使用自带函数,手动计算

    • 使用数据:mtcars
    Z<-as.matrix(mtcars)
    n<-nrow(Z)
    Z_scl<-scale(Z)
    S<-(1/(n-1))*t(Z_scl)%*%Z_scl #各个维度的写相关矩阵,本数据有11各变量
    > head(S)
                mpg        cyl       disp         hp       drat         wt        qsec         vs
    mpg   1.0000000 -0.8521620 -0.8475514 -0.7761684  0.6811719 -0.8676594  0.41868403  0.6640389
    cyl  -0.8521620  1.0000000  0.9020329  0.8324475 -0.6999381  0.7824958 -0.59124207 -0.8108118
    disp -0.8475514  0.9020329  1.0000000  0.7909486 -0.7102139  0.8879799 -0.43369788 -0.7104159
    hp   -0.7761684  0.8324475  0.7909486  1.0000000 -0.4487591  0.6587479 -0.70822339 -0.7230967
    drat  0.6811719 -0.6999381 -0.7102139 -0.4487591  1.0000000 -0.7124406  0.09120476  0.4402785
    wt   -0.8676594  0.7824958  0.8879799  0.6587479 -0.7124406  1.0000000 -0.17471588 -0.5549157
                 am       gear       carb
    mpg   0.5998324  0.4802848 -0.5509251
    cyl  -0.5226070 -0.4926866  0.5269883
    disp -0.5912270 -0.5555692  0.3949769
    hp   -0.2432043 -0.1257043  0.7498125
    drat  0.7127111  0.6996101 -0.0907898
    wt   -0.6924953 -0.5832870  0.4276059
    
    Eigen_value<-eigen(S) #11组特征值 以及 相对应的特征向量
    Z_score<-Z_scl %*% Eigen_value$vectors #Z标准化后的主成分得点
    > head(Z_score)
                             [,1]       [,2]       [,3]        [,4]       [,5]        [,6]
    Mazda RX4          0.64686274 -1.7081142 -0.5917309  0.11370221  0.9455234  0.01698737
    Mazda RX4 Wag      0.61948315 -1.5256219 -0.3763013  0.19912121  1.0166807  0.24172464
    Datsun 710         2.73562427  0.1441501 -0.2374391 -0.24521545 -0.3987623  0.34876781
    Hornet 4 Drive     0.30686063  2.3258038 -0.1336213 -0.50380035 -0.5492089 -0.01929700
    Hornet Sportabout -1.94339268  0.7425211 -1.1165366  0.07446196 -0.2075157 -0.14919276
    Valiant            0.05525342  2.7421229  0.1612456 -0.97516743 -0.2116654  0.24383585
                             [,7]         [,8]        [,9]       [,10]       [,11]
    Mazda RX4         -0.42648652  0.009631217  0.14642303 -0.06670350 -0.17969357
    Mazda RX4 Wag     -0.41620046  0.084520213  0.07452829 -0.12692766 -0.08864426
    Datsun 710        -0.60884146 -0.585255765 -0.13122859  0.04573787  0.09463291
    Hornet 4 Drive    -0.04036075  0.049583029  0.22021812 -0.06039981 -0.14761127
    Hornet Sportabout  0.38350816  0.160297757 -0.02117623 -0.05983003 -0.14640690
    Valiant           -0.29464160 -0.256612420 -0.03222907 -0.20165466 -0.01954506
    
    plot(Z_score[,1],Z_score[,2],col="red",pch=1) #PC1和PC2的plot
    
    PC1&PC2
    root_eigen<-sqrt(Eigen_value$values) #开方特征值
    loading_score<-root_eigen * Eigen_value$vectors #特征值的开方*各特征向量
    loading_label<-c(1:11) #给每各变量指定标签
    loading_data<-data.frame(loading_score,loading_label)  
    plot(loading_data$X1,loading_data$X2,col=loading_label,pch=loading_label) 
    #各变量与PC1,PC2的相关图
    
    Loading Score of PC1&PC2

    prcomp( )函数

    难度瞬间降低,不要忘了标准化数据scale=TRUE

    函数: prcomp( )
    $x: 主成分得点
    $sdev: 特征值的平方根
    $rotation: 特征向量
    $center: 各维度的平均值
    
    • Loading Score 主成分负荷量(prcomp( )里没有包含,需要另外计算)
      主成分负荷量就是最后得到的特征值的平方根($sdev)乘以特征向量($rotation)
    • 可以用mtcars来实战一下

    1.到此差不多大功告成,不得再次吐槽一下简书的Markdown,不能改字体,数据显示的太别扭了。
    2.PCA数据优雅可视化的话需要用ggplot,放到以后再说吧。

    3. 根据 prcomp( ) 自编可计算Loading Score的函数(工事中)

    4. 在生物统计学上的应用(工事中)

    相关文章

      网友评论

        本文标题:主成分分析PCA For R(工事中)

        本文链接:https://www.haomeiwen.com/subject/ewvmxctx.html