1. 程式人生 > >LDA和樸素貝葉斯相結合---影象分類

LDA和樸素貝葉斯相結合---影象分類

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