跳转至

P2-1.2 公式、代码与数据相遇的位置

Section ID: P2-1.2 Version: v2026.07.20

在 P2-1.1,我们把数学看成阅读 AI 计算的语言。现在继续看,这种语言在真实学习中到底放在哪里。学习 AI 时,公式(formula)、代码(code)、数据(data)并不是彼此分开的东西。它们更像是在用三张不同的脸展示同一个计算。

  1. 公式会压缩计算结构。
  2. 代码会执行计算步骤。
  3. 数据会提供计算对象和结果检查对象。

这一节要展示的是:公式、代码和数据其实都可能指向同一个计算。

以后即使你看到平均值、向量、损失、梯度的公式,也应该能一起读出 这个式子用在什么数据上,以及 它在代码里是在哪里执行的

这里会一起整理 公式代码数据输出(output)shape。如果 1.1 先抓住的是“为什么要把数学读成计算语言”,那么这里整理的是:这种计算语言如何在 文档、代码单元、真实数值 中指向同一个计算。

先抓住的共同场景

我们继续沿用上一节里的同一个小表。

学生 学习时间 x 小测分数 y
A 1 小时 55 分
B 2 小时 65 分
C 3 小时 80 分
D 4 小时 90 分

这张表可以作为 Chapter 1 中“公式、代码、数据相遇”的最小场景。

  • 从数据角度看,它是一张带有 xy 两列的小表。
  • 从公式角度看,它是写平均值(mean)、函数(function)、误差(error)的材料。
  • 从代码角度看,它是可以翻译成列表(list)、数组(array)、变量(variable)的输入。

读者在这里最容易忽略的一点是:公式代码 会看起来像是不同的学习主题。但实际上,它们只是从不同表面去读同一个场景。本节的目的就是把这种对应关系固定下来。

核心判断标准:公式、代码与数据相遇的位置

  • 能把公式读成一种压缩表达计算的方式。
  • 能把代码看成是把公式翻译成可执行步骤的东西。
  • 能把数据看成既是进入计算的值,也是计算后要回头检查的对象。
  • 能从公式、代码、数据三个角度解释一次小小的平均值计算。
  • 为后面章节里在公式记法和 Python 实践之间来回切换做好准备。

三个判断标准

这一节展示的是数学和编程相遇的位置。阅读本文时起标准作用的三个视角如下。

标准 为什么重要 本节需要达到的理解程度
同一个计算可以分别表现成 公式代码数据 它会让你建立“即使表达变了,读的还是同一个内容”的感觉。 理解一个平均值可以被用三种方式说明。
公式会 压缩计算结构,代码会 展开执行顺序 它能解释为什么文档和示例代码看起来不一样。 理解什么在相加、什么在相除,以及代码按什么顺序执行。
结果不能只看成一个数字,而要 放回语境里重新解释 这会直接连到后面如何阅读损失和指标。 理解你需要用一句话说明像 72.5 这样的结果意味着什么。

用三种方式看同一个计算

先看最简单的例子:平均值(mean)。平均值就是把多个数相加,再除以个数。

如果从上面那张表里只取出分数列,那么数据就是 55、65、80、90

写成公式如下。

\[ \mathrm{mean} = \frac{55 + 65 + 80 + 90}{4} \]

写成代码如下。

问题情境:

  • 即使是同一个平均值计算,一旦从公式转到代码,也可能不能立刻接上它展开成了什么执行顺序

输入(input):

  • 数值列表 scores = [55, 65, 80, 90]

期望输出(output):

  • 平均值 72.5

要确认的概念:

  • 代码里的 sum(scores) / len(scores),就是把平均值公式展开成执行顺序
  • 即使公式、代码、数据看起来不同,它们也可能指向同一个计算
1
2
3
4
5
6
7
# scores 是一个学生群体的测验分数列表。
scores = [55, 65, 80, 90]

# mean 把分数列表概括成一个代表值。
mean = sum(scores) / len(scores)

print(mean)

示例运行结果:

72.5

这三种表达看起来不同,但它们做的是同一件事。

  • 数据:分数组合 55、65、80、90
  • 公式:把“加总再除以个数”的结构压缩起来
  • 代码:计算机真实执行的过程
  • 输出:计算结束后被检查的数值

这个视角很重要。在 AI 文档中,只看公式会觉得抽象,只看代码会像在看库用法,只看数据又像只是在看数字列表。只有把三者连起来,才会真正看见 到底在计算什么

这个例子之所以好,是因为同一张表之后还可以用不同问题重新阅读。平均分是一个汇总值,xy 的关系是函数与预测问题,预测值和真实值的差又是损失问题。也就是说,一个数据场景会成为 Chapter 1 中多个解释的共同基准点。

