LDA线性判别分析

LDA(线性判别分析,又称为Fisher线性判别)是对标记数据的一种常见的降维算法。kaldi在对原始特征的常见处理中,就包括了应用LDA变换这一操作(但是一般不降维,比较奇怪)。本文主要讲解LDA的数学原理和在kaldi中的具体实现。

坐标变换

首先,对于坐标变换这个任务,变换之后的坐标可以理解为点在新的空间基向量方向上的投影。

对于变换空间的一组基向量 $\overrightarrow{\boldsymbol{w}} = \{\boldsymbol v_1, \boldsymbol v_2, \cdots, \boldsymbol v_n\}$和原空间的点 $\boldsymbol{x} = \{x_1, x_2, \cdots, x_n\}^T$,变换之后的坐标 $\boldsymbol y$表示为:

LDA

LDA的期望是,将高维度的数据通过某种变换/降维(投影到低维度),使得类间方差最大,类内方差最小,也就是要让同一类数据尽可能的接近,不同类数据尽可能的分开。所以,如果定义要优化的目标函数,那么,表征不同数据接近程度的离散矩阵和表征同类数据类内离散程度的离散矩阵应该被分别放置在分母和分子位置,最终取使得优化目标最大的变换矩阵即可。

定义原始数据维度为$D$,数据集标注为$C$类,对于类$P_i$,类内离散程度$\boldsymbol{S}_w$用类内方差$\boldsymbol{V}_i$之和表示:

类间方差$\boldsymbol{S}_b$用各类中心点$\boldsymbol{\mu}_i$相对整体样本的中心点$\boldsymbol{\mu}$计算得到的协方差$\boldsymbol{V}_i^r$之和表示:

由以上两式,可以得到优化的目标函数:

kaldi中的LDA变换

kaldi中经常对提取的声学特征做LDA变换,也是首先收集统计量,之后做LDA变换,输出变换矩阵。
统计量累计lda-acc接受GMM模型,声学特征和后验,输出统计量(主要是以下三个变量的值)。从GMM模型中可以知道pdf_class的个数,也就是数据集合的总的类别,记为$C$,特征维度记为$D$。那么统计量的维度以及存储的信息如下:

1
2
3
4
5
6
// C X 1 每一类的累计后验
Vector<double> zero_acc_;
// C X D 每一类的累计特征
Matrix<double> first_acc_;
// D X D 对称矩阵,存下三角 所有类的累计加权特征的平方
SpMatrix<double> total_second_acc_;

具体求解变换矩阵的过程没有找到对应的理论依据,根据代码,过程如下:
定义全局方差(将所有数据视为一个整体):

之后按照如下的过程求解:

  1. $\boldsymbol{S}_w = \boldsymbol{S}_t - \boldsymbol{S}_b = \boldsymbol{L}\boldsymbol{L}^T$(乔列斯基分解)
  2. $\boldsymbol{L}^{-1}\boldsymbol{S}_b = \boldsymbol{U}\boldsymbol{D}\boldsymbol{V}^T$(SVD分解)
  3. $\boldsymbol{W} = \boldsymbol{U}\boldsymbol{L}^{-1}$(投影变换)

补充:
后来在看ivector的时候发现上面的第一步做的应该是WCCN(Within-Class Covariance Normalization)。对于类内方差$\boldsymbol{W}$,WCCN定义变换:

其中$\boldsymbol{W}^{-1} = \boldsymbol{L}\boldsymbol{L}^T$,即$L$通过对$\boldsymbol{W}^{-1}$的乔列斯基分解得到。令:

则$\boldsymbol{S}_w^{-1} = (\boldsymbol{L}^T)^{-1}\boldsymbol{L}^{-1} = (\boldsymbol{L}^{-1})^T\boldsymbol{L}^{-1}$,所以: