您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Matlab中PCA算法有什么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
PCA算法主要用于降維,就是將樣本數據從高維空間投影到低維空間中,并盡可能的在低維空間中表示原始數據。PCA的幾何意義可簡單解釋為:
0維-PCA:將所有樣本信息都投影到一個點,因此無法反應樣本之間的差異;要想用一個點來盡可能的表示所有樣本數據,則這個點必定是樣本的均值。 1維-PCA:相當于將所有樣本信息向樣本均值的直線投影; 2維-PCA:將樣本的平面分布看作橢圓形分布,求出橢圓形的長短軸方向,然后將樣本信息投影到這兩條長短軸方向上,就是二維PCA。(投影方向就是平面上橢圓的長短軸方向); 3維-PCA:樣本的平面分布看作橢圓形分布,投影方法分別是橢圓球的赤道半徑a和b,以及是極半徑c(沿著z軸);
PCA簡而言之就是根據輸入數據的分布給輸入數據重新找到更能描述這組數據的正交的坐標軸,比如下面一幅圖,對于那個橢圓狀的分布,最方便表示這個分布的坐標軸肯定是橢圓的長軸短軸而不是原來的x ,y軸。
那么如何求出這個長軸和短軸呢?于是線性代數就來了:我們需要先求出這堆樣本數據的協方差矩陣,然后再求出這個協方差矩陣的特征值和特征向量,對應最大特征值的那個特征向量的方向就是長軸(也就是主元)的方向,次大特征值的就是第二主元的方向,以此類推。
實現PCA的方法, 可【1】直接調用Matlab工具箱princomp( )函數實現,也可【2】 自己實現PCA的過程,當然也可以【3】使用快速PCA算法的方法。
(1)方法一:[COEFF SCORE latent]=princomp(X) 參數說明: 1)COEFF 是主成分分量,即樣本協方差矩陣的特征向量; 2)SCORE主成分,是樣本X在低維空間的表示形式,即樣本X在主成份分量COEFF上的投影 ,若需要降k維,則只需要取前k列主成分分量即可 3)latent:一個包含樣本協方差矩陣特征值的向量;
實例:假設有8個樣本,每個樣本有4個特征(屬性),使用PCA方法實現降維(k維,k小于特征個數4),并提取前2個主成份的特征,即將原始數據從4維空間降維到2維空間。
%% 樣本矩陣X,有8個樣本,每個樣本有4個特征,使用PCA降維提取k個主要特征(k<4) k=2; %將樣本降到k維參數設置 X=[1 2 1 1; %樣本矩陣 3 3 1 2; 3 5 4 3; 5 4 5 4; 5 6 1 5; 6 5 2 6; 8 7 1 2; 9 8 3 7] %% 使用Matlab工具箱princomp函數實現PCA [COEFF SCORE latent]=princomp(X) pcaData1=SCORE(:,1:k) %取前k個主成分
運行結果:
X = 1 2 1 1 3 3 1 2 3 5 4 3 5 4 5 4 5 6 1 5 6 5 2 6 8 7 1 2 9 8 3 7 COEFF = 0.7084 -0.2826 -0.2766 -0.5846 0.5157 -0.2114 -0.1776 0.8111 0.0894 0.7882 -0.6086 0.0153 0.4735 0.5041 0.7222 -0.0116 SCORE = -5.7947 -0.6071 0.4140 -0.0823 -3.3886 -0.8795 0.4054 -0.4519 -1.6155 1.5665 -1.0535 1.2047 -0.1513 2.5051 -1.3157 -0.7718 0.9958 -0.5665 1.4859 0.7775 1.7515 0.6546 1.5004 -0.6144 2.2162 -3.1381 -1.6879 -0.1305 5.9867 0.4650 0.2514 0.0689 latent = 13.2151 2.9550 1.5069 0.4660 pcaData1 = -5.7947 -0.6071 -3.3886 -0.8795 -1.6155 1.5665 -0.1513 2.5051 0.9958 -0.5665 1.7515 0.6546 2.2162 -3.1381 5.9867 0.4650
(2)方法二:自己編程實現 PCA的算法過程,用一句話來說,就是“將所有樣本X減去樣本均值m,再乘以樣本的協方差矩陣C的特征向量V,即為PCA主成分分析”,其計算過程如下: [1].將原始數據按行組成m行n列樣本矩陣X(每行一個樣本,每列為一維特征) [2].求出樣本X的協方差矩陣C和樣本均值m;(Matlab可使用cov()函數求樣本的協方差矩陣C,均值用mean函數) [3].求出協方差矩陣的特征值D及對應的特征向量V;(Matlab可使用eigs()函數求矩陣的特征值D和特征向量V) [4].將特征向量按對應特征值大小從上到下按行排列成矩陣,取前k行組成矩陣P;(eigs()返回特征值構成的向量本身就是從大到小排序的) [5].Y=(X-m)×P即為降維到k維后的數據;
PS:關于協方差矩陣,很多人有點郁悶,有些教程用協方差矩陣,而有些資料是用散步矩陣計算,其實協方差矩陣和散步矩陣就是一個倍數關系:協方差矩陣C×(n-1)=散步矩陣S。我們可以使用Matlab工具箱的cov函數求協方差矩陣C。
%% 自己實現PCA的方法 [Row Col]=size(X); covX=cov(X); %求樣本的協方差矩陣(散步矩陣除以(n-1)即為協方差矩陣) [V D]=eigs(covX); %求協方差矩陣的特征值D和特征向量V meanX=mean(X); %樣本均值m %所有樣本X減去樣本均值m,再乘以協方差矩陣(散步矩陣)的特征向量V,即為樣本的主成份SCORE tempX= repmat(meanX,Row,1); SCORE2=(X-tempX)*V %主成份:SCORE pcaData2=SCORE2(:,1:k)
運行結果:
SCORE2 = -5.7947 0.6071 -0.4140 0.0823 -3.3886 0.8795 -0.4054 0.4519 -1.6155 -1.5665 1.0535 -1.2047 -0.1513 -2.5051 1.3157 0.7718 0.9958 0.5665 -1.4859 -0.7775 1.7515 -0.6546 -1.5004 0.6144 2.2162 3.1381 1.6879 0.1305 5.9867 -0.4650 -0.2514 -0.0689 pcaData2 = -5.7947 0.6071 -3.3886 0.8795 -1.6155 -1.5665 -0.1513 -2.5051 0.9958 0.5665 1.7515 -0.6546 2.2162 3.1381 5.9867 -0.4650
對比方法一和方法可知,主成份分量SCORE和SCORE2的絕對值是一樣的(符號只是相反方向投影而已,不影響分析結果),其中pcaData是從SCORE提取前2列的數據,這pcaData就是PCA從4維降到2維空間的數據表示形式,pcaData可以理解為:通過PCA降維,每個樣本可以用2個特征來表示原來4個特征了。
(3)方法三:使用快速PCA方法
PCA的計算中最主要的工作量是計算樣本協方差矩陣的本征值和本征向量。假設樣本矩陣X的大小為n ×d (n個d 維樣本特征向量),則樣本散布矩陣(協方差矩陣) S 將是一個d×d的方陣,故當維數d較大時計算復雜度會非常高。例如當維數*d=*10000,S是一個10 000 ×10 000的矩陣,此時如果采用上面的princomp函數計算主成份,Matlab通常會出現內存耗盡的問題(out of memory), 即使有足夠多的內存,要得到S的全部本征值可能也要花費數小時的時間。
快速PCA的方法相關理論,可以參考張錚的《精通Matlab數字圖像處理與識別》第12章(P307),PDF可在附件下載:http://download.csdn.net/detail/guyuealian/9799160
fastPCA函數用來對樣本矩陣A進行快速主成分分析和降維(降至k維),其輸出pcaA為維后的k維樣本特征向量組成的矩陣,每行一個樣本,列數k為降維后的樣本特征維數,相當于princomp函數中的輸出SCORE, 而輸出V為主成分分量,相當于princomp函數中的輸出COEFF。
%% 使用快速PCA算法實現的方法 [pcaData3 COEFF3] = fastPCA(X, k )
其中fastPCA函數的代碼實現如下:
function [pcaA V] = fastPCA( A, k ) % 快速PCA % 輸入:A --- 樣本矩陣,每行為一個樣本 % k --- 降維至 k 維 % 輸出:pcaA --- 降維后的 k 維樣本特征向量組成的矩陣,每行一個樣本,列數 k 為降維后的樣本特征維數 % V --- 主成分向量 [r c] = size(A); % 樣本均值 meanVec = mean(A); % 計算協方差矩陣的轉置 covMatT Z = (A-repmat(meanVec, r, 1)); covMatT = Z * Z'; % 計算 covMatT 的前 k 個本征值和本征向量 [V D] = eigs(covMatT, k); % 得到協方差矩陣 (covMatT)' 的本征向量 V = Z' * V; % 本征向量歸一化為單位本征向量 for i=1:k V(:,i)=V(:,i)/norm(V(:,i)); end % 線性變換(投影)降維至 k 維 pcaA = Z * V; % 保存變換矩陣 V 和變換原點 meanVec
運行結果為:
pcaData3 = -5.7947 -0.6071 -3.3886 -0.8795 -1.6155 1.5665 -0.1513 2.5051 0.9958 -0.5665 1.7515 0.6546 2.2162 -3.1381 5.9867 0.4650 COEFF3 = 0.7084 -0.2826 0.5157 -0.2114 0.0894 0.7882 0.4735 0.5041
關于“Matlab中PCA算法有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。