1602PCA的数学直觉与信息保留

🎯 教学目标与重难点…

【三维目标】

  • 📚 知识目标
    1. 理解PCA的几何本质——投影:将数据点垂直“拍”到主成分方向上。
    2. 理解“方差最大化”的深层含义——主成分是数据“拉得最开”的方向。
    3. 掌握碎石图(Scree Plot)的绘制与解读——用图形判断每个主成分的贡献。
    4. 理解累计方差比例与降维维度选择之间的关系。
  • ⚙️ 能力目标
    1. 能绘制碎石图并识别“拐点”,辅助判断主成分的选取数量。
    2. 能解释 explained_variance_ratio_ 数组中每个数字的含义。
    3. 能通过累计方差曲线判断“降到几维够用”。
  • 💡 素养目标
    1. 建立“用图形说话”的数据分析习惯——用碎石图、累计曲线等可视化工具辅助决策。
    2. 理解“信息保留”不是越高越好,而是在精度与简洁之间做理性权衡。

【重点与难点】

  • 🟢 教学重点
    1. 投影的几何直觉——每个数据点垂直落到主成分轴上。
    2. 碎石图的绘制与解读——识别“拐点”确定主成分数量。
    3. 累计方差比例的含义——前k个主成分保留了多少原始信息。
  • 🟡 教学难点
    1. 理解“投影”的几何操作——将二维/高维数据“拍”到一条线上。
    2. 区分“碎石图(看每个主成分的贡献)”与“累计方差曲线(看累积贡献)”的不同用途。
    3. 理解“信息保留比例”与“降维维度”之间的权衡关系。

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

回顾上节课(1601)

  • 我们学会了用PCA将高维数据降到2维,画散点图观察数据结构。
  • 我们知道 explained_variance_ratio_ 可以告诉我们每个主成分保留了多少信息。

核心疑问

上节课我们直接用了 PCA(n_components=2),相当于“硬性指定”降维维度。

问题来了

  1. 为什么第一主成分总是“最重要”的?(为什么它的方差比例最大?)
  2. 如果不知道降几维,我们怎么科学地决定?(总不能每次都瞎猜吧?)
  3. explained_variance_ratio_ 输出了一串数字(如 [0.92, 0.05, 0.02, 0.01]),但这一串数字怎么解读?为什么加起来等于1?

本节课定位

上节课我们“用了”PCA,本节课我们“读懂”PCA——理解PCA的几何直觉,学会用碎石图和累计曲线科学选择降维维度。

展示“成品”

课前准备:在屏幕上展示两张图——

  • 图1:鸢尾花数据的碎石图(Scree Plot)——横轴是主成分序号(1, 2, 3, 4),纵轴是每个主成分的方差比例(0.92, 0.05, 0.02, 0.01)。柱状图清晰显示“第一根柱子特别高,后面三根像小土坡”。
  • 图2:累计方差曲线——从0.92开始,累计到0.97,到0.99,到1.00。曲线快速上升后趋于平缓。

提问

  • “从碎石图你能看到什么?”(答案:第一主成分贡献最大)
  • “从累计曲线你能判断应该取几个主成分?”(答案:2个就够了,因为累计已经97%了)
  • 👨‍🏫 教师活动
    1. 展示上节课提到的鸢尾花数据的 explained_variance_ratio_ 数组 [0.92, 0.05, 0.02, 0.01]
    2. 指着数组提问:“0.92是什么意思?0.05是什么意思?为什么加起来正好等于1?”
    3. 引导学生回答:“0.92代表第一主成分保留了92%的信息……所有主成分的信息加起来就是100%。”
  • 🧑‍🎓 学生活动
    1. 观察碎石图和累计方差曲线的视觉对比。
    2. 讨论:“如果前2个主成分已经保留了97%的信息,第3个和第4个还有必要保留吗?”

通过视觉化的“碎石图”和“累计曲线”,让学生立刻抓住两个核心概念:“每个主成分的贡献”和“累积贡献”。用“柱子高度”和“累计爬坡”两个直观意象,为后续的数学直觉建立感性基础。


📖 二、 解决问题过程(一):PCA的几何直觉——投影(15分钟)

1. 什么是“投影”?——用“影子”来理解

想象一个三维空间中的球体(比如一个篮球),有一束平行光从侧面照射它:

  • 球体在墙上的影子是一个圆形(二维)。
  • 投影就是三维物体→二维影子的过程。

PCA做的是同样的事情:

  • 原始数据:高维空间中的点(比如4维的鸢尾花数据)。
  • 投影:将这些点“垂直照射”到一条直线(第一主成分)或一个平面(前两个主成分)上。
  • 降维结果:每个点在主成分轴上的坐标值

2. 二维→一维的投影(最直观的理解)

在二维平面上有一些点(用(x, y)表示),PCA找了一条直线(主成分),然后将每个点垂直投影到这条直线上。

  • 投影前:每个点需要2个数字描述(x和y)。
  • 投影后:每个点只需要1个数字描述(在直线上的位置)。

关键观察

  • 如果直线方向选得好(沿着数据拉得最开的方向),投影后的点依然能区分开(方差大)。
  • 如果直线方向选得不好(垂直于数据拉得最开的方向),投影后的点全部挤在一起(方差小)。

3. 为什么“投影后区分度”=“方差大”?

回到上节课的“集体照”类比:

  • 方差大(投影后点分散):你可以清楚分辨每个人——信息保留得多
  • 方差小(投影后点挤在一起):你分不清谁是谁——信息丢失得多

PCA的目标:找到那个“投影后点最分散”的方向——这就是第一主成分。

4. 主成分的数学含义(职高适配版)

主成分 含义 在鸢尾花数据中的表现
第一主成分(PC1) 数据最分散的方向 占了92%的方差 → 这一条线就几乎概括了全部数据
第二主成分(PC2) 与PC1垂直、第二分散的方向 占了5%的方差 → 增加了一点区分度
第三主成分(PC3) 与PC1、PC2垂直、第三分散的方向 占了2%的方差 → 基本是“噪音”
第四主成分(PC4) 剩余方向 占了1%的方差 → 几乎可以忽略

核心结论:PC1是“信息最丰富”的方向,PC2次之,越往后信息越少。降维就是只保留信息最丰富的前几个方向,放弃信息量极少的后几个方向

  • 👨‍🏫 教师活动
    1. 在黑板上画一个散点图(二维),再画一条穿过数据的斜线。
    2. 用手比划“垂直投影”的动作——将每个点垂直“拍”到线上。
    3. 画第二条线——垂直方向的线,把点投影上去,显示投影后的点“挤在一起”。
    4. 对比两条线的投影效果,提问:“哪个方向更好?”
  • 🧑‍🎓 学生活动
    1. 在纸上画5个散点,尝试画一条线,想象把点“拍”到线上的效果。
    2. 讨论:“如果线画歪了,投影后点挤在一起,说明什么?”(答案:这个方向信息量小)

通过“球体的影子”和“垂直投影”两个几何类比,将PCA中抽象的“投影”操作转化为可想象的空间动作。用“画线→投影→观察分散程度”的手动操作,帮助学生建立“方差最大=信息最多”的几何直觉。


💻 三、 解决问题过程(二):碎石图——看每个主成分的贡献(20分钟)

1. 什么是碎石图(Scree Plot)?

碎石图 = 将每个主成分的 explained_variance_ratio_ 按顺序绘制成柱状图或折线图。

为什么叫“碎石图”?

  • Scree在英文中指“山脚下的碎石堆”。
  • 图形特征:第一根柱子最高(山峰),后面的柱子像碎石一样越来越矮。
  • 观察“从哪里开始变成碎石”,就是选择主成分数量的依据。

2. 代码实现——绘制碎石图

 1import numpy as np
 2import matplotlib.pyplot as plt
 3from sklearn.datasets import load_iris
 4from sklearn.preprocessing import StandardScaler
 5from sklearn.decomposition import PCA
 6
 7# 加载数据
 8iris = load_iris()
 9X = iris.data
10
11# 标准化(PCA前的标准操作)
12scaler = StandardScaler()
13X_scaled = scaler.fit_transform(X)
14
15# 创建PCA对象(不降维,保留所有主成分,以便观察全部)
16pca = PCA()
17pca.fit(X_scaled)
18
19# 提取方差比例
20var_ratio = pca.explained_variance_ratio_
21
22# 绘制碎石图(柱状图)
23plt.figure(figsize=(10, 5))
24
25# 子图1:柱状图(碎石图)
26plt.subplot(1, 2, 1)
27plt.bar(range(1, len(var_ratio) + 1), var_ratio, color='steelblue', alpha=0.7)
28plt.xlabel('主成分序号')
29plt.ylabel('方差比例(信息占比)')
30plt.title('碎石图(Scree Plot)')
31plt.xticks(range(1, len(var_ratio) + 1))
32plt.grid(axis='y', alpha=0.3)
33# 在柱子上标注数值
34for i, v in enumerate(var_ratio):
35    plt.text(i + 0.9, v + 0.01, f'{v:.2f}', ha='center')
36
37# 子图2:折线图(累计方差曲线)
38plt.subplot(1, 2, 2)
39cumsum = np.cumsum(var_ratio)
40plt.plot(range(1, len(cumsum) + 1), cumsum, 'ro-', linewidth=2, markersize=8)
41plt.axhline(y=0.95, color='g', linestyle='--', label='95% 信息线')
42plt.xlabel('主成分序号')
43plt.ylabel('累计方差比例')
44plt.title('累计方差曲线')
45plt.xticks(range(1, len(cumsum) + 1))
46plt.legend()
47plt.grid(True, alpha=0.3)
48
49plt.tight_layout()
50plt.show()
51
52print("各主成分方差比例:", var_ratio)
53print("累计方差比例:", cumsum)

