1604综合练习

Part A:给定数据/代码的精讲精练(共 5 题)

练习 1:“PCA 投影手算 —— 一维数据理解方差最大化”

🎯 目标:通过一维数据的手算,理解 PCA 中“方差最大化”的直观含义。 📂 数据:一维数据集 {1, 2, 4, 5, 8, 9, 10},共 7 个点(分布在一条直线上)。

【详细操作步骤(Step-by-Step)】

第 1 步:理解“投影”在一维情况下的含义

在一维数据中,数据已经在一个方向上了。如果我们想“降维”——降到 0 维(即用一个常数代表所有数据),相当于找一个点,让所有数据点“投影”到这个点上。

问题:选哪个点作为“投影点”,能让投影后的数据“方差最大”?

💡 思考:如果一个点能把数据“拉开”,就能保留更多信息。但如果所有数据都投到同一个点上,方差为 0,信息全部丢失。

第 2 步:计算原始数据的均值和方差

  • 均值 μ = (1 + 2 + 4 + 5 + 8 + 9 + 10) / 7 = ____ / 7 = ____
  • 方差 σ² = [(1-μ)² + (2-μ)² + … + (10-μ)²] / 7 = ____

方差 = ____(保留两位小数)

第 3 步:尝试选择一个“投影点”

假设我们想把所有数据“投影”到常数 c = 5 上(即用一个常数 5 代表所有数据)。

投影后的“方差” = [(1-5)² + (2-5)² + (4-5)² + (5-5)² + (8-5)² + (9-5)² + (10-5)²] / 7

= [____ + ____ + ____ + ____ + ____ + ____ + ____] / 7 = ____ / 7 = ____

第 4 步:尝试另一个“投影点” c = 10

投影后的“方差” = [(1-10)² + (2-10)² + (4-10)² + (5-10)² + (8-10)² + (9-10)² + (10-10)²] / 7

= ____ / 7 = ____

第 5 步:回答问题

  1. 当 c = 5 时,投影后方差为 ____;当 c = 10 时,投影后方差为 ____。哪个点“保留的信息更多”?
  2. 当 c 取什么值时,投影后的方差最大?(提示:c 越接近数据的均值,投影后方差越大还是越小?)
  3. 核心结论:PCA 选择的主成分方向,能让数据投影后的方差____(最大/最小)。在一维数据中,最优的“投影点”就是数据的____(均值/中位数/众数)。

第 6 步:延伸思考

  • 二维数据中,PCA 找的“最佳投影线”需要穿过数据的____(中心/边缘),这样才能让投影后的方差最大。
  • 这个中心点就是所有数据点的____(均值/中位数)。

练习 2:“二维投影手算 —— 找到方差最大的方向”

🎯 目标:通过二维数据的手算,理解 PCA 是如何选择“最佳投影方向”的。 📂 数据:三个二维点 A(0,0), B(2,2), C(4,4)。它们完美分布在一条直线上(y=x)。

【详细操作步骤(Step-by-Step)】

第 1 步:观察数据的分布

将 A、B、C 三个点画在坐标纸上。它们完美共线,在 y=x 这条直线上。

问题:如果只能保留 1 个维度(降到 1 维),应该保留哪个方向的信息?

直觉答案:应该保留 y=x 方向,因为数据在这个方向上变化最大(从 0 到 4),而在垂直方向(y=-x)上完全没有变化。

第 2 步:计算数据的中心(均值)

  • 均值 μ = ((0+2+4)/3, (0+2+4)/3) = (____, ____)

第 3 步:计算不同投影方向的方差

方向 1:沿 x 轴投影(即只取 x 坐标,放弃 y 坐标)

投影后的值:A_x=0, B_x=2, C_x=4

  • 均值 = 2
  • 方差 = [(0-2)² + (2-2)² + (4-2)²] / 3 = (4 + 0 + 4) / 3 = ____

方向 2:沿 y=x 方向投影(数据本身的方向)

