最近一个朋友问这方面的一些问题,其实之前也就很粗略的看了下fisher,真正帮别人解答问题的时候才知道原来自己也有很多东西不懂。下面小结下自己对fisher判别的理解:

其实fisher和PCA差不多,熟悉PCA的人都知道,PCA其实就是在寻找一个子空间。这个空间怎么来的呢,先求协方差矩阵,然后求这个协方差矩阵的特征空间(特征向量对应的空间),选取最大的特征值对应的特征向量组成特征子空间(比如说k个,相当于这个子空间有k维,每一维代表一个特征,这k个特征基本上可以涵盖90%以上的信息)。那么我们把样本投影在这个子空间,原来那么多维的信息就可以用这k维的信息代替了,也就是说降维了。至于PCA为啥要用求协方差矩阵然后求特征子空间的方法,这个数学上有证明,记得在某篇文章上看过,有兴趣的可以找找,看看证明。

那么fisher空间又是怎么一回事呢,其实fisher判别和PCA是在做类似的一件事,都是在找子空间。不同的是,PCA是找一个低维的子空间,样本投影在这个空间基本不丢失信息。而fisher是寻找这样的一个空间,样本投影在这个空间上,类内距离最小,类间距离最大。那么怎么求这个空间呢,类似于PCA,求最大特征值对应的特征向量组成的空间。  当我们取最大几个特征值对应的特征向量组成特征空间时(这里指出,最佳投影轴的个数d<=c-1,这里c是类别数),最佳投影矩阵如下:

其实在文章Eigenfaces vs Fisherfaces :recognition using class specific linear projection中给出了PCA和LDA比较直观的解释,文中对一个二维的数据进行分析,PCA和LDA都是把二维数据降到一个一维空间,那么其实PCA使得数据投影在这个一维空间总的离散度最大,我的理解是这样的,如果数据在某一维上比较离散,说明这维特征对数据的影响比较大,也就是说这维特征是主成分。而LDA呢,数据投影在这个空间,类内离散度最小,类间离散度最大,数据变得线性可分,如文中所说:

假设我们给定C类样本,我们先求sw(类内离散度)和sb(类间离散度),如下所示:

那么样本投影在新的投影空间中类间离散度为:

样本投影在新的投影空间中类内离散度为:

那么只要我们最大化就可以使得样本投影在这个空间上类内离散度最小,类间离散度最大,其中,w就是我们要找的投影方向。但是问题就来了,如果sw是一个奇异矩阵,那么这个式子是求不出来的。所以就有高人想到用这个式子代替:

这里的B是一个权衡因子,权衡类间距离和类内距离谁的比重大,试验中可以根据需要调节。也就是说,只要我们可以根据梯度下降法迭代w,使得最大化,这个w就是我们所要求的最好的投影方向。在fisher中最大特征值对应的特征向量就是最佳投影方向,如果我们取最大k个特征值对应的特征向量作为投影方向,那么最终样本就投影到了这样的一个k维子空间,在这个子空间里面类内最小,类间最大。

另外还有一种方法来解决sw的奇异性引起的问题,比如如果我们试验中处理的数据时人脸图片,由于人脸图片之间相关性很大,所以sw很容易就是一个奇异矩阵,但是如果我们先用PCA对样本进行降维,去掉相关性,那么这样我们再用LDA就不会遇到sw奇异性的为题了,实际中这种方法也是很常用的,在用LDA的时候往往先使用PCA降维。

好了,下面来给出fisher的一个简单的matlab代码:

