线性判别函数分类器matlab实现

1.计算类内离散度矩阵

% --------------------------------------------------------------------
% 类内离散度矩阵(计算第一类“0”和第二类“1”的类内离散度矩阵)
% --------------------------------------------------------------------
load('template.mat');
xmeans0 = zeros(1,25);   %第一类类的均值
xmeans1 = zeros(1,25);    %第二类类的均值
s0 = zeros(25,25);  %第一类类内离散度矩阵
s1 = zeros(25,25);  %第二类类内离散度矩阵
sw = zeros(25,25);  %总类内离散度矩阵

%%%%%%%%%% Begin %%%%%%%%%%

%两类样品个数
num0 = pattern(1).num;  
num1 = pattern(2).num;

%两类样品均值向量
xmeans0=mean(pattern(1).feature);
xmeans1=mean(pattern(2).feature);

%求第一类样品类内离散度矩阵s0

s0=(pattern(1).feature-xmeans0).'*(pattern(1).feature-xmeans0);


%第二类样品类内离散度矩阵s1
s1=(pattern(2).feature-xmeans1).'*(pattern(2).feature-xmeans1);


%总类内离散矩阵sw
sw=s0+s1;


%%%%%%%%%% End %%%%%%%%%%

fprintf('%f\n',sw(1,1));
fprintf('%f\n',sw(25,25));

2.实现基于Fisher分类器的手写数字识别

% --------------------------------------------------------------------
% Fisher分类器
% --------------------------------------------------------------------
warning('off')
load('template.mat');
img=imread('untitled.bmp');
feature=Getfeature(img);
xmeans0 = zeros(1,25);   %第一类类的均值向量
xmeans1 = zeros(1,25);    %第二类类的均值向量
s0 = zeros(25,25);  %第一类类内离散度矩阵
s1 = zeros(25,25);  %第二类类内离散度矩阵
sw = zeros(25,25);  %总类内离散度矩阵
sw_ = zeros(25,25); %Sw的逆矩阵
W = zeros(1,25);    %解向量w*
m0 = 0;     %投影后的第一类样品均值
m1 = 0;     %投影后的第二类样品均值
y0 = 0;     %阈值y0
pnum = zeros(1,10);
fisher2classes = 0;

for m = 1:10
    for n = 1:m
       %两类样品个数
       num0 = pattern(m).num;  
       num1 = pattern(n).num;

       %%%%%%%%%% Begin %%%%%%%%%%

       %两类样品均值向量xmeans0、xmeans1
        xmeans0=mean(pattern(m).feature);
        xmeans1=mean(pattern(n).feature);

       
       %%求第一类样品类内离散度矩阵s0
       s0=(pattern(m).feature-xmeans0).' * (pattern(m).feature-xmeans0);


       %第二类样品类内离散度矩阵s1
        s1=(pattern(n).feature-xmeans1).' * (pattern(n).feature-xmeans1);

       %总类内离散矩阵
       sw=s0+s1;

       %sw的逆矩阵sw_
        sw_=inv(sw);
       
       %计算解向量W

        W=(xmeans0-xmeans1)*sw_;

      %投影后的第一类样品均值m0
        m0=mean(pattern(m).feature)*W';

      %投影后的第二类样品均值m1
        m1=mean(pattern(n).feature)*W';
      
      %计算阈值y0
        y0=(m0*num0+m1*num1)/(num0+num1);
 

       %计算投影后的测试样品y
        y=W*feature';
       

       %%%%%%%%%% End %%%%%%%%%%
       
       %对测试手写数字图片识别
        if y>y0
            fisher2classes = m;
        else
            fisher2classes = n;
        end      
       pnum(fisher2classes) = pnum(fisher2classes)+1;
    end
end
[tem,num] = max(pnum);
num = num-1;

str = num2str(num);
str = ['应用Fish算法识别结果:' str];

fprintf('%s\n',str);
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Fisher线性分类器,也称为Fisher判别分析(Fisher Discriminant Analysis),是一种经典的线性分类方法,用于将数据集分成两个或多个不同类别。它是由英国统计学家罗纳德·A·费舍尔(Ronald A. Fisher)在1936年提出的。 Fisher线性分类器的目标是找到一个投影方向,使得在该方向上不同类别的样本尽可能地分开,同一类别的样本尽可能地接近。具体而言,Fisher线性分类器通过计算类间散布矩阵和类内散布矩阵的比值来确定最佳投影方向。 在MATLAB中,可以使用`fitcdiscr`函数来实现Fisher线性分类器。该函数可以根据训练数据集自动学习最佳的投影方向,并返回一个分类器对象。然后,可以使用该分类器对象对新的样本进行分类预测。 下面是使用MATLAB实现Fisher线性分类器的示例代码: ```matlab % 假设有一个训练数据集X和对应的标签y X = ...; % 训练数据集 y = ...; % 标签 % 使用fitcdiscr函数学习Fisher线性分类器 classifier = fitcdiscr(X, y); % 对新的样本进行分类预测 newSample = ...; % 新的样本 predictedLabel = predict(classifier, newSample); ``` 以上代码中,`X`是训练数据集,`y`是对应的标签。`fitcdiscr`函数会根据这些数据学习最佳的投影方向,并返回一个分类器对象`classifier`。然后,可以使用`predict`函数对新的样本`newSample`进行分类预测,得到预测的标签`predictedLabel`。 希望以上介绍对您有帮助!如果您有任何进一步的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

happylife_mini

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值