11-2 几何与空间距离(二):线性判别分析 (LDA)——有监督降维

🎯 教学目标与重难点…

【三维目标】

  • 📚 知识目标
    1. 理解 LDA 的核心思想:有监督的降维——将数据投影到一条直线上,使不同类别的点尽可能分开。
    2. 掌握 LDA 的优化目标:类间距离大,类内距离小
    3. 理解 LDA 与 PCA 的本质区别:PCA 是无监督(不看标签),LDA 是有监督(利用标签)
    4. 掌握 LinearDiscriminantAnalysis 的基本使用。
  • ⚙️ 能力目标
    1. 能使用 LinearDiscriminantAnalysis 进行降维和分类。
    2. 能根据业务需求判断该用 PCA 还是 LDA。
  • 💡 素养目标
    1. 理解“有标签的信息是宝贵的”——LDA 利用标签信息比 PCA 更“聪明”。
    2. 建立“不同问题选不同工具”的工程思维。

【重点与难点】

  • 🟢 教学重点
    1. LDA 的核心思想:投影后“类间分散,类内聚集”。
    2. LDA 与 PCA 的对比(有监督 vs 无监督)。
  • 🟡 教学难点
    1. 理解“投影”的几何意义——把高维数据“压”到一条直线上。
    2. 理解“类间大、类内小”这个优化目标如何让分类更容易。

📌 一、 课程导入(5 分钟)

复习回顾:上节课我们学了 KNN,它用“距离”来做分类。第 6 章我们还学了 PCA(主成分分析),它用“方差最大”来做无监督降维。

情景模拟:两个班级的考试成绩

假设你是老师,想用“数学成绩”和“英语成绩”两个指标来区分“学霸班”和“普通班”。

  • 你发现两个班的成绩在二维平面上是混在一起的——单看数学或单看英语都分不清。
  • 但如果你换一个角度看——比如把两科成绩加权求和(0.7×数学 + 0.3×英语)——两个班突然被分开了!

核心问题:能不能找到一条“最佳投影方向”,让两个班在这条线上分得最开?

这就是 LDA 要解决的问题利用标签信息,找到一条投影线,让不同类别的数据在这条线上尽可能分开。

  • 👨‍🏫 教师活动:在 PPT 上展示两张图——左图是原始二维散点图(两类数据混在一起),右图是投影到一条直线后的分布(两类被明显分开)。提问:“哪条线是最好的投影方向?”
  • 🧑‍🎓 学生活动:学生观察图片,凭直觉指出“能让两类分开的那条线”,老师顺势引出 LDA 的目标。

用“班级考试成绩”和“最佳投影方向”的场景,将 LDA 的抽象概念转化为可视化直觉。通过对比 PCA 和 LDA 的不同目标,建立“有监督 vs 无监督”的清晰认知。

📖 二、 解决问题过程(一):LDA 的核心思想

1. LDA 的核心目标(一句话)

找一条投影线,让数据投影上去后,不同类别的点尽量分开,同类别的点尽量集中。

2. 两个关键指标

指标 含义 目标
类间距离 (Between-class) 不同类别的中心点之间的距离 越大越好(两类分得开)
类内距离 (Within-class) 同一类别内部点之间的分散程度 越小越好(同类聚得紧)

3. 生活类比:班级排座位

老师想让两个班级的学生在操场上排队,要求:

  • 类间大:两个班的队伍离得越远越好(方便区分)。
  • 类内小:每个班的队伍站得越整齐越好(班级内部紧凑)。

LDA 就是在找最优的排队方向

4. LDA vs PCA(本课灵魂对比)

对比维度 PCA(主成分分析) LDA(线性判别分析)
是否使用标签 ❌ 无监督(不看标签) ✅ 有监督(利用标签)
优化目标 方差最大(保留信息最多) 类间大 + 类内小(分类最好)
降维结果 找数据分散的方向 找分类效果最好的方向
适用场景 数据压缩、可视化、去噪 分类前的降维、特征提取

5. 核心结论(学生必记)

同样的数据,PCA 和 LDA 找到的投影方向完全不同。

  • PCA 找方差最大的方向(不管类别)。
  • LDA 找分类最好的方向(利用类别标签)。

