欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

机器学习之PCA降维

程序员文章站 2022-07-13 08:51:35
...

PCA(主成分分析,Principal components analysis)降维在很多技术上都有运用,从表面意思上看,他能够减少某个数据集的维度,特别是在相关的数据中或者含有冗余信息的数据中很有用,比如图像,我们往往通过降维的方式来提取关键信息或者减少计算量。
PCA在生活中的例子也有很多,但是我想把PCA和我们之前学的线性代数联系起来,线性代数中我们讲的就是矩阵,包括矩阵求秩,一个向量组的极大线性无关组,矩阵的特征值分解,这些都和PCA有着比较强烈的关系,矩阵求秩得到的是线性无关向量的个数,特征值分解的到的是矩阵的一些特征,每个特征值对应的特征向量之间有时线性无关的。
我们来看下面一个关于矩阵分解的例子:

b=[0.6166 0.6154;0.6154 0.7166]
[V,D]=eig(b)
V =

   -0.7352    0.6779
    0.6779    0.7352


D =

    0.0492         0
         0    1.2840

上面是对一个协方差矩阵进行特征值分解得到的,其中对角矩阵D的对角元素就是特征,降维的原理就是选取特征较大的值,舍弃特征中较小的,然后将那些特征较大的特征对应的特征向量组成一个特征矩阵。 但是往往一个数据矩阵中各元素差异较大,因此,我们不得不作一些预处理,我们需要做归一化,将矩阵变换为均值为0,标准差为1的矩阵。
处理步骤如下:
1 矩阵每列元素求均值
2 矩阵每列对应元素减去那列元素的均值
3 矩阵每列元素求标准差
4 每列元素除去那列对应的标准差
示例:

clc,clear all
B=[1 4 5 2;6 9 3 12;61 25 94 17;20 31 49 22];
[width,height]=size(B);%矩阵大小
B_mean=mean(B);%沿列的均值,第一步
B_mean_ex=repmat(B_mean,height,1);
B_remean=double(B)-B_mean_ex;%第二步
B_var=zeros(1,width);
for i=1:width
     B_var(i)=var(B_remean(:,i));%第三步,求的是方差
end
B_var_re=repmat(sqrt(B_var),height,1);
B_st=B_remean./B_var_re;%第四步

从吴恩达教授的视频中可以看出,PCA降维很重要的一步就是对预处理后的矩阵求协方差矩阵,然后对协方差矩阵进行特征值分解。
那么接下来就要求解协方差矩阵了,协方差指的是类间的相关程度。一个矩阵的协方差矩阵形式如下:
机器学习之PCA降维
在协方差矩阵C中,每一个元素c(i,j)对应着原矩阵第i列与第j列的协方差,举个例子:

B_cov=zeros(width,height)
for i=1:width
    for j=1:height
        B_cov(i,j)=sum((B_st(:,i)-mean(B_st(:,i))).*(B_st(:,j)-mean(B_st(:,j))))/(width-1);
    end
end
B_cov
c=cov(B_st)%使用matlab的cov函数求协方差
B_cov =

    1.0000    0.6546    0.9706    0.5522
    0.6546    1.0000    0.7914    0.9404
    0.9706    0.7914    1.0000    0.6534
    0.5522    0.9404    0.6534    1.0000


c =

    1.0000    0.6546    0.9706    0.5522
    0.6546    1.0000    0.7914    0.9404
    0.9706    0.7914    1.0000    0.6534
    0.5522    0.9404    0.6534    1.0000

两种方法是一样的。
接下来进行特征值分解:

[V,D]=eig(B_cov)
V =

    0.5142   -0.4063   -0.5797    0.4843
    0.4473    0.6131    0.3978    0.5156
   -0.6853    0.3193   -0.3966    0.5208
   -0.2568   -0.5976    0.5903    0.4780


D =

    0.0000         0         0         0
         0    0.0616         0         0
         0         0    0.6525         0
         0         0         0    3.2859

接下来,进行特征值排序,在本例中,正好是从小向大排序的。后面两个特征占据了总特征的98.46%。我们也可以根据比例来决定我们需要选取多少特征。
在本例中,我选取后两个特征。

B_rebuid=B_remean*V(:,3:4)
B_rebuid =

   13.2498  -39.4332
   19.0363  -30.6958
  -39.6188   53.9672
    7.3327   16.1619

这便是降维后的矩阵。
我是从吴恩达教授的视频中学习的PCA,但是我看到其他博客都是用的奇异值分解,得到的特征是自动排好序的(且特征非负) ,不过和特征值分解原理一样。
总之,PCA降维的步骤就是:
1 预处理
2 求协方差矩阵
3 特征值分解
4 特征值排序,求解降维矩阵
此外,我的理解可能有偏差,希望可以和大家交流,共同进步。