近期学习任务:
- 完成模式识别大作业
- 准备报告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); % 计算正确率