6-4降维(PCA与SVD)数据瘦身

🎯 教学目标与重难点…

【三维目标】

  • 📚 知识目标
    1. 理解什么是“维度灾难”——特征太多带来的计算负担和过拟合风险。
    2. 掌握 PCA(主成分分析)的核心思想:将高维数据投影到低维,保留最大方差(信息量)
    3. 了解 SVD 是 PCA 背后的数学计算引擎(知道名字和用途即可)。
    4. 掌握 sklearn.decomposition.PCA 的基本使用,尤其是 n_components 参数的设置。
  • ⚙️ 能力目标
    1. 能使用 PCA 将 4 维的鸢尾花数据降维到 2 维,并用散点图可视化。
    2. 能根据业务需求(保留 95% 信息)自动确定降维维度。
  • 💡 素养目标
    1. 建立“降维不是丢弃信息,而是提炼精华”的工程思维。
    2. 体会可视化对于理解高维数据的重要意义。

【重点与难点】

  • 🟢 教学重点
    1. PCA 的核心理念:找主成分(数据分散程度最大的方向)
    2. 使用 PCA(n_components=2) 实现二维可视化。
  • 🟡 教学难点
    1. 理解“方差最大”与“保留信息”之间的关系(数据越分散,区分度越高,信息越丰富)。
    2. SVD 与 PCA 的关系:只需要告诉学生“SVD 是 PCA 的底层数学解算器”,不推公式。

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

情景模拟:体检报告太详细,医生看花眼了!

假设你去医院体检,机器给你测了 100 个指标(身高、体重、血压、心率、血糖、血脂……)。这 100 个指标就是 100 维特征

问题来了

  1. 计算太慢:模型处理 100 维数据,计算距离要算 100 次减法,电脑卡顿。
  2. 过拟合风险:很多指标其实是重复的(比如“收缩压”和“舒张压”高度相关),冗余特征会让模型学歪。
  3. 没法画图:人类只能理解 3 维以内的空间,100 维的数据你看不到全貌。

引出解决方案: 聪明的医生不会看全部 100 项,而是提取几个综合指标,比如 “心血管健康指数”(由血压、血脂合并而来)。这个合并过程就是 降维

温故知新: 上节课我们学了用 PolynomialFeatures 造特征(特征变多)。降维就是它的“反向操作”——当特征多到跑不动时,我们把它压缩回去

  • 👨‍🏫 教师活动:展示一张 1000x1000 像素的图片,再展示压缩成 100x100 的缩略图。提问:“缩略图虽然模糊了,但你是不是还能认出它是猫还是狗?”(答案:能,关键信息保留了)。
  • 🧑‍🎓 学生活动:学生观察图片,感受“降维保信息”的直观含义。引出 PCA 就像“给数据拍一张低分辨率的快照”。

用“体检报告”这种信息过载的场景,让学生立刻共情“维度灾难”的痛点。再用“图片压缩”的常识,瞬间建立“降维≠瞎删数据,而是提炼精华”的正确认知。


📖 二、 解决问题过程(一):什么是 PCA 主成分分析(核心概念)

1. 核心思想:找一条“最佳投影线” 想象桌子上撒了一把长条形的豆子(二维数据:X 轴和 Y 轴)。

  • 原始坐标:你要用 (x, y) 两个数描述每颗豆子的位置。
  • 降维目标:只用一个数(一维)描述每颗豆子。

怎么做?

  • ❌ 错误做法:只取 X 坐标,抛弃 Y 坐标(丢掉了豆子在 Y 方向的高低差异)。
  • PCA 做法:画一条穿过豆子群中间、且豆子们在这条线上的投影分散得最开的斜线。

2. 关键术语(不讲数学,只讲意象)

  • 主成分(Principal Component):就是那条“最佳投影线”的方向。第一主成分是散得最开的线,第二主成分是与第一条垂直且散得第二开的线。
  • 方差(Variance):数据在投影线上的“分散程度”。方差越大,说明这个方向上区分度越高,信息量越大

3. 降维的威力(三个字:快、省、清)

作用 解释
加速计算 100 维降到 2 维,计算距离快几十倍
节省内存 数据体积缩小,训练更快
便于可视化 降到 2 维或 3 维,就能画散点图观察数据族群

4. PCA 与 SVD 的关系(一句话带过)

