資源簡介
現在我們回到LDA的原理上,我們在第一節說講到了LDA希望投影后希望同一種類別數據的投影點盡可能的接近,而不同類別的數據的類別中心之間的距離盡可能的大,但是這只是一個感官的度量。現在我們首先從比較簡單的二類LDA入手,嚴謹的分析LDA的原理。
假設我們的數據集D={(x1,y1),(x2,y2),...,((xm,ym))}D={(x1,y1),(x2,y2),...,((xm,ym))},其中任意樣本xixi為n維向量,yi∈{0,1}yi∈{0,1}。我們定義Nj(j=0,1)Nj(j=0,1)為第j類樣本的個數,Xj(j=0,1)Xj(j=0,1)為第j類樣本的集合,而μj(j=0,1)μj(j=0,1)為第j類樣本的均值向量,定義Σj(j=0,1)Σj(j=0,1)為第j類樣本的協方差矩陣(嚴格說是缺少分母部分的協方差矩陣)。
μjμj的表達式為:
μj=1Nj∑x∈Xjx(j=0,1)
μj=1Nj∑x∈Xjx(j=0,1)
ΣjΣj的表達式為:
Σj=∑x∈Xj(x?μj)(x?μj)T(j=0,1)
Σj=∑x∈Xj(x?μj)(x?μj)T(j=0,1)
由于是兩類數據,因此我們只需要將數據投影到一條直線上即可。假設我們的投影直線是向量ww,則對任意一個樣本本xixi,它在直線ww的投影為wTxiwTxi,對于我們的兩個類別的中心點μ0,μ1μ0,μ1,在在直線ww的投影為wTμ0wTμ0和wTμ1wTμ1。由于LDA需要讓不同類別的數據的類別中心之間的距離盡可能的大,也就是我們要最大化||wTμ0?wTμ1||22||wTμ0?wTμ1||22,同時我們希望同一種類別數據的投影點盡可能的接近,也就是要同類樣本投影點的協方差wTΣ0wwTΣ0w和wTΣ1wwTΣ1w盡可能的小,即最小化wTΣ0w+wTΣ1wwTΣ0w+wTΣ1w。綜上所述,我們的優化目標為:
argmaxwJ(w)=||wTμ0?wTμ1||22wTΣ0w+wTΣ1w=wT(μ0?μ1)(μ0?μ1)TwwT(Σ0+Σ1)w
argmax?wJ(w)=||wTμ0?wTμ1||22wTΣ0w+wTΣ1w=wT(μ0?μ1)(μ0?μ1)TwwT(Σ0+Σ1)w
我們一般定義類內散度矩陣SwSw為:
Sw=Σ0+Σ1=∑x∈X0(x?μ0)(x?μ0)T+∑x∈X1(x?μ1)(x?μ1)T
Sw=Σ0+Σ1=∑x∈X0(x?μ0)(x?μ0)T+∑x∈X1(x?μ1)(x?μ1)T
同時定義類間散度矩陣SbSb為:
Sb=(μ0?μ1)(μ0?μ1)T
Sb=(μ0?μ1)(μ0?μ1)T
這樣我們的優化目標重寫為:
argmaxwJ(w)=wTSbwwTSww
argmax?wJ(w)=wTSbwwTSww
仔細一看上式,這不就是我們的廣義瑞利商嘛!這就簡單了,利用我們第二節講到的廣義瑞利商的性質,我們知道我們的J(w)J(w)最大值為矩陣S?12wSbS?12wSw?12SbSw?12的最大特征值,而對應的ww為S?12wSbS?12wSw?12SbSw?12的最大特征值對應的特征向量! 而S?1wSbSw?1Sb的特征值和S?12wSbS?12wSw?12SbSw?12的特征值相同,S?1wSbSw?1Sb的特征向量w′w′和S?12wSbS?12wSw?12SbSw?12的特征向量ww滿足w′=S?12www′=Sw?12w的關系!
注意到對于二類的時候,SbwSbw的方向恒為μ0?μ1μ0?μ1,不妨令Sbw=λ(μ0?μ1)Sbw=λ(μ0?μ1),將其帶入:(S?1wSb)w=λw(Sw?1Sb)w=λw,可以得到w=S?1w(μ0?μ1)w=Sw?1(μ0?μ1), 也就是說我們只要求出原始二類樣本的均值和方差就可以確定最佳的投影方向ww了。
代碼片段和文件信息
clear;
clc;
pen=40;%總人數:people?number
pin=10;%每人照片數:picture?number
tr=5;%訓練數:train
k=32;%?k?w=46;%照片寬度
h=56;%照片高度
tic;%計時
%訓練人臉
imdata=zeros(w*htr*pen);
for?i=1:pen
????for?j=1:tr
????????addr=strcat(‘D:\ORL56_46\orl‘num2str(i)‘_‘num2str(j)‘.bmp‘);
????????a=imread(addr);
????????a=a(1:w*h);
????????imdata(:(i-1)*tr+j)=a‘;
????end;
end;
clear?i?j?a?adrr?b
N1=tr*ones(1pen);
V1=LDA(imdata‘N1k);
train=imdata‘*V1;
%測試人臉
imdata1=zeros(w*h(pin-tr)*pen);
for?i=1:pen
????for?j=tr+1:pin
????????addr=strcat(‘D:\ORL56_46\orl‘num2str(i)‘_‘num2str(j)‘.bmp‘);
????????a=imread(addr);
????????b=a(1:w*h);
????????imdata1(:(i-1)*(pin-tr)+j-tr)=b‘;
????end;
end;
clear?i?j?a?adrr?b
N2=(pin-tr)*ones(1pen);
test=imdata1‘*V1;
%顯示特征人臉
figure;
for?i=1:10
????
subplot(45i);
imshow(train((i-1)*5+1:(i-1)*5+5:)[]);
title(strcat(‘train‘num2str(i)));
end;
for?i=1:10
subplot(4510+i);
imshow(test((i-1)*5+1:(i-1)*5+5:)[]);
title(strcat(‘test‘num2str(i)));
end;
%計算test與train編號是否吻合
count=0;
for?i=1:pen*(pin-tr)
????point=calculate(test‘train‘ipen*tr);
????if(round(i/(pin-tr)+0.4)==round(point/tr+0.4))
????????count=count+1;
????end;
end;
clear?i?point
%匹配率
ratio=100*count/(pen*(pin-tr));
clear?count
display(strcat(‘匹配率:‘num2str(ratio)‘%‘));
clear?tr?ra
評論
共有 條評論