跳到主要内容

线性判别分析与二次判别分析 - LDA 与 QDA

概述

线性判别分析 (LDA) 和二次判别分析 (QDA) 是两种经典的分类器,它们的主要区别在于所采用的决策面类型:

  • LDA 采用线性决策面。
  • QDA 采用二次决策面。

这些分类器受到青睐的原因有以下几点:

  • 它们提供闭式解,计算效率高。
  • 它们本质上支持多类别分类。
  • 它们不需要超参数调优。

决策边界

  • LDA 仅限于线性边界。
  • QDA 凭借其二次边界,提供更大的灵活性,能够适应更复杂的模式。

LDA 的降维应用

LDA 也用于监督式降维,通过将输入数据投影到线性子空间上。这个子空间由最大化不同类别间分离度的方向定义。主要特点包括:

  • 降维效果显著,将维度降至小于类别数量。
  • 该方法在多类别背景下最有效。
  • LDA 中的 n_components 参数指定目标维度,但不影响拟合和预测过程。

数学公式

LDA 和 QDA 的一般公式

两种分类器都源于概率模型,假设类别条件分布是高斯分布:

P(xy=k)=1(2π)d/2Σk1/2exp(12(xμk)tΣk1(xμk))P(x | y=k) = \frac{1}{(2\pi)^{d/2} |\Sigma_k|^{1/2}} \exp\left(-\frac{1}{2} (x-\mu_k)^t \Sigma_k^{-1} (x-\mu_k)\right)

其中 dd 是特征数量,μk\mu_k 是类别 kk 的均值,Σk\Sigma_k 是类别 kk 的协方差矩阵。

QDA 的特点

  • QDA 允许每个类别拥有自己的协方差矩阵 Σk\Sigma_k,从而产生一个更灵活的分类器,能够建模更复杂的边界。
  • 如果协方差矩阵是对角矩阵,QDA 简化为高斯朴素贝叶斯分类器。

LDA 的特点

  • LDA 假设所有类别共享一个协方差矩阵 Σ\Sigma,将模型简化为:
logP(y=kx)=12(xμk)tΣ1(xμk)+logP(y=k)+Cst.\log P(y=k | x) = -\frac{1}{2} (x-\mu_k)^t \Sigma^{-1} (x-\mu_k) + \log P(y = k) + Cst.
  • LDA 有效地测量类别均值之间的马哈拉诺比斯距离,并根据最短距离进行分类。

收缩与协方差估计

收缩用于改进协方差矩阵估计,当特征数量远大于样本数量时尤其有用。主要实现方式包括:

  • 自动收缩 (shrinkage='auto'),它利用 Ledoit 和 Wolf 引理来确定最优收缩度。
  • 手动设置收缩参数,范围介于完全依赖经验协方差矩阵(shrinkage=0)与方差的对角矩阵(shrinkage=1)之间。

估计算法

  • SVD 求解器:LDA 的默认求解器,不直接计算协方差,适用于特征数量较大的情况。
  • LSQR 求解器:通过求解线性方程来计算系数,支持收缩和自定义协方差估计器。
  • 特征值求解器:优化类间散布与类内散布的比率,并支持收缩。
# 从 scikit-learn 导入必要的类
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis, QuadraticDiscriminantAnalysis

# 使用收缩功能初始化线性判别分析
lda = LinearDiscriminantAnalysis(solver='lsqr', shrinkage='auto')
# 初始化二次判别分析
qda = QuadraticDiscriminantAnalysis()

# 假设 X_train, y_train 为训练数据和标签;X_test 为测试数据
# 拟合模型
lda.fit(X_train, y_train)
qda.fit(X_train, y_train)

# 在测试数据上进行预测
lda_predictions = lda.predict(X_test)
qda_predictions = qda.predict(X_test)

# 使用 LDA 进行降维
# 设置 LDA 的组件数量
lda_for_reduction = LinearDiscriminantAnalysis(n_components=2)
lda_for_reduction.fit(X_train, y_train)
# 将训练数据转换到较低维度
X_train_reduced = lda_for_reduction.transform(X_train)

参考资料和有用链接