Linear Discriminant Analysis(LDA)

好久没有整理最近的一些算法了,今天趁着跑数据的过程整理一下LDA算法。该算法在很多地方都有使用:语音识别,说话人识别等等,那么今天在这里就为大家详细介绍一下,最终把matlab代码放在我的git上,有兴趣的可以去看一下,好了不多说,直接进入主题。

 

首先介绍一下LDA到底是什么?LDA是一种降维的方法,一提到降维,大家应该很熟悉PCA。那么PCA和LDA的区别是什么呢?我们简单的理解可以理解为PCA是获取那些数据能量集中的子空间,用《模式分类》中的例子:手写字母识别中,Q和O利用PCA能够发现两个字母的相似之处,却很可能把区分字母Q和O的那撇特征去掉。而LDA却不同,它也是是获取一个子空间,在这个子空间中:同类的数据会集中,不同类的数据则分散开来,所以从这个角度来看LDA更适合于分类的任务。那么上面大家对LDA有了一个整体的了解,下面我开始讲解LDA,这里会参照《模式分类》这本书,不过会穿插我的理解,方便大家一步步跟进,那么我们开始。

 

假设我们有n个d维度的样本:x1,x2,....xn,他们分别属于两个不同的类别,即其中大小为那n1的样本属于类别1,大小为n2 的样本属于类别2【假设我们只有两大类】.如果对x中的各个成分做线性组合,就会得到一个点积,结果就是一个标量:

Linear Discriminant Analysis(LDA)

Linear Discriminant Analysis(LDA)

那么全部的n个样本x1,x2,....xn就产生n个结果y1,y2,....yn。这些结果不是属于类别1就是属于类别2。从几何上说,当||w||=1的时候,那么每个yi就是把xi向着方向w的直线进行投影的结果【为什么这么说,大家可以查一下投影矩阵,看他的公式和意义】。那么根据我们上面讲过的LDA的思想,我们希望w有着以下这种功效:我们希望x经过w的映射后形成两个显著分开的聚类【这句话意味着不同类分散开,同类聚集在一起】。当我们把此LDA用作分类的时候,其实也就是需要两步:1. 确定w 2. 确定一个阀值,当低于阀值属于类别1,当高于阀值属于类别2.

 

那我们首先就来确定最佳的直线方向w,以达到最好的分类效果。以下是思路过程:

Linear Discriminant Analysis(LDA)

Linear Discriminant Analysis(LDA)

【PS:请你们自动忽略字体,我用的是草体,这绝不是乱,嗯~】

那么我们继续,把w变量引入:

Linear Discriminant Analysis(LDA)

Linear Discriminant Analysis(LDA)

这其实是一个广义特征值分解的问题,使得J最大的w必须满足:

Linear Discriminant Analysis(LDA)

Linear Discriminant Analysis(LDA)

我们左乘Sw^-1,得到:

Linear Discriminant Analysis(LDA)

Linear Discriminant Analysis(LDA)

 

因为我们只有两类,所以没有必要把Sw^-1*SB的特征值真的分解,SB*W的总是位于m1-m2的方向上,w的模的大小我们并不关心,只关心其方向,所以:

Linear Discriminant Analysis(LDA)

Linear Discriminant Analysis(LDA)

以上就是关于LDA在二分类情况下求解w的过程,关于阀值的判断我们不进行讨论。那么下面引入了新的问题:如何处理多分类的情况?

Linear Discriminant Analysis(LDA)

Linear Discriminant Analysis(LDA)

最后我把我的实现放在我的git上,并不难,主要是一个公式转代码的思想,这个很重要:https://github.com/mahuichao/MatlabWorkSpace