PCA相信大家都很熟悉,但是苦於網上的代碼資料良莠不齊。我在自己寫了,並且驗證過代碼的可行性之後,貼出來給大家分享。有什麼問題可以大家交流一下。由於初次使用csdn,公式原理太複雜我就不打了(懶),大家可以自己看資料。實際上看了我的可視化之後,大家也能直觀地瞭解PCA的思想了,直接上代碼。
代碼如下:
爲防止亂碼,下面貼入無註釋版
PCA_test.m X_origin=randn(2000,2); figure(1); scatter(X_origin(:,1),X_origin(:,2),3); X=(X_origin+100*ones(2000,2))*[2 1;1 2]; figure(2); scatter(X(:,1),X(:,2),3); [X_PCA]=PCA_mainfunction(X,1); figure(3); scatter(X_PCA(:,1),X_PCA(:,2),3); |
function[X_PCA]=PCA_mainfunction(X,T) n=size(X,1); X_mean=1/n.*(X'*ones(n,1)); H=(eye(n)-(ones(n,n))); S=1/n.*X'*H*X; [V,D]=eig(S); for i=1:size(X,2) V(i)=V(i)/norm(V(i)); end X_PCA=(X-ones(n,1)*X_mean')*V(:,1:T)*V(:,1:T)'; end |
在用於實際任務時,X可直接用實際數據。這裏用隨機數據只爲展示需要。另外,紅色部分的*V(:,1:T)'也需要去掉。這個也是爲了直觀展示而進行的座標轉換,實際工程中不需要。
效果:
(1)原始隨機數據(X_origin=randn(2000,2))
經過偏移以及轉置後的數據(X=(X_origin+100*ones(2000,2))*[2 1;1 2];)
(2)經過降維後的數據,爲直觀展現效果用二維圖像來表示
(3)如果保留所有的兩個維度的話
直觀來看,就是投影到了如圖所示的兩個方向
如果去掉上一幅圖的座標的投影,我們就可以得到這樣一幅座標變換後的散點圖。實際上PCA的含義就是特徵空間的重構,而這個重構的標準是使得重構後的樣本具有最大的方差,直觀來說,就是數據要儘量“散”地分佈在特徵空間裏。可以看到,這一幅圖是與最原始的隨機數據樣本是很相像的。當方差大了,樣本點在特徵空間裏的距離也就越大,這很有利於我們對樣本進行分類,這也是PCA的另外一個意義。