【手写数字识别】基于matlab GUI贝叶斯+线性分类器手写数字识别【含Matlab源码 828期】

2021/5/6 14:55:27

本文主要是介绍【手写数字识别】基于matlab GUI贝叶斯+线性分类器手写数字识别【含Matlab源码 828期】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、简介

贝叶斯分类器是以贝叶斯原理为基础的分类器的总称,是一种生成式模型,朴素贝叶斯分类器是其中最简单的一种。要高明白贝叶斯分类器的原理,首先得明白一些基本概念。
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


三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、备注

完整代码或者代写添加QQ 1564658423



这篇关于【手写数字识别】基于matlab GUI贝叶斯+线性分类器手写数字识别【含Matlab源码 828期】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程