LDA 降维原理

前面对 LDA 作为作为分类器 有详细推导, 其核心就是 贝叶斯公式, 已知全概率, 求(条件概率)最大先验概率, 类似的问题. 而 LDA 如果作为 降维 的原理是:

a. 将带上标签的数据点, 通过投影, 投影到维度更低的空间中,

b. 使得投影后的点, 同类别会"内聚", 不同类别会 "分隔开",

类似写代码的"高内聚, 低耦合". 注意是要 带标签的点, 不同于 PCA 值考虑 X 降维, y 不考虑. 直观上来理解还是比较容易的, 但怎么去确定投影方向, 这就不好弄了.

假设, 先计算不同类别数据的中心 (这里假设2维, 方便可视化). 如果将数据直接投影到连接中心的向量 w 上(降维), 会发现有重叠, (脑补吧, 不想贴图).

最近我有个奇怪的观点: 理解一个抽象概念, "数形结合" 在某种程度上, 反而不利于直观理解.

比如, 多维下, 是很难可视化的, 而此时的脑图像, 可能还是停留在 2维度, 因而总感觉, "很抽象"

其实,

我认为,

最好理解抽象概念的方式

回到抽象概念自身, 从规则, 从内部结构, 从定义去理解, "而非画个图", 低维可以, 高维凉凉了.

比如, 理解 "向量空间", 就不要画什么坐标性, 箭头之类的, "技术层", 多花心思去理解内部结构 加和数乘, 这样的 思想层.

这样就会导致,原来可以线性分割的的数据, 降维后无法分割了. 因此, 类别中心点连线作为 投影线, 是不行的哦.

那么, 最优的投影线要如何确定, 这就是接下来的求解问题

LDA 降维推导

Fisher's 线性降维

  • 不同类别, 降维后, 类与类之间, 差异大
  • 同一类别, 降维后, 类中数据点, 差异小

自然语言是很好描述的, 如何转为数学语言, 这其实是很有趣味的问题, 突然想到一句很有感触的一句话:

"相比于解决问题, 最难的其实是发现(定义)问题"

不扯了, 直接来吧, 宝贝~ 假设 样本 X 有大 K 个类别, 各个类别(矩阵)的中心 (均值向量) 为 \(\mu_1, \mu_2, ...\mu_k\)

首先,

来描述, 不同类别的 均值 和全局的 均值 之间的 "差异总量" 有多大, 得到一个矩阵

\(S_B = \sum \limits_{k=1}^K(\mu_k - \bar x) (\mu_k - \bar x)^T\)

都是列向量哦, 最后得到一个矩阵, B: 类别间 Between

然后,

来描述, 同一类别中, 各样本点 与 该类的 "中心点" , "距离" 有多大, 同样得到一个矩阵

\(\sum \limits_{i =1}^{n} (x_i - \mu_k)(x_i -\mu_k)^T\)

注: 我这里 n 表示 类别为 k 的 样本数, 是动态变化的哈,非 总体样本数哈

考虑所有类别, 各类之间的样本点差异 "总量", 就再 外层对 k求和, 即:

\(S_W = \sum \limits _{i=1}^K \sum \limits_{i =1}^n (x_i - \mu_k)(x_i -\mu_k)^T\)

W: 同类间的样本点, Within

目标: 其实就是想 找到一个 最优的 投影方向, 即一个向量

又理解了一波向量: 大小即其长度(模), 方向即, 与基坐标原点的连线方向. 二维下即可用 与某轴 的 "夹角" 衡量

\(max _w \ J(w) = \frac {w'S_Bw}{w'S_Ww}\)

