以下两个功能有什么区别?
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,那另一个人在做什么?
答案 0 :(得分:6)
第一个函数prepTransform
实际上在您的训练数据上执行PCA,您正在确定新轴以将数据表示到较低维空间。它的作用是找到数据的协方差矩阵的特征向量,然后对特征向量进行排序,使得具有最大特征值的特征向量出现在特征向量矩阵evec
的第一列和具有最小特征值的特征向量中。出现在最后一列。此功能的重要之处在于,您可以通过保留N
的{{1}}列的第一列来定义要减少数据的维度,这样您就可以将数据减少到{{1尺寸。丢弃其他列并仅保留第一个evec
是代码中设置为N
的内容。变量N
由trmx
函数中的N
变量定义。
第二个函数prep_count
最终转换在与训练数据相同的域内定义的数据,但不一定是训练数据本身(如果你愿意的话)可以转换到由下面定义的低维空间。协方差矩阵的特征向量。要最终执行缩小维度,或者通常知道dimensionality reduction,您只需将训练数据从平均值中减去每个要素,然后将训练数据乘以矩阵prepTransform
。请注意,pcaTransform
输出向量trmx
中每个要素的平均值非常重要,这意味着当您最终调用prepTransform
时减去数据。
要有效地使用这些功能,首先要确定包含数据的主要组件的mu
矩阵,方法是首先定义要将数据减少到多少维度。作为pcaTransform
中存储的每个要素的平均值:
trmx
接下来,您最终可以对与mu
(或者N = 2; % Reduce down to two dimensions for example
[mu, trmx] = prepTransform(tvec, N);
相同的域中定义的数据进行降维,如果您愿意,但不一定是:)< / p>
tvec
就词汇量而言,tvec
包含数据的主要得分,这是用于将数据转换为较低维度空间的术语。< / p>
已知通过特征向量方法找到PCA是不稳定的。我强烈建议您在协方差矩阵上使用Singular Value Decomposition通过svd
,其中结果的pcaSet = pcaTransform(tvec, mu, trmx);
矩阵已经为您提供了与您的主要成分相对应的特征向量:
pcaSet
然后,通过获取每个要素的平均减去数据并乘以V
矩阵来执行转换,一旦您对mu = mean(tvec, 1);
[~,~,V] = svd(cov(tvec));
的{{1}}列的V
列进行分组和抓取:
N
V
是与执行N = 2;
X = bsxfun(@minus, tvec, mu);
pcaSet = X*V(:, 1:N);
执行相同操作的平均减法数据,但您并未明确复制每个训练示例中的均值向量,而是让bsxfun
为您执行此操作内部。但是,利用MATLAB R2016b,可以在不显式调用X
的情况下完成此重复:
pcaSet = tvec - repmat(mu, size(tvec,1), 1);
如果你完全想要理解所编写的代码以及它正在做的事情背后的理论,我建议我写下以下两篇关于该主题的Stack Overflow帖子:
How to use eigenvectors obtained through PCA to reproject my data?
第一篇文章将您呈现的代码带入使用特征向量方法执行PCA的光。第二篇文章接触到了如何在答案结束时使用SVD进行操作。我在这里写的这个答案是上面两个帖子的混合。