博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】LDA-linear discriminant analysis
阅读量:5135 次
发布时间:2019-06-13

本文共 2360 字,大约阅读时间需要 7 分钟。

分类问题也可以用降维来理解,比如一个D维的数据点x,我们可以采用下面的映射进行线性的降维,

 

y=θTx

 

在计算出y后,就可以选择一个阈值h,来进行分类。正如我们在前面的PCA模型中看到的,降维会有信息的损失,可能会在降维过程中,丢失使数据可分的特征,导致分类的效果不理想。

 

那采用什么样的降维方式,可以尽量的在低维空间中保存原来数据在高维空间中的可分性(区分类别的特征)。一个常用的模型 linear discriminant analysis(LDA)就是用来做这个工作的,下面就具体的看一下LDA模型。

原理

LDA的基本原理就是最大化类间方差(between-class variance)和类内方差(within-class variance)的比率(注意这个variance用来理解,下面用到的定义实际上是variance的一个变形),使得降维后数据有最好的可分性。如果偷用软件工程里面用的术语的话,就是“高内聚,低耦合”,类内的数据内聚,方差小,而类间数据松散,方差大。通常来说,这要比只考虑类间的距离越大要好,如下图所示:

左边图只是考虑最大化每个类期望的最大距离,我们看到有很多点投影后重合了,丧失了标签信息;而右边是LDA投影,重合的点的数目减少了很多,能更好的保存标签信息。

模型

下面我们就来形式化这个过程,首先如何定义between-class variance和within-class variance?在Fisher提出的方法中,没有使用统计中标准的variance的定义,而是使用了一个称为scatter的概念,与variance时等价的,使用这个概念可能是为了后面的推导简洁。设数据集为X=x1,x2,..,xN,则scatter的定义为:

 

s=n=1N(xnm)T(xnm)

 

其中,m=1NNn=1xn

类内方差很容易形式化,可以直接使用scatter来定义,然后把所有类别的scatter连加;那么类间的方差如何定义才能很好的让类之间的数据分的更开呢?当然应该有很多的数学关系很描述,在LDA中使用了下面这种方式,计算每个类别的期望,求期望之间的距离。先从简单的两类情况开始,然后拓展到多类的情况。

两类

设数据集合为X={

x1,x2,..,xN},类别为C1,C2,则这两类的数据期望为m1,m2,计算公式如:

 

mk=1NkiCkxi

 

mk表示投影后的数据点的期望,则between-class variance的形式化定义为:

 

m2m1=θT(m2m1)

 

其中,mk=θTmk。within-class variance用within-scatter这个定义来表示,scatter是variance的变种(不用除以数据的数目),第Ck类的scatter定义为:

 

S2k=iCk(yimi)2

 

其中,yi=θTxi。这样就可以得到目标函数:

 

J(θ)=(m2m1)2s21+s22

 

将上面的定义代入上式,可以得到式子:

 

maxargθJ(θ)=θTSBθθTSWθ

 

其中,SB,SW分别称为between-class scatter和within-class scatter,表示如下:

 

SB=(m2m1)(m2m1)T;SW=S1+S2

 

其中,Sk=iCk(ximk)(ximk)T。下面要做的就是最优化目标函数(xmk),对上面的式子求导数,让导数为0,则可以得到:

 

(θTSBθ)SWθ=(θTSWθ)SBθ

 

由于投影操作,我们只关心θ的方向,上面的式子,可以去掉(θTSBθ),(θTSWθ),根据SB的定义,SBθ的方向与(m2m1)一致,我们可以得到:

 

θS1W(m2m1)

 

这个式子称为Fisher’s linear discriminant[1936],尽管这个式子不是一个判别式,只是选择了投影方向,不过只要我们选择一个阈值,然后就可以根据这个阈值进行分类了。(ps:使用求解generalized eigenvalue problem的方法求解导数为零的等式,也可以得到这个判别式)

多类

在多类问题时,将D维的向量x投影到M<D维的y,投影矩阵方程为:

 

y=ΘTx

 

可以参照PCA文章中提到投影公式,这里Θ是一个投影矩阵,每一个列向量表示一个投影方向Θk

设数据集合为X={

x1,x2,..,xN},类别为C1,C2,..,CK。在多类的时候,过程与上面一样,不过由于between-class scatter 和within-class scatter不再是标量,需要更改一下我们需要优化的目标函数。首先看一下在原空间x的定义,然后就可以类比到y空间。

withinin-class scatter 与二类时的定义一样,如下表示:

 

SW=k=1KiCk(ximk)(ximk)T

 

mk定义与上面一致。

between-class scatter的定义,这里我们根据PRML里面论述的,首先定义一个ST,然后根据ST=SB+SW,然后分解得到SBST的定义类似Sk,不过不在一个类别,而是在所有的数据集上进行计算。

 

ST=n=1N(xnm)(xnm)Tm=1Nn=1Nxn=1Nk=1KNkmk

 

所以得到:

 

SB=======STSWn=1N(xnm)(xnm)Tk=1KiCk(ximk)(ximk)Tk=1KiCk(xim)(xim)Tk=1KiCk(ximk)(ximk)Tk=1KiCk{
(xim)(xim)T

转载于:https://www.cnblogs.com/zhanjxcom/p/4161926.html

你可能感兴趣的文章
list control控件的一些操作
查看>>
精读《useEffect 完全指南》
查看>>
SNF快速开发平台MVC-EasyQuery-拖拽生成SQL脚本
查看>>
DrawerLayout实现双向侧滑
查看>>
MySQL入门很简单-触发器
查看>>
LVM快照(snapshot)备份
查看>>
绝望的第四周作业
查看>>
一月流水账
查看>>
数论四大定理
查看>>
npm 常用指令
查看>>
20几个正则常用正则表达式
查看>>
TextArea中定位光标位置
查看>>
非常棒的Visual Studo调试插件:OzCode 2.0 下载地址
查看>>
判断字符串在字符串中
查看>>
hdu4374One hundred layer (DP+单调队列)
查看>>
类间关系总结
查看>>
properties配置文件读写,追加
查看>>
Linux环境下MySql安装和常见问题的解决
查看>>
lrzsz——一款好用的文件互传工具
查看>>
ZPL语言完成条形码的打印
查看>>