1. 程式人生 > >PCA:matlab主成份分析

PCA:matlab主成份分析

通常對於高維資料需要進行降維,matlab中有pca進行資料分析,進行主成份分析:principal component analysis。
matlab呼叫PCA的方式如下:

XMean = mean(X);%X每行是一個例項,每列代表一個屬性
X = bsxfun(@minus,X,XMean);%去中心
[eigenVectors,scores,eigenValues] = pca(X);
transMatrix = eigenVectors(:,1:K);
X = X*transMatrix;

第一步是對求訓練集資料的均值;X代表原始的資料矩陣,是一個N*d的矩陣,N代表樣本個數,d代表特徵的原始維數;
第二步是對訓練集去中心化;
第三步是pca分析:eigenVectors是一個d*d的矩陣,每列代表對應特徵值的特徵向量,scores是N*d的矩陣,eigenValues是對應的特徵值向量,與eigenVectors的列相對應。
第四步取特徵向量矩陣的前K列作為變換矩陣
第五步是對資料進行變化,降維。
**如果資料既有訓練集又有測試集,一般先對訓練集進行PCA降維,得到相應的transMatrix;
然後在測試集上減去訓練樣本的均值trainMean,然後乘以變換矩陣得到對應的降維後的測試集;**
程式碼如下:

    XMean = mean(X);%訓練樣本中心點
    X = bsxfun(@minus,X,XMean);%訓練樣本減去訓練樣本中心點
    transMatrix = eigenVectors(:,1:K);  
    X = X*transMatrix;%訓練集降維後的資料
    X_ = bsxfun(@minus,X_,XMean);%測試樣本減去訓練樣本中心點
    X_ = X_*transMatrix;%測試樣本降維後的結果

K的值與選取的子空間最後能多大程度表示原空間有關,它的計算方式為:
sum(eigenValues(1:K))/sum(eigenValues);
一般情況下這個值要大於95%較為合理。

另:
通常如果資料集很大我們需要降維的情況下,一次性讀入所有的訓練集可能導致記憶體溢位的問題,此時是否就不能用PCA對資料進行分析呢?並不是這樣,如果我們自己實現PCA會發現每次將一個個的樣本讀入記憶體也可以完成PCA對整個資料集的分析,下面主要講這個流程:
1)計算所有樣本的均值:這個過程可以通過逐步加和實現,所以每次讀入一個樣本是沒有問題的;
2)計算協方差矩陣,這個也可以通過每個樣本加和實現,所以也可以讀入一個樣本;
3)對協方差矩陣進行奇異值分解;
4)根據特徵向量求變換矩陣;
5)對每個樣本根據變換矩陣求得變換後的結果。