LDA(线性判别分析)

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

维度 PCA LDA
监督性 无监督 有监督
目标 方差最大 类间大、类内小
是否用标签 不用 用
降维上限 特征数 类别数 - 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:有监督,看类别区分度。

相关推荐
昨夜见军贴06161 小时前
纸质报告OCR审核的智能化跃升:IACheck AI报告文档审核Agent的技术路径
人工智能·ocr
七十二时9561 小时前
2026科普:Work Agent品类解析,重新理解AI办公助手
人工智能
虎鲸不是鱼1 小时前
AI 自动化逆向(三)我把一个逆向项目交给了 AI:它做到了什么程度
人工智能·自动化·大模型·逆向·ai逆向
Yyyyyy~1 小时前
【深度学习】Day1
人工智能·深度学习
2601_965742221 小时前
AI是怎么判断一家本地商家值得推荐的?云南老板看完这篇就懂了
大数据·人工智能·算法·ai·新媒体运营
四季豆331 小时前
数据挖掘:从数据中获取知识
人工智能·数据挖掘
Raas1001 小时前
AI网关能做成本分摊吗?MAI Gateway(魔芋企业级AI网关)如何赋能企业AI能力
大数据·人工智能·ai·大模型·ai网关·mai gateway
像风一样自由20201 小时前
53.NginxAPI-Gateway与鉴权如何保护大模型接口
人工智能·大模型·gateway·智能体
乃嘿仔1 小时前
AI 热点日报 · 2026 年 10 月 12 日
人工智能