“PCA 是降维的方法,而 SVD(奇异值分解) 是计算机在背后计算 PCA 时使用的一种高效的数学工具。你只需要知道:调用 PCA 时,底层其实默认用了 SVD 算法来解方程即可,不用深究公式。”

  • 👨‍🏫 教师活动
    1. 在黑板上画一个椭圆形的点云图,用箭头画出长轴(第一主成分)和短轴(第二主成分)。
    2. 提问:“如果只保留一个数,你会选择把点投影到长轴上还是短轴上?”(答案:长轴,因为豆子在上面分开得更明显)。
  • 🧑‍🎓 学生活动:学生在纸上画一个斜着的椭圆,尝试画出那条“能最大拉开差距”的直线,感受“方差最大”的直觉。

彻底砍掉 PCA 的数学推导(协方差矩阵、特征向量),只保留 “找方差最大的投影方向” 这一个核心意象。对于职高生,知道“为什么做”和“怎么用代码”远比知道“怎么推导”重要。


💻 三、 解决问题过程(二):代码实战——鸢尾花数据 4 维降 2 维可视化

1. 经典案例:鸢尾花(Iris)数据集

  • 原始特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度(4 维)。
  • 目标:将其降维到 2 维,然后用散点图画出来,看看三种鸢尾花是否还能区分开。

2. 完整代码(三步走)

 1import numpy as np
 2import matplotlib.pyplot as plt
 3from sklearn.datasets import load_iris
 4from sklearn.decomposition import PCA
 5
 6# 第一步:加载数据
 7iris = load_iris()
 8X = iris.data          # 4维特征
 9y = iris.target        # 标签(3种花)
10target_names = iris.target_names
11
12# 第二步:创建 PCA 对象,指定降到 2 维
13pca = PCA(n_components=2)
14X_pca = pca.fit_transform(X)   # 拟合 + 转换一步到位
15
16print("原始形状:", X.shape)        # (150, 4)
17print("降维后形状:", X_pca.shape)  # (150, 2)
18
19# 第三步:可视化(2D散点图)
20plt.figure(figsize=(8, 6))
21colors = ['red', 'green', 'blue']
22for i, color, name in zip([0, 1, 2], colors, target_names):
23    plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], 
24                color=color, label=name, alpha=0.7)
25
26plt.xlabel('第一主成分 (PC1)')
27plt.ylabel('第二主成分 (PC2)')
28plt.title('鸢尾花 4维特征 -> 2维 PCA 降维可视化')
29plt.legend()
30plt.grid(True)
31plt.show()
32
33# 额外信息:查看每个主成分保留了百分之多少的“信息(方差)”
34print("各主成分解释方差比例:", pca.explained_variance_ratio_)
35print("前两个主成分累计保留信息:", sum(pca.explained_variance_ratio_))

运行结果解析

  • 输出显示累计保留信息约 95%+(说明 2 个新特征就能代表原来 4 个特征 95% 的信息)。
  • 散点图上,三种花各自聚成一团,界限清晰。这说明降维没有破坏分类能力!

3. 自动确定维度(省心小技巧) 如果不想指定具体维度,想让程序自动选择能保留 95% 信息 的维度数:

1pca = PCA(n_components=0.95)  # 传浮点数代表保留信息比例
2X_pca = pca.fit_transform(X)
3print("自动保留的特征数:", X_pca.shape[1])
  • 👨‍🏫 教师活动
    1. 带学生逐行运行代码,重点观察 explained_variance_ratio_ 的输出(比如 [0.92, 0.05, …]),说明第一主成分已经包含了绝大部分信息。
    2. 修改 n_components=3,让学生观察图形从 2D 变 3D(如果课堂环境支持,用 mpl_toolkits.mplot3d 展示)。
  • 🧑‍🎓 学生活动
    1. 学生自己运行代码,观察三种颜色的点在二维平面上的分布。
    2. 学生尝试将 n_components 改为 1,观察散点图变成一条直线上的点,讨论“1维还能分清三种花吗?”(答案:可能分不清了,说明信息丢太多)。

鸢尾花是机器学习的“Hello World”,用它做 PCA 可视化效果极佳,学生能直观看到“高维抽象”变成“低维具体”的全过程。explained_variance_ratio_ 的输出用百分比说话,比任何理论都更有说服力。


✍️ 四、 解决问题过程(三):课堂动手练习——手写数字压缩

📝 任务一:手写数字图片降维(PCA 压缩体验)…

背景与题目sklearn 自带了一个 load_digits 手写数字数据集,每张图片是 8×8 = 64 维的特征(64 个像素点的灰度值)。 请使用 PCA 将其降到 2 维,并观察降维后不同数字(0-9)在散点图上的分布。

 1from sklearn.datasets import load_digits
 2from sklearn.decomposition import PCA
 3import matplotlib.pyplot as plt
 4
 5digits = load_digits()
 6X = digits.data  # (1797, 64)
 7y = digits.target
 8
 9# 1. 请创建 PCA 对象,将数据降到 2 维,并完成转换
10pca = PCA(n_components=2)
11X_pca = pca.fit_transform(X)
12
13# 2. 绘制散点图,用不同颜色表示 0-9 这 10 个数字
14plt.figure(figsize=(10, 8))
15# 提示:可以用 for 循环遍历 10 个数字
16for i in range(10):
17    plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], label=str(i), alpha=0.6)
18
19plt.xlabel('第一主成分')
20plt.ylabel('第二主成分')
21plt.title('64维手写数字压缩到2维')
22plt.legend()
23plt.show()
24
25# 3. 打印:保留了多少信息?
26print("前两主成分累计方差比例:", sum(pca.explained_variance_ratio_))
🔍 查看参考结果与解析…

运行结果

  • 散点图上,0-9 的数字大致分成 10 个簇,但 1 和 7 可能混在一起,3 和 8 可能混在一起。
  • 累计方差比例大约在 0.28 ~ 0.30 之间(即降到 2 维只保留了 30% 的信息,因为 64 个像素压缩到 2 个点丢掉了太多细节)。

解析: 这说明对于复杂的图片,2 维不足以保留足够信息。如果改为 n_components=20,累计方差比例能到 90% 以上。降维并不是永远保住所有信息,而是在精度和效率之间做取舍


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

flowchart LR
    root["📉 6.2 降维(Dimensionality Reduction)"]

    subgraph C1 ["😫 为什么要降维(痛点)"]
        direction TB
        A1["特征爆炸(多项式惹的祸)"]
        A2["计算慢、占内存"]
        A3["无法可视化"]
    end

    subgraph C2 ["🧠 PCA 核心思想"]
        direction TB
        B1["找方差最大的投影方向"]
        B2["第一主成分 → 最分散"]
        B3["第二主成分 → 次分散"]
    end

    subgraph C3 ["💻 代码实战"]
        direction TB
        C1_node["PCA(n_components=2)"]
        C2_node["fit_transform(X)"]
        C3_node["explained_variance_ratio_"]
        C4_node["用 2D 散点图看分类"]
    end

    subgraph C4 ["⚙️ SVD"]
        direction TB
        D1["PCA 的底层计算器"]
        D2["知道即可,不推公式"]
    end

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

    style root fill:#4b6cb7,stroke:#253b6e,color:#fff
    style C1 fill:#ffebee,stroke:#ef5350
    style C2 fill:#e3f2fd,stroke:#2196f3
    style C3 fill:#e8f5e9,stroke:#4caf50
    style C4 fill:#f3e5f5,stroke:#9c27b0

✏️ 随堂检测与互动练习

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

一、 单选题

  1. PCA 降维的核心目标是什么?
  • A. 删除数据中所有小于 0 的数
  • B. 将高维数据投影到低维,并尽可能多地保留原始数据的方差(信息)
  • C. 将数据中的所有特征都变成 0 和 1
  • D. 增加数据的维度,使其更复杂
【答案】

【解析】B。PCA 追求的是在降维的同时保留最大的方差,因为方差越大代表数据的区分度越高。

  1. 在 sklearn 中,使用 PCA(n_components=0.95) 表示什么意思?
  • A. 只保留 95 个特征
  • B. 删除 95% 的特征
  • C. 自动选择能累计保留 95% 原始信息(方差) 的最少维度数
  • D. 只使用第 95 个主成分
【答案】

【解析】C。这是非常实用的技能!传入 0~1 之间的小数代表按“信息保留比例”自动定维。

  1. 结合上节课)我们在 6.1.7 学习了 PolynomialFeatures 生成多项式特征,当特征从 10 个变成 65 个导致模型训练过慢时,以下哪种做法最合理?
  • A. 放弃使用多项式特征
  • B. 使用 PCA 对生成的 65 个特征进行降维压缩
  • C. 增加训练数据量
  • D. 删除掉一半的特征列
【答案】

【解析】B。先用多项式捕捉非线性关系(造武器),再用 PCA 压缩冗余(瘦身防过载),这是工业界非常流行的 “先膨胀后压缩” 组合拳。

二、 代码填空题

题目:现有数据 X,请编写代码完成 PCA 降维,降到 3 维,并打印降维后每个新特征(主成分)的方差解释比例。

 1from sklearn.decomposition import PCA
 2
 3# 假设 X 是已加载好的数据
 4
 5# 1. 创建 PCA 对象,降至 3 维
 6pca = _________________________________
 7
 8# 2. 执行降维
 9X_pca = _________________________________
10
11# 3. 打印每个主成分的方差解释比例
12print(_________________________________)
【答案】
  1. PCA(n_components=3)
  2. pca.fit_transform(X)
  3. pca.explained_variance_ratio_

📮 六、 课后作业与拓展

📮 课后作业…
  1. 基础代码题:加载 load_digits 数据集,分别尝试 n_components=102040,打印累计方差比例,观察需要多少维才能保留 90% 的信息。
  2. 可视化作业:将鸢尾花数据降到 3 维,并使用 from mpl_toolkits.mplot3d import Axes3D 绘制 3D 散点图(旋转观察),体验高维降下来的立体感。
  3. 辨析题:降维后的新特征(主成分)还有原来“花瓣长度”这样的明确业务含义吗?(答案:没有了,主成分是原始特征的线性组合,物理意义变得模糊,这是降维的代价)。
  4. 预习任务:我们学完了所有的数据预处理(缩放、编码、填坑、造特征、降维)。下一章(6.3)我们将正式进入机器学习的两大阵营:有监督学习无监督学习 的划分——它们的区别就像“有标准答案的考试”和“没有标准答案的聚类”!
  5. 职高衔接拓展:如果你在一家电商公司工作,有 100 个用户行为特征(点击率、停留时长、加购率等),直接建模太慢,你会用 PCA 压缩成几个特征?压缩后的主成分你会怎么向业务总监解释?(提示:解释成“综合活跃指数”、“消费潜力指数”等)。

📋 七、 板书设计

🛠️ 板书设计…
 1第六章 降维
 26.2 PCA(主成分分析)& SVD
 3
 4一、为什么降维?
 5   - 特征太多(维度灾难)-> 计算慢、过拟合、画不了图
 6   - 目标:提炼精华,压缩体积
 7
 8二、PCA 怎么降?(不推公式,只讲直觉)
 9   - 找一条“最佳投影线”(主成分)
10   - 标准:数据在这条线上“散得越开”越好(方差最大)
11   - 第一主成分(最分散)-> 第二主成分(次分散,与第一垂直)
12
13三、代码三板斧
14   1. 创建:pca = PCA(n_components=2)
15   2. 执行:X_pca = pca.fit_transform(X)
16   3. 查看:pca.explained_variance_ratio_ (看保留了多少信息)
17
18四、PCA  SVD
19   - SVD  PCA 的底层数学计算工具(知道名字即可)
20
21⚠️ 记住:
22   降维是有代价的 —— 主成分失去了原始特征的“名字”,变成了黑箱综合指标。

本课用到的单词

单词 发音 专业英语解释(中文)
Dimensionality Reduction /daɪˌmenʃəˈnæləti rɪˈdʌkʃən/ 降维。减少数据集特征数量的过程。
PCA (Principal Component Analysis) /ˈprɪnsəpəl kəmˈpoʊnənt əˈnæləsɪs/ 主成分分析。一种通过将数据投影到方差最大方向来实现降维的算法。
Variance /ˈveriəns/ 方差。衡量数据分散程度的统计量,在 PCA 中代表“信息量”。
SVD (Singular Value Decomposition) /ˈsɪŋɡjələr ˈvæljuː ˌdiːkəmpəˈzɪʃən/ 奇异值分解。PCA 底层常用的数值计算工具。
Principal Component /ˈprɪnsəpəl kəmˈpoʊnənt/ 主成分。PCA 降维后生成的新的综合特征。
Explained Variance Ratio /ɪkˈspleɪnd ˈveriəns ˈreɪʃioʊ/ 解释方差比例。每个主成分所保留的原始数据信息百分比。