在 y=x 方向上的投影值 = (x + y) / √2(归一化后的坐标)

  • A: (0+0)/√2 = 0
  • B: (2+2)/√2 = 4/√2 = 2√2 ≈ 2.83
  • C: (4+4)/√2 = 8/√2 = 4√2 ≈ 5.66

投影后均值 = (0 + 2.83 + 5.66) / 3 ≈ 2.83 方差 ≈ [(0-2.83)² + (2.83-2.83)² + (5.66-2.83)²] / 3 = ____

第 4 步:填写对比表格

投影方向 投影后方差值 信息保留程度
x 轴方向 ____ 一般
y=x 方向(数据方向) ____ 最大!

第 5 步:回答问题

  1. 哪个方向投影后方差更大?____ 这说明什么?
  2. 在这个数据中,第一主成分的方向是____,第二主成分的方向是____。
  3. 如果数据是完美圆形的(所有方向方差相等),PCA 还“有意义”吗?为什么?

第 6 步:用 sklearn 验证

 1import numpy as np
 2from sklearn.decomposition import PCA
 3
 4X = np.array([[0, 0], [2, 2], [4, 4]])
 5pca = PCA(n_components=2)
 6pca.fit(X)
 7
 8print("主成分方向(每个主成分的向量):")
 9print(pca.components_)  # 第一行 ≈ [0.707, 0.707](y=x方向)
10print("各主成分方差比例:", pca.explained_variance_ratio_)  # [1.0, 0.0]

观察输出:第一主成分方向是 [0.707, 0.707],这正是 y=x 方向的单位向量!第二主成分的方差比例为 0,说明垂直方向没有信息。

练习 3:“碎石图与累计曲线 —— 数据告诉你该降几维”

🎯 目标:通过模拟数据,掌握碎石图和累计方差曲线的绘制与解读。 📂 数据:使用 make_classification 生成一个包含 10 个特征、有一定冗余的数据集。

【详细操作步骤(Step-by-Step)】

第 1 步:生成模拟数据

 1import numpy as np
 2import matplotlib.pyplot as plt
 3from sklearn.datasets import make_classification
 4from sklearn.preprocessing import StandardScaler
 5from sklearn.decomposition import PCA
 6
 7# 生成数据:500个样本,10个特征,其中只有4个是有信息的
 8X, y = make_classification(n_samples=500, n_features=10, n_informative=4,
 9                           n_redundant=3, n_repeated=0, random_state=42)
10
11# 标准化(PCA的必修课)
12scaler = StandardScaler()
13X_scaled = scaler.fit_transform(X)
14
15print(f"数据形状: {X_scaled.shape}")  # (500, 10)

第 2 步:训练 PCA 并提取方差比例

1pca = PCA()
2pca.fit(X_scaled)
3
4var_ratio = pca.explained_variance_ratio_
5cumsum = np.cumsum(var_ratio)
6
7print("各主成分方差比例:", [round(v, 4) for v in var_ratio])
8print("累计方差比例:", [round(v, 4) for v in cumsum])

第 3 步:绘制碎石图(柱状图)

 1plt.figure(figsize=(12, 4))
 2
 3# 左图:碎石图
 4plt.subplot(1, 2, 1)
 5plt.bar(range(1, 11), var_ratio, color='steelblue', alpha=0.7)
 6plt.xlabel('主成分序号')
 7plt.ylabel('方差比例')
 8plt.title('碎石图(Scree Plot)')
 9plt.xticks(range(1, 11))
10plt.grid(axis='y', alpha=0.3)
11for i, v in enumerate(var_ratio):
12    plt.text(i+1, v+0.01, f'{v:.3f}', ha='center', fontsize=9)
13
14# 右图:累计方差曲线
15plt.subplot(1, 2, 2)
16plt.plot(range(1, 11), cumsum, 'ro-', linewidth=2, markersize=8)
17plt.axhline(y=0.90, color='orange', linestyle='--', label='90% 信息线')
18plt.axhline(y=0.95, color='green', linestyle='--', label='95% 信息线')
19plt.xlabel('主成分数量')
20plt.ylabel('累计方差比例')
21plt.title('累计方差曲线')
22plt.legend()
23plt.grid(True, alpha=0.3)
24plt.xticks(range(1, 11))
25
26plt.tight_layout()
27plt.show()

