详细解说LDA线性判别分析方法_lda如何查看判断规则-程序员宅基地

技术标签: 机器学习  LDA  线性判别分析  类内、类间散度  

转载原文网址:LDA 线性判别分析

LDA, Linear Discriminant Analysis,线性判别分析。注意与LDA(Latent Dirichlet Allocation,主题生成模型)的区别。

1、引入

  上文介绍的PCA方法对提取样本数据的主要变化信息非常有效,而忽略了次要变化的信息。在有些情况下,次要信息可能正是把不同类别区分开来的分布方向。简单来说,PCA方法寻找的是数据变化的主轴方向,而判别分析寻找的是用来有效分类的方向。二者侧重点不同。在图1.1可以看出变化最大的方向不一定能最好的区分不同类别。

图1.1 用PCA和LDA对数据进行投影

2、LDA算法分析

  LDA算法主要用来对样本进行分类,其分类的核心思想是:将高维样本数据投影到最佳分类的向量空间,保证在新的子空间中,有更大的类间距离和更小的类内距离。

  设样本数据为:,将原始样本经过w变换后变成了z,其中,变换规则为:

  变换的目的在于使得同一类的样本被w作用后距离更近,不同类的样本被w作用后距离更远。为了能更好的度量类内距离和类间距离,我们先定义中心点,即均值,设Xi为类别ci的样本数据的集合,则Xi的中心点为:

  Ni为类别ci的样本数,即Xi的数目。

  此中心点经过w变换后得到的中心点为:

  即样本集Xi的中心点的投影为Xi中各元素投影后的均值。

  现在,我们需要使得投影之后同类之间样本距离更小,而不同类之间的样本距离越大。为此,我们通过定义类间距离和类内距离:

 

1)类内距离。

  类内距离主要用各样本点到该样本点所在类别的中心点的距离和来表示。我们使用散列度来表示一个类别的类内距离。对于投影之后类别为i的类内散列度(scatter,类似方差)为:

  其中Zi表示类别为i的所有样本集合。将上式进行变换得:

  为了使得表达式简介,令:

  所以有:

  上式只是一个类别的散列度,若将所有类别的散列度相加,便得到整个样本的类内离散度:

  将上式进行整理:

  令:

  所以:

  其中,Sw被称为类内散度矩阵。

 

2)类间距离。

类间距离主要通过两个类之间的中心点距离来衡量。但是当类别很多时如何计算类间距离呢?下面分别进行分析。

A)只有两个类别时。假设两个类别样本数据分别为z1,z2,此时,类间离散度为:

其中,

将上式整理成只包含x的式子:

令:

于是:

其中,SB被称为类间散度矩阵。

B)有多个类别时。根据只有两个类别的情况,我们很容易可以得到类间离散度为:

此时共有c(c-1)/2项的求和,时间复杂度为O(c2)。

通过上式,我们可以求得相应的类间散度矩阵为:

可能是这种方法复杂度太高,故而LDA并没有使用这种方法来计算多类别的类间离散度,而是采用了一种比较间接的方式。首先定义X的整体散度矩阵,

样本集的整体散度为类间散度和类内散度之和:

于是类间散度可是使用下式来进行计算:

现在我们对上式进行推导:

为了更加清楚的求解上式,我们将里面的求和搬出来进行分析:

将上式代入上上式得:

同样,最终得到类间散度为:

SB:为类间散度矩阵。

至此,我们已经得到了类内散度JW和类间散度JB,现在可以使用这两个散度来构造目标函数J(w):

  现在,我们需要求得目标函数最大时的w,因为这时通过w映射后的样本数据具有最佳的类间距离和类内距离。从目标函数可以看出。当w成倍的放大或缩小时,目标函数保持不变,因而我们通过目标函数最大只能得到w的方向。为了使得计算简单,我们假设分母的值为1,即:

首先,上式的计算结果是一个数,而不是一个向量或矩阵,于是我们可以设为:

即:

于是有:

因为我们最终求得的w的大小是可以随意的,只是方向是确定的,因此,我们将上面的分母设为1是合理的。

这时我们将原问题转化成了有约束的最优化问题:

看到此问题毫不犹豫的想起了用了无数次的拉格朗日定理,于是,我们使用拉格朗日乘子得:

对w求导:

