1601 降维与PCA

🎯 教学目标与重难点…

【三维目标】

  • 📚 知识目标
    1. 理解降维在无监督学习中的定位——与聚类并列,都是“在没有标签的情况下探索数据”。
    2. 掌握PCA的核心思想:将高维数据投影到低维,保留最大方差(信息量)。
    3. 理解“降维可视化”在探索性数据分析(EDA)中的核心价值——帮助人类理解高维数据。
    4. 掌握 sklearn.decomposition.PCA 的基本使用。
  • ⚙️ 能力目标
    1. 能使用PCA将高维数据降到2维或3维,并用散点图进行可视化。
    2. 能从PCA散点图中观察数据是否存在自然的“分组结构”,为后续聚类方法的选择提供依据。
    3. 能解释 explained_variance_ratio_ 的含义。
  • 💡 素养目标
    1. 建立“降维是探索性数据分析的‘探路者’”的思维——先降维看全局,再决定用什么方法做深入分析。
    2. 体会可视化对于理解高维数据的不可替代的价值。

【重点与难点】

  • 🟢 教学重点
    1. PCA的核心理念:找数据分散程度最大的方向(主成分)
    2. 使用 PCA(n_components=2) 实现高维数据到二维平面的可视化。
    3. 从PCA散点图中“读”出数据的分组结构。
  • 🟡 教学难点
    1. 理解“方差最大”与“保留信息”之间的关系——数据越分散,区分度越高,信息越丰富。
    2. 理解降维可视化与聚类的互补关系——“降维帮助我们看到分组,聚类帮我们自动分组”。

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

🔄 回顾无监督学习的两大阵营

在之前的课程中,我们学习了聚类(Clustering)——在没有标签的情况下,让计算机自动发现数据中的“群体”。比如K-Means把客户分成不同的群体。

今天我们要学习的,是无监督学习的另一个重要工具——降维(Dimensionality Reduction)

类比:聚类和降维就像两个“盲人摸象”的工具:

  • 聚类 → 把相似的事物归拢到一起(分组)
  • 降维 → 把复杂的事物简化展示(透视)

🌊 情景模拟:瑞士卷的启示

展示一张“瑞士卷”3D数据图(即Swiss Roll数据集):

  • 从3D视角看:数据像一卷蛋糕,卷曲缠绕,肉眼很难看清它的内部结构。
  • 但如果我们将它“展开”成2D平面,就会发现:数据其实是沿着一条长带分布的,颜色从一端渐变到另一端。

核心提问

  • 3D版本的数据,你很难看出“数据是怎么分布的”。
  • 2D展开版本,你一眼就能看出“数据是沿着一条渐变路径延伸的”。

降维的核心价值就在这里

降维不是为了“丢掉信息”,而是为了“找到合适的视角”,让你看清楚数据的骨架。

📌 本节课定位

在无监督学习章节中,降维与聚类并列为两大探索工具:

  • 聚类:从样本角度找“群体”(哪些样本聚在一起)
  • 降维:从特征角度找“骨架”(数据在哪个方向上变化最大)

两者可以单独使用,也可以组合使用——先降维可视化观察数据结构,再选择合适的方法做深入分析

💡 和特征处理章节的“降维”有什么区别?

维度 特征处理中的降维(A1/A2) 无监督学习中的降维(B1/B2/B3)
核心目标 压缩数据,加速后续建模 探索数据,发现内在结构
使用时机 建模之前的预处理环节 拿到数据后的探索性分析环节
价值取向 “瘦身” —— 让模型跑得更快 “探路” —— 让我看懂数据长什么样
后续动作 压缩后的数据送进分类/回归模型 可视化结果指导聚类方法选择
  • 👨‍🏫 教师活动
    1. 在大屏幕上展示瑞士卷数据的3D图和2D展开图(使用 make_swiss_roll + matplotlib 生成)。
    2. 提问:“3D图里,你能看出数据的渐变规律吗?2D图呢?”
    3. 引导学生回答:“2D图能,因为展开后结构更清楚了。”
    4. 在黑板上画出“聚类 vs 降维”的对比示意图,标注本节课在无监督学习中的位置。
  • 🧑‍🎓 学生活动
    1. 观察3D图和2D图的对比,感受“降维揭示结构”的直观含义。
    2. 讨论:“如果给你一份100维的数据,你第一步会做什么?”(期望回答:先降维看看!)

