zoukankan      html  css  js  c++  java
  • PCA算法学习(Matlab实现)

    PCA(主成分分析)算法,主要用于数据降维,保留了数据集中对方差贡献最大的若干个特征来达到简化数据集的目的。

    实现数据降维的步骤:

    1、将原始数据中的每一个样本用向量表示,把所有样本组合起来构成一个矩阵,通常需对样本矩阵进行处理,得到中性化样本矩阵

    2、求样本矩阵的协方差矩阵

    3、求协方差矩阵的特征值和特征向量

    4、将求出的特征向量按照特征值的大小进行组合形成一个映射矩阵。并根据指定的PCA保留的特征个数取出映射矩阵的前n行或者前n列作为最终的映射矩阵。

    5、用映射矩阵对数据进行映射,达到数据降维的目的。

    中心化样本矩阵:先让样本矩阵中心化,即每一维度减去该维度的均值,然后直接用新的到的样本矩阵乘上它的转置,然后除以(N-1)即可,如下:

    1 % 中心化样本矩阵,样本矩阵MySample是10*3大小的矩阵,repmat(mean(MySample),10,1)产生一个每行都是mean(Mysample),共10行
    2 X = MySample – repmat(mean(MySample),10,1);   %每一维度减去该维度的均值
    3 %X=X-ones(size(X,1),1)*mean(X);这样同样可以达到每一维度减去该维度的均值的效果,相比上面那种,这种更通用,因为不须每次改写repmat中的第二个参数
    4 C = (X’*X)/(size(X,1)-1)%新得到的矩阵X乘上的它的转置

    PCA算法Matlab实现:

     1 function [newX,T,meanValue] = pca_row(X,CRate)
     2 %每行是一个样本
     3 %newX  降维后的新矩阵
     4 %T 变换矩阵
     5 %meanValue  X每列均值构成的矩阵,用于将降维后的矩阵newX恢复成X
     6 %CRate 贡献率
     7 %计算中心化样本矩阵
     8 meanValue=ones(size(X,1),1)*mean(X);
     9 X=X-meanValue;%每个维度减去该维度的均值
    10 C=X'*X/(size(X,1)-1);%计算协方差矩阵
    11 
    12 %计算特征向量,特征值
    13 [V,D]=eig(C);
    14 %将特征向量按降序排序
    15 [dummy,order]=sort(diag(-D));
    16 V=V(:,order);%将特征向量按照特征值大小进行降序排列
    17 d=diag(D);%将特征值取出,构成一个列向量
    18 newd=d(order);%将特征值构成的列向量按降序排列
    19 
    20 %取前n个特征向量,构成变换矩阵
    21 sumd=sum(newd);%特征值之和
    22 for j=1:length(newd)
    23       i=sum(newd(1:j,1))/sumd;%计算贡献率,贡献率=前n个特征值之和/总特征值之和
    24       if i>CRate%当贡献率大于95%时循环结束,并记下取多少个特征值
    25             cols=j;
    26             break;
    27       end
    28 end
    29 T=V(:,1:cols);%取前cols个特征向量,构成变换矩阵T
    30 newX=X*T;%用变换矩阵T对X进行降维
    31 end

     测试数据:

    >> test=[10 15 29;15 46 13;23 21 30;11 9 35;42 45 11;9 48 5;11 21 14;8 5 15;11 12 21;21 20 25]

    test =

    10 15 29
    15 46 13
    23 21 30
    11 9 35
    42 45 11
    9 48 5
    11 21 14
    8 5 15
    11 12 21
    21 20 25

    调用函数:

     [newX,T,meanValue]=pca_row(test,0.9)%假设贡献率为90%

    newX =

    13.4627 -0.1472
    -21.2616 -6.1205
    4.7222 11.1751
    20.7366 4.1128
    -29.3539 16.6403
    -24.3452 -15.3551
    2.0237 -6.9416
    17.2018 -7.6807
    12.5972 -2.8162
    4.2167 7.1330


    T =

    -0.3025 0.8750
    -0.8672 -0.0881
    0.3956 0.4760


    meanValue =

    16.1000 24.2000 19.8000
    16.1000 24.2000 19.8000
    16.1000 24.2000 19.8000
    16.1000 24.2000 19.8000
    16.1000 24.2000 19.8000
    16.1000 24.2000 19.8000
    16.1000 24.2000 19.8000
    16.1000 24.2000 19.8000
    16.1000 24.2000 19.8000
    16.1000 24.2000 19.8000

     将降维后得到的新矩阵newX恢复:

    公式为X=newX*T'+meanValue

    得到:

    X =

    11.8983 12.5383 25.0552
    17.1770 43.1771 8.4762
    24.4495 19.1203 26.9878
    13.4252 5.8552 29.9604
    39.5407 48.1891 16.1105
    10.0297 46.6648 2.8603
    9.4139 23.0567 17.2959
    4.1753 9.9596 22.9479
    9.8247 13.5240 23.4422
    21.0656 19.9149 24.8636

    可以看到与原X有些误差

    对于该组测试数据当CRate设置为0.97时,恢复时可以100%恢复

     参考资料:

    1、PCA算法学习_1(OpenCV中PCA实现人脸降维),作者:tornadomeet

    2、PCA算法学习_2(PCA理论的matlab实现),作者:tornadomeet

    3、PCA(主成分分析)详解(写给初学者)结合matlab,作者:古剑寒

    4、PCA降维算法总结以及matlab实现PCA(个人的一点理解),作者:watkins

  • 相关阅读:
    [LeetCode] Trips and Users 旅行和用户
    [LeetCode] Rising Temperature 上升温度
    [LeetCode] Delete Duplicate Emails 删除重复邮箱
    [LeetCode] Department Top Three Salaries 系里前三高薪水
    Spring boot Jackson基本演绎法&devtools热部署
    使用spring tool suite(STS)工具创建spring boot项目和出现错误后的处理
    Spring Boot 2.0官方文档之 Actuator
    springboot 使用webflux响应式开发教程(二)
    SpringBoot在自定义类中调用service层等Spring其他层
    springBoot单元测试-模拟MVC测试
  • 原文地址:https://www.cnblogs.com/simon-c/p/4902651.html
Copyright © 2011-2022 走看看