令导数为零:

  上式中的Sw若可逆则可以直接移到等式左边,但是当样本维数较高,而样本数较少时,这时的Sw可能为奇异矩阵。此时可以考虑先使用PCA对样本进行降维,然后再对降维后的数据使用LDA。

在此,先假设Sw是可逆的,则有:

  这就是传说中的Fisher Linear Discriminantion公式。其实FLD和LDA在很多情况下可以互换。

  现在,我们可以看出w为上面式子的特征向量,而我们需要的w为特征值最大时所对应的特征向量。特征值最大,意味着在对应的特征向量上的变化最大。

  上式的不一定是对称矩阵,在求它的特征向量时不能使用奇异值分解,这样就只能使用普通的求特征向量的方式,普通的方式时间复杂度为O(n3),

  于是我们对上式中的SBw进行分析得到:

  于是:

  至此,我们已经得到了样本的最佳映射w,w=(w1,w2,…,wd’),当我们将样本集x使用w进行映射后得到了具有最佳分类效果的样本z。

 

3、LDA分类

  那么在最佳的分类空间如何对样本进行分类?

  1)对二分类问题。由于只有两个类别,在经过上面的求解后,最后所有样本将会映射到一维空间中,设两个不同样本映射后的中心点分别为,我们将两个类别的中心点之间中心点作为分类点。

  最后,我们将的x分为一类,其他的分为另一类。

  2)对多分类问题。通过LDA方法最终将原始数据映射到c-1个维度上,现在我们需要在这c-1个维度上将样本集分成c类。这个怎么分呢?本人暂时也不知道,能想到的只是将问题转化为二分类问题。实际上,对于多类的情况主要考虑用来降维。

  对于此类问题,我们主要将它转化为二分类来处理,我们使用一对其余的方法。简单来说就是先将所有c类样本分成1和2~c,然后再将2~c分为2和3~c,以此类推,直到完全分开。

 

3、维度分析和总结

         上面我们将原样本的维度从d维降到了d’(此时使用d’来表示,d’<d)。那么d’到底最大是多少呢?因为特征向量是通过而求出,所以特征向量的维数d’不会大于的秩。而SB的秩

  而:

  存在线性组合使得:

  所以有:

  因此:

  所以通过LDA算法进行映射的最终空间维度不会超过c-1个维度。当只有两个类别时,那么就只能将其投影到一维的空间中进行分类。

  在我们进行多分类时,并不是真的直接在c-1个维度上将样本分成c类,而是拆分成二分类的情况来进行分类。而我们千辛万苦推导出来的多分类的情形主要用来降维。

  另外,本人认为应该可以在c-1个维度上对c个类别的样本进行划分,只是本人尚未发现好的方法!

  在实际应用中,LDA算法表现出来的效果相比其他方法并不十分理想(一般情况下)。并且还可能会出现过拟合的情况。但是LDA算法的这种数学思想非常值得学习研究!

 

参考文献:

[1] Richard O. Duda, 模式分类

[2] peghoty, http://blog.csdn.net/itplus/article/details/12038357

      http://blog.csdn.net/itplus/article/details/12038441

[3] http://www.cnblogs.com/cfantaisie/archive/2011/03/25/1995849.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lqzdreamer/article/details/79596011

智能推荐

Docker 快速上手学习入门教程_docker菜鸟教程-程序员宅基地

文章浏览阅读2.5w次,点赞6次,收藏50次。官方解释是,docker 容器是机器上的沙盒进程,它与主机上的所有其他进程隔离。所以容器只是操作系统中被隔离开来的一个进程,所谓的容器化,其实也只是对操作系统进行欺骗的一种语法糖。_docker菜鸟教程

电脑技巧:Windows系统原版纯净软件必备的两个网站_msdn我告诉你-程序员宅基地

文章浏览阅读5.7k次,点赞3次,收藏14次。该如何避免的,今天小编给大家推荐两个下载Windows系统官方软件的资源网站,可以杜绝软件捆绑等行为。该站提供了丰富的Windows官方技术资源,比较重要的有MSDN技术资源文档库、官方工具和资源、应用程序、开发人员工具(Visual Studio 、SQLServer等等)、系统镜像、设计人员工具等。总的来说,这两个都是非常优秀的Windows系统镜像资源站,提供了丰富的Windows系统镜像资源,并且保证了资源的纯净和安全性,有需要的朋友可以去了解一下。这个非常实用的资源网站的创建者是国内的一个网友。_msdn我告诉你

