线性判别函数分类器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);

你可能感兴趣的:(模式识别,matlab,矩阵,python)