【问题标题】:Understanding PCA in MATLAB了解 MATLAB 中的 PCA
【发布时间】:2016-12-06 19:56:33
【问题描述】:

以下两个函数有什么区别?

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);

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;

哪一个真正在做 PCA?

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

【问题讨论】:

  • 您是否正在浏览某个长期离职同事的代码目录?
  • @excaza,是的。我是。你没看错。

标签: matlab octave pca


【解决方案1】:

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

第二个函数pcaTransform 最终将定义在与您的训练数据相同的域内但不一定是训练数据本身(如果您愿意,也可以是)的数据转换到由特征向量定义的低维空间协方差矩阵。为了最终执行降维,或者众所周知的dimensionality reduction,您只需将训练数据从其平均值中减去每个特征,然后将训练数据乘以矩阵trmx。请注意,prepTransform 输出向量mu 中每个特征的平均值很重要,以便在您最终调用pcaTransform 时减去您的数据。


如何使用这些功能

要有效地使用这些函数,首先要确定 trmx 矩阵,该矩阵包含数据的主成分,方法是首先定义要将数据减少到的维度以及存储在mu 中的每个特征的平均值:

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

接下来,您最终可以对定义在与tvec(如果您愿意,甚至可以是tvec,但不是必须)在同一域中的数据执行降维操作:

pcaSet = pcaTransform(tvec, mu, trmx);

就词汇而言,pcaSet 包含所谓的数据主要分数,这是用于将数据转换到低维空间的术语。

如果我可以推荐一些东西...

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

mu = mean(tvec, 1);
[~,~,V] = svd(cov(tvec));

然后通过取每个特征的平均减去数据并乘以V 矩阵来执行转换,一旦你子集并获取V 的第一个N 列:

N = 2;
X = bsxfun(@minus, tvec, mu); 
pcaSet = X*V(:, 1:N);

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

X = tvec - mu;

进一步阅读

如果您完全想了解所编写的代码及其背后的理论,我推荐以下两篇关于该主题的 Stack Overflow 帖子:

What does selecting the largest eigenvalues and eigenvectors in the covariance matrix mean in data analysis?

How to use eigenvectors obtained through PCA to reproject my data?

第一篇文章介绍了您提供的代码,该代码使用特征向量方法执行 PCA。第二篇文章涉及您如何在答案末尾使用 SVD 进行操作。我在这里写的这个答案是上面两个帖子的混合。

【讨论】:

  • 哇!那很棒!我希望我能多次投票给这个答案!
  • @anonymous :D 非常感谢。 PCA 是我最喜欢的话题。我很高兴能帮上忙。祝你好运!
  • 真正的教科书风格 :D 这应该在文档中。
猜你喜欢
  • 1970-01-01
  • 2017-06-12
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2017-08-19
  • 2013-08-03
  • 2014-05-31
相关资源
最近更新 更多