主成分分析經常被用做模型分類時特征的降維,本篇首先介紹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
幫助中心中有豐富的例子可以幫助理解。