您的位置:首页 > 编程语言 > MATLAB

PCA(Principal Component Analysis 主成分分析)原理及MATLAB实现

2017-06-26 21:35 766 查看
关于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.7071  0.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’);

运行效果如图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: