关于PCA的原理参见:
PCA原理
PCA:一种通过特征的线性组合来实现降维的方法,目的就是在尽可能好的代表原始数据的前提下,通过线性变换将样本数据投影到地位空间中。
如图示意,二维样本分别投影到e1、e2上,降维一维数据。
MATLAB中使用princomp()函数对PCA进行封装。
一般调用类型:
[COEEF,SCORE,latent]=princomp(Y);
COEEF:为样本协方差矩阵的(标准化后的)特征向量;即变换空间中的基向量:e1、e2、e3...
SCORE:主成分,Y的低维表示,即Y中的数据在主成分分量上的投影;
latent:包含样本协方差矩阵的特征值的向量。
如:
Y=[-1,-2;-1,0;0,0;2,1;0,1];[COEEF,SCORE,latent]=princomp(Y);
可得
COEEF=
0.70710.7071
0.7071 -0.7071
SCORE=
-2.1213 0.7071
-0.7071 -0.7071
0 0
2.1213 0.7071
0.7071 -0.7071
latent=
2.5
0.5
上述PCA过程主要的计算量是计算样本协方差矩阵的特征值和特征向量。假如有n个d维样本特征向量,则组成的样本矩阵X的大小为n×d,对应的协方差矩阵S的大小为d×d,当维数d很大时会导致PCA计算了很大,会消耗大量内存。
因此需要一种算法减小PCA的计算量——快速PCA
1、奇异值分解(SVD)
SVD的原理及推导过程参见:
奇异值分解详解
知乎话题:奇异值的物理意义是什么
用不同的特征分量,进行重构
clear all;
close all;
clc;
a=imread(‘sophie.jpg’);
a=rgb2gray(a);
[m n]=size(a);
r=rank(double(a));
[s v d]=svd(double(a));
re01=s(:,:)*v(:,1:1)*d(:,1:1)’;
re1=mat2gray(re01);
re02=s(:,:)*v(:,1:3)*d(:,1:3)’;
re2=mat2gray(re02);
re03=s(:,:)*v(:,1:5)*d(:,1:5)’;
re3=mat2gray(re03);
re04=s(:,:)*v(:,1:20)*d(:,1:20)’;
re4=mat2gray(re04);
re05=s(:,:)*v(:,1:40)*d(:,1:40)’;
re5=mat2gray(re05);
figure;
subplot(2,3,1),subimage(a);
title(‘原图’);
subplot(2,3,2),subimage(re1);
title(‘1*1’);
subplot(2,3,3),subimage(re2);
title(‘3*3’);
subplot(2,3,4),subimage(re3);
title(‘5*5’);
subplot(2,3,5),subimage(re4);
title(‘20*20’);
subplot(2,3,6),subimage(re5);
title(‘40*40’);
运行效果如图: