Fisher线性判别算法原理及实现 MATLAB

一、Fisher判别器原理









二、代码实现

clc;
close all;
clear;
%% 生成数据
rng(2020);   %指定一个种子
mu1 = [0 3];
sigma1 = [0.5 0; 0 0.5];
data1 = mvnrnd(mu1,sigma1,300); %生成一个300*2的矩阵,每一列的数据分别以0,3为均值,标准差都为0.5rng(2021);  %指定一个种子
mu2 = [6 7];
sigma2 = [0.5 0; 0 0.5];
data2 = mvnrnd(mu2,sigma2,300); %生成一个300*2的矩阵,每一列的数据分别以6,7为均值,标准差都为0.5% rng(2022);  %指定一个种子
% mu3 = [5 -5];
% sigma3 = [0.5 0;
%          0 0.5];
% data3 = mvnrnd(mu3,sigma3,300); %生成一个300*2的矩阵,每一列的数据分别以5,-5为均值,标准差都为0.5%%
figure(1),plot(data1(:,1),data1(:,2),'r+');hold on;
plot(data2(:,1),data2(:,2),'b*');hold on;
% figure(3),plot(data3(:,1),data3(:,2),'m^');hold on;%%
mu_1=mean(data1,1);  %求data1数据集的均值 mean是求每一列的均值
mu_2=mean(data2,1);  %求data2数据集的均值 mean是求每一列的均值
tmp=data1-repmat(mu_1,[size(data1,1),1]); %size(data1,1)返回data1第一维的大小 repmat将mu_1矩阵当成一个数,然后按后面的向量排列
S1=tmp'*tmp;   %计算出S1 下面的操作是一样的
tmp=data2-repmat(mu_2,[size(data2,1),1]);
S2=tmp'*tmp;
Sw=S1+S2;
w_star=Sw\(mu_1-mu_2)';  %这边直接用结论 注意这里的mu_1 mu_2是行向量,而PPT上的为列向量,所以多了个转置,实际上是一样的%% Plot w_star
Data=[data1;data2]; %将两个数据集合并成一个数据集
[xmin,ymin]=min(Data,[],1); %返回每一列的最小值
[xmax,ymax]=max(Data,[],1); %返回每一列的最大值
X=xmin:0.1:xmax; %采样
k=w_star(2)/(w_star(1)+eps);%求出判别函数的斜率
plot(X,k*X-4,'k--'); %画出判别函数,-4只是上下平移,并不会影响到判别函数的方向,这里只是为了不让它穿过样本%%
w_star=-w_star;  %反向
y1=data1*w_star; %计算data1中每一个样本的投影
y2=data2*w_star; %计算data2中每一个样本的投影
figure(2),plot(y1,zeros(length(y1)),'r+');hold on;
plot(y2,zeros(length(y2)),'b*');hold on; %横坐标是它们的投影,纵坐标取零是便于在一维中比较,可以发现两类样本分开了%% Sw-1Sb特征值分解
Sb=(mu_1-mu_2)'*(mu_1-mu_2); %注意这里的mu_1 mu_2是行向量,而PPT上的为列向量,所以多了个转置,实际上是一样的
Tmp=Sw\Sb; % Jf矩阵
[V,D]=eig(Tmp); %V储存特征向量,D储存特征值,D是个对角阵,特征值储存在对角线上
D=diag(D); %提取出特征值行向量
[~,ind]=max(D);%最大特征值的序号
v=V(:,ind); %提取出与最大特征值对应的特征向量
k1=v(2)/(v(1)+eps);
figure(3),plot(data1(:,1),data1(:,2),'r+');hold on;
plot(data2(:,1),data2(:,2),'b*');hold on;
plot(X,k*X-4,'k--');hold on;
plot(X,k1*X-6,'m--'); %可以发现与第一种方法得到的结果是一样的%% G(x)=w'x+w0
mu_y1=mean(y1); %计算data1数据投影的平均值
mu_y2=mean(y2); %计算data2数据投影的平均值
d=(mu_y1+mu_y2)/2; %d就是阈值
w0=-d;
figure(4),plot(data1(:,1),data1(:,2),'r+');hold on;
plot(data2(:,1),data2(:,2),'b*');hold on;
plot(X,k*X-4,'k--');hold on;
Y=(-w_star(1)*X-w0)/(w_star(2));%令G(x)=0解出y即可 注意x向量的第一个元素是横坐标,第二个元素是纵坐标
plot(X,Y,'m-');
axis equal;

三、实验结果

Figure 1:

Figure 2:

Figure 3:

Figure 4:

