通過LDA方法將原始空間轉換成特徵空間,然後再用樸素貝葉斯方法進行分類;
1)用LDA方法轉換成特徵空間,用
Deng Cai, Xiaofei He, Yuxiao Hu, Jiawei Han, and Thomas Huang,
% "Learning a Spatially Smooth Subspace for Face Recognition", CVPR'2007 文獻中的代碼LDA.m轉化
函數:[eigvector, eigvalue] = LDA(X,gnd,options)
%eigvector表示特徵向量;
%eigvalue表示特徵值;
%X爲N*D的矩陣;N表示樣本數,D表示原始空間維數;對於圖像而言,N表示圖像塊的數目,D表示一個圖像 %塊的像素數
%gnd爲N*1的向量,N表示樣本數,1表示所屬的類
得到特徵空間的矩陣:
Y= X* eigvector; %Y的行數依舊是樣本數,列數由原始空間維數變成特徵空間的維數;
2)用樸素貝葉斯方法分類:
a)對應特徵空間的數據點,構建判別結構體:每一類的協方差矩陣和均值都求出,構造判別函數;
ReducedDim = size(eigvalue,1);%特徵空間維數
%以下求類的判別函數
oneClassSamples = ones(ntrain, ReducedDim); %一類中的訓練圖像Feature
discResult = ones(1, nclass); %預先構造一個判別結果數組
discStruct.funHandle = @sin; %預先構造一個判別函數結構體
discStruct.sigma = []; %最終此判別函數結構體的長度爲nclass
discStruct.mu = [];
for i=1:nclass
for j=1:ntrain
oneClassSamples(j,:) = allcoor((i-1)*ntrain+j,:);
% OneClassSamples 是一個ntrain * ReducedDim 矩陣
end
%求一類樣本的均值以及協方差陣
meanClassSamples = mean(oneClassSamples); %均值行向量,1*ReducedDim
sigma = cov(meanClassSamples);
%構造一個判別函數結構體,用於類判別;
discStruct(i).funHandle = ...
@(x, MU, SIGMA)(-x*(inv(SIGMA))*x'/2 + MU*(inv(SIGMA))'*x' -MU*(inv(SIGMA))*MU'/2 - log(det(SIGMA))/2);
discStruct(i).sigma = sigma;%第i個類的協方差陣
discStruct(i).mu = meanClassSamples;%第i類樣本均值
end
b)用判別結構對測試樣本分類;
%以下用NaiveBayes準則進行分類測試
% 測試過程
testsamples = []; %所有測試樣本M*10304, M= nclass*ntest
for i = 1 : nclass
for j = ntrain+1 : ntrain+ntest % 讀入ntest 即 5 副測試圖像
b = pattern(i).figure.data(j).face(:); % b是列矢量 1×N,其中N=10304,提取順序是先列後行,即從上到下,從左到右
b = im2double(b'); % 轉換爲行向量
testsamples = [testsamples; b];
end
end
testsamples = testsamples - ones(ntest*nclass,1) * mean(testsamples); %數據中心化
tcoor = testsamples * eigvector; %測試樣本進行投影,是M×ReducedDim階矩陣, M= nclass*ntest
% % %用判別結構的判別函數discResult.funHandle()判斷測試樣本屬於哪個類,獲得一個行向量discResult,discResult中最大值所在的列數即所屬的類;
for i = 1 : nclass
for j = 1 : ntest
for k = 1 : nclass
discResult(k) = discStruct(k).funHandle(tcoor((i-1)*ntest+j,:), discStruct(k).mu, discStruct(k).sigma);
end
%利用排序方式得到樣本屬於第幾類
[maxv, indx] = max(discResult);%discResult爲1行40列,值最大的列即判定所屬的類,所以判定屬於indx類;
result = ['第', num2str(i),'類中第', num2str(j), '張識別'];
if indx == i
accu = accu + 1;
result = [result, '正確'];
else
result = [result, '錯誤,被識別爲了第', num2str(indx), '類'];
end
disp(result);
end
end
accuracy = accu / (nclass*ntest); %輸出識別率
disp('>>> ');
disp(strcat('從',num2str(nclass),'類圖像中選擇前',num2str(ntrain),...
'張訓練,後',num2str(ntest),'張測試,'));
disp(strcat('抽取特徵維數',num2str(ReducedDim),',共花費時間',num2str(cputime-tmp_T)));
disp('--- ');
disp(strcat('識別率爲', num2str(accuracy*100), '%'));