2016-12-06 60 views
1

以下兩個函數有什麼區別?瞭解MATLAB中的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); 

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,另一個人在做什麼?

+2

您是否正在瀏覽一些長期離職的同事的代碼目錄? – excaza

+0

@excaza,是的。我是。你說對了。 – anonymous

回答

6

第一個函數prepTransform實際上是在您的訓練數據上執行PCA,您可以在其中確定將新數據表示到較低維空間的新座標軸。它所做的是找到數據的協方差矩陣的特徵向量,然後對特徵向量排序,使得具有最大特徵值的特徵向量出現在特徵向量矩陣的第一列中,並且具有最小特徵值的特徵向量出現在最後柱。此功能的重要之處在於,您可以通過保留第一個N列(這將允許您將數據減少到N尺寸)來定義要減少數據的多少個維度。丟棄其他列並只保留第一個N是在代碼中設置爲trmx。變量NprepTransform函數中的prep_count變量定義。

第二個函數pcaTransform最終轉換在與您的訓練數據相同的域中定義的數據,但不一定是訓練數據本身(它可能是如果您希望的話)到由特徵向量定義的較低維空間協方差矩陣。爲了最終執行尺寸縮減或dimensionality reduction,因爲它是衆所周知的,您只需從訓練數據中減去每個特徵的平均值,然後將訓練數據乘以矩陣trmx即可。請注意,輸出矢量mu中每個要素的平均值的prepTransform對於當您終於呼叫pcaTransform時意味着減去數據很重要。


如何使用這些功能

爲了有效地使用這些功能,首先確定trmx矩陣,其中包含通過先定義你要多少尺寸,以減少你的數據數據的的主要成分向下以及存儲在mu每個功能的平均值:

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

接下來你終於可以在你的DA進行降維TA是由同一個域中定義爲tvec(甚至tvec如果你願意,但它並沒有成爲):

pcaSet = pcaTransform(tvec, mu, trmx); 

在詞彙方面,pcaSet包含所謂的校長您的數據的分數爲,這是用於將數據轉換爲較低維空間的術語。

如果我可以推薦一些東西......

通過特徵向量法找出PCA是不穩定的。我強烈建議你在協方差矩陣,其中結果的V矩陣已經給你一個特徵向量來分類對應於你的主成分通過svd使用Singular Value Decomposition

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; 

進一步閱讀

如果你完全想明白,寫的代碼和背後的理論是什麼感覺這樣做,我建議我寫了談論的話題以下兩個堆棧溢出職位:

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完成答案。我在這裏寫的這個答案是上述兩篇文章的混合體。

+1

哇!那太棒了!我希望我能投這個答案多次! – anonymous

+0

@anonymous:D非常感謝。 PCA是我最喜歡的話題。我很高興能夠提供幫助。祝你好運! – rayryeng

+1

真正的教科書風格:D這應該在文檔中。 – GameOfThrows