在MATLAB中理解PCA

use*_*312 1 matlab octave pca

以下两个功能有什么区别?

prepTransform.m

function [mu trmx] = prepTransform(tvec, comp_count)
% Computes transformation matrix to PCA space
% tvec - training set (one row represents one sample)
% comp_count - count of principal components in the final space
% mu - mean value of the training set
% trmx - transformation matrix to comp_count-dimensional PCA space

% this is memory-hungry version
% commented out is the version proper for Win32 environment

tic;
mu = mean(tvec);
cmx = cov(tvec); 

%cmx = zeros(size(tvec,2));
%f1 = zeros(size(tvec,1), 1);
%f2 = zeros(size(tvec,1), 1);
%for i=1:size(tvec,2)
%  f1(:,1) = tvec(:,i) - repmat(mu(i), size(tvec,1), 1);
%  cmx(i, i) = f1' * f1;
%  for j=i+1:size(tvec,2)
%    f2(:,1) = tvec(:,j) - repmat(mu(j), size(tvec,1), 1);
%    cmx(i, j) = f1' * f2;
%   cmx(j, i) = cmx(i, j);
%  end
%end
%cmx = cmx / (size(tvec,1)-1);

toc
[evec eval] = eig(cmx);
eval = sum(eval);

[eval evid] = sort(eval, 'descend');
evec = evec(:, evid(1:size(eval,2)));

% save 'nist_mu.mat' mu
% save 'nist_cov.mat' evec 
trmx = evec(:, 1:comp_count);
Run Code Online (Sandbox Code Playgroud)

pcaTransform.m

function [pcaSet] = pcaTransform(tvec, mu, trmx)
% tvec - matrix containing vectors to be transformed
% mu - mean value of the training set
% trmx - pca transformation matrix
% pcaSet -  output set transforrmed to PCA  space

pcaSet = tvec - repmat(mu, size(tvec,1), 1);

%pcaSet = zeros(size(tvec));
%for i=1:size(tvec,1)
%  pcaSet(i,:) = tvec(i,:) - mu;
%end

pcaSet = pcaSet * trmx;
Run Code Online (Sandbox Code Playgroud)

哪一个实际上在做PCA?

如果一个人在做PCA,那另一个人在做什么?

ray*_*ica 6

第一个功能prepTransform实际上是在您的训练数据上执行PCA,您要确定新轴以将数据表示到较低维度空间.它的作用是找到数据的协方差矩阵的特征向量,然后对特征向量进行排序,使得具有最大特征值的特征向量出现在特征向量矩阵的第一列中,evec具有最小特征值的特征向量出现在最后一列中.此功能的重要之处在于,您可以通过保留其中的第一Nevec可以将数据减少到N维度来定义要将数据减少到多少维度.丢弃其他列并仅保留第一列Ntrmx代码中设置的内容.变量N是由定义prep_count在变量prepTransform函数.

第二个函数pcaTransform最终转换在与训练数据相同的域内定义的数据,但不一定将训练数据本身(可能是您希望的话)转换到由协方差矩阵的特征向量定义的低维空间.到最后执行尺寸的减少,或降维,因为它是俗称,你随便拿各功能的从它的均值减去你的训练数据,你用矩阵乘法训练数据trmx.请注意,prepTransform输出向量中每个要素的平均值mu非常重要,这意味着当您最终调用时减去数据pcaTransform.


如何使用这些功能

要有效地使用这些功能,首先要确定trmx包含数据主要组成部分的矩阵,方法是首先定义要减少数据的维数,以及存储在mu以下内容中的每个要素的平均值:

N = 2; % Reduce down to two dimensions for example
[mu, trmx] = prepTransform(tvec, N);
Run Code Online (Sandbox Code Playgroud)

接下来,您最终可以通过以下方式对您在同一域中定义的数据执行降维tvec(或者,即使tvec您希望,但不一定如此):

pcaSet = pcaTransform(tvec, mu, trmx);
Run Code Online (Sandbox Code Playgroud)

在词汇方面,pcaSet包含所谓的数据的主要分数,这是用于将数据转换为较低维度空间的术语.

如果我能推荐一些东西......

已知通过特征向量方法找到PCA是不稳定的.我强烈建议您在协方差矩阵上使用奇异值分解,svd其中V结果矩阵已经为您提供了与您的主要成分相对应的特征向量:

mu = mean(tvec, 1);
[~,~,V] = svd(cov(tvec));
Run Code Online (Sandbox Code Playgroud)

然后通过获取每个特征的平均减去数据并乘以V矩阵来执行变换,一旦您进行了子集并抓住第一NV:

N = 2;
X = bsxfun(@minus, tvec, mu); 
pcaSet = X*V(:, 1:N);
Run Code Online (Sandbox Code Playgroud)

X是平均减去的数据,它执行与执行相同的操作pcaSet = tvec - repmat(mu, size(tvec,1), 1);,但您没有明确地复制每个训练示例中的平均向量,而是让bsxfun您在内部执行此操作.但是,利用MATLAB R2016b,可以在不显式调用的情况下完成此重复bsxfun:

X = tvec - mu;
Run Code Online (Sandbox Code Playgroud)

进一步阅读

如果你完全想要理解所编写的代码以及它正在做的事情背后的理论,我建议我写下以下两篇关于该主题的Stack Overflow帖子:

在协方差矩阵中选择最大特征值和特征向量的意义在于数据分析?

如何使用通过PCA获得的特征向量重新投影我的数据?

第一篇文章将您呈现的代码带入使用特征向量方法执行PCA的光.第二篇文章接触到了如何在答案结束时使用SVD进行操作.我在这里写的这个答案是上面两个帖子的混合.