第 4 步:分析图形,填写下表

主成分序号 方差比例 累计方差比例
PC1 ____ ____
PC2 ____ ____
PC3 ____ ____
PC4 ____ ____
PC5 ____ ____
PC6 ____ ____
PC7 ____ ____
PC8 ____ ____
PC9 ____ ____
PC10 ____ ____

第 5 步:回答问题

  1. 碎石图中,从第几个主成分开始“柱子高度”明显变小?(即拐点出现在哪里?)
  2. 如果目标是“保留 95% 的信息”,根据累计曲线,需要保留____个主成分。
  3. 如果目标是“保留 90% 的信息”,需要保留____个主成分。
  4. 实际数据中,只有 4 个特征是有信息的。你从碎石图中能推断出这个结论吗?提示:观察前 4 个主成分的方差比例之和,是否占主导?

第 6 步:核心结论

  • 通过碎石图,我们可以直观地看到每个主成分的“个体贡献”。
  • 通过累计曲线,我们可以科学地决定“降几维”。
  • 在这个模拟数据中,由于只有 4 个信息特征,前 4 个主成分的累计方差比例通常能达到 90% 以上,说明碎石图能反映数据的真实结构。

练习 4:【独立实战】“PCA vs t-SNE —— 谁是更好的可视化工具?”

🎯 目标:在手写数字数据集上,独立对比 PCA 和 t-SNE 的可视化效果与运行时间。 📂 数据集sklearn.datasets.load_digits(1797 个样本,64 维)

任务要求

  1. 加载数据:使用 load_digits,提取特征 X 和标签 y(标签用于给散点图着色)。

  2. 标准化:使用 StandardScalerX 进行标准化。

  3. PCA 降维

    • 使用 PCA 将数据降到 2 维。
    • 记录运行时间。
    • 用散点图展示结果(不同颜色表示不同数字)。
    • 打印累计方差比例(判断 2 维保留了多信息)。
  4. t-SNE 降维

    • 使用 TSNE 将数据降到 2 维(设置 random_state=42, perplexity=30)。
    • 记录运行时间。
    • 用散点图展示结果。
  5. 并排对比

    • 将两张散点图并排显示。
    • 在每张图上标注运行时间。
  6. 填写对比表格

方法 运行时间(秒) 聚类效果(好/中/差) 是否能送进模型
PCA ____ ____ ____
t-SNE ____ ____ ____
  1. 结论(50 字以内):
    • 哪个方法可视化效果更好?
    • 哪个方法运行更快?
    • 如果你要“探索数据分组”给老板看,选哪个?如果要“压缩特征后训练模型”,选哪个?

练习 5:【独立实战】“降维方法选型 —— 场景匹配题”

🎯 目标:通过多个业务场景,培养降维方法的选型决策能力。

任务要求:阅读以下 6 个业务场景,为每个场景选择最合适的降维方法(从 PCA、t-SNE、TruncatedSVD 中选择),并在括号中写明理由(一句话即可)。

场景 1:某电商公司有 10 万条用户数据,100 个特征。数据科学家需要压缩特征后训练一个分类模型(预测用户是否会购买)。

  • 选择:______
  • 理由:______

场景 2:某生物实验室有 2000 个基因样本,每个样本有 20000 个基因表达值。研究员想看看样本是否自然分成几个群体(比如不同亚型),需要画一张 2D 散点图。

  • 选择:______
  • 理由:______

场景 3:某新闻网站有 50 万篇新闻文章,需要将文章转化为特征向量(TF-IDF 矩阵)进行聚类。矩阵高度稀疏(大部分元素为 0),需要降维后再聚类。

  • 选择:______
  • 理由:______

