關於PCA的詳細說明,參見:http://blog.sina.com.cn/s/blog_61b8694b0101jg4f.html
在此,我把我所用的matlab實現代碼列舉在此,比較簡潔,並附有詳細的注釋。
訓練數據的PCA處理:
function [ mu,sigma,coeff,score,latent ] = PCA( originalData ) % originalData——原始數據,每行代表一組; % 標准化數據:mu-每列的均值;sigma-每列的標准差; % PCA降維數據:coeff-系數矩陣;score-PCA降維結果;latent-所有主成分的影響率(%)。 %訓練時: %1、數據標准化,並保存標准化所用的參數; %2、PCA降維; %3、選擇維度(一般選擇累計影響率大於95%的前幾個維度),並保留所用的樣本均值和系數矩陣; %1、數據標准化:Z-標准化后的數據;mu-每列的均值;sigma-每列的標准差。 [Z,mu,sigma]=zscore(originalData); %2、PCA降維: [coeff,score,latent] = princomp(Z); %3、選擇維度 latent=100*latent/sum(latent); A=length(latent); percent_threshold=95; %百分比閥值,用於決定保留的主成分個數; percents=0; %累積百分比 for n=1:A percents=percents+latent(n); if percents>percent_threshold break; end end coeff=coeff(:,1:n); %達到主成分累積影響率要求的系數矩陣; score=score(:,1:n); %達到主成分累積影響率要求的主成分;
save PCA mu sigma coeff latent end
測試數據的PCA處理:
%測試時: %1、按照訓練樣本的標准化參數,對測試數據進行處理: % Y=(X-mu)/sigma; %2、再按照訓練樣本的PCA降維后所選擇的系數矩陣對數據進行處理: % Y=X*coeff % 由於在標准化中,已經對數據進行了減去均值處理,所以在此可直接乘系數矩陣。 load PCA rownum=size(input_test,1); input_test=(input_test-repmat(mu,rownum,1))./repmat(sigma,rownum,1); input_test=input_test*coeff;