机器学习之PCA降维
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降维很重要的一步就是对预处理后的矩阵求协方差矩阵,然后对协方差矩阵进行特征值分解。
那么接下来就要求解协方差矩阵了,协方差指的是类间的相关程度。一个矩阵的协方差矩阵形式如下:
在协方差矩阵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 特征值排序,求解降维矩阵
此外,我的理解可能有偏差,希望可以和大家交流,共同进步。
上一篇: 机器学习实战PCA算法
下一篇: 机器学习之EM、GMM和PCA