zoukankan      html  css  js  c++  java
  • 模式识别算法之1----Fisher线性判别

    思想:多维 --> Fisher变换 --> 利于分类的一维


    1.已知:
     
    给定n维训练模式 x1,x2,...,xn,其中有N1和N2个模式分属w1和w2类(N1+N2=N),分别记为{xj_(1)}和{xj_(2)}
     
    2.目标:
     
    我们希望通过Fisher变换之后,同一类的模式向量“距离”更近,而类之间的“距离”更远,这样达到更容易区分的目的。
    同一类的模式向量“距离”:类内离散度矩阵(类内离差阵)
    类之间的“距离”:类间离散度矩阵(类间离差阵)
     
    3.变换前的类内离散度矩阵和类间离散度矩阵
     
    变换前的类内离散矩阵Swi=sum_j(xj_(i)-mi)(xj_(i)-mi)'
                
    其中mi=1/Ni sum (xj_(i))是各类的模式均值矢量。所以类内离散度矩阵实际上就是各模式矢量在各维度的协方差矩阵。
     
    总的类内离散度矩阵为各个类内离散度矩阵相加,如果只考虑两个类的话:Sw=Sw1+Sw2;
     
    变换前的类间离散度矩阵:SB=(m1-m2)(m1-m2)'
     
    4.Fisher变换
     
    yj_(i)=u'*xj_(i)
    其中u就是变换矩阵,它的行数和x相同,而列数是新的维数
     
    5.变换后的类内离散度矩阵和类间离散度矩阵
     
    类内:Swi~=sum (yj_(i)-mi~)(yj_(i)-mi~)'
              =sum(u'*xj_(i)-u'*mi)(u'*xj_(i)-u'*mi)'
              =u'*Swi*u
    总类内: Sw~=u'*Sw*u
    类间:  SB~=u'*SB*u
     
    6.Fisher判别函数
     
    JF(u)=SB~/Sw~=(u'*SB*u)/(u'*Sw*u)
    这个值越大,说明变换后越容易区分(求导后应该是一个矢量,如何有大小之分)
     
    让其对u求导(需要利用二次型对其矢量求导的公式):
    dJF/du=(2*(u'*Sw*u)*SB*u-2*(u'*SB*u)*Sw*u)/(u'*Sw*u)^2=NON(表示空)
    令 lamda=u'*Sb*u/u'*Sw*u,则 (lamda是标量。为什么?)
    SB*u=lamda*Sw*u
     
    7.u的求解
    当N较大时,Sw通常是非奇异的:(|Sw|~=0,即 Sw是可逆的)
    Sw^-1*SB*u=lamda*u
    于是演变为求特征值和特征向量的情况
     
    上式展开:
    Sw^-1*(m1-m2)*(m1-m2)'*u=lamda*u
     
    考虑到(m1-m2)'*u=a(a是标量),而且我们只关心u的方向,而不关心大小:
    u=Sw^-1*(m1-m2)

     

  • 相关阅读:
    从代码书写理解指针,很重要
    指针参数 引用参数
    [转载]c/c++ 操作sqlite
    [转载]C#.NET DataTable扩展 ToList/Get/OrderBy/Where/ToPage
    [转载]宏定义
    【转载】scanf,sscanf高级用法
    C开发机顶盒实战应用代码片段
    指针精华口诀,短小精悍
    C# linq泛型 字典集合 排序
    c开发机顶盒实战应用代码片段2
  • 原文地址:https://www.cnblogs.com/Iknowyou/p/3445319.html
Copyright © 2011-2022 走看看