LDA(线性判别分析,Linear Discriminant Analysis)

读完周志华教授的《机器学习》中的线性判别分析章节,他从LDA实现的效果角度对其进行了推导:类间间距要尽可能大,类内间距尽可能小的基本思想通过拉格朗日乘子法可以简单解出想要的结果。但是在章节的最后,教授提到:LDA可以从贝叶斯决策理论的角度来阐释,并可证明,当两类数据同先验、满足高斯分布且协方差相等时,LDA可达到最优分类。

今天,我们从贝叶斯理论的角度来阐释一回神奇的LDA.


贝叶斯定理

我们先从条件概率入手:
P(AB)=P(AB)P(B)P(BA)=P(BA)P(A) \begin{aligned} P(A|B)&=\frac{P(A\cap B)}{P(B)}\\ P(B|A)&=\frac{P(B\cap A)}{P(A)}\\ \end{aligned}
显然有P(AB)=P(BA)P(A\cap B)=P(B\cap A),则可推导出贝叶斯定理:
P(AB)=P(BA)P(A)P(B) P(A|B)=\frac{P(B|A)\cdot P(A)}{P(B)}
贝叶斯公式可以解释为:事件B的发生是由事件A导致的概率。


LDA模型

将上述公式应用到我们的分类问题上来,我们可以改写这个公式。
P(Y=kX=x)=P(X=xY=k)P(Y=k)P(X=x)(1) P(Y=k|X=x)=\frac{P(X=x|Y=k)\cdot P(Y=k)}{P(X=x)} \qquad(1)
在LDA中我们使用高斯分布,这样,我们来改写(1)式中的三项因子。
首先是xxkk这个类别的类条件概率,建设我们的数据在每个类别上都是一个n维高斯分布。则:
P(X=xY=k)=Pk(x)=1(2π)n/2Σk1/2exp[12(xμk)TΣk1(xμk)](2) P(X=x|Y=k)=P_k(x)=\frac{1}{(2\pi)^{n/2}|\Sigma_k|^{1/2}}exp[-\frac{1}{2}(x-\mu_k)^T\Sigma_k^{-1}(x-\mu_k)] \qquad(2)
其次是kk类的先验概率:
P(Y=k)=πk(3) P(Y=k)=\pi_k \qquad(3)
最后是P(X=x)P(X=x)
P(X=x)=i=1kPi(x)πi(4) P(X=x)=\sum_{i=1}^kP_i(x)\pi_i\qquad(4)
注意,在LDA模型中,我们假设所有类别的协方差矩阵是相等的,即:
Σk=Σk(5) \Sigma_k=\Sigma \quad \forall k \qquad(5)
将式子(2),(3),(4),(5)代入式子(1)我们可以得到:
P(Y=kX=x)=Pk(x)πkP(X=x)={1(2π)n/2Σ1/2exp[12(xμk)TΣ1(xμk)]}πki=1kPi(x)πi(6) P(Y=k|X=x)=\frac{P_k(x)\cdot \pi_k}{P(X=x)} =\frac{\{\frac{1}{(2\pi)^{n/2}|\Sigma|^{1/2}}exp[-\frac{1}{2}(x-\mu_k)^T\Sigma^{-1}(x-\mu_k)] \}\cdot \pi_k}{\sum_{i=1}^kP_i(x)\pi_i}\qquad (6)
对式子(6)取对数。并去除仅与xx有关的项(如分母),常数项(分子中exp之前的项,展开后仅与xxΣ\Sigma有关的项),我们可以清晰地定义出判别函数(Discriminant functions)δk(x)\delta_k(x)
δk(x)=(Σ1μk)Tx12μkTΣ1μk+logπk(7)C(x)=arg minkδk(x)(8) \begin{aligned} \delta_k(x)&=(\Sigma^{-1}\mu_k)^Tx-\frac{1}{2}\mu_k^T\Sigma^{-1}\mu_k+log\pi_k \qquad(7)\\ C(x)&=\underset{k}{\mathrm{arg\ min}} \delta_k(x) \qquad(8) \end{aligned}

LDA(线性判别分析,Linear Discriminant Analysis)

参数估计

从上面的模型我们可以看出,对于LDA,我们有三个大方面的参数需要估计,πk,μk,Σ\pi_k,\mu_k,\Sigma.
我们需要从联合概率的最大似然函数出发去进行参数估计。也正是因为LDA需要计算来联合概率P(xi,yi)P(x_i,y_i),LDA被称之为生成模型(Generative model)。与之对应的是判别模型(Discriminative model),比如我们熟悉的逻辑回归。
L(θ)=i=1mP(xi,yi)=i=1mP(xiyi)P(yi)=i=1mk=1KPk(xi)yikπkyik=i=1mk=1Kϕ(xi,μk,Σ)yikπkyikyik=I(yi=k) \begin{aligned} L(\theta)=\prod_{i=1}^mP(x_i,y_i)&=\prod_{i=1}^mP(x_i\mid y_i)\cdot P(y_i)\\ &=\prod_{i=1}^m\prod_{k=1}^KP_k(x_i)^{y_{ik}}\cdot \pi_k^{y_{ik}}\\ &=\prod_{i=1}^m\prod_{k=1}^K\phi(x_i,\mu_k,\Sigma)^{y_{ik}}\cdot \pi_k^{y_{ik}}\\ y_{ik}&=\mathbb{I}(y_i=k)\\ \end{aligned}
这样,我们可以得到参数的估计如下:
π^k=mkmmkkmμ^k=1mki=1myikxiΣ^=1mk=1KmkΣ^kΣ^k=1mki=1myik(xiμ^k)(xiμ^k)T \begin{aligned} \hat \pi_k&=\frac{m_k}{m}\quad m_k为k类的样本数,m为总样本数\\ \hat \mu_k&=\frac{1}{m_k}\sum_{i=1}^{m}y_{ik}\cdot x_i\\ \hat \Sigma &=\frac{1}{m}\sum_{k=1}^Km_k\hat \Sigma_k\\ \hat \Sigma_k&=\frac{1}{m_k}\sum_{i=1}^my_{ik}(x_i-\hat \mu_k)(x_i-\hat \mu_k)^T \end{aligned}
这样得到的Σ^\hat \Sigma是有偏估计。真正的无偏估计如下:
S=mmKΣ^ S=\frac{m}{m-K}\hat \Sigma

至此,我们完成了从贝叶斯角度对LDA的推导过程。


Python代码实现

https://github.com/Haifei-ZHANG/machine-learning-algorithms/tree/master/LDA