目前,pca算法已經(jīng)廣泛應(yīng)用于各方面,就拿圖像處理,經(jīng)常做的一件事就是當(dāng)提取的圖像特征維度比較高時,為了簡化計算量以及儲存空間,需要對這些高維數(shù)據(jù)進行一定程度上的降維,并盡量保證數(shù)據(jù)的不失真。
先舉個例子,方便理解:
1)對于一個訓(xùn)練集,20個sample(i=1,2,3,...,20),特征Xi是100維[Xi1,Xi2,Xi3,...Xij,...,Xi100](j=1,2,..,100),那么它可以建立一個20*100的樣本矩陣M。
2)緊接著我們開始求這個樣本的協(xié)方差矩陣,得到一個20*20的協(xié)方差矩陣,計算過程如下:
先求解出Xi的平均Xav=(∑xi)/20;
對每一個Xi,計算Xi-Xav,即Mi(第 i 行)變?yōu)?
Mi-Xav,記為Mn;
則容易得到協(xié)方差矩陣Z為Mn*Mn'( ' 表示轉(zhuǎn)置 ) 。
3)然后求出這個協(xié)方差矩陣Z20x20的特征值和特征向量,一般情況下應(yīng)該有20個特征值和特征向量,現(xiàn)在根據(jù)特征值的大小,取出較大的特征值以及其所對應(yīng)的特征向量,(假設(shè)提取的特征值為較大的5個特征值),那么這5個特征向量就會構(gòu)成一個20*5的矩陣V,這個矩陣就是我們要求的特征矩陣。
4)用Mn'去乘以V,得到一個base矩陣(*),大小為100x5。
5)任取一個樣本1x100,乘上這個100*5的特征矩陣,就得到了一個1*5的新的樣本,顯然每個sample的維數(shù)下降了,然后再用這個1x5向量去比較相似性。
注:
上述3)過程中特征值的選取在不確定具體要降到多少維的情況下,一般還可以根據(jù)n個特征值之和大于總和的90%進行選取。
上面的(*)處base矩陣的求解不唯一,也可以自行修正。
大致說完了PCA降維的過程,現(xiàn)在會有人要問為什么只提取特征值較大的幾個特征值就可以近似代替原樣本矩陣呢。
好了,話不多說。下面就講講矩陣的特征值和特征向量的數(shù)學(xué)意義:
為簡單起見,以二維矩陣A=[1 0;0
-1](矩陣的秩為2)為例,以平面上一點(x,y)經(jīng)過A變換后變?yōu)椋▁',y')若這兩點在一條直線在,那么可以理解為矩陣A的作用恰好使得向量[x y]'
只是在原有方向上變換了長度而已,即Ax=λx (x為一列向量).對于A矩陣,容易得到A的兩個特征值及相應(yīng)的特征向量 λ1=1 ,e1=[1 0]'
, λ2=-1 ,e2=[0 -1]' ,二維平面上任意一點(x,y)=b1*(1,0)+b2*(0,-1)(b1,b2均為實常數(shù)); 那么A[x
y]'=A*(b1*e1+b2*e2)=b1*λ1+b2*λ2 =∑biλi ;
把這個公式推廣到高維空間,在計算(x',y')對于λ值比較小的特征維可以忽略.
B=[1 0;0 0.01] ,其中B的兩個特征值及相應(yīng)的特征向量 λ1=1 ,e1=[1 0]' , λ2=0.01 ,e2=[0 1]'
那么x=[2 3]' 經(jīng)過B變換為 Bx=[2 0.03]';
如果我們認(rèn)為λ2遠小于λ1,忽略掉λ2時,Bn=[1 0;0 0],Bnx=[2 0]'≈[2
0.03].
通俗點講,pca算法就是去尋找那些在該維度上方差比較大的維,同時忽略比較平均的維度。假如上面所說的X特征向量的第一個元素都為1,那么這一列數(shù)據(jù)是可以忽略的,因為他并不能起到區(qū)分的作用,相反我們是要尋找那些在某一維度分布比較廣的維,并提取出來。
打個比方,平面區(qū)域一個斜75度的橢圓,且長軸遠大于短軸,那么橢圓上的點在短軸上的分布明顯弱于長軸,當(dāng)短軸遠小于長軸時,近似為一條直線,便失去了短軸這個維度。

