這是一個快速的演練.首先我們創建一個隱藏變量的矩陣.它有100個觀察,有兩個特點.
>> Y = randn(100,2);
現在創建一個加載矩陣.這將把隱藏的變量映射到觀察到的變量上.說你觀察到的變量有四個特征.那么你的加載矩陣需要是2×4
>> W = [1 1; 1 -1; 2 1; 2 -1]';
這告訴你,觀察的第一部分是兩個因素的總和,第二個是兩個因素的差異,第三個和第四個是各種其他組合.
現在創建你的觀察:
>> X = Y * W + 0.1 * randn(100,4);
我添加了少量隨機噪聲來模擬實驗誤差.現在我們使用stats工具箱中的princomp函數執行PCA:
>> [w pc ev] = princomp(X);
你應該如何解釋這些?那么,pc是主要組件的矩陣.它應該拉出與原始Y變量非常接近的因子.你可以查看這個:
>> corr(pc(:,1),Y(:,1)); % returns -0.9981
>> corr(pc(:,2),Y(:,2)); % returns 0.9830
組合pc * w’將重新創建您的原始數據,減去其平均值.在執行PCA之前總是減去平均值.所以要獲取我們做的原始數據
>> mu = mean(X);
>> xhat = bsxfun(@minus,X,mu); % subtract the mean
>> norm(pc * w' - xhat);
ans =
2.3385e-014
因為w是正交的,所以你也有Xhat * w = pc或者示意性地(即這個代碼不會執行)
(X - mu) * w = pc <=> X = mu + pc * w'
要獲得原始數據的近似值,您可以從計算的主要組件開始刪除列.要了解哪些列要放棄,我們檢查ev變量
>> ev
ev =
11.1323
3.0812
0.0116
0.0068
我們可以清楚地看到,前兩個因素比第二個因素更重要.所以我們來試試看
>> Xapprox = pc(:,1:2) * w(:,1:2)';
>> Xapprox = bsxfun(@plus,mu,Xapprox); % add the mean back in
我們現在可以嘗試繪圖:
>> plot(Xapprox(:,1),X(:,1),'.'); hold on; plot([-4 4],[-4 4])
>> xlabel('Approximation'); ylabel('Actual value'); grid on;
它看起來像一個非常合理的近似值.它高估了一點,但我們不能都是完美的.
如果我們想要一個更粗略的近似,我們可以使用第一個主成分:
>> Xapprox = pc(:,1) * w(:,1)';
>> Xapprox = bsxfun(@plus,mu,Xapprox);
>> plot(Xapprox(:,1),X(:,1),'.'); hold on; plot([-4 4],[-4 4])
>> xlabel('Approximation'); ylabel('Actual value'); grid on;
這次重建不是很好.那是因為我們故意構造我們的數據有兩個因素,我們只是從其中一個重建它們.
最后,您可能希望看到每個因素解釋了多少差異.您可以使用ev變量來執行此操作:
>> 100*ev/sum(ev)
ans =
78.2204
21.6499
0.0818
0.0479
因此,第一個組件解釋了78%的方差,下一個組件解釋了大約22%,最后兩個組件解釋了其余部分.