vue2封装对话框el-dialog组件_<el-dialog 封装成组件 vue2-程序员宅基地

文章浏览阅读1.2k次。vue2封装对话框el-dialog组件_

MFC 文本框换行_c++ mfc同一框内输入二行怎么换行-程序员宅基地

文章浏览阅读4.7k次,点赞5次,收藏6次。MFC 文本框换行 标签: it mfc 文本框1.将Multiline属性设置为True2.换行是使用"\r\n" (宽字符串为L"\r\n")3.如果需要编辑并且按Enter键换行,还要将 Want Return 设置为 True4.如果需要垂直滚动条的话将Vertical Scroll属性设置为True,需要水平滚动条的话将Horizontal Scroll属性设_c++ mfc同一框内输入二行怎么换行

redis-desktop-manager无法连接redis-server的解决方法_redis-server doesn't support auth command or ismis-程序员宅基地

文章浏览阅读832次。检查Linux是否是否开启所需端口,默认为6379,若未打开,将其开启:以root用户执行iptables -I INPUT -p tcp --dport 6379 -j ACCEPT如果还是未能解决,修改redis.conf,修改主机地址:bind 192.168.85.**;然后使用该配置文件,重新启动Redis服务./redis-server redis.conf..._redis-server doesn't support auth command or ismisconfigured. try

实验四 数据选择器及其应用-程序员宅基地

文章浏览阅读4.9k次。济大数电实验报告_数据选择器及其应用

随便推点

灰色预测模型matlab_MATLAB实战|基于灰色预测河南省社会消费品零售总额预测-程序员宅基地

文章浏览阅读236次。1研究内容消费在生产中占据十分重要的地位,是生产的最终目的和动力,是保持省内经济稳定快速发展的核心要素。预测河南省社会消费品零售总额,是进行宏观经济调控和消费体制改变创新的基础,是河南省内人民对美好的全面和谐社会的追求的要求,保持河南省经济稳定和可持续发展具有重要意义。本文建立灰色预测模型,利用MATLAB软件,预测出2019年~2023年河南省社会消费品零售总额预测值分别为21881...._灰色预测模型用什么软件

log4qt-程序员宅基地

文章浏览阅读1.2k次。12.4-在Qt中使用Log4Qt输出Log文件,看这一篇就足够了一、为啥要使用第三方Log库,而不用平台自带的Log库二、Log4j系列库的功能介绍与基本概念三、Log4Qt库的基本介绍四、将Log4qt组装成为一个单独模块五、使用配置文件的方式配置Log4Qt六、使用代码的方式配置Log4Qt七、在Qt工程中引入Log4Qt库模块的方法八、获取示例中的源代码一、为啥要使用第三方Log库,而不用平台自带的Log库首先要说明的是,在平时开发和调试中开发平台自带的“打印输出”已经足够了。但_log4qt

100种思维模型之全局观思维模型-67_计算机中对于全局观的-程序员宅基地

文章浏览阅读786次。全局观思维模型,一个教我们由点到线,由线到面,再由面到体,不断的放大格局去思考问题的思维模型。_计算机中对于全局观的

线程间控制之CountDownLatch和CyclicBarrier使用介绍_countdownluach于cyclicbarrier的用法-程序员宅基地

文章浏览阅读330次。一、CountDownLatch介绍CountDownLatch采用减法计算;是一个同步辅助工具类和CyclicBarrier类功能类似,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。二、CountDownLatch俩种应用场景: 场景一:所有线程在等待开始信号(startSignal.await()),主流程发出开始信号通知,既执行startSignal.countDown()方法后;所有线程才开始执行;每个线程执行完发出做完信号,既执行do..._countdownluach于cyclicbarrier的用法

自动化监控系统Prometheus&Grafana_-自动化监控系统prometheus&grafana实战-程序员宅基地

文章浏览阅读508次。Prometheus 算是一个全能型选手,原生支持容器监控,当然监控传统应用也不是吃干饭的,所以就是容器和非容器他都支持,所有的监控系统都具备这个流程,_-自动化监控系统prometheus&grafana实战

React 组件封装之 Search 搜索_react search-程序员宅基地

文章浏览阅读4.7k次。输入关键字,可以通过键盘的搜索按钮完成搜索功能。_react search