LDA 比 PCA “聪明”的地方在于:它知道哪些点属于同一类,所以能更有针对性地降维。

  • 👨‍🏫 教师活动
    1. 在黑板上画出两类数据(圆圈和三角),分别画出 PCA 的投影方向(方差最大)和 LDA 的投影方向(分类最好),让学生直观对比。
    2. 指着 LDA 的方向问:“如果我们要降维到 1 维,用 PCA 还是 LDA 能更好地保留分类信息?”(答案:LDA)。
  • 🧑‍🎓 学生活动
    1. 学生在笔记本上抄写 LDA vs PCA 对比表格。
    2. 讨论:“如果你在做分类任务,降维时应该优先考虑 PCA 还是 LDA?”(答案:LDA,因为它利用了标签信息)。

通过“班级排座位”和“PCA vs LDA 对比”两个维度,将 LDA 的抽象优化目标转化为直观的生活经验,并建立与已学知识的紧密连接。

💻 三、 解决问题过程(二):代码实战——LDA 降维与分类

1. LDA 的两大用途

用途 说明 代码
降维 将高维数据投影到低维空间(有监督) LDA(n_components=2)
分类 直接用 LDA 作为分类器(假设数据服从正态分布) LDA() 直接 .fit()

2. 用途一:LDA 降维 + 可视化(对比 PCA)

用鸢尾花数据,分别用 PCA 和 LDA 降到 2 维,对比降维后两类是否更好区分。

 1import numpy as np
 2import matplotlib.pyplot as plt
 3from sklearn.datasets import load_iris
 4from sklearn.decomposition import PCA
 5from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
 6from sklearn.preprocessing import StandardScaler
 7
 8# 加载数据
 9X, y = load_iris(return_X_y=True)
10X = StandardScaler().fit_transform(X)  # 标准化
11
12# PCA 降维(无监督)
13pca = PCA(n_components=2)
14X_pca = pca.fit_transform(X)
15
16# LDA 降维(有监督)
17lda = LDA(n_components=2)
18X_lda = lda.fit_transform(X, y)  # 注意:LDA 需要传入 y!
19
20# 可视化对比
21fig, axes = plt.subplots(1, 2, figsize=(12, 5))
22targets = [0, 1, 2]
23colors = ['red', 'green', 'blue']
24labels = ['山鸢尾', '杂色鸢尾', '维吉尼亚鸢尾']
25
26# PCA 图
27for t, c, l in zip(targets, colors, labels):
28    axes[0].scatter(X_pca[y == t, 0], X_pca[y == t, 1], color=c, label=l, alpha=0.7)
29axes[0].set_title('PCA 降维(无监督)')
30axes[0].legend()
31
32# LDA 图
33for t, c, l in zip(targets, colors, labels):
34    axes[1].scatter(X_lda[y == t, 0], X_lda[y == t, 1], color=c, label=l, alpha=0.7)
35axes[1].set_title('LDA 降维(有监督)')
36axes[1].legend()
37
38plt.tight_layout()
39plt.show()
40
41# 打印信息保留比例
42print(f"PCA 前两主成分方差比例: {pca.explained_variance_ratio_.sum():.4f}")
43print(f"LDA 前两成分解释比例: {lda.explained_variance_ratio_.sum():.4f}")

观察结论

  • PCA 降维后,三类数据在二维平面上仍然混在一起(尤其是绿色和蓝色)。
  • LDA 降维后,三类数据在二维平面上被明显分开,边界清晰。

原因:PCA 只看方差大小,不管类别;LDA 知道哪些点属于同一类,降维时专门找能把类分开的方向。

3. 用途二:LDA 直接做分类

LDA 本身也是一个分类器(与逻辑回归类似,但假设数据服从正态分布)。

 1from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
 2from sklearn.model_selection import train_test_split
 3from sklearn.datasets import load_iris
 4
 5X, y = load_iris(return_X_y=True)
 6X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
 7
 8# LDA 分类器
 9lda_clf = LDA()
