☰
LDA(线性判别分析)
2026/10/14 6:12:15 网站建设 项目流程

LDA(Linear Discriminant Analysis,线性判别分析),是一种有监督的降维和分类方法。它和 PCA 都是线性降维,但核心区别是:PCA 不看标签,LDA 看标签。

它属于你之前看的组件列表里(特征工程组件 -> Python特征工程组件 -> LDA)的核心功能。下面我从概念、原理、代码实现、典型场景几个方面来讲。


一、LDA 是做什么的?

LDA 有两个用途:

  1. 降维:把高维数据投影到低维空间,同时最大化类间距离、最小化类内距离。

  2. 分类:直接用 LDA 做分类器(sklearn 的LinearDiscriminantAnalysis就支持)。

核心目标

投影后,同类样本尽量聚在一起,不同类样本尽量分开。


二、LDA 的核心思想

直观理解

想象两类数据(红点、蓝点)在二维平面上:

  • PCA:找方差最大的方向,不管红蓝。

  • LDA:找一个方向,让红点投影后挤在一起,蓝点也挤在一起,但红蓝之间离得远。

用一句话概括:

LDA 找的是"最能区分类别"的方向,PCA 找的是"最能代表数据分布"的方向。


数学目标

LDA 要最大化:

J(w)=wTSBwwTSWwJ(w)=wTSW​wwTSB​w​

其中:

  • SBSB​:类间散度矩阵(Between-class scatter),衡量不同类中心的距离。

  • SWSW​:类内散度矩阵(Within-class scatter),衡量同类样本的分散程度。

目标:让分子(类间距离)大,分母(类内距离)小。

求解方法:对 SW−1SBSW−1​SB​ 做特征值分解,取最大的 k 个特征值对应的特征向量。


降维后的维度上限

LDA 降维后的维度最多是类别数 - 1。

  • 二分类:最多降到1 维。

  • 三分类:最多降到2 维。

  • 十分类:最多降到9 维。

这是 LDA 的硬性限制,因为类间散度矩阵 SBSB​ 的秩最多是类别数 - 1。


三、LDA vs PCA

维度PCALDA
监督性无监督有监督
目标方差最大类间大、类内小
是否用标签不用用
降维上限特征数类别数 - 1
适用场景降维、去噪、可视化分类、有标签降维
新特征关系不相关不相关
分布假设无近似正态、同类协方差相同

一句话:PCA 是"无监督的降维",LDA 是"有监督的降维 + 分类"。


四、代码实现

1. 基本降维

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.datasets import load_iris # 加载鸢尾花数据(3类,4个特征) iris = load_iris() X, y = iris.data, iris.target print("原始形状:", X.shape) # (150, 4) # LDA 降到 2 维(3类最多降到2维) lda = LinearDiscriminantAnalysis(n_components=2) X_lda = lda.fit_transform(X, y) print("降维后形状:", X_lda.shape) # (150, 2) print("解释方差比例:", lda.explained_variance_ratio_)

注意:LDA 的fit需要传入y(标签),这是和 PCA 最大的区别。


2. 可视化

import matplotlib.pyplot as plt plt.figure(figsize=(8, 6)) colors = ['red', 'green', 'blue'] for i, color in enumerate(colors): plt.scatter(X_lda[y == i, 0], X_lda[y == i, 1], c=color, label=iris.target_names[i], alpha=0.7) plt.xlabel('LD1') plt.ylabel('LD2') plt.title('LDA 降维可视化(鸢尾花)') plt.legend() plt.show()

三类样本在 LD1/LD2 平面上分得很开。


3. LDA 作为分类器

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=42, stratify=y ) # 直接用 LDA 做分类 lda_clf = LinearDiscriminantAnalysis() lda_clf.fit(X_train, y_train) y_pred = lda_clf.predict(X_test) print("LDA 分类准确率:", accuracy_score(y_test, y_pred))

LDA 本身就是分类器,不需要先降维再分类。


4. 降维 + 分类(Pipeline)

