LDA和樸素貝葉斯相結合---圖像分類


通過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), '%'));

發佈了26 篇原創文章 · 獲贊 16 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章