通过瑞士卷数据的3D→2D展开对比,让学生直观感受降维的“探路”价值——不是丢掉信息,而是找到一个更好的视角来观察数据。同时,通过与聚类的对比,明确降维在无监督学习中的独特定位:降维看“结构”,聚类看“群体”。


📖 二、 解决问题过程(一):什么是PCA(核心概念,20分钟)

1. 核心思想:找一条“最佳投影线”

想象桌子上撒了一把长条形的豆子(二维数据:X轴和Y轴)。

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

怎么做?

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

2. 关键术语(只讲意象,不讲公式)

术语 含义 生活类比
主成分(Principal Component) 数据“散得最开”的方向 豆子群的长轴方向
第一主成分(PC1) 最分散的方向(最重要的新特征) 长轴
第二主成分(PC2) 与PC1垂直、次分散的方向 短轴
方差(Variance) 数据在某个方向上的“分散程度” 豆子沿某个方向拉开多远

3. 为什么“方差越大=信息越多”?(核心难点,重点展开)

想象你在拍摄一张集体照,有5个人站在一条直线上:

  • 情况A(方差小) :5个人都挤在画面正中央的一小块区域。你很难分清谁是谁,因为你无法从“位置”这个维度区分他们——区分度低,信息量少
  • 情况B(方差大) :5个人均匀分布,一个人站在最左边,一个在最右边,其余均匀分布。你可以很清楚地通过“位置”来分辨每一个人——区分度高,信息量丰富

PCA找的正是那个“最能拉开人与人距离”的方向——也就是方差最大的方向。

4. 降维作为“探索工具”的三大用途

用途 解释 示例
① 发现自然分组 降维后画散点图,看数据是否自然聚成几团 鸢尾花降到2维后,3种花各自聚成一团
② 识别离群点 远离主体的点一目了然 数据中的异常值会在图中“孤零零”出现
③ 判断冗余度 如果降到2维只保留了30%信息,说明数据复杂;如果保留了95%,说明数据高度冗余 鸢尾花95% vs 手写数字30%

5. ⚠️ 降维的代价

降维后,新生成的“主成分”失去了原始特征的具体名字(比如“花瓣长度”变成了PC1),变成了一个“综合指标”。

在探索性分析中,这不一定是坏事——因为我们的目的不是“解释每个主成分叫什么”,而是“观察数据的整体结构”。

但在需要向业务方汇报时,记得给主成分起“综合指数”这样的名字,方便对方理解。

  • 👨‍🏫 教师活动
    1. 在黑板上画一个椭圆形的点云图,用箭头画出长轴(第一主成分)和短轴(第二主成分)。
    2. 提问:“如果只保留一个数,你会选择把点投影到长轴上还是短轴上?”
    3. 引导学生回答:“长轴!因为豆子在长轴上分散得更开,区分度更高。”
    4. 在黑板另一侧画出“方差小”和“方差大”的对比示意图(同样是5个点,一组挤在一起,一组散得很开),让学生直观感受“分散→区分度高→信息量大”。
  • 🧑‍🎓 学生活动
    1. 在纸上画一个斜着的椭圆,尝试画出那条“能最大拉开差距”的直线。
    2. 讨论:“如果降维后的主成分没有名字,在探索性分析中,这会影响我们的判断吗?”(答案:不会,因为我们只是想看结构,不是想命名)

彻底砍掉PCA的数学推导(协方差矩阵、特征向量),只保留“找方差最大的投影方向”这一个核心意象。通过“集体照”的生活化类比,将“方差=信息量”这一反直觉的概念转化为可感知的经验。通过“三大用途”的表格,让学生明确PCA在探索性分析中的具体价值。


💻 三、 解决问题过程(二):代码实战——鸢尾花PCA可视化(20分钟)

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

  • 原始特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度(4维)。
  • 目标:将其降维到2维,用散点图展示三种鸢尾花的分布。
  • 核心问题:我们提前知道鸢尾花有3种。但如果不知道呢?仅凭PCA降维后的散点图,我们能推断出“数据大概分成3类”吗?

