模式識別作業6實驗報告


近期學習任務:

  • 完成模式識別大作業
  • 準備報告SDeCNN論文並實現
  • 隨機分析課後習題
  • 壓縮感知論文公式改錯
  • IEEE模式識別論文翻譯與報告

利用貝葉斯分類器實現手寫數字識別

基本原理

  1. 對每個手寫的數字樣品,按bxb(如b=5)方式劃分,共有b2份。
  2. 對每一份內的象素個數進行累加統計,除以每一份內的象素總數,設定閾值T=0.05(可改),若每一份內的象素佔有率大於T則對應的特徵值爲1,否則爲0。
  3. 先計算數字ii的先驗概率P(ωi)=NiNP(\omega_i)=\frac{N_i}{N},其中NiN_i爲數字ii的樣品數,NN爲樣品總數。
  4. 再計算Pj(ωi)=k=0,XωiNixkj+1Ni+2P_j(\omega_i)=\frac{\sum_{k=0,X\in\omega_i}^{N_i}x_{kj}+1}{N_i+2},再計算類條件概率P(Xωi)=j=024P(xj=αXωi)P(X|\omega_i)=\prod_{j=0}^{24}P(x_j=\alpha|X\in\omega_i),其中Pj(ωi)P_j(\omega_i)表示樣品XX屬於ωi\omega_i類條件下,XX的第jj個分量爲1的概率估計值,α=0or1\alpha=0\,or\,1.
  5. 利用貝葉斯公式求後驗概率P(ωiX)=P(ωi)P(Xωi)k=09P(ωk)P(Xωk)i=0,1,,9.P(\omega_i|X)=\frac{P(\omega_i)P(X|\omega_i)}{\sum_{k=0}^9P(\omega_k)P(X|\omega_k)},i=0,1,\cdots,9.
  6. 後驗概率的最大值的類別0-9就是手寫數字的所屬類別。

實驗數據採集

從網上下載,來源:https://blog.csdn.net/qq_25005311/article/details/97910815
有4000張手寫數字圖片,大小爲28×28,數字0-9分別有400張。部分圖片如下:
在這裏插入圖片描述

算法流程

算法的思維導圖爲:

實驗結果分析(key)

取不同的樣本個數,設定不同的劃分數b和閾值T,得到數字識別正確率的百分比如下兩個表格:

表格1

樣本總數\參數 b=7,T=0.06 b=7,T=1/16 b=7,T=2/16 b=7,T=3/16 b=7,T=4/16 b=7,T=5/16
100 86% 87% 86% 82% 85% 83%
500 72.4% 73.4% 77.6% 76.4% 74.8% 73.8%
1000 70% 71.7% 74% 75.1% 74.2 75.2%
2000 69.1% 71.65% 73.25% 74.1% 72.25% 72.6%
3000 69.53% 71.37% 73.33% 74.33% 72.97% 73.77%
4000 70.03% 71.92% 73.72% 74.42% 72.72% 73.12%

表格2

樣本總數\參數 b=7,T=6/16 b=7,T=7/16 b=7,T=8/16 b=14,T=1/4 b=14,T=2/4 b=28,T=0
100 85% 84% 81% 95% 92% 97%
500 76.6% 77% 70% 85.2% 83.6% 85.6%
1000 76.4 75.8% 72.5% 83.8% 83.1% 84.7%
2000 73.75% 73.6% 69.95% 81.35% 80.65% 82.45%
3000 74.33% 73.7% 69.83% 81.97% 81.03% 82.73%
4000 73.52% 72.9% 69.67% 81.7% 80.65% 82.27%

上表可以看到,當b=28,T=0,即對圖片不做分塊處理,閾值爲0時識別率最高,基本在80%以上。下圖爲樣本總數等於100時的數字識別矩陣,可以看到,錯誤識別三個數字
在這裏插入圖片描述
識別錯誤的圖片爲:

下圖爲樣本總數等於100時的數字識別矩陣:
在這裏插入圖片描述
在這裏插入圖片描述
Bayes分類器的優點和缺點爲:

  • 優點:貝葉斯算法高效,易於實現。
  • 缺點:分類性能不一定很高。

程序代碼

clear;clc;
tune_b = 28; % 需要調的參數1
tune_T = 0;  % 需要調的參數2
A = [];N1=9; % 每個數字樣本個數爲N1+1,需要調的參數3
N = 10*(N1+1); % 樣本總數爲N
for i=0:9
    B = [];
    for j=0:N1
        x = im2double(imread(strcat('D:\kp_matlab\hw6-number_recog\01\images4000\',...
            num2str(i),'_', num2str(j),'.bmp')));
        b = tune_b; % b*b方式劃分,影響正確率
        a = size(x,1)/b; % 每份的行數
        a1 = a*ones(1,b);
        x = mat2cell(x,a1,a1); %28*28的數值矩陣分塊,分成b*b
        x = reshape(x,b^2,1); % 將矩陣轉化爲列向量
        C = [];
        for k = 1:b^2
            c = (cell2mat(x(k))~=0);
            count = sum(c(:));
            t = count/a^2;
            T = tune_T; % 修改閾值提高正確率
            if t>T
                t=1;
            else t=0;
            end
            C = [C;t]; % 構造特徵指標列向量
        end
        B = [B,C]; % 拼接每個樣本的指標列向量
    end
    A = cat(3,A,B); % 每個數字樣本個數都相同,構造數字0-9的三維特徵矩陣
end

P1 = (N1+1)/N; % 先驗概率
for i = 1:10
    for j=1:b^2
        s = sum(A(j,:,i))+1;
        P(i,j) = s/((N1+1)+2); % 計算樣品X屬於wi類條件下,X的第j個分量爲1的概率估計值
    end
end

p = ones(10,1);
for h=1:10
    for k=1:(N1+1)
        for i=1:10
            for j=1:b^2
                if A(j,k,h)==1
                    p(i)=p(i)*P(i,j);
                else p(i)=p(i)*(1-P(i,j));
                end
            end
        end
        p = P1*p; % 利用貝葉斯公式求後驗概率,分母都相同故忽略不計
        [maxval,index] = max(p); % 後驗概率的最大值的類別0-9就是手寫數字的所屬類別
        I(h,k) = index; % 行h表示數字0-9,列k表示樣本
        p = ones(10,1);
    end
end

I = I-1;
disp(I); % 顯示數字識別矩陣
for i=1:10
    z(i) = sum((I(i,:)~=i-1));
end
disp(sum(z(:))); % 計算識別錯誤的總個數
disp((N-sum(z(:)))/N); % 計算正確率

利用支持向量機實現手寫數字識別

基本原理

算法流程

實驗結果分析

程序代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章