主成分分析(PCA)算法介紹及matlab實現案例


主成分分析經常被用做模型分類時特征的降維,本篇首先介紹PCA的步驟,並根據步驟撰寫對應的MATLAB代碼,最后指明使用PCA的步驟。

我們在做分類時,希望提取的特征能夠最大化將數據分開,如果數據很緊密,模型就比較難將其分開,如果數據比較離散,那么就比較容易分開,換句話說,數據越離散,越容易分開。

那怎么讓數據離散呢?離散又用什么指標衡量呢?

統計學的知識告訴我們,數據越離散,方差越大。

因此,PCA的問題就變為:尋找一個坐標軸,使得數據在該坐標軸上面離散度最高。也就是尋找一個基使得所有數據在這個基上面的投影值的方差最大。

那具體怎么做呢?科學家們已經幫我們做好了,如下步驟:

設有m個樣本,每個樣本有n個特征,組成m行n列的矩陣

1)將每一列特征進行均值化處理,特征歸一化,也稱為數據中心平移到坐標原點

 2)求取協方差矩陣

3)求取協方差矩陣的特征值和特征向量

4)將特征向量按對應特征值大小從上到下按行排列成矩陣,取前K列組成系數矩陣

matlab代碼

function [coffMatrix,lowData,eigValSort,explained,meanValue] = myPCA(data)
%data為row行col列矩陣,row為樣本數量,col為特征列,每一列代表一個特征
[row , col] = size(data);
% 求出每一列的均值
meanValue = mean(data);
% 將每一列進行均值化處理,特征歸一化,數據中心平移到坐標原點
normData = data - repmat(meanValue,[row,1]);
%求取協方差矩陣
covMat = cov(normData);
%求取特征值和特征向量
[eigVect,eigVal] = eig(covMat);
% 將特征向量按對應特征值大小從上到下按行排列成矩陣
[sortMat, sortIX] = sort(eigVal,'descend');
[B,IX] = sort(sortMat(1,:),'descend');
coffMatrix = eigVect(:,IX);
% 排序后的特征向量就是新的坐標系
lowData = normData * coffMatrix;
% 分量得分
explained = 100*B/sum(B);
%特征值
eigValSort = B;
%%
% [U,S,V] = svd(data);
end

  

我們在實際應用PCA的時候需要注意保留以下幾個值。

1、每個特征的均值meanValue,用於驗證集和測試集的歸一化

2、系數矩陣coffMatrix,用於求取轉換后的訓練數據,和轉換后的驗證數據,測試數據

3、各分量的得分scores,用以確定最終的所需要的維度。

下面借鑒matlab幫助中心的例子實現撰寫以下代碼:

clc
clear
creditrating = readtable('CreditRating_Historical.dat');
creditrating(1:5,:);
X = table2array(creditrating(:,2:7));
Y = creditrating.Rating;
XTest = X(1:100,:);
XTrain = X(101:end,:);
YTest = Y(1:100);
YTrain = Y(101:end);

[coeffMatrix,scoreTrain,eigval,score,meanValue] = myPCA(XTrain);

sum_score = 0;
idx = 0;
while sum_score < 95
    idx = idx + 1;
    sum_score = sum_score + score(idx);
end
idx
scoreTrain95 = scoreTrain(:,1:idx);
mdl = fitctree(scoreTrain95,YTrain);
%關鍵步驟:1、測試集減去均值,均值是訓練集各個特征值的均值
for i=1:size(XTest,1)
    XTest(i,:) = XTest(i,:)-meanValue;
end
%關鍵步驟:2、均值化之后的值乘以訓練集的系數矩陣(新基),轉化為該基下來對應的值
scoreTest95 = XTest*coeffMatrix(:,1:idx);
% 新基下面的值作為預測數據
YTest_predicted = predict(mdl,scoreTest95);

matlab中也有自帶的pca函數

[coeff, score, latent, tsquared, explained, mu] = pca(x,varargin);

詳細的參數說明可以通過在命令行輸入 doc pca查看

也可以通過matlab的幫助中心查看:https://ww2.mathworks.cn/help/stats/pca.html?requestedDomain=cn

幫助中心中有豐富的例子可以幫助理解。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM