机器学习&数据挖掘

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

Author
宋天龙
发布于 2015-05-12
3173 次阅读
0 次赞
0 次分享
线性判别分析Linear Discriminant Analysis (LDA)
AI 智能核心导读

线性判别分析(LDA)是经典的监督式降维与分类算法。其核心思想是将高维数据投影至最佳鉴别空间,实现类间距离最大化与类内距离最小化。相比无监督的PCA,LDA更侧重最优分类性能。该算法广泛应用于模式识别等领域,但在小样本高维数据下易受限。结合Python实战演示了模型构建,并指出可引入收缩(Shrinkage)机制有效解决数据稀疏问题。

线性判别分析(LDA)详解:原理、对比与实战

什么是线性判别分析(LDA)?

判别分析(Discriminant Analysis) 是一种分类方法,它通过一个已知类别的“训练样本”来建立判别准则,并通过预测变量来为未知类别的数据进行分类。

线性判别分析(Linear Discriminant Analysis,简称 LDA) 是其中的一种,也是模式识别的经典算法。该算法于 1996 年由 Belhumeur 引入模式识别和人工智能领域。LDA 以 Bayes 判别思想为基础,当分类只有两种且总体服从多元正态分布条件下,Bayes 判别与 Fisher 判别、距离判别是等价的。

核心思想

LDA 的基本思想是将高维的模式样本投影到最佳鉴别矢量空间,以达到抽取分类信息和压缩特征空间维数的效果。

投影后,能够保证模式样本在新的子空间有最大的类间距离最小的类内距离。简而言之,就是让模式在该空间中拥有最佳的可分离性。

LDA 与 PCA 的深度对比

在《主成分分析 Principal Component Analysis (PCA)》一文中曾介绍过数据降维的主成分分析(PCA)。LDA 与 PCA 都是常用的降维方法,但二者存在显著差异:

  1. 出发思想不同
    • PCA 主要是从特征的协方差角度,去找到比较好的投影方式,即选择样本点投影具有最大方差的方向。
    • LDA 则更多的是考虑了分类标签信息,寻求投影后不同类别之间数据点距离更大化,以及同一类别数据点距离最小化,即选择分类性能最好的方向。
  2. 学习模式不同
    • PCA 属于无监督式学习,因此大多场景下只作为数据处理过程的一部分,需要与其他算法结合使用(例如将 PCA 与聚类、判别分析、回归分析等组合使用)。
    • LDA 是一种监督式学习方法,本身除了可以降维外,还可以进行预测应用。因此既可以组合其他模型一起使用,也可以独立使用。
  3. 降维后可用维度数量不同
    • LDA 降维后最多可生成 C-1 维子空间(分类标签数 - 1),因此 LDA 与原始维度数量无关,只与数据标签分类数量有关。
    • PCA 最多有 n 维度可用,即最大可以选择全部可用维度。

可视化视角的差异

从直接可视化的角度,以二维数据降维为例,PCA 和 LDA 的区别如下图所示:

PCA与LDA对比图
PCA与LDA对比图

图像解析:

  • 左侧(PCA 的降维思想):它所作的只是将整组数据整体映射到最方便表示这组数据的坐标轴上,映射时没有利用任何数据内部的分类信息。因此,虽然 PCA 后的数据在表示上更加方便(降低了维数并能最大限度地保持原有信息),但在分类上也许会变得更加困难。
  • 右侧(LDA 的降维思想):可以看到 LDA 充分利用了数据的分类信息,将两组数据映射到了另外一个坐标轴上,使得数据更易区分(在低维上就可以区分,大幅减少了运算量)。

LDA 的局限性

线性判别分析 LDA 算法由于其简单有效性,在多个领域都得到了广泛应用,是目前机器学习、数据挖掘领域经典且热门的一个算法。但是,算法本身仍然存在一些局限性:

  • 小样本高维数据导致奇异矩阵:当样本数量远小于样本的特征维数时,样本与样本之间的距离变大使得距离度量失效,导致 LDA 算法中的类内、类间离散度矩阵奇异,不能得到最优的投影方向(在人脸识别领域中表现得尤为突出)。
  • 数据分布限制:LDA 不适合对非高斯分布的样本进行降维。
  • 依赖均值差异:当样本分类信息依赖方差而不是均值时,LDA 的效果不好。
  • 过拟合风险:在特定情况下,LDA 可能过度拟合数据。