3. 图形解读(重点!)

左侧碎石图(柱子高度)

  • PC1的柱子最高(0.92)—— 这一个方向占了92%的信息。
  • PC2的柱子明显变矮(0.05)—— 只有5%。
  • PC3和PC4几乎贴地(0.02, 0.01)—— 基本是“碎石”。
  • 判断方法:找到“柱子突然变矮”的位置,从那里开始就是“碎石”,舍弃。

右侧累计曲线(上升过程)

  • 从PC1到PC2:曲线从0.92升到0.97(快速上升)。
  • 从PC2到PC3:曲线从0.97升到0.99(缓慢上升)。
  • 从PC3到PC4:曲线从0.99升到1.00(几乎不动)。
  • 判断方法:找到“曲线从快速上升变为平缓”的位置——这就是“肘点”。

4. 碎石图 vs 累计曲线:两种视角,一个结论

工具 看什么 怎么用
碎石图 每个主成分的个体贡献 观察柱子高度,找“断崖式下降”的位置
累计曲线 前k个主成分的累计贡献 观察曲线,找“由陡变缓”的肘点

两者结合使用,结论相互验证。 在鸢尾花数据中,两者都指向K=2。

  • 👨‍🏫 教师活动
    1. 运行代码,展示两张子图。
    2. 指着左侧碎石图提问:“从第几个柱子开始,高度明显变小了?”
    3. 指着右侧累计曲线提问:“曲线在哪个位置从‘陡’变‘缓’了?”
    4. 引导学生得出统一结论:“两个图都指向K=2。”
  • 🧑‍🎓 学生活动
    1. 在本地运行代码,观察两张图。
    2. 记录自己判断的“拐点”位置。
    3. 对比两个图给出的结论是否一致。

通过“一张图的两个视角”——柱状图看个体、折线图看累计,让学生掌握两种互补的分析工具。并排对比的设计让学生直观感受到:不同工具指向同一结论时,这个结论就很可靠。


✍️ 四、 解决问题过程(三):动手实验——用碎石图分析不同数据集(20分钟)

📝 任务:对比三个数据集的碎石图…

背景与题目

三个数据集的特征冗余程度不同:

  • 鸢尾花(iris) :4维,已知降到2维能保留95%以上信息。
  • 葡萄酒(wine) :13维,特征间的相关性不如鸢尾花那么强。
  • 手写数字(digits) :64维,像素点各有用途,冗余度较低。

任务要求

  1. 对三个数据集分别:
    • 标准化 → PCA(保留全部主成分) → 绘制碎石图 + 累计曲线。
    • 记录:达到95%累计方差需要几个主成分。
  2. 将三个结果并排对比(3行,每行2张图)。
 1from sklearn.datasets import load_iris, load_wine, load_digits
 2from sklearn.preprocessing import StandardScaler
 3from sklearn.decomposition import PCA
 4import matplotlib.pyplot as plt
 5import numpy as np
 6
 7datasets = [
 8    ('鸢尾花', load_iris().data),
 9    ('葡萄酒', load_wine().data),
10    ('手写数字', load_digits().data)
11]
12
13fig, axes = plt.subplots(3, 2, figsize=(12, 12))
14
15for row, (name, X) in enumerate(datasets):
16    # 标准化
17    X_scaled = StandardScaler().fit_transform(X)
18    # PCA
19    pca = PCA()
20    pca.fit(X_scaled)
21    var_ratio = pca.explained_variance_ratio_
22    cumsum = np.cumsum(var_ratio)
23    
24    # 左列:碎石图
25    axes[row, 0].bar(range(1, len(var_ratio)+1), var_ratio, color='steelblue', alpha=0.7)
26    axes[row, 0].set_title(f'{name} - 碎石图')
27    axes[row, 0].set_xlabel('主成分序号')
28    axes[row, 0].set_ylabel('方差比例')
29    axes[row, 0].grid(axis='y', alpha=0.3)
30    
31    # 右列:累计曲线
32    axes[row, 1].plot(range(1, len(cumsum)+1), cumsum, 'ro-', linewidth=2)
33    axes[row, 1].axhline(y=0.95, color='g', linestyle='--', label='95%')
34    axes[row, 1].set_title(f'{name} - 累计方差')
35    axes[row, 1].set_xlabel('主成分序号')
36    axes[row, 1].set_ylabel('累计方差比例')
37    axes[row, 1].legend()
38    axes[row, 1].grid(True, alpha=0.3)
39    
40    # 打印信息
41    n_95 = np.argmax(cumsum >= 0.95) + 1
42    print(f"{name}: 原始维度={X.shape[1]}, 达到95%需要{n_95}个主成分")
43
44plt.tight_layout()
45plt.show()

