PCA(主成分分析)算法,主要用於數據降維,保留了數據集中對方差貢獻最大的若干個特征來達到簡化數據集的目的。
實現數據降維的步驟:
1、將原始數據中的每一個樣本用向量表示,把所有樣本組合起來構成一個矩陣,通常需對樣本矩陣進行處理,得到中性化樣本矩陣
2、求樣本矩陣的協方差矩陣
3、求協方差矩陣的特征值和特征向量
4、將求出的特征向量按照特征值的大小進行組合形成一個映射矩陣。並根據指定的PCA保留的特征個數取出映射矩陣的前n行或者前n列作為最終的映射矩陣。
5、用映射矩陣對數據進行映射,達到數據降維的目的。
中心化樣本矩陣:先讓樣本矩陣中心化,即每一維度減去該維度的均值,然后直接用新的到的樣本矩陣乘上它的轉置,然后除以(N-1)即可,如下:
1 % 中心化樣本矩陣,樣本矩陣MySample是10*3大小的矩陣,repmat(mean(MySample),10,1)產生一個每行都是mean(Mysample),共10行 2 X = MySample – repmat(mean(MySample),10,1); %每一維度減去該維度的均值 3 %X=X-ones(size(X,1),1)*mean(X);這樣同樣可以達到每一維度減去該維度的均值的效果,相比上面那種,這種更通用,因為不須每次改寫repmat中的第二個參數 4 C = (X’*X)/(size(X,1)-1)%新得到的矩陣X乘上的它的轉置
PCA算法Matlab實現:
1 function [newX,T,meanValue] = pca_row(X,CRate) 2 %每行是一個樣本 3 %newX 降維后的新矩陣 4 %T 變換矩陣 5 %meanValue X每列均值構成的矩陣,用於將降維后的矩陣newX恢復成X 6 %CRate 貢獻率 7 %計算中心化樣本矩陣 8 meanValue=ones(size(X,1),1)*mean(X); 9 X=X-meanValue;%每個維度減去該維度的均值 10 C=X'*X/(size(X,1)-1);%計算協方差矩陣 11 12 %計算特征向量,特征值 13 [V,D]=eig(C); 14 %將特征向量按降序排序 15 [dummy,order]=sort(diag(-D)); 16 V=V(:,order);%將特征向量按照特征值大小進行降序排列 17 d=diag(D);%將特征值取出,構成一個列向量 18 newd=d(order);%將特征值構成的列向量按降序排列 19 20 %取前n個特征向量,構成變換矩陣 21 sumd=sum(newd);%特征值之和 22 for j=1:length(newd) 23 i=sum(newd(1:j,1))/sumd;%計算貢獻率,貢獻率=前n個特征值之和/總特征值之和 24 if i>CRate%當貢獻率大於95%時循環結束,並記下取多少個特征值 25 cols=j; 26 break; 27 end 28 end 29 T=V(:,1:cols);%取前cols個特征向量,構成變換矩陣T 30 newX=X*T;%用變換矩陣T對X進行降維 31 end
測試數據:
>> test=[10 15 29;15 46 13;23 21 30;11 9 35;42 45 11;9 48 5;11 21 14;8 5 15;11 12 21;21 20 25]
test =
10 15 29
15 46 13
23 21 30
11 9 35
42 45 11
9 48 5
11 21 14
8 5 15
11 12 21
21 20 25
調用函數:
[newX,T,meanValue]=pca_row(test,0.9)%假設貢獻率為90%
newX =
13.4627 -0.1472
-21.2616 -6.1205
4.7222 11.1751
20.7366 4.1128
-29.3539 16.6403
-24.3452 -15.3551
2.0237 -6.9416
17.2018 -7.6807
12.5972 -2.8162
4.2167 7.1330
T =
-0.3025 0.8750
-0.8672 -0.0881
0.3956 0.4760
meanValue =
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
將降維后得到的新矩陣newX恢復:
公式為X=newX*T'+meanValue
得到:
X =
11.8983 12.5383 25.0552
17.1770 43.1771 8.4762
24.4495 19.1203 26.9878
13.4252 5.8552 29.9604
39.5407 48.1891 16.1105
10.0297 46.6648 2.8603
9.4139 23.0567 17.2959
4.1753 9.9596 22.9479
9.8247 13.5240 23.4422
21.0656 19.9149 24.8636
可以看到與原X有些誤差
對於該組測試數據當CRate設置為0.97時,恢復時可以100%恢復
參考資料:
1、PCA算法學習_1(OpenCV中PCA實現人臉降維),作者:tornadomeet
2、PCA算法學習_2(PCA理論的matlab實現),作者:tornadomeet
3、PCA(主成分分析)詳解(寫給初學者)結合matlab,作者:古劍寒
4、PCA降維算法總結以及matlab實現PCA(個人的一點理解),作者:watkins