人工神经网络、贝叶斯、欧氏距离在手写数字识别中的应用[原创]

Matlab要求>=Matlab 7.0
Matlab 代码: http://download.csdn.net/source/2655457
VC代码: http://download.csdn.net/source/2620375
VC 可执行文件: http://download.csdn.net/source/2620323
运行方法:
注册MyControl.ocx控件,双击下图文件即可.

Matlab的在Matlab中打开myFigDemo.fig运行即可(对应UI的m文件为myFigDemo.m)。一些识别结果如下:



VC可执行程序直接双击DlgDemo.exe运行。一些识别结果如下:

一、特征选择
对手写数字特征的提取有很多种方法,本文首先找到手写样品的起始位置,在此附近搜索该样品的宽度和高度,再将每个样品的长度和宽度5等分,构成一个5*5的均匀小区域,如图:

对每一个小区域内的黑像素个数进行统计统计,除以该区域的面积总数,即得特征值。本文提供了一个ActiveX控件可用于多种语言,甚至可以嵌入到web中。使用该控件的GetFeature()方法即可获得上述25个特征值。
Matlab的使用例子如下:
h=handles.activex5;
data=invoke(h,'GetFeature');

VC的使用例子如下:
void CDlgDemoDlg::OnBtnRecognition()
{
       ……
VARIANT vt;
UpdateData();
       vt=m_myPic.GetFeature();   //m_myPic为ActiveX变量
       ……
}
记特征向量X(x_1,x_2,x_i,…,x_25),x_i表示样品X的第i个特征分量。
接下来讨论一个问题要有多少样品来做特征库呢?引入一个概念样品类别即有共同属性的一类样品的划分。本文讨论的样品类别是0到9这十个数字类别。一般来说一个类别中的样品数是特征值数目的5-10倍,例类别1的样品数=25*5=125个样品(本文取130),总的特征库样品数=10*125=1250个样品(本文是1300)。本文的特征库数据存放在templat.mat(Matlab专用)和templat.txt(其它语言用)。

Templat.mat中存放的是一组结构体:
Struct pattern
{
Index;          //类别,比如数字0
Num;          //该类别的样品数
Feature[j];    //记录类第i个样品,第j个特征
}
templat.txt以|分隔为列,每一行为一个样品的记录。
第一列为样品类别,第二列是该类别的样器个数,其它列为对应的25个特征值。
二、分类器的构造
本文的Matlab版程序中提供了三个分类器的构造,VC的只提供了欧式距离的分类器。
欧式距离分类器 识别离率>80%
BP人工神经网络分类器 >70%   (注:由于神经网记忆的不是读者的笔迹所以识别率低一些)
贝叶斯分类器>95% (为什么呢?大家有兴趣看数学书。)
本文着重讲最简单的欧式距离分类器,其它两种不是一点文字讲得清的。
给定一个手写体的25个特征值怎么与特征库的标准样品比较用距离分类器归类呢?

设X为待分类的手写数字特征值向量,Xi为特征库中某个样品的特征向量,计算X,到Xi的距离d(X,Xi)。取min(d(X,Xi)),则X,划分跟Xi属同一类.相应的Matlab代码如下:
function y = neartempleta(data)
%data------待识别的手写数字特征向量
%y-----------识别结果
load templet.mat pattern;   %加载特征库中的样品
d = 0;
min = [inf,0];
for i = 1:10
for j = 1:pattern(i).num
       d = sqrt(sum((pattern(i).feature(:,j)-data').^2));   %计算待识别手写数字到特征库某样品的距离
       if(min(1)>d)
         min(1) = d;
         min(2) = i-1;
       end
end
end
y = min(2);   %返回识别结果
end
接下来说一下贝叶斯分类器中的,先验概率和条件概率的计算方法,其它的细节读者看代码自己研究吧。

后验概率的最在值的类别(0-9)就是手写数字的所属类别。代码在bayeser.m里,就一列出来了。
最后简单的说一下BP人神经网络,不得不吸人工神经网络是一个很让着迷的东西。BP神经网络的结构如下:

本文采用了梯度下降学习算法,一些训练参数如下图:

代码在bpnet.m(仿真网络)和bpgdtrain(训练网络)。

你可能感兴趣的:(人工神经网络、贝叶斯、欧氏距离在手写数字识别中的应用[原创])