公式会命名并压缩关系

读公式时首先该看的,不是符号长得多复杂,而是名字和关系。

\[ y = f(x) \]

这行式子看起来不复杂,但它是 AI 文档中最重要的基本结构之一。

  • x:输入(input)
  • f:把输入变成输出的函数(function)或模型(model)
  • y:输出(output)

在机器学习语境里,可以把它读成 输入数据 x 经过模型 f 之后变成输出 y

如果直接贴回前面的表,x 是学习时间,y 是分数。即使现在还没有复杂模型,只要先做一个“根据学习时间预测分数的函数”这种思维实验,就足以固定“输入-变换-输出”的结构。

在代码里,它可能会这样出现。

问题情境:

  • 即使能读公式 y = f(x),也可能暂时不能立刻感觉它在真实代码里长什么样

输入(input):

  • 输入值 x
  • 把输入变成输出的模型或函数 model

输出(output):

  • 执行结果 y

要确认的概念:

  • 公式里的“输入-变换-输出”关系,在代码里也会用同样结构表示
  • 这个例子的重点不是复杂计算,而是练习读取关系表达
# x 是输入给模型的值,y 是模型返回的输出。
y = model(x)

公式和代码并不使用完全相同的语法,但它们都在表达同一个关系:输入经过某种变换后变成输出。只要能读懂这层关系,后面出现的模型、预测、损失和学习就更容易找到位置。

数据会以可计算的形状进入

现实数据通常不会直接被原样计算。句子、图片、表格、日志都会先变成可计算的数值形式。

例如,句子 "I am studying AI again" 可以变成 token、数字 ID 和向量;图片可以继续变成像素(pixel)、数值数组(array)、张量(tensor);表格数据则会基于行和列进入数组、矩阵或 DataFrame 的形式。

这时,数据的形状(shape)就变得重要。到底是一个值、一组值、一张带行列的表,还是拥有多个轴的数组,会改变你使用的公式和代码。

问题情境:

  • 即使是相同数字,一个值、向量和矩阵在计算里也会被当成不同形状处理

输入(input):

  • 类似标量的数组 one_value
  • 一维数组 vector
  • 二维数组 matrix

期望输出(output):

  • 每个数组对应的 shape

要确认的概念:

  • 数据形状是区分可计算结构的基础信息
  • NumPy 会把即使数字相同、但轴和维度不同的对象区分显示出来
# 这个例子用 NumPy 数组的 shape 检查输入数据包含多少个样本和变量。
import numpy as np

# one_value、vector、matrix 展示相同数字也可以被放进不同形状。
one_value = np.array(3)
vector = np.array([1, 2, 3])
matrix = np.array([[1, 2, 3], [4, 5, 6]])

# shape 是用来观察数组轴和大小的值。
print(one_value.shape)
print(vector.shape)
print(matrix.shape)

示例运行结果:

1
2
3
()
(3,)
(2, 3)

这个例子不是为了学习高阶 NumPy 用法,而是为了确认:即使是同样的数字,装进什么形状里,也会改变计算的含义。

前面的学习时间-分数表也是一样。如果只看分数列,它可以被当成一维向量;但如果把 xy 放在一起看,它就会成为两列的表结构。后面为什么要拆分 Xy,或者为什么要检查 shape,最终也都是为了把 这个数据是为哪一种问题服务的 变成可计算的形式。

代码会把公式变成可执行步骤

公式会简短展示计算结构,但真实执行仍然需要代码。例如,平均值写成公式很短。

\[ \mathrm{mean} = \frac{\sum_{i=1}^{n}x_i}{n} \]

但在代码里,你必须决定数据放在哪里、有几个值、用哪个函数去加总、以及把结果存到哪里。

问题情境:

  • 带有 sigma 的平均值公式很短,但在代码里往往需要写得更细

输入(input):

  • 分数列表 scores = [55, 65, 80, 90]

输出(output):

  • 个数 n
  • 总和 total
  • 平均值 mean

要确认的概念:

  • 在代码里,公式的一行可能会展开成多个中间变量和执行步骤
  • 不只是最后结果,中间变量也会成为帮助解释公式的观察点
# scores 是平均值公式要计算的数据。
scores = [55, 65, 80, 90]

# n 和 total 是得到平均值之前的中间观察值。
n = len(scores)
total = sum(scores)
mean = total / n

print(n)
print(total)
print(mean)

示例运行结果:

1
2
3
4
290
72.5

代码可能比公式更长,但代码会把执行顺序展示出来。它先准备数值,再计数,再求和,再相除,最后再存下结果。如果你依次看 429072.5,就能立刻看到“一行 sigma 公式”在代码里到底被展开成了哪些中间步骤。