main.m

   1: clear; clc;

   2: %定义两类样本的空间范围 

   3: x1min=2;x1max=6; 

   4: y1min=-4,y1max=0; 

   5: x2min=6,x2max=10; 

   6: y2min=2,y2max=6; 

   7: %产生两类2D空间的样本 

   8: c1=createSwatch(x1min,x1max,y1min,y1max,100); 

   9: c2=createSwatch(x2min,x2max,y2min,y2max,80); 

  10: %获取最佳投影方向 

  11: w=fisher_w(c1,c2); 

  12: %计算将样本投影到最佳方向上以后的新坐标 

  13: cm1=c1(1,:)*w(1)+c1(2,:)*w(2); 

  14: cm2=c2(1,:)*w(1)+c2(2,:)*w(2); 

  15: cc1=[w(1)*cm1;w(2)*cm1]; 

  16: cc2=[w(1)*cm2;w(2)*cm2]; 

  17: %打开图形窗口 

  18: figure; 

  19: %绘制多图 

  20: hold on; 

  21: %绘制第一类的样本 

  22: plot(c1(1,:),c1(2,:),'rp'); 

  23: %绘制第二类的样本 

  24: plot(c2(1,:),c2(2,:),'bp'); 

  25: %绘制第一类样本投影到最佳方向上的点 

  26: plot(cc1(1,:),cc1(2,:),'r+'); 

  27: %绘制第二类样本投影到最佳方向上的点 

  28: plot(cc2(1,:),cc2(2,:),'b+'); 

  29: w=10*w; 

  30: %画出最佳方向 

  31: line([-w(1),w(1)],[-w(2),w(2)],'color','k'); 

  32: axis([-10,10,-10,10]); 

  33: grid on; 

  34: hold off; 

fisher_w.m

   1: function w = fisher_w(c1,c2) 

   2: %利用Fisher准则函数确定最佳投影方向 

   3: %c1和c2分别为两类样本的样本矩阵

   4: %得到样本矩阵的尺寸信息 

   5: %样本矩阵的行数代表样本的维数 

   6: %样本矩阵的列数代表样本的个数 

   7:     size1=size(c1); 

   8:     size2=size(c2); 

   9:     %计算两类样本的均值向量 

  10:     m1=sum(c1,2)/size1(2); 

  11:     m2=sum(c2,2)/size2(2); 

  12:     %样本向量减去均值向量 

  13:     c1=c1-m1(:,ones(1,size1(2))); 

  14:     c2=c2-m2(:,ones(1,size2(2))); 

  15:     %计算各类的类内离散度矩阵 

  16:     S1=c1*c1.'; 

  17:     S2=c2*c2.'; 

  18:     %计算总类内离散度矩阵 

  19:     Sw=S1+S2; 

  20:     %计算最佳投影方向向量 

  21:     w=Sw^-1*(m1-m2); 

  22:     %将向量长度变成1 

  23:     w=w/sqrt(sum(w.^2)); 

  24: end

createSwatch.m

   1: function swatch=createSwatch(xmin,xmax,ymin,ymax,num,varargin) 

   2:  

   3: xlen = abs(xmax - xmin);

   4: ylen = abs(ymax - ymin);

   5:  

   6: if numel(varargin)>0 && isa(varargin{1},'function_handle') 

   7:     f = varargin{1}; 

   8: else

   9:     f = @rand;

  10: end 

  11: swatch=[xlen*f(1,num)+min(xmax,xmin);ylen*f(1,num)+min(ymax,ymin)]; 

  12:  

  13: end

  14:  

实验效果如下:

