机器学习-模式识别(2)基于Fisher准则的线性分类器设计

Fisher线性分类器是将n维训练样本投影到1维空间上,然后在一维空间进行分类,最关键的参数就是投影方向w。

由于投影方向有很多,如何得到最佳的投影方向呢?这个投影过程要求满足一个原则,这个原则一句话解释就是:类内离散度越小越好,类间离散度越大越好。
  记类内离散度为类间离散度为,整个准则可以描述为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
已知有两类数据w1 和w2 ,即 Female.txt 和 Male.txt,进行 Fisher 判别分类,用 test1.txt 和 test1.txt 中的样本进行测试。
(1)首先读取测试集内容,并进行样本点绘制。数据的样本点分布如下图:在这里插入图片描述
(2)计算男生,女生测试集 数据的均值向量,并进一步根据公式求类内离散度矩阵和类间
离散度矩阵。根据公式求出投影向量和阈值。
(3)根据判别函数,对测试集数据进行判别。对于本次实验判别函数 G(x)大于 0 判别为第一类,小于 0 判别为第二类。对分类后的数据进行储存,并与测试集中实际性别相对比,得出分类的正确率。
在这里插入图片描述

clc; close all;
 
load MALE.txt;
load FEMALE.txt;
figure(1);
for i =1:50
        plot(FEMALE(i,2),FEMALE(i,1),'r+');
        plot(MALE(i,2),MALE(i,1),'b*');
        hold on;
end
title('原样本身高特征分布图');
legend('男性','女性');
[m,n]=size(MALE);
%求均值
MALE_aver=mean(MALE);
FEMALE_arer=mean(FEMALE);
%求类内离散度矩阵和总类内离散度矩阵
tmp=MALE-repmat(MALE_aver,[size(MALE,1),1]); %size(MALE,1)返回MALE第一维的大小 repmat将MALE_aver矩阵当成一个数,然后按后面的向量排列
S1=tmp'*tmp;   %计算出S1 下面的操作是一样的
tmp=FEMALE-repmat(FEMALE_arer,[size(FEMALE,1),1]);
S2=tmp'*tmp;
Sw=S1+S2;
 
%画出根据w*得到的投影线
W=inv(Sw)*(MALE_aver-FEMALE_arer)';%两个式子等价,但是使用inv()函数求矩阵的逆阵运算速度慢
w_star=Sw\(MALE_aver-FEMALE_arer)';
%求出分类阈值w0
W0=-((MALE_aver+FEMALE_arer)*inv(Sw)*(MALE_aver-FEMALE_arer)')/2;%inv()为矩阵求逆
 
%原样本映射到新的坐标空间
 
k=W(2,:)/W(1,:);
x11=(MALE(:,1)+k.*MALE(:,2))./(k*k+1);
x12=k.*x11;
x21=(FEMALE(:,1)+k.*FEMALE(:,2))./(k*k+1);
x22=k.*x21;
figure(2)
plot(x11,x12,'b*',x21,x22,'r+');                       %训练数据投影图例
hold on
plot(MALE(:,1),MALE(:,2),'b*',FEMALE(:,1),FEMALE(:,2),'r+');  %训练数据图例
legend('男性','女性');
 
[height,weight,gender]=textread('test2.txt','%n%n%s');
test2=[height,weight];%test2数据集
[row,col]=size(test2);
Compare=ones(row,col);
error=0;
for i=1:row
      if strcmp(gender(i,1),'M')|| strcmp(gender(i,1),'m')    %将字符转变数字01标记
         Compare(i,1)=1;%男生为1女生为0
     else
        Compare(i,1)=0;
      end    
    g(1,i)=W(:,1)'*test2(i,:)'+W0(1,1);    
    if(g(i)>0)
        Compare(i,2)=1;%fisher线性判别分类结果
    else
       Compare(i,2)=0;
    end
    error=error+abs( Compare(i,1)-Compare(i,2));  %绝对值不一致即为有预测错误   
end
 
fprintf('错误个数为%d 错误概率为%f\n',error,error/row);
 
figure(3);
for i=1:32
    if i==5||i==10||i==15||i==22||i==32%求指定样本的分类结果
      x=(test2(i,1)+k.*test2(i,2))./(k*k+1);
      y=k.*x;
      if(g(i)>0)
          plot(test2(i,1),test2(i,2),'g*',x,y,'b*');
          hold on
      else  
          plot(test2(i,1),test2(i,2),'g*',x,y,'r*');
          hold on
      end
 
    end
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

香草绵绵冰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值