10lda_clf.fit(X_train, y_train)
11print(f"LDA 分类准确率: {lda_clf.score(X_test, y_test):.4f}")
12
13# 对比逻辑回归
14from sklearn.linear_model import LogisticRegression
15lr = LogisticRegression(max_iter=1000)
16lr.fit(X_train, y_train)
17print(f"逻辑回归准确率: {lr.score(X_test, y_test):.4f}")

结论:在鸢尾花数据集上,LDA 分类效果通常不输逻辑回归,且代码更简洁。

  • 👨‍🏫 教师活动
    1. 运行 PCA vs LDA 对比代码,让学生观察两张散点图——LDA 的图明显“分得更开”。
    2. 强调 lda.fit_transform(X, y) 必须传入 y(标签),这是 LDA 与 PCA 代码上的唯一区别,但也是本质区别。
  • 🧑‍🎓 学生活动
    1. 观察两张散点图,指出 LDA 降维后绿色和蓝色是否更容易区分。
    2. 修改 n_components=1(降到 1 维),用直方图展示两类在一条线上的分布,感受“类间大、类内小”。

通过 PCA vs LDA 的同图对比,用最直观的方式呈现“有监督降维”的优势。让学生亲眼看到:同样的数据,用不同的方法,结果天差地别。

✍️ 四、 解决问题过程(三):课堂练习——手写数字的 LDA 降维

📝 任务一:手写数字 LDA 降维可视化…

背景与题目: 使用 load_digits 手写数字数据集(64 维),用 LDA 将其降到 2 维并可视化。观察不同数字在 LDA 降维后的分布。

 1from sklearn.datasets import load_digits
 2from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
 3from sklearn.preprocessing import StandardScaler
 4import matplotlib.pyplot as plt
 5
 6# 加载数据
 7digits = load_digits()
 8X, y = digits.data, digits.target
 9
10# 标准化
11X = StandardScaler().fit_transform(X)
12
13# LDA 降维到 2 维
14lda = LDA(n_components=2)
15X_lda = lda.fit_transform(X, y)
16
17# 可视化(10 个数字用 10 种颜色)
18plt.figure(figsize=(10, 8))
19for i in range(10):
20    plt.scatter(X_lda[y == i, 0], X_lda[y == i, 1], label=str(i), alpha=0.6)
21
22plt.xlabel('LDA 第一成分')
23plt.ylabel('LDA 第二成分')
24plt.title('手写数字 64 维 → LDA 降维到 2 维')
25plt.legend()
26plt.show()
27
28# 查看降维后能保留多少判别信息
29print(f"前两成分判别能力比例: {lda.explained_variance_ratio_.sum():.4f}")
🔍 查看结果与解析…

观察

  • LDA 降维后,不同数字在二维平面上形成各自独立的簇。
  • 但数字 1 和 7、3 和 8 可能仍然有一些重叠,说明 2 维不足以完全区分所有数字。

对比回忆

  • 在第 6 章我们曾用 PCA 对同样的数据降维到 2 维,当时各数字混在一起。
  • LDA 的区分效果明显优于 PCA,因为它利用了标签信息。

📝 五、 课堂小结(5 分钟)

flowchart LR
    root["📊 LDA(线性判别分析)"]

    subgraph C1 ["💡 核心思想"]
        direction TB
        A1["有监督降维"]
        A2["类间距离大 + 类内距离小"]
        A3["找最佳投影方向"]
    end

    subgraph C2 ["🔁 vs PCA"]
        direction TB
        B1["PCA:无监督,方差最大"]
        B2["LDA:有监督,分类最好"]
    end

    subgraph C3 ["💻 代码"]
        direction TB
        C1_node["from sklearn.discriminant_analysis import LinearDiscriminantAnalysis"]
        C2_node["lda.fit_transform(X, y) ← 需要传标签!"]
        C3_node["用途:降维 + 分类"]
    end

    root --> C1
    root --> C2
    root --> C3

    style root fill:#4b6cb7,stroke:#253b6e,color:#fff
    style C1 fill:#e3f2fd,stroke:#2196f3
    style C2 fill:#fff3e0,stroke:#ff9800
    style C3 fill:#e8f5e9,stroke:#4caf50

✏️ 随堂检测与互动练习

点击展开:随堂测试题(带解析)

