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);