3-3 NumPy数据的统计与广播
📌 一、 课程导入(10 分钟)
- 真实场景引入:不同量纲带来的“算法灾难”
- 假设有一个二手房数据集,特征 1 为“房屋面积”(数值范围 50
200 ㎡),特征 2 为“房间数”(数值范围 15 间)。 - 提问:在计算两套房子之间的“相似度/距离”时,面积数值偏大(如差值 50)会完全掩盖房间数(如差值 2)的作用!
- 解决办法:数据标准化(Z-score Normalization),把所有特征压缩到均值为 0、标准差为 1 的同一量纲下: $$X_{\text{scaled}} = \frac{X - \mu}{\sigma}$$
- 思考:如何用两行代码算出每一列(每个特征)的均值 $\mu$ 与标准差 $\sigma$,并用整个矩阵去减它?
- 假设有一个二手房数据集,特征 1 为“房屋面积”(数值范围 50
- 👨🏫 教师活动:在黑板上呈现原始房屋数据集表格,引导学生发现“面积数值大、房间数数值小”导致不公平比较的问题,引出标准化的数学公式。
- 🧑🎓 学生活动:观察数据形态,结合前面的切片知识,思考如果用循环实现该公式会有多繁琐。
通过机器学习特征缩放的真实痛点导入,让统计函数与广播机制不再是孤立的语法点,而是解决“数据标准化”这一核心任务的有力工具。
📖 二、 解决问题过程(一):定向统计与 axis 轴的奥秘(30 分钟)
- 常用统计函数
np.sum():求和np.mean():求均值 $\mu$np.std():求标准差 $\sigma$
- 核心攻克:
axis(轴)的方向与口诀- 不指定
axis:对整张表格所有元素求全局统计值。 axis=0(按列统计/跨行折叠):沿着“纵向/行”的方向进行压缩,求出每个特征的统计值(如求每个特征的平均值,返回 $1 \times N$)。axis=1(按行统计/跨列折叠):沿着“横向/列”的方向进行压缩,求出每个样本的统计值(如求每个学生的各科总分,返回 $M \times 1$)。- 💡 记忆口诀:“沿着哪个轴(axis)计算,哪个维度就被压缩折叠消失!”
- 不指定
- 👨🏫 教师活动:在黑板上画出 $4 \times 3$ 的表格,手势演示沿
axis=0纵向向下折叠压缩成一行,沿axis=1横向向右折叠压缩成一列。 - 🧑🎓 学生活动:上机运行
np.mean(data, axis=0)与axis=1,打印输出结果的shape,对比验证口诀。
axis 是整个 NumPy 乃至深度学习中最易混淆的概念。用图形折叠与维度消失口诀替代抽象定义,彻底突破这一教学难点。
💻 三、 解决问题过程(二):广播机制与标准化实操(25 分钟)
- 广播机制(Broadcasting)的通俗理解
- 当一个 $100 \times 3$ 的二维矩阵减去一个 $1 \times 3$ 的一维数组时,维度并不相同。
- NumPy 的广播机制会自动将 $1 \times 3$ 的数组“沿着纵向向下复制拉伸 100 次”,变为 $100 \times 3$,然后再执行逐元素的相减操作!
- Z-score 数据标准化综合实战
- 👨🏫 教师活动:分步运行标准化代码,重点展示
(X - mean)这一步中不同 shape 数组相减的过程,解释广播机制的自动补全。 - 🧑🎓 学生活动:敲击代码完成标准化练习,观察输出的
X_scaled中各特征数值被缩放到统一量纲下的变化。
将抽象的广播机制与现实的数据标准化公式结合,让学生在完成完整实战的过程中自然消化广播的自动拉伸特性。
✍️ 四、 解决问题过程(三):课堂练习与巩固(20 分钟)
📝 五、 课堂小结(5 分钟)
flowchart LR
root["📊 2-3 NumPy 基础:数据的统计与广播"]
subgraph C1["📐 统计函数与 axis 轴"]
direction TB
A1["基础函数:sum, mean, std"]
A2["axis=0:跨行按列 (求特征指标)"]
A3["axis=1:跨列按行 (求样本指标)"]
A4["口诀:沿哪个轴算,哪个维度消失"]
end
subgraph C2["📡 广播机制 (Broadcasting)"]
direction TB
B1["触发条件:维度不相同但兼容"]
B2["核心动作:自动沿缺失轴拉伸复制"]
B3["优势:无需写 for 循环逐项计算"]
end
subgraph C3["🚀 预处理实战"]
direction TB
C1_node["Z-score 标准化公式:(X - mean) / std"]
C2_node["目的:统一不同特征的量纲"]
end
root --> C1
root --> C2
root --> C3
%% 自定义主题色彩美化
style root fill:#4b6cb7,stroke:#253b6e,color:#fff,stroke-width:2px,rx:8px,ry:8px
style C1 fill:#e3f2fd,stroke:#2196f3,stroke-width:1px
style C2 fill:#fff3e0,stroke:#ff9800,stroke-width:1px
style C3 fill:#e8f5e9,stroke:#4caf50,stroke-width:1px