📋 填写对比表格

数据集 原始维度 达到95%所需主成分数 压缩比例 特征冗余程度判断
鸢尾花 4维 ____ 压缩了____% 高/中/低
葡萄酒 13维 ____ 压缩了____% 高/中/低
手写数字 64维 ____ 压缩了____% 高/中/低

🔍 深度思考

  1. 哪个数据集的碎石图“第一根柱子”最高?(____)这说明什么?
  2. 哪个数据集的碎石图“柱子下降最平缓”?(____)这说明什么?
  3. 如果你有一个100维的数据集,碎石图显示前5个主成分累计达到95%,你打算保留几个主成分?为什么?
🔍 查看参考结论…

典型结果

数据集 原始维度 达到95%所需主成分数 压缩比例 冗余度
鸢尾花 4维 2 50%
葡萄酒 13维 约7-8 约40%
手写数字 64维 约30 约53% 中低

解读

  • 鸢尾花:第一主成分占了92% → 说明4个特征高度相关(比如花瓣长度和花瓣宽度几乎同升同降)。
  • 葡萄酒:第一主成分约占40%-50% → 13个特征之间有一定相关性,但不如鸢尾花那么强。
  • 手写数字:第一主成分约占10%-15% → 64个像素点各有独立性,没有哪个单一方向能概括所有数据。

结论:降维的效果完全取决于数据本身的冗余程度。冗余度高的数据(如鸢尾花)用PCA效果极佳,冗余度低的数据(如手写数字)用PCA只能有限压缩。


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

flowchart LR
    root["📊 无监督学习(七):PCA的数学直觉"]

    subgraph C1["📐 投影的几何直觉"]
        direction TB
        A1["数据点垂直'拍'到主成分轴上"]
        A2["投影后分散 → 方差大 → 信息多"]
        A3["投影后聚集 → 方差小 → 信息少"]
    end

    subgraph C2["📊 碎石图(看个体)"]
        direction TB
        B1["每个主成分的方差比例"]
        B2["柱子高度 = 信息量"]
        B3["找'断崖'——突然变矮的位置"]
    end

    subgraph C3["📈 累计曲线(看整体)"]
        direction TB
        C1_node["前k个主成分的累计方差"]
        C2_node["找'肘点'——由陡变缓的位置"]
        C3_node["确定最优降维维度"]
    end

    subgraph C4["🎯 核心结论"]
        direction TB
        D1["降维维度不靠猜 —— 碎石图/累计曲线说了算"]
        D2["降维效果取决于数据冗余度"]
    end

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

    style root fill:#6a1b9a,stroke:#4a148c,color:#fff
    style C1 fill:#e3f2fd,stroke:#2196f3
    style C2 fill:#fff3e0,stroke:#ff9800
    style C3 fill:#e8f5e9,stroke:#4caf50
    style C4 fill:#f3e5f5,stroke:#9c27b0

✏️ 随堂检测与互动练习

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

一、 单选题

  1. 在PCA中,“投影"的几何含义是?
  • A. 将数据点垂直映射到主成分方向上
  • B. 将数据点水平移动到主成分方向上
  • C. 删除数据点中不符合条件的一部分
  • D. 将数据点随机分配到不同主成分上
【答案】

【解析】A。投影是PCA的核心几何操作——将每个高维数据点垂直"拍"到低维主成分方向上,得到新的坐标值。

  1. 碎石图(Scree Plot)的主要用途是?
  • A. 显示每个主成分的方差比例(个体贡献)
  • B. 显示前k个主成分的累计方差比例
  • C. 显示原始数据的分布情况
  • D. 显示聚类结果
【答案】