Fisher线性判别算法原理及实现 MATLAB相关推荐

  1. fisher线性判别算法python_干货|机器学习算法之线性判别分析

    作者:just_sort 链接:https://blog.nowcoder.net/n/e668319c70b64fab945871e5ab6cc363 来源:牛客网 算法原理 在上文我们使用LDA实 ...

  2. fisher线性判别算法python_Fisher线性判别(LDA)python实现

    LDA概述 首先,LDA是一个用于分类的有监督算法. 基本想法非常质朴,不失一般性的以二维平面二分类为例: 对于两类样本点,我们的目的是想找一条直线,将两类样本点映射到这条直线上时,使这两类之间的类间 ...

  3. fisher判别_经典模式识别:Fisher线性判别

    本文将介绍Fisher线性判别的原理和具体实践,阅读时间约8分钟,关注公众号可在后台领取数据集资源哦^-^ Fisher线性判别 1.背景介绍 生活中我们往往会遇到具有高维特性的数据,如个人信息,天气 ...

  4. 多类线性分类器算法原理及代码实现 MATLAB

    多类线性分类器算法原理及代码实现 MATLAB 一.算法原理 下面举例说明为何蓝圈部分在case2中是确定的而在case1中不确定: 二.代码实现 1.HK函数 function [] = HK(w1 ...

  5. matlab fisher检验,FISHER线性判别MATLAB实现.doc

    FISHER线性判别MATLAB实现 Fisher线性判别上机实验报告 班级: 学号: 姓名: 算法描述 Fisher线性判别分析的基本思想:选择一个投影方向(线性变换,线性组合),将高维问题降低到一 ...

  6. 基于fisher线性判别法的分类器设计

    0.引言说明 这篇文章实际上是楼主上的模式识别课程的课堂报告,楼主偷懒把东西直接贴出来了.选择fisher判别法的原因主要是想学习一下这个方法,这个方法属于线性判别法,操作起来和lda判别法近乎没啥区 ...

  7. 朴素贝叶斯分类器与Fisher线性判别实践——水果识别为例

    开篇:本次博客主要分享二分类水果实现案例,样本构造显然不具备泛化.大数量特性以及背景均为纯白色是为了方便目标提取.大家若需要更好的水果样本,Github上有许多的优秀案例.本次代码计算效率较低,代码有 ...

  8. 模式识别(1)Fisher线性判别

    Fisher线性判别 分类是我们经常会遇到是问题,下面主要介绍Fisher线性判别,利用Fisher算法来分类UCI数据集中的Iris数据集和Sonar数据集. 一.数据集说明 UCI数据库是加州大学 ...

  9. Python 分类问题研究-Fisher线性判别

    [实验目的] 1.掌握常见机器学习分类模型思想.算法,包括Fisher线性判别.KNN.朴素贝叶斯.Logistic回归.决策树等: 2.掌握Python编程实现分类问题,模型评价指标.计时功能.保存 ...

最新文章

  1. Git之不明觉厉11-利其器source tree
  2. Progressbar 实现从右向左 加载(逆向)
  3. ext 从头开始 extjs 控件 触发事件 的几种方式
  4. 剑指offer--不用加减乘除做加法
  5. 007_控制器可扩展性
  6. 理解Lucene中的Query
  7. 一道money计算题引发的思考
  8. Android电量优化全解析
  9. ifonts提取下载ttf文件
  10. 微信小程序-更改个人信息
  11. 使用主密钥和钱包方法加密数据
  12. 风雨十年路,历历在眼前,今做离职语,感慨有万千!-------来自一位中兴长天java十年的总工程师
  13. 永磁体的退磁化与静态工作点
  14. 学习数据库应该上哪个网站
  15. 【ARM指令】LDRD与STRD
  16. 如何用excel制作xy曲线图_如何用Excel计算百分比?
  17. VMware Workstation Pro安装教程
  18. C++ 删除C盘中的用户(坑人必备,极度危险)
  19. HP LaserJet P2015d 打印机的使用问题
  20. 2020 非常火的 11 个微前端框架

热门文章

  1. 记录今天登录oracle时遇到的一个小问题--不能登录
  2. 新浪微博第三方登陆重定向错误23123
  3. crm 一级菜单排序,二级菜单选中并且展开,非菜单权限的归属,权限粒度控制到按钮级别...
  4. electron 项目的搭建方式,借助 node 和 npm
  5. 2016.3.22(关系型数据库简介,管理数据库和表)
  6. Linux下nginx安装与配置
  7. 【vue-router①】router-link跳转页面传递参数 - 进击的前端之路(偶尔爬坑java小路) - SegmentFault 思否
  8. [题解]Codeforces Round #519 - B. Lost Array
  9. 导出数据生成excel
  10. @angular/platform-browser-dynamic