这就是降维作为“探索工具”的价值——在没有任何标签的情况下,先降维画图,看看数据是否存在自然分组,再决定后续使用什么聚类方法(K-Means? 层次聚类? DBSCAN?)。

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        # 标签(本节课先用标签来着色,是为了验证降维效果)
10target_names = iris.target_names
11
12print("原始数据形状:", X.shape)  # (150, 4)
13
14# 第二步:创建PCA对象,指定降到2维
15pca = PCA(n_components=2)
16X_pca = pca.fit_transform(X)
17
18print("降维后形状:", X_pca.shape)  # (150, 2)
19
20# 第三步:可视化(2D散点图)
21plt.figure(figsize=(10, 8))
22colors = ['red', 'green', 'blue']
23for i, color, name in zip([0, 1, 2], colors, target_names):
24    plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], 
25                color=color, label=name, alpha=0.7, s=50)
26
27plt.xlabel('第一主成分 (PC1)')
28plt.ylabel('第二主成分 (PC2)')
29plt.title('鸢尾花 4维 → 2维 PCA 降维可视化')
30plt.legend()
31plt.grid(True)
32plt.show()
33
34# 第四步:查看每个主成分保留了多少信息
35print("各主成分解释方差比例:", pca.explained_variance_ratio_)
36print("前两个主成分累计保留信息:", sum(pca.explained_variance_ratio_))

3. 运行结果解读——从“探索”角度看问题

假设输出为:

1各主成分解释方差比例: [0.92, 0.05, 0.02, 0.01]
2前两个主成分累计保留信息: 0.97

解读(站在“探索性分析”的视角)

发现 含义
PC1占了92%的信息 数据在某个方向上变化最为剧烈——这是数据的“主骨架”
前两维保留97%信息 4维数据可以用2维替代,几乎不丢信息
散点图上3种花各自聚成一团 数据存在明显的3个自然分组,即使不知道标签,肉眼也能看出3个群体
红色(山鸢尾)与其他两种分离较远 山鸢尾与其他两种差异较大,而变色鸢尾和维吉尼亚鸢尾有部分重叠

核心结论

仅仅通过PCA降维可视化,即使没有任何标签,我们也能推断出:这组数据大概可以分成3类,且其中一类与其他两类差异较大。 这就是降维作为“探路者”的价值——它告诉我们应该往哪个方向继续探索(比如:尝试K-Means,K=3)。

4. 课堂互动提问

  • 如果我们在做完PCA后,看到散点图上3个簇非常清晰,下一步应该做什么?
  • 答案:可以尝试用K-Means(K=3)进行聚类,然后用聚类结果与真实标签对比,验证降维后的可视化是否“可信”。
  • 👨‍🏫 教师活动
    1. 带学生逐行运行代码,在散点图生成后,指着图提问:“把坐标轴上的数字遮住,单看三种颜色的分布——即使你不知道这是三种花,你会认为数据分几类?”
    2. 引导学生从图上“读”出结论:“红色聚在左边,绿色和蓝色在右边,虽然绿色和蓝色有重叠,但整体上可以看到3个群体。”
  • 🧑‍🎓 学生活动
    1. 在本地运行代码,观察三种颜色在二维平面上的分布。
    2. 讨论:“如果我们不知道鸢尾花有3种,仅凭这张图,我们会推断出K=3还是K=2?为什么?”

鸢尾花数据集是经典的“降维展示案例”,因为它的4个特征高度冗余,降到2维后几乎不丢信息。关键区别在于分析视角:在系列A(特征处理)中,强调的是“降维后数据还能送进模型”;在本节课(无监督学习)中,强调的是“从散点图中我们能读出什么关于数据结构的线索”。


✍️ 四、 解决问题过程(三):课堂探索——用PCA寻找数据分组(20分钟)

📝 任务:在未知数据中探索结构…

背景与题目

现有一个“未知”数据集(load_wine,葡萄酒数据集,13维特征,3个品种),但你不知道它有几类

你的任务:使用PCA将其降到2维,通过散点图观察数据是否存在自然分组,并推测可能的聚类个数。

 1from sklearn.datasets import load_wine
 2from sklearn.decomposition import PCA
 3import matplotlib.pyplot as plt
 4
 5# 加载数据(假装不知道标签)
 6wine = load_wine()
 7X = wine.data  # 13维特征
 8# y = wine.target  # 先不告诉你标签!
 9
