近期學習任務:
- 完成模式識別大作業
- 準備報告SDeCNN論文並實現
- 隨機分析課後習題
- 壓縮感知論文公式改錯
- IEEE模式識別論文翻譯與報告
利用貝葉斯分類器實現手寫數字識別
基本原理
- 對每個手寫的數字樣品,按bxb(如b=5)方式劃分,共有b2份。
- 對每一份內的象素個數進行累加統計,除以每一份內的象素總數,設定閾值T=0.05(可改),若每一份內的象素佔有率大於T則對應的特徵值爲1,否則爲0。
- 先計算數字的先驗概率,其中爲數字的樣品數,爲樣品總數。
- 再計算,再計算類條件概率,其中表示樣品屬於類條件下,的第個分量爲1的概率估計值,.
- 利用貝葉斯公式求後驗概率
- 後驗概率的最大值的類別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); % 計算正確率