场景 4:某银行有 5000 个客户,每个客户有 50 个特征。风控部门要先用聚类方法识别“高风险客户群体”,但不确定数据中是否有自然分组。数据分析师决定先降维画图看一下。

  • 选择:______
  • 理由:______

场景 5:某公司内部有 200 万条日志数据,每条数据有 20 个特征。由于数据量极大,任何慢速算法都无法接受。目标是压缩特征以便后续异常检测。

  • 选择:______
  • 理由:______

场景 6:某科研团队有 3000 个单细胞 RNA-seq 数据样本,每个样本有 20000 个基因特征。他们想用可视化探索细胞类型的分群情况(样本<5000,但特征数极高)。

  • 选择:______
  • 理由:______

参考答案

场景 推荐方法 理由
1 PCA 速度快,可送模型,建模前预处理标准做法
2 t-SNE 样本<5000,探索性可视化,聚类效果最好
3 TruncatedSVD 专门处理稀疏矩阵(TF-IDF/词频数据)
4 t-SNE 先看图再聚类,样本量适中(5000<5000)
5 PCA 数据量极大,速度优先,压缩后送模型
6 t-SNE 样本<5000,特征数极高,经典的单细胞可视化方案

Part B:不给定数据集的开放设计挑战(共 2 题)

练习 6:【造数据挑战】“高维数据的 PCA 探路 —— 找到隐藏的 3 个群体”

背景:你是某互联网公司的数据分析师,拿到了一份 20 维特征的用户行为数据,没有任何标签。老板想知道“用户自然分成几类”,以便制定不同的产品策略。

任务要求

  1. 自行构造数据

    • 使用 make_blobsmake_classification 生成 1000 个样本、20 个特征的数据。
    • 真实群体数量设置为 3 个(但你拿到数据时,假装不知道这个数字)。
    • 添加适量噪声,让聚类不是 100% 完美(模拟真实数据)。
  2. 数据标准化

    • 对 20 个特征进行标准化(StandardScaler),为 PCA 做准备。
  3. PCA 探索性分析

    • 将数据降到 2 维,绘制散点图(先用一种颜色,观察整体分布)。
    • 从散点图中,你能看到几个“自然群体”?
  4. 碎石图与累计曲线

    • 绘制碎石图(全部 20 个主成分的方差比例柱状图)。
    • 绘制累计方差曲线。
    • 判断:如果要“保留 95% 的信息”,需要保留多少个主成分?
  5. 与真实标签验证

    • 现在,用你生成数据时保存的真实标签(y_true)给散点图着色。
    • 对比:你从“无色散点图”中推断出的群体数量,与真实标签是否一致?
  6. 撰写“探索简报”(100 字以内):

    • 你通过 PCA 看到了几个群体?
    • 下一步你会建议团队做什么?(提示:聚类分析、深入挖掘群体特征等)

练习 7:【综合设计挑战】“甲方需求 —— 大规模电商用户画像可视化系统”

背景:某电商平台有 50000 个活跃用户,每个用户有 200 个行为特征(浏览、点击、加购、购买、评价等)。平台希望构建一个“用户画像可视化系统”,能够将 200 维的用户数据映射到 2D 平面,让业务人员直观地看到“用户分群”情况。

【甲方需求书】

项目 内容
数据情况 50000 个用户,200 个特征(数值型,量纲差异大,存在大量稀疏特征)。
核心需求 ① 将 200 维数据映射到 2D 平面,画一张散点图;② 每 2 天刷新一次数据;③ 业务人员需要看到“哪些用户聚在一起”;④ 不需要精确的解释性(不需要知道每个轴叫什么)。
硬性约束 ① 数据处理时间 < 1 小时(普通服务器);② 散点图上的点必须清晰可辨。
交付物 ① 2D 散点图(带颜色分群);② 降维方法的选择理由说明书;③ 参数配置表。