10# 1. 请创建PCA对象,将数据降到2维
11pca = PCA(n_components=2)
12X_pca = pca.fit_transform(X)
13
14# 2. 绘制散点图(先用一种颜色,观察整体分布)
15plt.figure(figsize=(8, 6))
16plt.scatter(X_pca[:, 0], X_pca[:, 1], alpha=0.7, s=50)
17plt.xlabel('第一主成分')
18plt.ylabel('第二主成分')
19plt.title('葡萄酒数据 PCA降维后分布(未知标签)')
20plt.grid(True)
21plt.show()
22
23# 3. 打印累计方差比例
24print("前两个主成分累计保留信息:", sum(pca.explained_variance_ratio_))
25
26# 4. 思考题:从图中你能看到几个"自然的群体"?你推测大概有几类?

🔍 对比验证

在完成上面的探索后,用真实标签来验证你的推测:

 1# 现在查看真实标签,验证你的推测
 2y_true = wine.target
 3plt.figure(figsize=(8, 6))
 4colors = ['red', 'green', 'blue']
 5for i, color in zip([0, 1, 2], colors):
 6    plt.scatter(X_pca[y_true == i, 0], X_pca[y_true == i, 1], 
 7                color=color, label=f'品种{i}', alpha=0.7, s=50)
 8plt.xlabel('第一主成分')
 9plt.ylabel('第二主成分')
10plt.title('葡萄酒数据 PCA降维后分布(带真实标签验证)')
11plt.legend()
12plt.grid(True)
13plt.show()

📋 填写探索日志

  1. 我在未看到标签时,从散点图中观察到的“自然群体”数量是____个。
  2. 使用真实标签验证后,实际类别数是____个。
  3. 我的推测____(准确/不准确)。如果不准确,可能的原因是______。
  4. 累计方差比例为____%,说明13维降到2维保留了____%的信息(这个数字比鸢尾花____(高/低),说明葡萄酒数据的特征冗余程度____(高/低))。
🔍 查看参考解析…

典型结果

  • 累计方差比例:约55%~60%(13维降到2维,约保留58%信息)。
  • 散点图上可以看到3个大致分离的簇,但其中一个簇(品种0)与其他两个分离较好,品种1和品种2有部分重叠。

解析

  • 葡萄酒数据的特征冗余程度不如鸢尾花高(13维压缩到2维只保留了不到60%),所以2维散点图上的簇不如鸢尾花“干净”,重叠部分较多。
  • 尽管如此,我们仍然能从图中看到大概3个群体——这已经足够让我们决定“尝试用K-Means(K=3)”了。
  • 核心体会:降维可视化不要求完美分离,只要能看到“大致有几个群体”,就已经发挥了“探路者”的作用。

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

flowchart LR
    root["📊 无监督学习(六):降维与PCA"]

    subgraph C1["🔍 降维 vs 聚类"]
        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_"]
    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:#f3e5f5,stroke:#9c27b0
    style C2 fill:#e3f2fd,stroke:#2196f3
    style C3 fill:#e8f5e9,stroke:#4caf50
    style C4 fill:#fff8e1,stroke:#ffb300

✏️ 随堂检测与互动练习

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

一、 单选题

  1. 在无监督学习中,PCA的主要用途是?
  • A. 自动将数据分成若干类
  • B. 将高维数据投影到低维,便于可视化观察数据结构
  • C. 预测新样本的类别标签
  • D. 删除数据中的异常值
【答案】

【解析】B。PCA是降维工具,核心价值在于帮助人类理解和可视化高维数据。A是聚类的任务,C是有监督学习的任务。

  1. 如果对一组数据做PCA降到2维后,散点图上出现了3个清晰的簇,这说明什么?
  • A. 数据一定有3个类别
  • B. 数据可能存在3个自然分组,值得进一步用聚类验证
  • C. 降维效果很差
  • D. 数据只有2个特征
【答案】

【解析】B。降维可视化看到的结构不一定完全对应真实标签,但它是一个强烈的信号,提示我们“数据可能存在3个自然群体”,值得用聚类方法进一步探索。

  1. 在鸢尾花数据中,PCA降到2维后累计方差比例达到95%以上,这说明?
  • A. 鸢尾花的4个特征相互独立,没有冗余
  • B. 鸢尾花的4个特征之间有大量冗余信息
  • C. PCA在鸢尾花数据上失败了
  • D. 还需要更多特征才能准确分类
