基于Fisher线性判别分析的手写数字识别

本文介绍了如何使用Fisher线性判别分析进行手写数字识别。首先解释了Fisher算法的基本原理,寻找最优投影方向以最大化类别间距离和最小化类别内离散度。接着,提出了基于Fisher算法的多类识别策略,通过连续比较找到最匹配的数字。最后,讨论了特征提取方法,通过二值化和像素统计得到49维特征向量。实验在Matlab环境下完成,实现了GUI界面的交互式手写数字识别。
摘要由CSDN通过智能技术生成

基于Fisher线性判别分析的手写数字识别

<1>Fisher算法简介:
为简单起见,我们以两类问题1和2的分类来说明Fisher判别法的原理,看下面的图,为识别w1类和w2类,通过选择适当的投影方向可以比较好的分开这两类,Fisher线性判别的思想就是选择投影方向,使投影后的两类相隔尽可能的远,而同时每一类内部的样本又尽可能聚集。关键是找出那个最佳的投影方向。
这里写图片描述

我们假设w1共有N1个样本,w2共有N2个样本,N= N1+N2。两个类别在输入空间的均值向量为:
这里写图片描述

各类的类内离散度矩阵为:
这里写图片描述

总类内离散度矩阵为:
这里写图片描述

根据Fisher算法的思想,要使两类投影后两类尽可能分开,而各类内部又尽可能聚集,最优的投影方向即为:
这里写图片描述

确定投影方向之后,再确定一个分类阈值Wo,并采取决策规则:
这里写图片描述

在自己的实验中,样本的数量肯定是有限的,可以将分类阈值定为:
这里写图片描述
判别的决策就改为:
这里写图片描述

<2>基于Fisher线性判别实现数字识别的想法:
根据Fisher算法可以实现两类的识别,数字识别为多类识别,我们可以通过多个两类分类器来实现。具体的算法是先从1开始逐个与比它大的数字比较,当遇到比1更加匹配输入的数字是则将1排除,而改为从2开始逐个与比它大的数比较,由此进行到找出最匹配的数字为止。
这里写图片描述

<3>数字特征的提取
利用Fisher线性判别时,每一类都对应着一个特征线性向量,不同的类之间对应的向量也是有差别的,Fisher就是找出这些特征向量的最优投影方向,使之在投影方向上能够有最大间距。

特征有很多不同的提取方法,本实验采取的是将手写数字图片二值化,再讲二值化图片分割为7×7块,计算每块内的像素点不为0的百分比,这样就可以构成一个49维的特征向量。

本人使用了Matlab作为研究平台,设计了一个gui界面(可以手写输入数字),采用Fisher线性识别,样本是已经采集好的。
这里写图片描述

部分Matlab代码如下:
<1>         *********手写数字matlab实现(部分)*************
%%手写输入程序

%鼠标按下
function figure_patten_WindowButtonDownFcn(hObject, eventdata, handles)
% hObject    handle to figure_patten (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global draw_enable     %定义一个标志,1表示绘图,0表示停止绘图
global x;
global y;
global h1;
imSize=10;
draw_enable=1;

axis([1 imSize 1 imSize]);  %设定axes1大小

       % grid on;
      %  box on; 
if draw_enable==1
    p=get(gca,'currentpoint');          %鼠标按下,获取当前坐标
    x(1)=p(1);         
    y(1)=p(3);  
end

%鼠标移动
function figure_patten_WindowButtonMotionFcn(hObject, eventdata, handles)
% hObject    handle to figure_patten (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
axes(handles.axes1);
global draw_enable;
global x;
global y;
global h1;
p=get(gca,'currentpoint');
if draw_enable==1
  x(2)=p(1);          %鼠标第一次移动后的坐标为x(2),y(2)
    y(2)=p(3);   

x_gap = 0.1;    % 定义x方向增量
        y_gap = 0.1;    % 定义y方向增量
        if x(2) > x(1)
            step_x = x_gap;
        else
            step_x = -x_gap;
        end
        if y(2) > y(1)
            step_y = y_gap;
        else
            step_y = -y_gap;
        end  
        % 定义x,y的变化范围和步长
        if abs(x(2)-x(1)) < 0.01        % 线平行于y轴,即斜率不存在时
            iy = y(1):step_y:y(2);
            ix = x(2).*ones(1,size(iy,2));
        else
            ix = x(1):step_x:x(2) ;    % 定义x的变化范围和步长
            % 当斜率存在,即k = (Y-InitialY)/(X-InitialX) ~= 0
            iy = (y(2)-y(1))/(x(2)-x(1)).*(ix-x(1))+y(1);   
        end
        ImageX = [ix, x(2)]; 
        ImageY = cat(2, iy, y(2));
    
  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值