下面貼上一個matlab版的pca算法代碼:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 |
%一個修改后的PCA進行人臉識別的Matlab代碼
clear;
% calc
xmean,sigma and its eigen decomposition
allsamples=[];%所有訓(xùn)練圖像
for
i=1:40
for j=1:5
a=imread(strcat('C:\Documents and
Settings\Foreigners\桌面\ORL\s',num2str(i),'\',num2str(j),'.bmp'));
% imshow(a);
b=a(1:112*92); %
b是行矢量 1×N,其中N=10304,提取順序是先列后行,即從上到下,從左到右
b=double(b);
allsamples=[allsamples; b]; % allsamples 是一個M * N
矩陣,allsamples 中每一行數(shù)據(jù)代表一張圖片,其中M=200
end
end
samplemean=mean(allsamples); % 平均圖片,1 × N
for
i=1:200 xmean(i,:)=allsamples(i,:)-samplemean; %
xmean是一個M × N矩陣,xmean每一行保存的數(shù)據(jù)是“每個圖片數(shù)據(jù)-平均圖片”
end;
sigma=xmean*xmean'; % M * M 階矩陣
[v
d]=eig(sigma);
d1=diag(d);
[d2
index]=sort(d1); %以升序排序
cols=size(v,2);% 特征向量矩陣的列數(shù)
for
i=1:cols
vsort(:,i) = v(:,
index(cols-i+1) ); % vsort 是一個M*col(注:col一般等于M)階矩陣,保存的是按降序排列的特征向量,每一列構(gòu)成一個特征向量
dsort(i) = d1(
index(cols-i+1) ); % dsort 保存的是按降序排列的特征值,是一維行向量
end %完成降序排列
%以下選擇90%的能量
dsum =
sum(dsort);
dsum_extract = 0;
p = 0;
while( dsum_extract/dsum < 0.90)
p = p + 1;
dsum_extract =
sum(dsort(1:p));
end
i=1;
%
(訓(xùn)練階段)計算特征臉形成的坐標(biāo)系
while (i<=p
&& dsort(i)>0)
base(:,i) = dsort(i)^(-1/2) * xmean' * vsort(:,i); %
base是N×p階矩陣,除以dsort(i)^(1/2)是對人臉圖像的標(biāo)準(zhǔn)化,詳見《基于PCA的人臉識別算法研究》p31
i = i + 1;
end
% add by
wolfsky 就是下面兩行代碼,將訓(xùn)練樣本對坐標(biāo)系上進行投影,得到一個 M*p 階矩陣allcoor
allcoor =
allsamples * base;
accu = 0;
% 測試過程
for
i=1:40
for j=6:10 %讀入40 x 5 副測試圖像
a=imread(strcat('C:\Documents and
Settings\Foreigners\桌面\ORL\s',num2str(i),'\',num2str(j),'.bmp'));
b=a(1:10304);
b=double(b);
tcoor= b *
base;
%計算坐標(biāo),是1×p階矩陣
for
k=1:200
mdist(k)=norm(tcoor-allcoor(k,:));
end;
%三階近鄰
[dist,index2]=sort(mdist);
class1=floor(
index2(1)/5 )+1;
class2=floor(index2(2)/5)+1;
class3=floor(index2(3)/5)+1;
%class=class1;%%blue_lg
if
class1~=class2 && class2~=class3
class="class1";
elseif
class1==class2
class="class1";
%elseif
class2==class3
%
class="class2";
end;
if
class==i
accu=accu+1;
end;
end;
end;
accuracy=accu/200 %輸出識別率
%zuobiao=[1:100];
%plot(zuobiao,accuracy);
|
轉(zhuǎn)載請注明: http://www.cnblogs.com/blue-lg/archive/2012/05/14/2499581.html