【解析】A。碎石图关注的是"每个"主成分的贡献,用柱子高度表示。累计方差曲线(B)是另一个工具,两者互补使用。

  1. 以下关于累计方差曲线的说法,正确的是?
  • A. 曲线一定是从0开始逐渐上升
  • B. 曲线从1开始逐渐下降
  • C. 曲线从第一个主成分的方差比例开始,逐渐累加到1
  • D. 曲线与碎石图表达的是完全相同的信息
【答案】

【解析】C。累计曲线从第一个主成分的比例开始累加,最终到达1(全部主成分之和为100%)。A错误(起点是第一个主成分的比例,不一定是0)。

二、 简答题

题目:某数据分析师对一个数据集做PCA后,得到以下碎石图结果:PC1=0.60, PC2=0.25, PC3=0.10, PC4=0.03, PC5=0.02。请回答:

  1. 前两个主成分累计保留了多少信息?
  2. 如果目标是"保留90%以上的信息”,应该选几个主成分?
  3. 哪个主成分开始可以被视为"碎石"?
【答案】
  1. PC1 + PC2 = 0.60 + 0.25 = 0.85(85%)
  2. PC1+PC2+PC3 = 0.60+0.25+0.10 = 0.95(95%) ,已达到90%目标,需要3个主成分
  3. 从PC4开始(0.03, 0.02),柱子高度显著变小,可视为"碎石"。

📮 六、 课后作业与拓展

📮 课后作业…
  1. 基础代码题:在 load_breast_cancer(乳腺癌数据集,30维)上绘制碎石图和累计方差曲线,记录达到90%、95%、98%分别需要多少个主成分。
  2. 对比分析作业:比较鸢尾花、葡萄酒、乳腺癌三个数据集的碎石图形态,按"第一主成分占比从高到低"排序,并解释原因。
  3. 思考题:如果一个数据集的碎石图显示所有主成分的方差比例都差不多(没有明显的"高柱子"),这说明什么?这种情况下PCA还适用吗?
  4. 综合题:你拿到一个200维的数据集,碎石图显示PC1=0.08, PC2=0.07, PC3=0.06, …,没有明显拐点。达到95%累计方差需要150个主成分。你会如何使用这个数据集?PCA还是原始数据?为什么?
  5. 预习任务:下节课我们将学习SVD,它是PCA背后的"数学计算引擎"。预习教材中关于SVD的部分,思考:如果PCA是"做一道菜",SVD是什么角色?

📋 七、 板书设计

🛠️ 板书设计…
 1无监督学习(七):PCA的数学直觉与信息保留
 2
 3一、 投影的几何直觉
 4   - 数据点垂直"拍"到主成分轴上
 5   - 投影后分散 → 方差大 → 信息多(好方向!)
 6   - 投影后聚集 → 方差小 → 信息少(差方向!)
 7
 8二、 碎石图(Scree Plot)—— 看"个体贡献"
 9   - 横轴:主成分序号(PC1, PC2, PC3, ...)
10   - 纵轴:每个主成分的方差比例
11   - 柱子高度 = 该主成分保留的信息量
12   - 找"断崖":柱子突然变矮的位置 = 舍弃起点
13
14三、 累计方差曲线 —— 看"整体贡献"
15   - 横轴:主成分序号
16   - 纵轴:前k个主成分的累计方差比例
17   - 找"肘点":曲线由陡变缓的位置 = 最优维度
18
19四、 两个工具的关系
20   - 碎石图 → 看"每个"主成分(微观)
21   - 累计曲线 → 看"前k个"主成分(宏观)
22   - 结论一致 → 可信!
23
24五、 核心结论
25   ⭐ 降几维不靠猜——用碎石图 + 累计曲线做出量化决策!

本课用到的单词

单词 发音 专业英语解释(中文)
Projection /prəˈdʒekʃən/ 投影。将数据点垂直映射到低维空间的操作,是PCA的核心几何步骤。
Scree Plot /skriː plɒt/ 碎石图。显示每个主成分方差比例的柱状图,用于判断主成分数量。
Cumulative Variance /ˈkjuːmjələtɪv ˈveriəns/ 累计方差。前k个主成分的方差比例之和,用于评估降维的信息保留程度。
Elbow Point /ˈelboʊ pɔɪnt/ 肘点。累计方差曲线从快速上升变为平缓的转折点,对应最优降维维度。
Principal Component /ˈprɪnsəpəl kəmˈpoʊnənt/ 主成分。PCA降维后生成的新的综合特征,按方差大小排序。
Explained Variance Ratio /ɪkˈspleɪnd ˈveriəns ˈreɪʃioʊ/ 解释方差比例。每个主成分所保留的原始数据信息百分比。