【答案】

【解析】B。累计方差比例高说明数据可以被大幅压缩而不丢失太多信息,意味着原始特征之间存在较强的相关性(冗余)。

二、 简答题

题目:你拿到了一份包含50个特征、没有任何标签的数据集。请描述你将如何使用PCA进行探索性数据分析,写出至少3个步骤。

【答案】

【解析】

  1. 标准化:先对50个特征进行标准化(StandardScaler),避免量纲差异影响PCA方向。
  2. 降维可视化:用PCA将数据降到2维,绘制散点图,观察是否存在自然的分组、是否有明显的离群点。
  3. 评估压缩效果:查看 explained_variance_ratio_,判断前2个主成分保留了多大比例的信息。
  4. 决策:如果图上出现了清晰的簇,可以考虑用聚类方法(如K-Means)深入分析;如果没有明显结构,可能数据本身没有自然分组,或者降维丢掉了太多信息。

📮 六、 课后作业与拓展

📮 课后作业…
  1. 基础代码题:使用 load_digits 手写数字数据集(64维),用PCA降到2维并绘制散点图。观察不同数字在散点图上的分布。
  2. 探索性分析作业:在 load_digits 的PCA散点图上,找出“分离得最好”的数字和“混在一起最严重”的数字,并猜测原因。
  3. 对比作业:比较鸢尾花、葡萄酒、手写数字三个数据集的累计方差比例(降到2维后),按照“冗余度高→低”排序,并解释原因。
  4. 预习任务:降维帮助我们看到数据“大概分成几类”,但还没有自动完成分类。下一节课我们将学习如何“解读”PCA的数学直觉——为什么第一主成分的方差最大、方差比例的具体含义是什么。
  5. 综合思考题:如果PCA散点图上完全看不出任何结构(所有点混在一起),可能的原因有哪些?下一步你会怎么做?

📋 七、 板书设计

🛠️ 板书设计…
 1无监督学习(六):降维与PCA
 2
 3一、 聚类 vs 降维
 4   聚类:谁和谁在一起?(样本视角)
 5   降维:骨架长什么样?(特征视角)
 6   组合使用:先降维探路  再聚类深入
 7
 8二、 PCA核心思想
 9   找一条“最佳投影线”(主成分)
10   标准:数据在线上“散得越开”越好(方差最大)
11
12   第一主成分(最分散)→ 第二主成分(次分散,与第一垂直)
13
14三、 代码三板斧
15   1. 创建:pca = PCA(n_components=2)
16   2. 执行:X_pca = pca.fit_transform(X)
17   3. 查看:pca.explained_variance_ratio_
18
19四、 降维作为“探路者”三大功能
20    发现自然分组(看到几个簇)
21    识别离群点(孤独的点)
22    评估冗余度(累计方差比例)
23
24五、 本节课核心结论
25    在不知道任何标签的情况下,先降维画图,观察数据结构,再决定用哪种聚类方法——这就是降维作为“探路者”的核心价值!

本课用到的单词

单词 发音 专业英语解释(中文)
Dimensionality Reduction /daɪˌmenʃəˈnæləti rɪˈdʌkʃən/ 降维。减少数据集特征数量的过程,在无监督学习中主要用于探索性数据分析。
Principal Component Analysis (PCA) /ˈprɪnsəpəl kəmˈpoʊnənt əˈnæləsɪs/ 主成分分析。一种无监督降维方法,通过找方差最大方向实现数据投影。
Exploratory Data Analysis (EDA) /ɪkˈsplɔːrətɔːri ˈdeɪtə əˈnæləsɪs/ 探索性数据分析。在建模之前对数据进行可视化探索的流程。
Variance /ˈveriəns/ 方差。衡量数据分散程度的统计量,在PCA中代表“信息量”。
Principal Component /ˈprɪnsəpəl kəmˈpoʊnənt/ 主成分。PCA降维后生成的新的综合特征,是原始特征的线性组合。
Explained Variance Ratio /ɪkˈspleɪnd ˈveriəns ˈreɪʃioʊ/ 解释方差比例。每个主成分所保留的原始数据信息百分比。
Curse of Dimensionality /kɜːrs əv daɪˌmenʃəˈnæləti/ 维度灾难。高维数据带来的计算、存储和可视化困难。