【数据分析】基于matlab PCA主成分分析【含Matlab源码 466期】

266 阅读3分钟

一、简介

PCA(PrincipalComponents Analysis)即主成分分析,是图像处理中经常用到的降维方法,大家知道,我们在处理有关数字图像处理方面的问题时,比如经常用的图像的查询问题,在一个几万或者几百万甚至更大的数据库中查询一幅相近的图像。
这时,我们通常的方法是对图像库中的图片提取响应的特征,如颜色,纹理,sift,surf,vlad等特征,然后将其保存,建立响应的数据索引,然后对要查询的图像提取相应的特征,与数据库中的图像特征对比,找出与之最近的图片。
这里,如果我们为了提高查询的准确率,通常会提取一些较为复杂的特征,如sift,surf等,一幅图像有很多个这种特征点,每个特征点又有一个相应的描述该特征点的128维的向量,设想如果一幅图像有300个这种特征点,那么该幅图像就有300*vector(128维)个,如果我们数据库中有一百万张图片,这个存储量是相当大的,建立索引也很耗时,如果我们对每个向量进行PCA处理,将其降维为64维,是不是很节约存储空间啊?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、源代码

%K-L变换的基本原理是去掉样本集合数据(矢量)的分量相关性。
%
% 具体做法是对一组N维样本向量,先求出其协方差矩阵,将协方差矩阵对角化,
% 得到本征向量,这些本征向量组成了N维空间的一组正交基,从本征向量中选取对应本征值较大的若干个作为变换矩阵的列,
% 用这个变换矩阵对原有样本进行线性变换,投影到一个特征空间中,得到的向量称为特征向量。K-L变换可以用来进行样本压缩和特征提取。
% 实际问题中它要求样本集合的分布应该比较紧致,
% 如满足高斯分布,这样样本的能量才能集中在较少的几个本征向量的方向上。

clear;clc;
% %线性分类;
x1= [-5 -5;-5 4;4 -5;-5 6;-6 -5;];
x2=[ 5 5;5 6;6 5; 5 4; 4 5];
x=[x1;x2];
%   用PCA 变换来做一维特征提取
X=x1+x2;
m0=sum(sum(X));

%令p(w1)=p(w2)=0.5;
y1=x1';
y2=x2';
w1=y1;
z1=y1*y1';
z2=y2*y2';
r=1/10*(z1+z2);
% p=poly(r); % ploy 用来产生特征多项式系数向量
% root=roots(p) % 求r的特征值
% sort(root());


[E,D]=eig(r);%矩阵的特征值
%eigenvalues =flipud(sort(diag(D)));
% 对特征值按逆序排序
[eigD,IX]=sort(diag(D),'descend');
% 特征向量矩阵按特征值的调整作对应调整
eigE(:,1:length(IX))=E(:,IX);%
disp('协方差矩阵的特征值:');disp(eigD);
disp('协方差矩阵对应于特征值的特征向量(列)矩阵:');disp(eigE);

% 样本集X的协方差矩阵
Covx= cov(x);
disp('样本集的协方差矩阵:');disp(Covx);

% 协方差矩阵CovX的特征值eigenvalue(D)与对应的特征向量矩阵eigenvector(V) 
[E,D] = eig(Covx);

% 对特征值按逆序排序
[eigD,IX]=sort(diag(D),'descend');
% 特征向量矩阵按特征值的调整作对应调整
eigE(:,1:length(IX))=E(:,IX);
disp('协方差矩阵的特征值:');disp(eigD);
disp('协方差矩阵对应于特征值的特征向量(列)矩阵:');disp(eigE);

% 对样本集X进行PCA
Y=(x-repmat(mean(x,1),10,1))  * eigE;
disp('样本集x:');disp(x);
disp('样本集x经PCA后的结果:');
disp(Y);

Srange = minmax(x(:,1)');        % 样本集变化范围
Smean = mean(x);                 % 样本集中心点

三、运行结果

在这里插入图片描述

四、备注

版本:2014a