Menu
CoddyTech

广播

本课属于 Coddy Machine Learning 学习旅程的“数据与图表”单元。第 13 课,共 60 课。

当每个特征都接近 0 时,模型的学习效果更好。因此,你要从每一列中减去该列的平均值,NumPy 会将这些平均值复制到每一行:

一个 3 行 2 列的身高和体重表,减去复制到全部三行的平均值行 170 和 70,结果是中心化后的表:0 和 -10、10 和 10、-10 和 0

在代码中,记录了三个人的身高和体重:

data = np.array([[170, 60],
                 [180, 80],
                 [160, 70]])
print(data - data.mean(axis=0))

这会输出:

[[  0. -10.]
 [ 10.  10.]
 [-10.   0.]]

这种复制称为广播。现在,表格已居中:每个值都表示它与所在列平均值的差距。

均值的形状为 (2,):(3, 2) 表的每一列对应一个值。其他任何长度都会导致程序报错并停止。

challenge icon

挑战

简单

健身应用会在训练前对每个表进行中心化处理。起始代码会对两个表调用 center,分别是 users(3 个特征)和 workouts(2 个特征),并打印结果。目前,center 会原样返回表。

请补全 center,让它从每一列中减去该列的平均值,适用于任意列数。保留下方的代码行,不要修改。

如果有两个用户和两次训练,输出会如下所示:

Centered users:
[[-6.  7. -5.]
 [ 6. -7.  5.]]
Column means after centering: [0. 0. 0.]
Centered workouts:
[[-10. -90.]
 [ 10.  90.]]
Column means after centering: [0. 0.]

亲手试试

import numpy as np


def center(table):
    # 返回每列都减去该列平均值的 table
    # 在下方编写你的代码
    return table


# 每个用户占一行:年龄、静息心率、每天的运动分钟数
users = np.array([[25, 62, 30],
                  [31, 70, 45],
                  [40, 58, 20],
                  [29, 66, 25]])
# 每次锻炼占一行:运动分钟数、消耗的卡路里
workouts = np.array([[30, 240],
                     [45, 410],
                     [20, 150],
                     [60, 520],
                     [35, 300]])

# 不要修改下面的代码行
print("Centered users:")
print(center(users))
print("Column means after centering:", np.round(center(users).mean(axis=0), 2))
print("Centered workouts:")
print(center(workouts))
print("Column means after centering:", np.round(center(workouts).mean(axis=0), 2))
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

数据与图表中的所有课

自己练习: Python 在线编译器