這一節不論是思想還是實現都比較容易。
主成分分析(PCA)就是模式識別裏面說的K-L變換,思想是完全相同的。
詳情可見我的博文:特徵選擇(三)-K-L變換
這裏簡單介紹幾個概念。順便貼出代碼和效果圖。
<span style="font-family:Times New Roman;font-size:14px;">xRot = zeros(size(x));
xRot=u'*x;
figure(2);
scatter(xRot(1, :), xRot(2, :));
title('xRot');</span>
得到原始圖和主軸方向,如圖1所示。
圖1
PCA變換
就是要找到數據分佈最大的方向,作爲主軸方向,然後以這些主軸方向爲基,旋轉過去,就完成了數據的去相關性,這是因爲此時數據的協方差矩陣成了對角陣。如圖2所示。
xRot = zeros(size(x));
xRot=u'*x;
figure(2);
scatter(xRot(1, :), xRot(2, :));
title('xRot');
圖2
PCA降維
如果我們只取了特徵根最大的幾個特徵向量作爲旋轉矩陣,那麼這就是PCA降維。如圖3。
<span style="font-family:Times New Roman;font-size:14px;">k = 1;
xHat = zeros(size(x));
xHat=u(:,1:k)*u(:,1:k)'*x;
figure(3);
scatter(xHat(1, :), xHat(2, :));
title('xHat');</span>
圖3
PCA白化
我們不降維,而此基礎上將數據左乘一個,那麼數據就按照各自主軸方向進行壓縮拉伸,成了一個球形,這就是PCA白化。
epsilon = 1e-5;
xPCAWhite = zeros(size(x));
xPCAWhite=diag(1./(diag(s)+epsilon))*u'*x;
figure(4);
scatter(xPCAWhite(1, :), xPCAWhite(2, :));
title('xPCAWhite');
這裏加了一個epsilon是因爲有的特徵根已經很小了,歸一化的時候根號了一下,容易出現數據上溢。同時它還有消除噪聲的作用。如圖4。
圖4
ZCA白化
我們在PCA白化的基礎上,左乘一個特徵向量矩陣,數據的方向就會又轉回去了。這就是ZCA白化,ZCA白化去除了數據的相關性、保留了最大限度原始數據的形式。是數據預處理的好方法。如圖5。
xZCAWhite = zeros(size(x));
xZCAWhite=u*diag(1./(diag(s)+epsilon))*u'*x;
figure(5);
scatter(xZCAWhite(1, :), xZCAWhite(2, :));
title('xZCAWhite');
圖5
歡迎參與討論並關注本博客和微博以及知乎個人主頁後續內容繼續更新哦~
轉載請您尊重作者的勞動,完整保留上述文字以及文章鏈接,謝謝您的支持!