关于fisher判别的一点理解的更多相关文章

  1. R语言中Fisher判别的使用方法

    最近编写了Fisher判别的相关代码时,需要与已有软件比照结果以确定自己代码的正确性,于是找到了安装方便且免费的R.这里把R中进行Fisher判别的方法记录下来. 1. 判别分析与Fisher判别 不 ...

  2. opencv笔记5:频域和空域的一点理解

    time:2015年10月06日 星期二 12时14分51秒 # opencv笔记5:频域和空域的一点理解 空间域和频率域 傅立叶变换是f(t)乘以正弦项的展开,正弦项的频率由u(其实是miu)的值决 ...

  3. 对socket的一点理解笔记

    需要学web service,但是在视频中讲解到了socket套接字编程.以前貌似课上老师有提过,只是没用到也感觉乏味.现在遇到,自己看了些博客和资料.记录一点理解,不知正确与否. 首先说这个名字,叫 ...

  4. iOS 的一点理解(一) 代理delegate

    做了一年的iOS,想记录自己对知识点的一点理解. 第一篇,想记录一下iOS中delegate(委托,也有人称作代理)的理解吧. 故名思议,delegate就是代理的含义, 一件事情自己不方便做,然后交 ...

  5. 关于web开发的一点理解

    对于web开发上的一点理解 1 宏观上的一点理解 网页从请求第地址 到获得页面的过程:从客户端(浏览器)通过地址 从soket把请求报文封装发往服务端   服务端通过解析报文并处理报文最后把处理的结果 ...

  6. angular.js的一点理解

    对angular.js的一点理解 2015-01-14 13:18 by MrGeorgeZhao, 317 阅读, 4 评论, 收藏, 编辑 最近一直在学习angular.js.不得不说和jquer ...

  7. RxSwift 入坑好多天 - 终于有了一点理解

    一.前言 江湖上都在说现在就要赶紧学 swift 了,即将是 swift 的天下了.在 api 变化不大的情况下,swift 作为一门新的语言,集众家之所长,普通编码确实比 oc 要好用的多了 老早就 ...

  8. rt-thread中动态内存分配之小内存管理模块方法的一点理解

    @2019-01-18 [小记] rt-thread中动态内存分配之小内存管理模块方法的一点理解 > 内存初始化后的布局示意 lfree指向内存空闲区首地址 /** * @ingroup Sys ...

  9. rt-thread中软件定时器组件超时界限的一点理解

    @2019-01-15 [小记] 对 rt-thread 中的软件定时器组件中超时界限的一点理解 rt_thread_timer_entry(void *parameter)函数中if ((next_ ...

随机推荐

  1. MySQL基础操作命令

    MySQL基础操作命令 1. 查看MySQL进程 ps -ef|grep mysql |grep -v grep 2. 查看MySQL端口 ss -lnt | grep 3306 3. MySQL的启 ...

  2. nginx服务器配置多域名

    nginx服务器支持配置多站点,我们可以通过配置子域名让你的一个域名下放置多个项目. 那么如何实现这个过程呢? 网络上的许多方案,有些写的过于繁杂,有些则是配置有误,或者说,有些配置项是要根据自己的主 ...

  3. 利用Unicode属性移除文本中的标点符号

    原文:http://bbs.csdn.net/topics/270033191   摘抄: str = str.replaceAll("[\\pP‘’“”]", "&qu ...

  4. DataSnap数据库连接池,数据集对象池的应用

    传统的应用服务器的开发往往是在ServerMethods单元中拖放一堆TDataSet, TDaTaSetProvider控件,这是一个最简单粗暴的开发方向,往往会造成服务端程序文件的臃肿.服务运行期 ...

  5. 使用 Visual Studio Team Test 进行单元测试和java中的测试

    C#中test测试地 方法一. 1.从NUnit官网(http://www.nunit.org/index.php)下载最新版本NUnit,当前版本为NUnit2.5.8. 2.安装后,在VS2008 ...

  6. 小课堂Week11 会说话的代码

    小课堂Week11 会说话的代码 今天主要讨论下,在编码过程中和"命名"相关的问题.因为命名方法比较自由,如果要提高可读性,我们需要尽量使其符合正规的英文语法习惯. 变量/属性 通 ...

  7. Spark菜鸟学习营Day5 分布式程序开发

    Spark菜鸟学习营Day5 分布式程序开发 这一章会和我们前面进行的需求分析进行呼应,完成程序的开发. 开发步骤 分布式系统开发是一个复杂的过程,对于复杂过程,我们需要分解为简单步骤的组合. 针对每 ...

  8. 试图使用未在此报表服务器中注册或此版 Reporting Services 不支持的数据扩展插件“Devart.Data.PostgreSql”

    数据源用的是Postgresql 我在Deploy Report的时候出现这条ErrorMessage Error 2 试图使用未在此报表服务器中注册或此版 Reporting Services 不支 ...

  9. left join 过滤条件写在on后面和写在where 后面的区别

    create table t1(id int, feild int);insert into t1 values(1 , 1);insert into t1 values(1 , 2);insert ...

  10. 分析 "ADO" "ADODB" "ADODC" 之间的区别与联系

    在敲学生信息管理系统的时候,通过查阅了解了一些关于 ADO / ADODB / ADODC / 的简单描述,想想将他们对 比着总结一下更容易理解记忆.尽管都是一些浅显的东西,不过对像我这样的菜鸟们还是 ...