Python 实战:基于 SKlearn 的 LDA 分类

以下使用 Python 的机器学习库 SKlearn 中的 LDA(使用贝叶斯判别)进行案例演示。

原始数据集中有 4 个维度,3 个目标分类集。我们提取其中的最后 5 个数据作为预测使用,其余作为训练数据。

代码实现

python
1from sklearn import datasets 2from sklearn.lda import LDA 3 4# 加载数据集 5iris = datasets.load_iris() 6 7# 划分训练集与预测集 8X = iris.data[:-5] 9pre_x = iris.data[-5:] 10y = iris.target[:-5] 11 12print('first 10 raw samples:', X[:10]) 13 14# 初始化并训练 LDA 模型 15clf = LDA() 16clf.fit(X, y) 17 18# 进行降维与预测 19X_r = clf.transform(X) 20pre_y = clf.predict(pre_x) 21 22# 打印降维结果 23print('first 10 transformed samples:', X_r[:10]) 24# 打印预测目标分类结果 25print('predict value:', pre_y)

运行结果分析

以下是输出结果。从结果可以看出,原始数据集由于是 3 个目标分类,因此降维后最多只能产生 2 个“新维度”:

code
1('first 10 raw samples:', array([[ 5.1, 3.5, 1.4, 0.2], 2[ 4.9, 3. , 1.4, 0.2], 3[ 4.7, 3.2, 1.3, 0.2], 4[ 4.6, 3.1, 1.5, 0.2], 5[ 5. , 3.6, 1.4, 0.2], 6[ 5.4, 3.9, 1.7, 0.4], 7[ 4.6, 3.4, 1.4, 0.3], 8[ 5. , 3.4, 1.5, 0.2], 9[ 4.4, 2.9, 1.4, 0.2], 10[ 4.9, 3.1, 1.5, 0.1]])) 11 12('first 10 transformed samples:', array([[ 7.82980001, 0.32152479], 13[ 6.90948663, -0.79927295], 14[ 7.27243493, -0.26853178], 15[ 6.60094723, -0.65305491], 16[ 7.90146095, 0.54669608], 17[ 7.46909339, 1.49939454], 18[ 7.00117745, 0.36240908], 19[ 7.37793873, 0.01740025], 20[ 6.35610395, -1.02010821], 21[ 7.11704798, -0.91694247]])) 22 23('predict value:', array([2, 2, 2, 2, 2]))

核心参数配置

在 SKlearn 中,LDA 可配置的参数签名如下:

python
1class sklearn.lda.LDA(solver='svd', shrinkage=None, priors=None, n_components=None, store_covariance=False, tol=0.0001)

LDA 的典型应用场景

  • 人脸识别中的降维或模式识别
  • 根据市场宏观经济特征进行经济预测
  • 根据市场或用户不同属性进行市场调研
  • 根据患者病例特征进行医学病情预测

进阶探讨:应对数据稀疏与收缩(Shrinkage)

LDA 是一个经典的机器学习算法,作为判别分析中的线性分类器,它在很多应用情况下会面临数据稀疏的问题。

这一问题在面部识别场景中尤为常见:数据的维度很可能大于数据的样本量,甚至可能呈几倍的差异。此时,LDA 的预测准确率会表现较差。当维度数与样本量比例达到 4 倍时,准确率可能只有 50% 左右。

解决方法之一是对 LDA 算法进行收缩(Shrinkage)。Python 的 SKlearn 中的 LDA 算法原生支持这一收缩规则:

  • 默认情况下,solver 的值被设定为 svd,这在大数据量下的表现很好,但不支持收缩规则。
  • 当面临数据稀疏时,我们需要将 solver 设置为 lsqreigen
  • 与之配合的是 shrinkage 参数,建议设置成 auto 以便于算法自动调整收缩值。当然,你也可以凭借经验将值设定在 0~1 之间(值越大收缩越厉害:0 时不收缩,1 时意味着对角线方差矩阵将被用作协方差矩阵值的估计)。

LDA收缩效果图
LDA收缩效果图

分享
最后修订: 2015-05-12