1:为什么图像处理需要PC A?
1- 如果【特征向量】维度过高,不仅会增加计算复杂度,还会给分类问题带来负面影响,造成识别,或者分类精度降低。
2- 可能,直观上,感觉特征越多,就越多的描述【样本的属性】,可提高识别率。
3- 其实,并不是???!!
假设,要区分西瓜,冬瓜。我们可以直接通过表皮就纹理,就可以做出正确的判断。那么,我多加几个特征:(重量)(形状)(体积)(是否有籽),可能还会对分类造成干扰。
:实际上,对于【特定样本数目】的情况下,特征维度与识别率关系 大概如下曲线:
注意:x轴—特征向量数目, y轴—分类性能。
这就需要对【特征降维】,其中一个重要手段:PCA.
2: PCA 干什么?
【实质】:尽可能好的保留原始数据信息的条件下,通过【线性变换】将高维空间中样本数据投影到低维空间。
3: PCA怎么干?数学解释
1- 提取 样本协方差矩阵S 的 前K个特征值【求矩阵特征值,然后排序,然后取前K个】对应的特征向量【这些特征向量保证相互正交】。
2- 实际上,就是找到一组基,将原来的矩阵投影到新的 空间上。
3- 几何解释
1- 在二维平面,求出来的两个本征向量就是,E1,E2. PCA实际上做:投影变换【从原来的X,Y轴,转换到了一组新的E1,E2 坐标系】
2- 这实际上也是去除数据的线性相关的过程。
【直观解释】:如果直接用眼看,让你先给一个向量,使得样本数据在此方向上的差异【方差】表现最大。那肯定E1,找到第二个,必须跟第一个垂直,也就是E2.
4:计算实例
已知样本 X={(1,2), (3,3), (3,5), (5,4), (5,6), (6,5), (8,7), (9,8)}
问题: 利用1个,2个主成分 实现X的重构(表达X)。
1- 计算样本均值 m=(5,5);
2- 计算协方差矩阵:
3- 求S特征值 lamda1 = 9.34, lamda2 = 0.41
求特征向量 e1 = (0.81,0.59)T ,e2 = (-0.59 0.81) T;
e1 与e2 彼此单位正交。
4 -降至一维:
结果: a1 = -5.01, a2 = -2.8 , a3 = -1.62, a4 = -0.59 ,a5 = 0.59, a6= 0.81 ,a7 = 3.61, a8=5.01
5 -二维:
【a1 = -5.01, a2 = -2.8 , a3 = -1.62, a4 = -0.59 ,a5 = 0.59, a6= 0.81 ,a7 = 3.61, a8=5.01】
第二维度【-0.07, 0.44, 1.18, -0.81, 0.81, 0.59, -0.15, 0.07】
5:matlab 计算上题
x=[1,2;
3,3;
3,5;
5,4;
5,6;
6,5;
8,7;
9,8]
[COFFE,Score, latent] = princomp(X); %主成分分析 注意matlab版本应低于2014b
— — — — — — - - - - - -
X =
1 2
3 3
3 5
5 4
5 6
6 5
8 7
9 8
COFFE = %变幻基矩阵,每一个列向量构成变换空间中的一组基
0.8086 -0.5883
0.5883 0.8086
Score = % 主成分,Score(:,1) 就是第一个最重要的分量,Score(:,2) 次之
-4.9995 -0.0728
-2.7939 -0.4407
-1.6173 1.1766
-0.5883 -0.8086
0.5883 0.8086
0.8086 -0.5883
3.6025 -0.1476
4.9995 0.0728
latent = %协方差矩阵的特征值
10.6764
0.4664
实际上,我们做过CenterLoss实验的都知道,我们可以对LFW图像提取特征之后,再应用PCA。然后就上上面那样,找一个最好的维度,去将原来的特征空间,转换到新的特征空间,那么原来的特征在新的空间上有新的表示。
那如果想把未来的一张图片,投影的原来已经设定好的特征空间,应该如何做呢?
%*************************************************************************
% ┊File Name: pca_fea.m
% ┊Author: bin.wang
% ┊Mail: [email protected]
% ┊Created Time: Fri 16 Jun 2017 09:03:37 PM CST
%************************************************************************/
% this file for find top-K principle component
% feature.mat include 2 variables :fea & fea_p ,size(fea)==size(fea_p)=[6000,512]
load feature.mat
% pca for fea then result store in Score ,size(Score)=[6000,512]
[COFFE,Score, latent] = princomp(fea);
% compute transform matrix for pca
fea_p_mean=mean(fea_p);
for i=1:6000
%each col = col - mean(col)
fea_p_sub_mean(i,:)=fea_p(i,:)-fea_p_mean(:,:);
end
%project fea_p to a new subspace ;
proj_fea_p=fea_p_sub_mean * COFFE;