机器学习算法直观解释及数学原理手把手推导2——Fisher线性判别分析(LDA/FLD)
文章目录
本文旨在提供对线性判别分析方法(以下简称LDA)全面通俗的解释,并且会在几个知识需求层面进行分类,对于不同需求我会在文章中穿插阅读顺序,每个部分所需要的先修知识我会先说出来,如果需要查缺补漏的话可以移步传送门(如果原作者介意请联系我删除),尽可能地让各种不同深度需求的小伙伴都能够尽可能看懂。如有谬误,欢迎各路大佬指出。
一、算法直观理解
PCA的局限性
有些时候,PCA并不是降维中的万能手段(关于PCA和数据降维,可以参考另一篇我的文章:机器学习算法数学原理手把手推导之主成分分析),里面有PCA的直观理解、详细推导和数据降维的内容),尤其是当标签和数据分布具有比较强的相关性的时候。比如我们拿到一组关于调查肥胖症的数据,在这数据集中,数据的标签是“是否患有肥胖症”。假如其中一个数据的特征是“体重”,结合我们生活实际,就可以知道绝大部分体重值很大的人都是患有肥胖症的。所以如果我们把这组数据集放到特征空间中并用不同颜色标注数据的标签,体重值高的这一部分数据很可能是同一组颜色的。如果我们还是用PCA的话,可能效果就不会很好了。为什么呢?直接上图。
![](https://img-blog.csdnimg.cn/direct/929f4fc280e84c1c87510aa8cefc54bc.png#pic_center)
我们可以看到,假设我们用上述数据集放到坐标空间中(具体几维的数据不重要,我只是想展示一个分布的效果,另外这里的蓝红箭头并不是x和y轴),蓝色代表没有肥胖症的,红色代表有肥胖症的,并且是否有肥胖症跟数据的分布有很强的相关性。如果我们使用PCA的话,也就是找出能让数据最分散的方向,那就是图中蓝色箭头所在的方向。这时候问题就来了,如果你把蓝色和黄色的点都投影到蓝色箭头上,那岂不是蓝色和黄色的点都混在一起了?还不如不投影直接看呢。
但是就一点办法都没了吗?也不是,如果我们按照图中红色箭头的方向进行投影,是不是也能很好的区分开两种类别呢?这样我们还是只需要计算一维的数据,而不是二维的数据,数据降维的目的也达到了。
LDA直观理解
其实我个人认为这并不是PCA算法的问题,而是PCA根本就不是用来做有标签数据的降维。当我们面对有标签数据的时候,不妨可以试一下LDA——这是一个有监督学习的降维方法。换句话说,LDA的降维操作会跟数据的标签密切相关,最后降维后的数据也应该能够跟原数据一样,能够尽可能保持对不同类别的区分度。
这就是LDA要做到的目标。我们拆解一下这个目标来理解,什么样的情况才会让我们很快地就能看出两个不同的类别呢——不同类间能够彼此分开,而相同类的点能够彼此尽可能的扎堆。我们放到坐标空间里面说就是:不同类之间的距离要尽可能的远,而相同类之间不能分布太散,这两个条件缺一不可。
所以,综合上面的理解,LDA要做到的就是:找到一个或多个方向,能使得所有数据点投影到这组方向的时候能够保持以下两种特性:1.不同类之间的距离要尽可能远;2.相同类之间的数据点要尽可能分布紧密。
接下来我会先讲算法的推导。因为整个算法过程跟推导过程中要用到的变量密切相关,如果只是为了依葫芦画瓢做计算题可以只看构建优化目标函数部分然后跳到算法过程部分,了解几个量的意义即可。
二、算法推导
本部分涉及数学推导,需要的先修知识有:线性代数中的矩阵运算,向量内外积,优化问题中的拉格朗日乘子法;另外,在做数学推导的时候只考虑两个类的过程,多类推广会在最后提供
构建优化目标函数
对于一个二分类问题,一共有两个类 C 1 , C 2 C_1, C_2 C1,C2,数据点用 x i x_i xi表示,数据总量用 N N N表示,每个类的数据点数量为 N C 1 , N C 2 N_{C_1},N_{C_2} NC1,NC2。
我们把LDA投影后的数据特性依次量化,首先对于第一个特性,用每个类的均值点的差的平方来代表不同类之间的距离(以后简称类间距)。假设两个类二点均值点分别为 m 1 , m 2 m_1, m_2 m1,m2( m 1 = ∑ i ∈ C 1 N C 1 x i N C 1 m_1=\frac{\sum_{i \in C_1}^{N_{C_1}}x_i}{N_{C_1}} m1=NC1∑i∈C1NC1xi),那么我们表示类间距可以用 ( m 2 − m 1 ) 2 (m_2-m_1)^2 (m2−m1)2。为什么不用距离差的平方开根号之类的其他量呢?其实这没有什么差别,看推导的过程其实就能够慢慢体会了。
针对第二个特性,在PCA那一章其实就能了解到,衡量一组数据是否分散,可以用方差来形容,所以,对于所有类内的数据点是否分布紧密,我们可以将每个类的方差做一个累加(平不平均不重要,只是除以一个常数的事情),所以我们可以用 s 1 2 + s 2 2 s_1^2 + s_2^2 s12+s22来代表这个特性,其中 s 1 , s 2 s_1,s_2 s1,s2是两个类数据点的标准差。
那怎么样把这两个特性组合起来呢?我们可以将二者分别作为分子和分母,最大化第一个特性的同时也能最小化第二个特性,这样就能一举两得,同时达到目的了。所以我们要优化的式子就是:
f
(
m
,
s
)
=
(
m
2
−
m
1
)
2
s
1
2
+
s
2
2
f(m,s) = \frac{(m_2-m_1)^2}{s_1^2 + s_2^2} \\
f(m,s)=s12+s22(m2−m1)2
之后的推导我会放到解优化问题部分进行,现在先定义几个度量:
- 类内散度(矩阵): S C k = ∑ y i ∈ C k N C k ( x i − μ k ) ( x i − μ k ) T = ∑ y i ∈ C k N C k ( x i − μ k ) 2 S_{C_k}=\sum_{y_i \in C_k}^{N_{C_k}}(x_i-\mu_k)(x_i-\mu_k)^T=\sum_{y_i \in C_k}^{N_{C_k}}(x_i-\mu_k)^2 SCk=∑yi∈CkNCk(xi−μk)(xi−μk)T=∑yi∈CkNCk(xi−μk)2,这个其实就是没有除以数量 N C k N_{C_k} NCk的方差矩阵(注意转置在后面);
- 总散度: S w = S C 1 + S C 2 S_w=S_{C_1}+S_{C_2} Sw=SC1+SC2,就是把每一类的类内散度做一个求和;
- 类间距: S B = ( μ 2 − μ 1 ) ( μ 2 − μ 1 ) T S_B=(\mu_2 - \mu_1)(\mu_2 - \mu_1)^T SB=(μ2−μ1)(μ2−μ1)T,代表两类中心之间的距离;
这里的 x i x_i xi是原空间的数据点向量, μ \mu μ也是原空间的数据类内平均值向量;
解优化问题
我们分析一下 f ( m , s ) f(m,s) f(m,s),可以发现这是个经过投影,在新空间的表示形式,和PCA一样,我们把它一步步转化成原空间的表示形式。为什么会有这种想法呢?这是个优化问题,我们要优化的目标已经确定,但是我们要优化的对象是什么?我们要寻找一个方向向量能够使目标函数最大化,所以优化的对象得是这个方向向量。我们假设方向向量是 w w w,因此我们要将 f ( m , s ) f(m,s) f(m,s)转化为 f ( w ) f(w) f(w)的形式。
由向量投影的知识我们知道,在新空间中的向量表示等于原向量与新空间方向向量的内积。所以,新空间的目标点
u
i
=
w
T
x
i
u_i = w^T x_i
ui=wTxi;同理,均值向量也是原空间的一个向量,而投影并不会改变数据点之间的平行性,因此原空间中的类内均值仍然在新空间中也是该类的均值,所以我们有:
m
k
=
w
T
μ
k
m_k = w^T\mu_k
mk=wTμk,k指的是第k类。针对目标函数中的方差,我们可以知道
s
k
=
∑
y
∈
C
k
N
C
k
(
u
i
−
m
k
)
2
s_k = \sum_{y \in C_k}^{N_{C_k}}(u_i-m_k)^2
sk=∑y∈CkNCk(ui−mk)2,那么我们将三个等式代入目标函数:
f
(
m
,
s
)
=
(
m
2
−
m
1
)
2
s
1
2
+
s
2
2
=
(
w
T
μ
2
−
w
T
μ
1
)
(
w
T
μ
2
−
w
T
μ
1
)
T
∑
y
∈
C
1
N
C
1
(
u
i
−
m
1
)
2
+
∑
y
∈
C
2
N
C
2
(
u
i
−
m
2
)
2
=
w
T
(
μ
2
−
μ
1
)
(
μ
2
−
μ
1
)
T
w
w
T
∑
y
∈
C
1
N
C
1
(
x
i
−
μ
1
)
2
w
+
w
T
∑
y
∈
C
2
N
C
2
(
x
i
−
μ
2
)
2
w
=
w
T
(
μ
2
−
μ
1
)
(
μ
2
−
μ
1
)
T
w
w
T
(
∑
y
∈
C
1
N
C
1
(
x
i
−
μ
1
)
2
+
∑
y
∈
C
2
N
C
2
(
x
i
−
μ
2
)
2
)
w
\begin{align*} f(m,s) &= \frac{(m_2-m_1)^2}{s_1^2 + s_2^2} \\ &= \frac{(w^T \mu_2 - w^T \mu_1)(w^T \mu_2 - w^T \mu_1)^T}{\sum_{y \in C_1}^{N_{C_1}}(u_i-m_1)^2 + \sum_{y \in C_2}^{N_{C_2}}(u_i-m_2)^2} \\ &= \frac{w^T (\mu_2-\mu_1)(\mu_2-\mu_1)^T w}{w^T\sum_{y \in C_1}^{N_{C_1}}(x_i-\mu_1)^2 w +w^T \sum_{y \in C_2}^{N_{C_2}}(x_i-\mu_2)^2 w} \\ &= \frac{w^T (\mu_2-\mu_1)(\mu_2-\mu_1)^T w}{w^T(\sum_{y \in C_1}^{N_{C_1}}(x_i-\mu_1)^2 + \sum_{y \in C_2}^{N_{C_2}}(x_i-\mu_2)^2) w} \\ \end{align*}
f(m,s)=s12+s22(m2−m1)2=∑y∈C1NC1(ui−m1)2+∑y∈C2NC2(ui−m2)2(wTμ2−wTμ1)(wTμ2−wTμ1)T=wT∑y∈C1NC1(xi−μ1)2w+wT∑y∈C2NC2(xi−μ2)2wwT(μ2−μ1)(μ2−μ1)Tw=wT(∑y∈C1NC1(xi−μ1)2+∑y∈C2NC2(xi−μ2)2)wwT(μ2−μ1)(μ2−μ1)Tw
这里整体的思路相当于不断地把投影方向向量
w
w
w不断地往外提。推到这里,我们就可以把之前定义的量全部带进来了:
f
(
m
,
s
)
=
w
T
S
B
w
w
T
S
w
w
=
f
(
w
)
f(m,s)=\frac{w^TS_Bw}{w^TS_ww}=f(w)
f(m,s)=wTSwwwTSBw=f(w)
同时,因为我们投影到的地方是一个方向向量,所以我们要添加一个限制条件
w
T
w
=
1
w^Tw=1
wTw=1,这样优化问题就是:
m
a
x
i
m
i
z
e
f
(
w
)
=
w
T
S
B
w
w
T
S
w
w
s
.
t
.
w
T
w
=
1
maximize \space \space f(w)=\frac{w^TS_Bw}{w^TS_ww}\\ s.t. \space \space w^Tw=1
maximize f(w)=wTSwwwTSBws.t. wTw=1
使用拉格朗日乘子法转化问题:
m
a
x
i
m
i
z
e
L
(
w
,
λ
)
=
w
T
S
B
w
w
T
S
w
w
−
λ
(
w
T
w
−
1
)
s
.
t
.
λ
≥
0
maximize \space \space L(w,\lambda)=\frac{w^TS_Bw}{w^TS_ww}-\lambda(w^Tw-1)\\ s.t. \space \space \lambda \ge 0
maximize L(w,λ)=wTSwwwTSBw−λ(wTw−1)s.t. λ≥0
这个写法相当的复杂,我们需要用到广义特征值转化的方法进行转化(广义特征值问题:【矩阵论】广义特征值问题),有兴趣的朋友可以看传送门里面的文章进行深究,转化后的问题为:
m
a
x
i
m
i
z
e
L
(
w
,
λ
)
=
S
B
w
−
λ
S
w
w
s
.
t
.
λ
≥
0
maximize \space \space L(w,\lambda)=S_Bw-\lambda S_ww \\ s.t. \space \space \lambda \ge 0
maximize L(w,λ)=SBw−λSwws.t. λ≥0
这个时候我们展开
S
B
w
S_Bw
SBw,神奇的事情发生了:
S
B
w
=
(
μ
2
−
μ
1
)
(
μ
2
−
μ
1
)
T
w
S_Bw=(\mu_2-\mu_1)(\mu_2-\mu_1)^Tw
SBw=(μ2−μ1)(μ2−μ1)Tw
仔细观察右边的式子,
(
μ
2
−
μ
1
)
T
w
(\mu_2-\mu_1)^Tw
(μ2−μ1)Tw左右两边的维度相等(因为都是基于原空间的向量),那就说明这两者之积一定是一个数(假设为
α
\alpha
α),即
S
B
w
=
α
(
μ
2
−
μ
1
)
S_Bw=\alpha(\mu_2-\mu_1)
SBw=α(μ2−μ1),这说明
S
B
w
S_Bw
SBw其实是跟
(
μ
2
−
μ
1
)
(\mu_2-\mu_1)
(μ2−μ1)平行的!同时我们回过头看
S
B
S_B
SB,这个东西也是一个跟
(
μ
2
−
μ
1
)
(\mu_2-\mu_1)
(μ2−μ1)有关的量!一个向量
v
v
v与另一个向量
u
u
u相乘还能得到与
v
v
v平行的向量,说明与之相乘的
u
u
u也是一个跟
v
v
v平行的向量。换句话说,
w
w
w就是跟
(
μ
2
−
μ
1
)
(\mu_2-\mu_1)
(μ2−μ1)平行的向量,
w
w
w的方向就是由
(
μ
2
−
μ
1
)
(\mu_2-\mu_1)
(μ2−μ1)的方向决定的。
也就是说,我们找到 ( μ 2 − μ 1 ) (\mu_2-\mu_1) (μ2−μ1)的方向,这个问题就差不多能解决了,最后只需要解 w = S w − 1 ( μ 2 − μ 1 ) w=S_w^{-1}(\mu_2-\mu_1) w=Sw−1(μ2−μ1)即可。最后一个小问题:这个式子怎么来的?对目标函数同右乘一个 w − 1 w^{-1} w−1,左乘一个 S w − 1 S_w^{-1} Sw−1即可。整个推导过程最关键的就在于弄明白上面说的平行关系。
有时候不一定需要解出一个问题才能得到答案,过程当中的某一步就是解开问题的钥匙。
三、算法过程
二分类算法过程
通过上述证明,求解LDA的问题就简单很多了,整体的算法步骤如下:
- 计算两类的类内均值 μ 1 , μ 2 \mu_1,\mu_2 μ1,μ2;
- 计算 S w S_w Sw;
- 使用 w = S w − 1 ( μ 2 − μ 1 ) w=S_w^{-1}(\mu_2- \mu_1) w=Sw−1(μ2−μ1);
- 最后归一化 w ′ = w ∣ ∣ w ∣ ∣ w'=\frac{w}{||w||} w′=∣∣w∣∣w;
w ′ w' w′即为所求方向向量,最后将数据点投影即可;
附上一道LDA的计算例题,英文自行翻译即可:
这里面用到 S B S_B SB是防止 S w S_w Sw没有逆矩阵的情况的伪逆过程,一般手算计算题不会出现,遇到了多半也是放进代码里求解。。(希望别打脸)
多类问题的推广
假设有 N N N个样本, C C C类,那么我们需要求:
- 数据整体的均值 μ = 1 C ∑ i = 1 C μ i \mu=\frac{1}{C}\sum_{i=1}^{C}\mu_i μ=C1∑i=1Cμi, μ i \mu_i μi是每类的均值;
- S w = ∑ k = 1 C S k S_w=\sum_{k=1}^{C}S_k Sw=∑k=1CSk, S k S_k Sk就是每类的散度矩阵;
- S B = ∑ i = 1 C N i ( μ i − μ ) ( μ i − μ ) T S_B=\sum_{i=1}^{C}N_i(\mu_i-\mu)(\mu_i-\mu)^T SB=∑i=1CNi(μi−μ)(μi−μ)T,把每一类的均值跟整体均值做差再平方乘以类内数量 N i N_i Ni,这个的意义其实就是把类内每个点跟整体均值点求一次差异度;
是每类的散度矩阵;
- S B = ∑ i = 1 C N i ( μ i − μ ) ( μ i − μ ) T S_B=\sum_{i=1}^{C}N_i(\mu_i-\mu)(\mu_i-\mu)^T SB=∑i=1CNi(μi−μ)(μi−μ)T,把每一类的均值跟整体均值做差再平方乘以类内数量 N i N_i Ni,这个的意义其实就是把类内每个点跟整体均值点求一次差异度;
谢谢观看!