LDA(线性判别分析)
LDA(线性判别分析)
1.LDA是什么
LDA是一种解决二分类问题的线性方法。它描述,对于给定样例集,将样例点投影到一条直线上,这条直线能使异样的样例相距远,同类的样例分布靠近,对于新的样例,根据在这条直线上的投影判断属于哪一类别。
因此我们的所有任务围绕确定直线展开。
2.问题背景
首先描述问题背景,这里直接引用西瓜书原话:
这里描述的是一个二分类问题。
那么如何理解投影?
3.投影
若已知向量$\vec{x}$和向量$\vec{w}$ ,求$\vec{x}$在向量$\vec{w}$上的投影,可以用内积表示:
$$
\vec{x} \cdot \vec{w} = |\vec{x}||\vec{w}|\cos {\theta}
$$
当w为单位向量,该投影为:
$$
|\vec{x}|\cos {\theta}
$$
因此在下图上,$y$表示target(标签),假设x与y有线性关系由参数集合$w$确定($y = wx + b,w^T = {w,b}*$)
则任意x在直线上的投影可以认为是x根据线性关系找到的y值,那么这个投影过程表示为:
$$
w^TX
$$
其中$x_i$在向量$X$方向上($X={X_1;X_2..;X_i}$)
4.离散度
前面提到需要使得“异样的样例相距远,同类的样例分布靠近”,因此我们需要一个衡量标准,异样的距离使用类间散度衡量,同样使用类内散度衡量
$ \ {\mu}_i$用来表示各类的均值,这里只有$\ {\mu_0},{\mu_1}$,分别表示正类和负类的均值。异类之间的距离使用均值在直线的投影的距离表示:
$$
||wT\mu_0-wT\mu_1||_2^2 = wT(\mu_0-\mu_1)(\mu_0-\mu_1)Tw
$$
这里下标2表示2类向量的模,即欧几里得距离
同类之间使用协方差比较距离:
$$
w^T(\Sigma_0 + \Sigma_1) w
$$
$\ {\Sigma}$为协方差矩阵
为了简化表示,我们引入两个新概念,类间散度矩阵和类内散度矩阵。
类间散度矩阵用$\ {S_b}$表示:
$$
S_b=(\mu_0-\mu_1)(\mu_0-\mu_1)^T
$$
类内散度矩阵用$S_w$表示:
$$
S_w= \Sigma_0+\Sigma_1
$$
5.目标函数
为了同时考虑”使同类样例的投影点尽可能接近,可以让同类样例投影点的协方差尽可
能小“,设置目标函数:
$$
J=\frac{wTS_bw}{wTS_ww}
$$
求这个目标函数的最大值可以转换为求$\ S_b$和$\ S_w$的”广义瑞利商“,这里使用拉格朗日乘子法求解,具体过程不在讨论范围。
$$
min\quad ω^TS_bw\
s.t.\quad w^TS_ww = 1 .
$$
最终求得$\ w = S^{-1}(\mu_0-\mu_1)$
6.推广到多分类
在多分类问题中,LDA一般作为降维方法进行属性约简。设target数量为N,$\mu$为所有数据的均值,$\ {\mu_i}$表示示属性i的均值,$m_i$表示第i属性的数据量。
首先定义”全局散度矩阵“:
$$
S_t=S_b+S_w=\sum_{i=1}m({x_i}-\mu)({x_i}-\mu)T
$$
$\ {S_w}$ 可以表示为:
$$
{S_w}i = \sum \Sigma_i = \sum_{x\in X_i} \ (x-\mu_i)(x-\mu_i)^T\
S_w = \sum_{i=1}^N S_{wi}
$$
$\ {S_b}$可以表示为:
$$
S_b=\sum_{i=1}Nm_i(\mu_i-\mu)(\mu_i-\mu)T
$$
推导参考:
多分类 LDA 可以有多种实现方法,使用 $S_w$, $S_t$ 两者中的任何两个即可。常见的一种实现是采用优化目标
$$
max_W{\frac{tr(WTS_bW)}{tr(WTS_wW)}}
$$
$tr(\cdot)$表示矩阵的迹(trace)即矩阵对角线上元素的和,我们在LDA中要做的是找到一个投影矩阵$W$,使得这个比值最大化。
该式可以转换为一个最大广义特征值的问题的求解:
$$
S_bW=\lambda S_wW
$$
$W$的闭式解则是 $S_w ^{-1}S_b$_的N-1个最大广义特征值所对应的特征向量组成的矩阵,即我们要求的投影矩阵
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通