pca人脸特征降维的过程理解及matlab编程实现
生活随笔
收集整理的這篇文章主要介紹了
pca人脸特征降维的过程理解及matlab编程实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?只提取了最基礎簡潔的pca實現過程,其中的具體原理和過程可以參考如下博客:完整程序代碼
https://blog.csdn.net/guyuealian/article/details/68487833
https://www.cnblogs.com/hxjbc/p/6197986.html
PCA進行特征降維的步驟:
-
設有m條n維數據。
-
1)將原始數據按列組成n行m列矩陣X
-
2)將X的每一行(代表一個屬性字段)進行零均值化,即減去這一行的均值
-
3)求出協方差矩陣
-
4)求出協方差矩陣的特征值及對應的特征向量r
-
5)將特征向量按對應特征值大小從上到下按行排列成矩陣,取前k行組成矩陣P
-
6)即為降維到k維后的數據
?Matlab實現pca特征降維時涉及的主要函數功能:
-
scatter: scatter(x,y)在向量?x?和?y?指定的位置創建一個包含圓形的散點圖
-
randn:randn(n)返回一個n*n的隨機項的矩陣
-
mean: 求數組的平均數或者均值
-
eigs:eigs(A):求度矩陣A的全部特征值,構成向量(有別eig,返回的結果不同,處理過程也有區別)
-
cov:cov(x)?求向量x的方差
-
repmat:用于快速的產生一個大的矩陣
?簡單實例:
使用n=2000; X = randn(n,2)*[0.1? 1; 1 0.7] 生成2000個2維的樣本,使用scatter函數畫出這2000個樣本;用xlim([-5 5]) 設置圖中x坐標軸的范圍為[-5,5],用ylim([-5 5])設置y坐標軸的范圍也為[-5,5]。
n=2000; X=randn(n,2)*[0.1 1;1 0.7]; scatter(X(:,1),X(:,2)); xlim([-5,5]); ylim([-5,5]);?得到如下效果:
?
編程實現對X中樣本進行PCA變換,保留所有的2個維度,注意此處沒有使用matlab自帶的pca函數直接得到結果,使用eigs函數代替pca函數的實現過程。將對X進行PCA變換后的樣本用scatter函數畫出;同樣設置x和y軸的顯示范圍為[-5,5]。
n=2000; [row,col]=size(X); X=randn(n,2)*[0.1 1;1 0.7]; c=cov(X); [F,V]=eigs(c); meanx=mean(X); tempx=repmat(meanx,row,1); score=(X-tempx)*F; pca=score(:,1:2); scatter(pca(:,1),pca(:,2)); xlim([-5,5]); ylim([-5,5]);?進行pca變換后,給樣本重新找到更能描述這組數據的正交的坐標軸
?使用PCA進行人臉的特征降維和特征臉的輸出。
數據集:人臉數據集_免費
主要步驟:
(a) 對28張人臉圖片依次進行如下處理:讀取每一張圖片,將圖片的像素矩陣轉換為一個特征向量,存儲到數據data的一行,從而得到28*10304的矩陣,矩陣每一行表示一個樣本。在讀取過程,使用subplot函數和imshow函數將28張原始的人臉圖片顯示在一張圖中。
(b) 計算這28個樣本的均值向量,使用reshape函數將該均值向量重新調整為112*92的矩陣,使用imshow函數顯示該矩陣。在人臉識別中,均值向量稱為平均臉,它描述了數據集中所有人臉平均長成什么樣。
(c) 對data進行PCA變換(直接使用pca函數)。在人臉識別中,每個主成分稱為一個特征臉(eigenface)或主成分臉。使用subplot函數和imshow函數將所有的特征臉顯示在一張圖中,注意,仍需要對每個主成分重新調整為112*92的矩陣再顯示。觀察特征臉和原始的人臉圖像的區別。
imgstr=dir(strcat('.\faces_for_pca\','*.pgm')); data=[]; for i=1:28img=im2double(imread(imgstr(i).name));subplot(5,6,i);imshow(img);data=[data;reshape(img,1,10304)]; end meanData=mean(data); figure; imshow(reshape(meanData,112,92));[COEFF,SCORE,latent,tsquare] = pca(data); % 1)COEFF 是主成分分量,即樣本協方差矩陣的特征向量; % 2)SCORE主成分,是樣本X在低維空間的表示形式,即樣本X在主成份分量COEFF上的投影 ,若需要降k維,則只需要取前k列主成分分量即可 % 3)latent:一個包含樣本協方差矩陣特征值的向量; %cumsum(latent)./sum(latent) %計算特征值的累計貢獻率,算出降維后的空間所能表示原空間的程度 %train=SCORE(:,1:17); %17維%90 figure; for i=1:27 %降至27維zimg=COEFF(:,i);zimg=reshape(zimg,112,92);subplot(5,6,i);imshow(mat2gray(zimg)); end?數據集中的所有臉
?平均臉
?降維后的特征臉
?
總結
以上是生活随笔為你收集整理的pca人脸特征降维的过程理解及matlab编程实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个机器人教小八_重生学霸天后第25章
- 下一篇: python爬虫之一:爬取网页小说(魂破