把同一个场景再往前推一点,后面就会开始用 study_hours = [1, 2, 3, 4]quiz_scores = [55, 65, 80, 90] 这样分开存储输入与输出。从这里起,就会自然地从“平均值计算”继续过渡到“描述关系的模型计算”。

AI 学习里也会发生同样的事。论文或教材里的损失函数(loss function)可能只是一条短公式,但在真实代码里,它会展开成很多行:数据加载、预处理(preprocessing)、模型执行、损失计算、参数更新。

结果还需要重新解释

计算结束,不等于理解结束。输出(output)还必须放回问题语境里重新解释。

如果平均值是 72.5,那就表示四名学生成绩的中心大概在 72.5 分附近。

机器学习里也是一样。

如果损失是 0.2,那表示:按照某种具体方式去计算模型输出和参考值之间的差,结果得到了 0.2。

如果准确率是 90%,那表示在评价数据里有 90% 被预测正确。但究竟哪些数据错了,还必须另外看。

数字结果不会自动变成意义。你必须一起检查:它来自什么数据、是按什么公式算出来的、又是由什么代码执行的。

连到一个小小的学习流程

如果把 AI 学习尽可能缩小,可以把它读成这样一条流程:准备数据,把数据输入模型,得到输出,与参考值比较来计算损失,再调整参数,并不断重复这个过程。

这正是公式、代码和数据都会一起出现的位置。

  • 数据会提供输入(input)和参考值(target)
  • 公式会表达模型输出、损失和更新方向
  • 代码会按真实顺序执行这些计算
  • 结果会以 metric、loss、prediction 的形式被检查

这就是为什么 Part 2 会把数学和 Python 放在一起看。只看公式时,执行不会显现;只看代码时,计算意图可能变得模糊;只看数据时,又很难看见模型到底学到了什么。

用案例来看

案例 1. 即使只是一个平均值计算,公式、代码、数据也可能各自分开

假设一个学习者觉得自己“好像懂了”平均值(mean)的公式,但一到代码单元里,就不能立刻连上为什么会出现 sum(scores) / len(scores)。反过来,如果只看代码,虽然能算出结果,却可能漏掉“为什么是按这个顺序相加、再相除”。

这时,只要把真实数据 55、65、80、90 摆出来,三种表达就会重新汇合到一个位置。数据是计算对象,公式会压缩 全部相加后再除以个数 的结构,代码会把这个结构展开成真实执行顺序,而输出 72.5 又会让你重新解释原本那组分数的中心大概落在哪里。

这个案例说明:为什么 Part 2 不会把公式和 Python 分开。只有当你能在一个计算上用这三种方式来回切换,后面的向量、矩阵、损失、概率计算才会带着“表达不同,但结构相同”的感觉去读。

所以,平均值例子并不只是简单算术练习,而是整个 AI 学习阅读框架的缩小版。公式负责计算结构,代码负责执行步骤,数据负责计算材料和解释对象。这个位置区分会直接延续到后面关于向量、矩阵、损失和概率的计算里。

检查清单

  • 你能说明:公式、代码、数据可以用不同方式表达同一个计算吗?
  • 你能把 y = f(x) 读成输入(input)、函数(function)、输出(output)之间的关系吗?
  • 你能说明数据的形状(shape)会影响计算方式吗?
  • 你能说明代码是在把公式变成可执行步骤吗?
  • 你能说明输出(output)必须和数据、公式、代码、问题语境一起解释吗?
  • 你能说明:数学要用代码来确认,代码要用数据来验证,而结果又要回到公式和问题定义中重新解释这一流程吗?
  • 当公式、代码、数据看起来彼此分开时,你能把它们重新绑回“同一个计算的不同表达”吗?

来源与参考资料

  • Marc Peter Deisenroth, A. Aldo Faisal, Cheng Soon Ong, Mathematics for Machine Learning, Cambridge University Press, 2020, 确认日期:2026-07-19.
  • Ian Goodfellow, Yoshua Bengio, Aaron Courville, Deep Learning, MIT Press, 2016, 确认日期:2026-07-19.
  • Charles R. Harris et al., Array Programming with NumPy, Nature, 2020, 确认日期:2026-07-19.
  • NumPy Developers, numpy.ndarray.shape, NumPy User Guide, 确认日期:2026-07-19. 这是把 shape 解释为数组维度和长度信息的直接参考资料。
  • scikit-learn developers, Glossary of Common Terms and API Elements, scikit-learn User Guide, 确认日期:2026-07-19. 这是确认把 X 读作输入数据、把 y 读作 target 这一惯例的参考资料。