一、简介
贝叶斯分类器是以贝叶斯原理为基础的分类器的总称,是一种生成式模型,朴素贝叶斯分类器是其中最简单的一种。要高明白贝叶斯分类器的原理,首先得明白一些基本概念。\ 1 基本概念\ 先验概率:根据统计/经验得到的某事情发生的概率,比如北京下雨的概率可以通过以往的经验或者统计结果得到。\ 后验概率:在一定条件下某事情发生的概率,比如北京天空出现乌云(因)会下雨(果)的概率。\ 条件概率:事情发生时某条件出现的概率,比如北京下雨(果)会出现乌云(因)的概率。
2 贝叶斯公式\ \ 2 朴素贝叶斯分类器\
\
\
\
二、源代码
``` function varargout = Classification(varargin) % Begin initialization code - DO NOT EDIT guiSingleton = 1; guiState = struct('guiName', mfilename, ... 'guiSingleton', guiSingleton, ... 'guiOpeningFcn', @ClassificationOpeningFcn, ... 'guiOutputFcn', @ClassificationOutputFcn, ... 'guiLayoutFcn', [] , ... 'guiCallback', []); if nargin && ischar(varargin{1}) guiState.gui_Callback = str2func(varargin{1}); end
if nargout [varargout{1:nargout}] = guimainfcn(guiState, varargin{:}); else guimainfcn(guiState, 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
[pctemplate,pcdata]=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
%求协方差矩阵、协方差矩阵的逆矩阵、协方差矩阵的行列式 scov=[]; sinv=[]; s_det=[];
for i=1:10 scov(i).data=cov(pattern(1,i).feature'); sinv(i).data=inv(scov(i).data); sdet(i)=det(s_cov(i).data); end ```
三、运行结果
\
\
\
\
\
\
\
\
\