手写数字识别基于贝叶斯分类器实现手写数字识别matlab源码含GUI
Posted Matlab咨询QQ1575304183
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写数字识别基于贝叶斯分类器实现手写数字识别matlab源码含GUI相关的知识,希望对你有一定的参考价值。
一、简介
贝叶斯分类器是以贝叶斯原理为基础的分类器的总称,是一种生成式模型,朴素贝叶斯分类器是其中最简单的一种。要高明白贝叶斯分类器的原理,首先得明白一些基本概念。
1 基本概念
先验概率:根据统计/经验得到的某事情发生的概率,比如北京下雨的概率可以通过以往的经验或者统计结果得到。
后验概率:在一定条件下某事情发生的概率,比如北京天空出现乌云(因)会下雨(果)的概率。
条件概率:事情发生时某条件出现的概率,比如北京下雨(果)会出现乌云(因)的概率。
2 贝叶斯公式
2 朴素贝叶斯分类器
二、源代码
function varargout = Classification(varargin)
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @Classification_OpeningFcn, ...
'gui_OutputFcn', @Classification_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before Classification is made visible.
function Classification_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
%--------------------------------------------------------------------------
global flag
flag=0;
if exist('template.mat','file')~=0
load template pattern;
else
pattern(1,1).num=0;
pattern(1,1).feature=[];
pattern(1,2).num=0;
pattern(1,2).feature=[];
pattern(1,3).num=0;
pattern(1,3).feature=[];
pattern(1,4).num=0;
pattern(1,4).feature=[];
pattern(1,5).num=0;
pattern(1,5).feature=[];
pattern(1,6).num=0;
pattern(1,6).feature=[];
pattern(1,7).num=0;
pattern(1,7).feature=[];
pattern(1,8).num=0;
pattern(1,8).feature=[];
pattern(1,9).num=0;
pattern(1,9).feature=[];
pattern(1,10).num=0;
pattern(1,10).feature=[];
save template pattern;
end
%------------------------------------------------------------------------
% --- Outputs from this function are returned to the command line.
function varargout = Classification_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
%--------------------------------------------------------------------------
%手写板实现---按下左键开始画直线
function figure1_WindowButtonDownFcn(hObject, eventdata, handles)
%clc
global flag
global pos0 %
global x0 y0
pos0=get(handles.WritingAxes,'currentpoint');
x0=pos0(1,1);
y0=pos0(1,2);
if (pos0(1,1)>=0&pos0(1,1)<=100) && (pos0(1,2)>=0&pos0(1,2)<=100)
flag=1;
end
%--------------------------------------------------------------------------
%--------------------------------------------------------------------------
function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)
%clc
%手写板实现---移动鼠标进行画线实现的程序
global flag
global pos0
global x0 y0
pos=get(handles.WritingAxes,'currentpoint');
x=pos(1,1);
y=pos(1,2);
if flag && (pos(1,1)>=0&pos(1,1)<100) && (pos(1,2)>=0&pos(1,2)<100)
line(x,y, 'marker', '.','markerSize',18, 'LineStyle','-','LineWidth',2,'Color','Black');
if x>x0
stepX=0.1;
else
stepX=-0.1;
end
if y>y0
stepY=0.1;
else
stepY=-0.1;
end
X=x0:stepX:x;
if abs(x-x0)<0.01
Y=y0:stepY:y;
else
Y=(y-y0)*(X-x0)/(x-x0)+y0;
end
line(X ,Y, 'marker', '.','markerSize',18, 'LineStyle','-','LineWidth',2,'Color','Black');
x0=x;
y0=y;
pos0=pos;
else
flag=0;
end
%-------------------------------------------------------------------------
%-------------------------------------------------------------------------
function figure1_WindowButtonUpFcn(hObject, eventdata, handles)
%clc
%手写板实现程序---释放鼠标左键结束画线的程序
global flag
flag=0;
%global data
data=[];
Img=getframe(handles.WritingAxes);
imwrite(Img.cdata,'当前手写数字.bmp','bmp');
I=imread('当前手写数字.bmp');
I=rgb2gray(I);
I=im2bw(I);
imwrite(I,'当前手写数字.bmp','bmp');
I=imread('当前手写数字.bmp');
data=GetFeature(I);
%--------------------------------------------------------------------------
function y=BayesLeastRisk(data)
clc;
load template pattern;
%将数字特征转化为0、1两个数值表示
for i=1:10
for j=1:25
for k=1:pattern(1,i).num
if pattern(1,i).feature(j,k)>0.1
pattern(1,i).feature(j,k)=1;
else
pattern(1,i).feature(j,k)=0;
end
end
end
end
[pc_template,pc_data]=pcapro(data); %主成分分析
temp=0;
for i=1:10
pattern(1,i).feature=pc_template(:,temp+1:temp+pattern(1,i).num);
temp=temp+pattern(1,i).num;
end
%求协方差矩阵、协方差矩阵的逆矩阵、协方差矩阵的行列式
s_cov=[];
s_inv=[];
s_det=[];
for i=1:10
s_cov(i).data=cov(pattern(1,i).feature');
s_inv(i).data=inv(s_cov(i).data);
s_det(i)=det(s_cov(i).data);
end
三、运行结果
完整代码或仿真咨询QQ1575304183
以上是关于手写数字识别基于贝叶斯分类器实现手写数字识别matlab源码含GUI的主要内容,如果未能解决你的问题,请参考以下文章