基于最小错误率的贝叶斯决策实现手写数字识别
1、实验目的
本次试验的目的是建立一个手写数字识别系统,能够准确 的提取用户在手写板上写出的数字,并且能够正确地识别出来。
2、实验方法及步骤
此次实验选择MATLAB中的GUI界面来构建实验的平台框架,然后采用基于最小错误率的贝叶斯决策来作为识别方法,对手写数字进行识别。需要在GUI界面中搭建好所需的对象,并写入完成相关功能的程序。其实现的功能是首先能够识别用户输入的手写数字,并提取输入数字的特征;然后将得到的手写数字特征加上对应数字的标签,将其存入样本库中,用于后面手写数字的对比识别;最后根据用户输入的手写数字,提取特征并在样本库中根据贝叶斯决策来判断手写数字的类型,最后显示识别结果。主要分为以下四个步骤:
(1)平台搭建
本次手写数字识别系统的编程环境为MATLAB,通过在MATLAB的GUI界面中搭建框架,并在对应的对象的回调函数中编写相关的程序来实现手写数字识别的功能。
在GUI界面中需要的对象有两个静态文本框、一个坐标区、一个可编辑文本,搭建的界面及其功能如图1所示。
由图可以看出每个对象都有各自的的功能:“手写板”坐标用于用户书写数字;“特征提取”可编辑文本用于显示手写数字的每个特征值,以便后面的对比识别;“清除”按钮可以清除用户写在“手写板”上的数字以及“特征提取”中数字特征值;“提取特征”按钮的功能是对“手写板”中的数字进行识别处理,提取相应的特征值并输到“特征提取”可编辑文本中显示;“保存为样本”按钮则是用于建立样本数据库,将前期的样本特征保存到样本库中,以便后面数字的识别;而“识别”按钮则是根据当前输入的手写数字特征,在样本库中寻找对应的数字类型。
此次手写数字识别系统的平台搭建就如图1所示,然后通过搭建的界面根据需要实现的功能对相应的对象的回调函数编写程序。
(2)特征描述
特征描述就是对手写数字进行分析处理,得到数字的特征,然后根据每类数字各自的特征值来识别手写数字的类型。
在此次设计中,手写数字特征描述的步骤为:首先将含有全部特征信息的手写数字图像从坐标轴中提取出来,将提取出来的书写数字图像进行二值化处理;然后将处理后的图像分成
6
×
6
6\times6
6×6小格,每个网格中全部1值像素点个数与全部像素点个数之比就是手写数字在这一网格中的特征值,得到36个网格中的特征值并存入特征矩阵feature中,即feature矩阵包含了手写数字所有的特征信息;最后显示手写数字的特征图,判断每个网格的特征值是否大于预先设定好的阈值(此次设计中取0.1),若大于阈值,则此网格全部像素点的值为1,反之网格全部像素点的值为0。其实现如图2所示。
(3)建立最小错误率贝叶斯决策分类器
①分类器原理
对于具有多个特征参数的样本(本次设计samplelib数据样本d=36有个参数),其正态分布的概率密度函数可定义为
p
(
x
)
=
1
(
2
π
)
d
2
∣
Σ
∣
1
2
exp
{
−
1
2
(
x
−
μ
)
Σ
−
1
(
x
−
μ
)
T
}
p(\textbf{x})=\frac{1}{(2\pi)^{\frac{d}{2}}|\Sigma|^{\frac{1}{2}}}\exp\{-\frac{1}{2}(\textbf{x}-\mathbf{\mu})\Sigma^{-1}(\textbf{x}-\mathbf{\mu})^{T}\}
p(x)=(2π)2d∣Σ∣211exp{−21(x−μ)Σ−1(x−μ)T}式中,
x
=
[
x
1
,
x
2
,
⋯
,
x
d
]
\textbf{x}=[x_{1},x_{2},\cdots,x_{d}]
x=[x1,x2,⋯,xd]是d维待识别样本特征向量,
μ
=
[
μ
1
,
μ
2
,
⋯
,
μ
d
]
\mathbf{\mu}=[\mu_{1},\mu_{2},\cdots,\mu_{d}]
μ=[μ1,μ2,⋯,μd]是d维样本平均特征向量,
Σ
\Sigma
Σ是
d
×
d
d\times d
d×d维协方差矩阵。
本次设计采用最小错误率的贝叶斯决策,选择判别函数如下:
g
i
(
x
)
=
p
(
x
∣
w
i
)
⋅
p
(
w
i
)
,
i
=
1
,
2
,
⋯
,
10
g_{i}(\textbf{x})=p(\textbf{x}|w_{i})\cdot p(w_{i}),\ \ \ i=1,2,\cdots,10
gi(x)=p(x∣wi)⋅p(wi), i=1,2,⋯,10式中,
p
(
w
i
)
p(w_{i})
p(wi)为类别发生的先验概率,
p
(
x
∣
w
i
)
p(\textbf{x}|w_{i})
p(x∣wi)为类别的
w
i
w_{i}
wi类条件概率密度函数。
由判别规则,如果使
g
i
(
x
)
>
g
j
(
x
)
g_{i}(\textbf{x})>g_{j}(\textbf{x})
gi(x)>gj(x)对一切
i
≠
j
i\neq j
i=j成立,则将
x
\textbf{x}
x归为
w
i
w_{i}
wi类。假设类条件概率密度函数
p
(
x
∣
w
i
)
p(\textbf{x}|w_{i})
p(x∣wi)服从正态分布,即有
p
(
x
∣
w
i
)
∼
N
(
μ
i
,
Σ
i
)
,
p(\textbf{x}|w_{i})\sim N(\mu_{i},\Sigma_{i}),
p(x∣wi)∼N(μi,Σi),,那么上式就可以写为
g
i
(
x
)
=
p
(
w
i
)
(
2
π
)
d
2
∣
Σ
∣
1
2
exp
{
−
1
2
(
x
−
μ
)
Σ
−
1
(
x
−
μ
)
T
}
,
i
=
1
,
2
,
⋯
,
10
g_{i}(\textbf{x})=\frac{p(w_{i})}{(2\pi)^{\frac{d}{2}}|\Sigma|^{\frac{1}{2}}}\exp\{-\frac{1}{2}(\textbf{x}-\mathbf{\mu})\Sigma^{-1}(\textbf{x}-\mathbf{\mu})^{T}\},i=1,2,\cdots,10
gi(x)=(2π)2d∣Σ∣21p(wi)exp{−21(x−μ)Σ−1(x−μ)T},i=1,2,⋯,10
对上式右端取对数,可得
g
i
(
x
)
=
−
1
2
(
x
−
μ
i
)
Σ
−
1
(
x
−
μ
i
)
T
+
ln
p
(
w
i
)
−
1
2
ln
∣
Σ
i
∣
−
d
2
ln
(
2
π
)
g_{i}(\textbf{x})=-\frac{1}{2}(\textbf{x}-\mathbf{\mu_{i}})\Sigma^{-1}(\textbf{x}-\mathbf{\mu_{i}})^{T}+\ln p(w_{i})-\frac{1}{2}\ln |\Sigma_{i}|-\frac{d}{2}\ln(2\pi)
gi(x)=−21(x−μi)Σ−1(x−μi)T+lnp(wi)−21ln∣Σi∣−2dln(2π)上式中的第四项与样本所属类别无关,将其从判别函数中消去,不会改变分类结果,则判别函数
g
i
(
x
)
g_{i}(\textbf{x})
gi(x)可简化为以下形式
g
i
(
x
)
=
−
1
2
(
x
−
μ
i
)
Σ
−
1
(
x
−
μ
i
)
T
+
ln
p
(
w
i
)
−
1
2
ln
∣
Σ
i
∣
g_{i}(\textbf{x})=-\frac{1}{2}(\textbf{x}-\mathbf{\mu_{i}})\Sigma^{-1}(\textbf{x}-\mathbf{\mu_{i}})^{T}+\ln p(w_{i})-\frac{1}{2}\ln |\Sigma_{i}|
gi(x)=−21(x−μi)Σ−1(x−μi)T+lnp(wi)−21ln∣Σi∣②分类实现步骤
1)从samplelib.mat文件中读取样本(每类样本个数为20)特征参数,求出特征参数均值
μ
i
\mu_{i}
μi,然后从文件feature.dat中读取待分类样本的特征参数
x
\textbf{x}
x;
2)求出每类样本的协方差矩阵,逆矩阵以及对应的行列式;
3)由于每类样本的个数相同,故先验概率
p
(
w
i
)
=
0.1
p(w_{i})=0.1
p(wi)=0.1,根据一二步骤可求出类条件概率
p
(
x
∣
w
i
)
p(\textbf{x}|w_{i})
p(x∣wi)。
4)将每类样本参数代入判别函数,求取最大值即得到分类。
(4)实现手写数字识别
根据上述设计,得到了手写数字识别系统。首先,通过输入样本得到样本库。此次实验中存入样本库samplelib.mat的每类样本的个数为20,选取的特征参数为 6 × 6 6\times 6 6×6。其系统实现如图3所示。
3、实验结果
通过设计的手写数字识别系统,首先构建一个训练样本集。通过向手写板中输入数字,获取手写数字的特征,存入相应标签的样本库中。在此次设计中,样本库有0-9十个类别,而且每个类别中存入了20个样本,以供手写数字的识别。
构建好样本库后,输入每个类别的手写数字进行了重复地识别测试。经实验发现,本次设计的手写数字识别效果很好,基本可以识别出所有书写规范的数字,只是当书写不规范时会发生错误,但也有少部分类型的手写数字识别率不高,如手写数字8,就在书写很规范时也会有很高的错误率。
针对手写数字8识别率不高的情况,我对其进行了大量的重复实验,根据实验结果可以发现,当手写数字8识别错误时,总是将其识别为0或者6,很少识别为其他数字。其错误识别结果如图4,5所示。
4、实验结果讨论
针对上述手写数字8识别率不高的情况进行讨论发现,只有数字书写特别规范时才能正确识别,而当书写不太规范时就会错误地识别为6或者0。分析可知,手写数字8的特征图与6或者0的特征图较为相似,故当书写不规范时的数字特征会与数字6或者0的特征更为相似,从而导致识别错误。
根据以上分析可得,有以下两种方法来解决此问题:
(1)增加类样本数
增加每类数字的样本数,使样本库包含尽可能多的数字形状,从而增大容错率,提高识别误差。
(2)提取更多的数字特征
在本次设计中,我将手写数字分成
6
×
6
6\times 6
6×6个小块来提取数字特征。如果将数字分为更多的小块来提取特征,则得到的数字信息会更精确,使得识别效果更加理想。
5、实验结论
本次手写数字识别系统实在MATLAB中的GUI界面上实现的,决策分类器则是采用的基于最小错误率的贝叶斯决策。通过以上实验可知,采用基于最小错误率的贝叶斯决策分类较为准确,此手写数字识别系统有较好的识别性能,而且根据上述讨论,本手写数字识别系统还有改进提升的空间。
文章代码链接:https://pan.baidu.com/s/1xgDBD8rUdDSi7Z7yozfaeA
提取码:jr6o