任务要求

  1. 自行生成模拟数据

    • 使用 make_classification + make_blobs 混合生成 50000 个样本、200 个特征的数据。
    • 模拟 5-8 个“真实用户群体”(用 y 表示,但分析时假设未知)。
  2. 问题分析

    • 直接使用 t-SNE 会遇到什么问题?(提示:运行时间)
    • 直接使用 PCA 会失去什么?(提示:局部聚类结构可能被掩盖)
  3. 方案设计(两步降维法)

    • 步骤 1:先用 PCA 将 200 维降到 50 维(快速压缩,保留主要信息)。
    • 步骤 2:再用 t-SNE 将 50 维降到 2 维(精细可视化,揭示聚类结构)。
    • 执行两步降维,记录每步的运行时间。
  4. 参数调优

    • 在 t-SNE 步骤中,尝试 perplexity = 5, 10, 20, 30, 50, 100,观察哪个参数让散点图的聚类效果最好。
    • 记录你最终选择的 perplexity 值和理由。
  5. 效果评估

    • 用真实标签给最终散点图着色,评估聚类效果。
    • 如果看不到清晰的簇,尝试调整 PCA 保留的维度数(如 30、50、80、100),观察对 t-SNE 效果的影响。
  6. 交付物

    • 最终的 2D 散点图(带颜色分群)。
    • 方法选型说明书(200 字以内):
      • 为什么选择“两步降维法”(PCA + t-SNE)?
      • 放弃了哪些方法?为什么放弃?
    • 参数配置表
步骤 方法 参数 运行时间
1 PCA n_components=____ ____ 秒
2 t-SNE perplexity=____, random_state=42 ____ 秒
  1. 扩展挑战(加分项)
    • 如果甲方要求“每次刷新必须在 10 分钟内完成”,你会怎么调整方案?请简要说明你的优化思路。

📌 使用指南

练习题 难度 建议课时 对应教案 带步骤
练习 1 ★☆☆ 0.5 课时 1602(方差最大化直觉) ✅ 是
练习 2 ★★☆ 0.5 课时 1601(投影几何直觉) ✅ 是
练习 3 ★★☆ 0.5 课时 1602(碎石图与累计曲线) ✅ 是
练习 4 ★★★ 1 课时 1603(PCA vs t-SNE) ❌ 否
练习 5 ★★☆ 0.5 课时 1603(方法选型) ❌ 否
练习 6 ★★★ 1.5 课时 1601 + 1602(综合) ❌ 否
练习 7 ★★★★ 2 课时 1601 + 1602 + 1603(全系列) ❌ 否

建议

  • 练习 1-2 作为 课堂随堂练习(第一次课后布置),巩固投影和方差最大化的直觉。
  • 练习 3 作为 课后作业(第二次课后布置),巩固碎石图和累计曲线。
  • 练习 4-5 作为 实训课任务(第三次课的前半段),综合对比三种方法。
  • 练习 6 作为 小组项目(2 人一组),培养探索性数据分析能力。
  • 练习 7 作为 期末大作业/机考题目,综合考察全系列知识 + 工程化能力。

参考答案要点

练习 关键答案
练习 1 c = 均值 ≈ 5.57 时方差最大;一维数据中“最佳投影点”就是均值;二维数据中“最佳投影线”穿过均值点
练习 2 y=x 方向方差最大;第一主成分方向 = [0.707, 0.707];垂直方向方差为 0
练习 3 碎石图柱子在 PC5 左右开始“变矮”;95% 信息通常需要 5-6 个主成分(取决于数据生成参数)
练习 4 t-SNE 可视化效果更好,但速度慢 10-50 倍;PCA 可送模型,t-SNE 不能
练习 5 见场景匹配表
练习 6 两步降维法,先 PCA 压缩到 50 维,再 t-SNE 降 2 维;perplexity 通常 20-50 效果较好
练习 7 两步降维法是最佳方案;单用 t-SNE 会因 50000 样本而极其缓慢;单用 PCA 无法揭示局部聚类结构