\(w'\) 也表示 \(w^T\). 对应向量/矩阵来说, ' 表示转置, 对应函数来说表示 求导

w 的不同数值, 即表示了不同方向的 投影线 (向量的方向)

"组间大,组内小" , 即上式的 分母要尽可能大,分子相对下, 则总体是以最大化问题 ,关于投影线(向量) w 的函数 J(w).

w 向量是可以任意取值的, 为了尽快求解, 可以对 w 做一个条件约束:

\(w'S_ww =1\)

为啥要分子 为1 而不出2,3,4 呢? 其实也可以, 1感觉比较好看 嗯.

为啥能对w约束? \(S_w\) 是已知的嘛, 如果 \(S_w\) 很大, 那 w 必然很小, 瞧, 约束上了

约束的是在干啥? 控制 w 的大致方向范围, 不要人生, 没有方向

转为带约束的最小值问题 ( - 最大 = 最小 )

\(min_w \ J(w) =- \frac{1}{2} w'S_Bw\)

\(s.t. \ w'S_ww = 1\)

引入拉格朗日函数

\(L(w) = - \frac {1}{2} w'S_B w+ \frac {1}{2} \lambda (w'S_ww-1)\)

后面的 \(\frac {1}{2}\) 是为了求导后形式更好看一点, 没啥实际意义

对 w 求偏导, 让其值 为0

\(\nabla_w = 0 = -S_Bw + \lambda S_ww\)

矩阵求导, 网查的, 具体也不太理解和会

即: \(S_Bw = \lambda S_ww\)

等号两边同时 左乘 \(S_w^{-1}\) 即:

\(S_w^{-1} S_B w = \lambda w\)

兄弟们, 这个形式, 形如 "\(Ax = \lambda x\)" 不就是特征分解嘛 (方向平行, 做拉伸变换对向量), 严格来说,

如果 \(S_w^{-1} S_B\) 是对称矩阵, 则 求解 w 则是一个特征分解问题, 但如果 不是对称矩阵呢, 问题就变为了广义特征向量问题了哦.

由于 \(S_B\) 是正交正定矩阵, (先不证明了哈) , 对 \(S_B\) 做特征分解, 可得:

S_B 跟协方差差不多的, 这里证明下协方差是半正定的

协方差阵定义为: \(\Sigma = E[(X-\mu)(X-\mu)^T]\)

只需证明对于任意非零向量 z, 满足:

\(z^T\Sigma z \ge 0 即可\)

\(z'\Sigma z = z' E[(X-\mu)(X-\mu)^T]z\)

\(= E[z'(X-\mu)(z'(X-\mu))^T]\)

\(=E[z'(X-\mu)]^2 \ge 0\)

期望必然是非负, 即证协方差是 半正定

\(S_B = S \land S^{-1} = Q \land Q'\)

矩阵性质: if X 是正交的

\(S_B ^{\frac {1}{2}} = Q \land ^{\frac {1}{2}}Q'\), \(\land\) 是一个对角阵, 就是只有主对角线有值的矩阵.

因此,

\(S_B = S_B^{\frac {1}{2}} S_B^{\frac {1}{2}}\)

现在, 再定义 \(v = S_B ^{\frac{1}{2}} w\) 则对于之前的等式: \(S_w^{-1} S_B w = \lambda w\) 可写为

\(S_w ^{-1} S_B^{\frac {1}{2}} S_B^{\frac {1}{2}} w = \lambda w\)

将 v 代入得:

\(S_w^{-1} S_B ^{\frac {1}{2}} v = \lambda w\)

再两边 左乘 \(S_B^{\frac {1}{2}}\) 得:

\(S_B^{\frac {1}{2}} S_w^{-1} S_B ^{\frac {1}{2}} v = S_B^{\frac {1}{2}} \lambda w = \lambda v\)

简写一波, 令 \(A = S_B^{\frac {1}{2}} S_w^{-1} S_B ^{\frac {1}{2}}\) 其实 A 也是正定矩阵, 此时的形式, 又变为咱熟悉的形式:

\(Av = \lambda v, \ 其中 v = S_B^{\frac {1}{2}}w\)

为啥要弄一通转换? 就是为了求解 w 啊

然后对 A 进行特征分解, 找到 \(\lambda_k 和 v_k\) 后, (回得到很多配对的 \(\lambda_k, v_k\) 取几个大的不就行了吗)

对应的求解 w, 即找到了最佳的投影方向, 能满足 "高内聚, 低耦合"

\(w = (S_B^{\frac {1}{2}})^{-1}v_k\)

LDA vs PCA

  • PCA 的 投影线(方向) 是 使得数据点在只上的方差最大, 该投影线的垂直方向可作为类分割线, 不关注标签值

  • LDA 的 投影线(方向) 是 使得不同标签的点, 类别之间距离大, 同类之间的点距离小, 标签必须考虑

小结

连推了这两波LDA, 嗯...

作为, 线性分类器, 其核心思想, 就是 贝叶斯

作为, 降维工具, 其原理就是写代码风格的 高内聚, 低耦合

想想, 接下来, 扩展一波, 嗯 综合 LDA 先升维, 在分类 + 核函数技巧 , 琢磨一波....

LDA-作为线性判别 降维 推导的更多相关文章

  1. LDA(线性判别分类器)学习笔记

    Linear Discriminant Analysis(线性判别分类器)是对费舍尔的线性鉴别方法(FLD)的归纳,属于监督学习的方法. LDA的基本思想是将高维的模式样本投影到最佳鉴别矢量空间,以达 ...

  2. LDA-作为线性判别 分类器 推导

    LDA, 即 Linear Discriminant Analysis, 中文翻译为, 线性判别分析. 比较有趣的一点是:LDA 既可以直接用作分类算法, 也可作为特征降维的方法. 给人感觉, 这是将 ...

  3. 机器学习降维方法概括, LASSO参数缩减、主成分分析PCA、小波分析、线性判别LDA、拉普拉斯映射、深度学习SparseAutoEncoder、矩阵奇异值分解SVD、LLE局部线性嵌入、Isomap等距映射

    机器学习降维方法概括   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014772862/article/details/52335970 最近 ...

  4. PRML读书会第四章 Linear Models for Classification(贝叶斯marginalization、Fisher线性判别、感知机、概率生成和判别模型、逻辑回归)

    主讲人 planktonli planktonli(1027753147) 19:52:28 现在我们就开始讲第四章,第四章的内容是关于 线性分类模型,主要内容有四点:1) Fisher准则的分类,以 ...

  5. 【LDA】线性判别式分析

    1. LDA是什么 线性判别式分析(Linear Discriminant Analysis),简称为LDA.也称为Fisher线性判别(Fisher Linear Discriminant,FLD) ...

  6. 线性SVM的推导

    线性SVM算法的一般过程 线性SVM的推导 超平面方程 SVM是用来分类的.给定一系列输入数据(n维向量),需要找到一个切分界线(n-1维的超平面),这里假定数据是线性可分的.比如,二维数据的超平面是 ...

  7. 【线性判别】Fisher线性判别(转)

    今天读paper遇到了Fisher线性判别的变体, 所以来学习一下, 所以到时候一定要把PRMl刷一遍呀 以下两篇论文一起阅读比较好: 论文1: https://blog.csdn.net/Rainb ...

  8. 线性判别分析(LDA), 主成分分析(PCA)及其推导【转】

    前言: 如果学习分类算法,最好从线性的入手,线性分类器最简单的就是LDA,它可以看做是简化版的SVM,如果想理解SVM这种分类器,那理解LDA就是很有必要的了. 谈到LDA,就不得不谈谈PCA,PCA ...

  9. 线性判别函数-Fisher 线性判别

    这是我在上模式识别课程时的内容,也有参考这里. 线性判别函数的基本概念 判别函数为线性的情况的一般表达式 式中x是d 维特征向量,又称样本向量, 称为权向量, 分别表示为 是个常数,称为阈值权. 设样 ...

随机推荐

  1. O2O场景下的推荐排序模型:

    推荐系统遇上深度学习(五)--Deep&Cross Network模型理论和实践 发表: 2018-04-22 推荐系统遇上深度学习系列:推荐系统遇上深度学习(一)--FM模型理论和实践:ht ...

  2. nwjs-简介

    nwjs是基于nodejs的,它支持nodejs所有的api,主要用于跨平台轻量级桌面应用开发,运行环境包括32位和64位的Window.Linux和Mac OS nwjs是在英特尔开源技术中心创建的 ...

  3. cookie清除及其他操作

    JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的. 而cookie是运行在客户端的,所以可以用JS来设置cookie. 一:设置co ...

  4. C语言 某数输出二进制的某位

    如题: 输入一个整数,截取它对应的二进制位中从右到左的第8-11位(最右边为第0位). **输入格式要求:"%d" 提示信息:"请输入一个整数:" **输出格式 ...

  5. 【转】jsp 页面 按回车键 触发事件

    转载: https://blog.csdn.net/ludongshun2016/article/details/59536779. 第一种: <script type="text/J ...

  6. Spring IOC小记

    1. What IOC (Inversion Of Control,控制反转)与DI(Dependency Injecion,依赖注入) 用于对象间解耦,如在以前若对象A依赖B则需要在A中负责B的创建 ...

  7. 第09组 Beta冲刺(1/5)

    队名:观光队 链接 组长博客 作业博客 组员实践情况 王耀鑫 过去两天完成了哪些任务 文字/口头描述 任务分配 展示GitHub当日代码/文档签入记录 接下来的计划 完成短租车,页面美化 还剩下哪些任 ...

  8. python实现的WebSocket客户端

    code #coding=utf- import json import time from websocket import create_connection ws = create_connec ...

  9. c++性能测试工具:计算时间复杂度

    有时候除了测量算法的具体性能指数,我们也会希望测试出算法的时间复杂度,以便我们对待测试的算法的性能有一个更加直观的了解. 测量时间复杂度 google benchmark已经为我们提供了类似的功能,而 ...

  10. 基于Kafka的实时计算引擎如何选择?Flink or Spark?

    1.前言 目前实时计算的业务场景越来越多,实时计算引擎技术及生态也越来越成熟.以Flink和Spark为首的实时计算引擎,成为实时计算场景的重点考虑对象.那么,今天就来聊一聊基于Kafka的实时计算引 ...