关于PCA算法的步骤,网上相关的资料很多。为了在实际应用中更好地使用PCA算法,一个健壮且高效的PCA算法实现的代码是非常有用的。
本人根据一些网络资料综合得出PCA算法的6种实现,旨在给对这方面有需要的人提供帮助。
实现一:matlab的princomp函数,具体见http://blog.csdn.net/qiuchangyong/article/details/70654022
实现二:在matlab里使用eig函数实现,这样更详细。
%X是4行8列的矩阵,表示样本数为4,维数为8
>> X=[28 8 8 34 11 26 5 40;
23 39 30 37 45 49 48 43;
0 15 13 22 7 3 0 4;
16 26 32 4 41 22 38 19]
X =
28 8 8 34 11 26 5 40
23 39 30 37 45 49 48 43
0 15 13 22 7 3 0 4
16 26 32 4 41 22 38 19
>> Y=X-repmat(mean(X),4,1)
Y =
11.2500 -14.0000 -12.7500 9.7500 -15.0000 1.0000 -17.7500 13.5000
6.2500 17.0000 9.2500 12.7500 19.0000 24.0000 25.2500 16.5000
-16.7500 -7.0000 -7.7500 -2.2500 -19.0000 -22.0000 -22.7500 -22.5000
-0.7500 4.0000 11.2500 -20.2500 15.0000 -3.0000 15.2500 -7.5000
%这里的3即样本数-1
>> C=Y'*Y/3
C =
148.9167 21.0000 11.9167 80.7500 85.6667 177.3333 109.2500 212.5000
21.0000 183.3333 145.0000 5.0000 242.0000 178.6667 299.3333 73.0000
11.9167 145.0000 144.9167 -72.2500 227.6667 115.3333 269.2500 23.5000
80.7500 5.0000 -72.2500 224.2500 -55.0000 142.0000 -36.2500 181.5000
85.6667 242.0000 227.6667 -55.0000 390.6667 271.3333 469.0000 142.0000
177.3333 178.6667 115.3333 142.0000 271.3333 356.6667 347.6667 309.0000
109.2500 299.3333 269.2500 -36.2500 469.0000 347.6667 567.5833 191.5000
212.5000 73.0000 23.5000 181.5000 142.0000 309.0000 191.5000 339.0000
>> [V,D]=eig(C)
V =
-0.1342 0.0883 -0.5991 0.3063 0.3280 0.5260 0.3266 0.1749
0.1039 0.1495 -0.5084 0.3515 -0.5041 -0.4653 -0.1630 0.2961
-0.4935 -0.6821 0.1397 0.3642 0.0419 0.0008 -0.2781 0.2447
-0.0500 -0.2763 -0.1759 -0.1961 0.4021 -0.6438 0.5227 0.0484
-0.2808 0.0183 -0.2572 -0.7478 -0.0566 0.1057 -0.2536 0.4657
-0.4398 0.5302 0.4541 0.1721 -0.0235 -0.1031 0.3071 0.4290
0.6017 -0.0007 0.1871 0.1155 0.4457 -0.0139 -0.2497 0.5730
0.3013 -0.3830 0.1576 -0.0969 -0.5220 0.2652 0.5434 0.3005
D =
1.0e+003 *
-0.0000 0 0 0 0 0 0 0
0 -0.0000 0 0 0 0 0 0
0 0 -0.0000 0 0 0 0 0
0 0 0 0.0000 0 0 0 0
0 0 0 0 0.0000 0 0 0
0 0 0 0 0 0.1182 0 0
0 0 0 0 0 0 0.6277 0
0 0 0 0 0 0 0 1.6094
>> Y*V
ans =
0.0000 -0.0000 0.0000 -0.0000 -0.0000 8.2819 30.4765 -17.4956
-0.0000 0.0000 0.0000 -0.0000 -0.0000 -9.2663 8.5765 47.5771
-0.0000 0.0000 -0.0000 0.0000 0.0000 -9.5006 -11.8355 -45.0906
0.0000 -0.0000 -0.0000 -0.0000 0.0000 10.4850 -27.2175 15.0091
这是投影后的结果。
先讲到这里,还有其它的实现方法,待续。。。