一、 单选题

  1. LDA 的优化目标是什么?
  • A. 让投影后方差最大
  • B. 让投影后类间距离大、类内距离小
  • C. 让投影后方差最小
  • D. 让所有数据投影到同一个点
【答案】

【解析】B。LDA 追求的是“不同类分开,同类聚拢”,这是它与 PCA 的本质区别。

  1. 以下哪个说法关于 LDA 是错误的?
  • A. LDA 是有监督学习算法
  • B. LDA 可以用于降维
  • C. LDA 和 PCA 一样,都不需要标签信息
  • D. LDA 也可以直接做分类
【答案】

【解析】C。LDA 必须有标签信息,这是它与 PCA 最核心的区别。

  1. 有 5 个类别的分类问题,用 LDA 最多能降到多少维?
  • A. 5 维
  • B. 4 维
  • C. 2 维
  • D. 1 维
【答案】

【解析】B。LDA 降维的最大维度是“类别数 - 1”。5 类数据最多降到 4 维。(这是一个拓展知识点,属于加分项)

二、 代码填空题

题目:请补全代码,使用 LDA 将数据降到 3 维。

1from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
2
3lda = _________________________________
4X_lda = _________________________________
【答案】
  1. LDA(n_components=3)
  2. lda.fit_transform(X, y)

📮 六、 课后作业与拓展

📮 课后作业…
  1. 基础代码题:加载 load_wine 葡萄酒数据集(3 类,13 个特征),分别用 PCA 和 LDA 降到 2 维,绘制两张散点图对比效果。
  2. 思考题:LDA 降维最大维度为什么是“类别数 - 1”?试着用 3 类数据(三角形三个顶点)去理解。(提示:3 个点最多确定一个平面,平面是 2 维)。
  3. 对比分析题:在鸢尾花数据集上,分别用 LDA 降维后再用 KNN 分类,和直接用 KNN 分类,对比准确率和训练时间,你发现了什么?
  4. 预习任务:我们已经学了两个基于“几何与空间距离”的算法(KNN 和 LDA),下一节课将是巩固强化练习课,我们会用实战项目把这两个算法串起来用。
  5. 职高衔接拓展:在人脸识别系统中,每张人脸图像有成千上万个像素特征,直接计算距离极慢。你会建议先用 PCA 还是 LDA 降维?为什么?(提示:人脸识别是有标签的分类任务,用 LDA 更合适)。

📋 七、 板书设计

🛠️ 板书设计…
 1第十一章 几何与空间距离
 2第二课时:LDA(线性判别分析)
 3
 4一、核心思想
 5   "有监督降维"
 6   目标:类间距离大 + 类内距离小
 7   本质:找一条投影线,让不同类别分得最开
 8
 9二、LDA vs PCA(灵魂对比)
10   PCA:无监督,只看方差,不管类别
11   LDA:有监督,利用标签,服务分类
12
13三、代码
14   from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
15   lda = LDA(n_components=2)
16   X_lda = lda.fit_transform(X, y)   # 注意:必须传入 y!
17
18四、两大用途
19   1. 降维(有监督的 PCA)
20   2. 分类(可替代逻辑回归)
21
22五、与 KNN 的关系
23   共同点:都基于"距离"和"空间"的几何直觉
24   不同点:KNN 直接分类,LDA 先降维再分类

本课用到的单词

单词 发音 专业英语解释(中文)
LDA (Linear Discriminant Analysis) /ˌlaɪniər dɪˈskrɪmɪnənt əˈnæləsɪs/ 线性判别分析。一种有监督的降维方法,目标是最大化类间距离、最小化类内距离。
Between-class Variance /bɪˈtwiːn klæs ˈveriəns/ 类间方差。不同类别中心点之间的分散程度,LDA 希望它越大越好。
Within-class Variance /wɪˈðɪn klæs ˈveriəns/ 类内方差。同一类别内部点的分散程度,LDA 希望它越小越好。
Projection /prəˈdʒekʃən/ 投影。将高维数据映射到低维空间的过程。
Discriminant /dɪˈskrɪmɪnənt/ 判别式。用于区分不同类别的函数或方向。