from sklearn.pipeline import Pipeline from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.linear_model import LogisticRegression pipe = Pipeline([ ('lda', LinearDiscriminantAnalysis(n_components=2)), # 先降到2维 ('clf', LogisticRegression()) # 再分类 ]) pipe.fit(X_train, y_train) print("Pipeline 准确率:", pipe.score(X_test, y_test))

5. 二分类问题

python

from sklearn.datasets import make_classification from sklearn.discriminant_analysis import LinearDiscriminantAnalysis # 二分类数据 X, y = make_classification(n_samples=200, n_features=10, n_classes=2, random_state=42) # 二分类最多降到 1 维 lda = LinearDiscriminantAnalysis(n_components=1) X_lda = lda.fit_transform(X, y) print("降维后形状:", X_lda.shape) # (200, 1)

6. 使用solver参数

solver决定求解方法:

solver说明适用场景
'svd'奇异值分解(默认)通用,不需要计算协方差矩阵
'lsqr'最小二乘只用于分类
'eigen'特征值分解需要shrinkage参数
'svd'推荐默认,稳定

python

# 用 shrinkage 提升稳定性(高维小样本) lda = LinearDiscriminantAnalysis(solver='eigen', shrinkage='auto')

shrinkage可选:

  • None:不收缩

  • 'auto':自动(Ledoit-Wolf 估计)

  • 0~1 之间的浮点数:手动指定


7. 处理新数据(transform)

python

X_new = X_test[:5] X_new_lda = lda.transform(X_new) print(X_new_lda.shape)

五、LDA 的重要属性

属性说明
coef_分类器的权重系数
intercept_分类器的截距
explained_variance_ratio_各判别方向的解释方差比例
means_每个类别的均值
priors_每个类别的先验概率
scalings_判别方向的缩放(特征向量)
classes_类别标签

六、LDA 的优缺点

优点

  1. 有监督:利用标签信息,降维后分类效果好。

  2. 简单快速:计算成本低,适合大规模数据。

  3. 可解释性较好:判别方向有明确含义。

  4. 自带分类:不需要额外模型。

  5. 降维上限明确:类别数 - 1,避免维度爆炸。

缺点

  1. 假设强:假设数据近似正态、各类协方差相同。实际数据可能不满足。

  2. 降维上限:最多降到 类别数 - 1 维,类别少时受限。

  3. 对异常值敏感:均值和协方差受异常值影响。

  4. 线性:只能找线性判别边界,非线性关系要用 QDA、KernelLDA。

  5. 小样本问题:特征数 > 样本数时,SWSW​ 不可逆,需要 shrinkage 或正则化。


七、LDA 的变体

变体说明
QDA(二次判别分析)允许各类协方差不同,边界是二次曲线
KernelLDA用核函数处理非线性
Regularized LDA加正则化,解决小样本问题
Sparse LDA加 L1 正则,做稀疏特征选择
Flexible LDA用样条等非线性变换

sklearn 只提供了 LDA 和 QDA:

from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis qda = QuadraticDiscriminantAnalysis() qda.fit(X_train, y_train) print("QDA 准确率:", qda.score(X_test, y_test))

八、典型应用场景

场景说明
人脸识别Fisherfaces 就是 LDA
文本分类降维 + 分类
医学诊断疾病分类
信用评分好坏客户分类
模式识别通用分类任务
数据可视化降到 2-3 维画图
特征提取有标签数据的降维

九、关键提醒

  1. LDA 需要标签:fit(X, y),这是和 PCA 最大的区别。

  2. 降维上限 = 类别数 - 1:二分类最多 1 维,三分类最多 2 维。

  3. 假设近似正态、协方差相同:不满足时考虑 QDA 或 KernelLDA。

  4. 对异常值敏感:先做异常值处理。

  5. 小样本问题:特征数 > 样本数时,用shrinkage='auto'。

  6. 参数从训练集学:fit只在训练集,测试集只transform,避免数据泄露。

  7. 可先标准化:虽然 LDA 对尺度不如 PCA 敏感,但标准化通常有帮助。

  8. 和 PCA 结合:可以先用 PCA 降维去噪,再用 LDA。


十、总结

LDA = 有监督的线性降维 + 分类,目标是最大化类间距离、最小化类内距离。

  • 核心思想:投影后同类聚集、异类分开。

  • sklearn 实现:LinearDiscriminantAnalysis、QuadraticDiscriminantAnalysis。

  • 关键参数:n_components、solver、shrinkage。

  • 重要限制:降维上限 = 类别数 - 1。

  • 核心价值:有标签降维、自带分类、可解释性好。

  • 主要代价:假设强、对异常值敏感、线性。

  • 和 PCA 的区别:PCA 无监督看方差,LDA 有监督看类别区分度。

它和前面讲的 PCA、FastICA 都是特征变换方法,区别在于:

  • PCA:无监督,看方差。

  • FastICA:无监督,看独立性。

  • LDA:有监督,看类别区分度。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询