P2-1.2 公式、代码与数据相遇的位置¶
Section ID:
P2-1.2Version:v2026.07.20
在 P2-1.1,我们把数学看成阅读 AI 计算的语言。现在继续看,这种语言在真实学习中到底放在哪里。学习 AI 时,公式(formula)、代码(code)、数据(data)并不是彼此分开的东西。它们更像是在用三张不同的脸展示同一个计算。
- 公式会压缩计算结构。
- 代码会执行计算步骤。
- 数据会提供计算对象和结果检查对象。
这一节要展示的是:公式、代码和数据其实都可能指向同一个计算。
以后即使你看到平均值、向量、损失、梯度的公式,也应该能一起读出 这个式子用在什么数据上,以及 它在代码里是在哪里执行的。
这里会一起整理 公式、代码、数据、输出(output) 和 shape。如果 1.1 先抓住的是“为什么要把数学读成计算语言”,那么这里整理的是:这种计算语言如何在 文档、代码单元、真实数值 中指向同一个计算。
先抓住的共同场景¶
我们继续沿用上一节里的同一个小表。
| 学生 | 学习时间 x | 小测分数 y |
|---|---|---|
| A | 1 小时 | 55 分 |
| B | 2 小时 | 65 分 |
| C | 3 小时 | 80 分 |
| D | 4 小时 | 90 分 |
这张表可以作为 Chapter 1 中“公式、代码、数据相遇”的最小场景。
- 从数据角度看,它是一张带有
x和y两列的小表。 - 从公式角度看,它是写平均值(mean)、函数(function)、误差(error)的材料。
- 从代码角度看,它是可以翻译成列表(list)、数组(array)、变量(variable)的输入。
读者在这里最容易忽略的一点是:表、公式、代码 会看起来像是不同的学习主题。但实际上,它们只是从不同表面去读同一个场景。本节的目的就是把这种对应关系固定下来。
核心判断标准:公式、代码与数据相遇的位置¶
- 能把公式读成一种压缩表达计算的方式。
- 能把代码看成是把公式翻译成可执行步骤的东西。
- 能把数据看成既是进入计算的值,也是计算后要回头检查的对象。
- 能从公式、代码、数据三个角度解释一次小小的平均值计算。
- 为后面章节里在公式记法和 Python 实践之间来回切换做好准备。
三个判断标准¶
这一节展示的是数学和编程相遇的位置。阅读本文时起标准作用的三个视角如下。
| 标准 | 为什么重要 | 本节需要达到的理解程度 |
|---|---|---|
同一个计算可以分别表现成 公式、代码、数据 | 它会让你建立“即使表达变了,读的还是同一个内容”的感觉。 | 理解一个平均值可以被用三种方式说明。 |
公式会 压缩计算结构,代码会 展开执行顺序 | 它能解释为什么文档和示例代码看起来不一样。 | 理解什么在相加、什么在相除,以及代码按什么顺序执行。 |
结果不能只看成一个数字,而要 放回语境里重新解释 | 这会直接连到后面如何阅读损失和指标。 | 理解你需要用一句话说明像 72.5 这样的结果意味着什么。 |
用三种方式看同一个计算¶
先看最简单的例子:平均值(mean)。平均值就是把多个数相加,再除以个数。
如果从上面那张表里只取出分数列,那么数据就是 55、65、80、90。
写成公式如下。
写成代码如下。
问题情境:
- 即使是同一个平均值计算,一旦从公式转到代码,也可能不能立刻接上它展开成了什么执行顺序
输入(input):
- 数值列表
scores = [55, 65, 80, 90]
期望输出(output):
- 平均值
72.5
要确认的概念:
- 代码里的
sum(scores) / len(scores),就是把平均值公式展开成执行顺序 - 即使公式、代码、数据看起来不同,它们也可能指向同一个计算
示例运行结果:
这三种表达看起来不同,但它们做的是同一件事。
- 数据:分数组合
55、65、80、90 - 公式:把“加总再除以个数”的结构压缩起来
- 代码:计算机真实执行的过程
- 输出:计算结束后被检查的数值
这个视角很重要。在 AI 文档中,只看公式会觉得抽象,只看代码会像在看库用法,只看数据又像只是在看数字列表。只有把三者连起来,才会真正看见 到底在计算什么。
这个例子之所以好,是因为同一张表之后还可以用不同问题重新阅读。平均分是一个汇总值,x 和 y 的关系是函数与预测问题,预测值和真实值的差又是损失问题。也就是说,一个数据场景会成为 Chapter 1 中多个解释的共同基准点。
公式会命名并压缩关系¶
读公式时首先该看的,不是符号长得多复杂,而是名字和关系。
这行式子看起来不复杂,但它是 AI 文档中最重要的基本结构之一。
x:输入(input)f:把输入变成输出的函数(function)或模型(model)y:输出(output)
在机器学习语境里,可以把它读成 输入数据 x 经过模型 f 之后变成输出 y。
如果直接贴回前面的表,x 是学习时间,y 是分数。即使现在还没有复杂模型,只要先做一个“根据学习时间预测分数的函数”这种思维实验,就足以固定“输入-变换-输出”的结构。
在代码里,它可能会这样出现。
问题情境:
- 即使能读公式
y = f(x),也可能暂时不能立刻感觉它在真实代码里长什么样
输入(input):
- 输入值
x - 把输入变成输出的模型或函数
model
输出(output):
- 执行结果
y
要确认的概念:
- 公式里的“输入-变换-输出”关系,在代码里也会用同样结构表示
- 这个例子的重点不是复杂计算,而是练习读取关系表达
公式和代码并不使用完全相同的语法,但它们都在表达同一个关系:输入经过某种变换后变成输出。只要能读懂这层关系,后面出现的模型、预测、损失和学习就更容易找到位置。
数据会以可计算的形状进入¶
现实数据通常不会直接被原样计算。句子、图片、表格、日志都会先变成可计算的数值形式。
例如,句子 "I am studying AI again" 可以变成 token、数字 ID 和向量;图片可以继续变成像素(pixel)、数值数组(array)、张量(tensor);表格数据则会基于行和列进入数组、矩阵或 DataFrame 的形式。
这时,数据的形状(shape)就变得重要。到底是一个值、一组值、一张带行列的表,还是拥有多个轴的数组,会改变你使用的公式和代码。
问题情境:
- 即使是相同数字,一个值、向量和矩阵在计算里也会被当成不同形状处理
输入(input):
- 类似标量的数组
one_value - 一维数组
vector - 二维数组
matrix
期望输出(output):
- 每个数组对应的
shape
要确认的概念:
- 数据形状是区分可计算结构的基础信息
- NumPy 会把即使数字相同、但轴和维度不同的对象区分显示出来
示例运行结果:
这个例子不是为了学习高阶 NumPy 用法,而是为了确认:即使是同样的数字,装进什么形状里,也会改变计算的含义。
前面的学习时间-分数表也是一样。如果只看分数列,它可以被当成一维向量;但如果把 x 和 y 放在一起看,它就会成为两列的表结构。后面为什么要拆分 X 和 y,或者为什么要检查 shape,最终也都是为了把 这个数据是为哪一种问题服务的 变成可计算的形式。
代码会把公式变成可执行步骤¶
公式会简短展示计算结构,但真实执行仍然需要代码。例如,平均值写成公式很短。
但在代码里,你必须决定数据放在哪里、有几个值、用哪个函数去加总、以及把结果存到哪里。
问题情境:
- 带有 sigma 的平均值公式很短,但在代码里往往需要写得更细
输入(input):
- 分数列表
scores = [55, 65, 80, 90]
输出(output):
- 个数
n - 总和
total - 平均值
mean
要确认的概念:
- 在代码里,公式的一行可能会展开成多个中间变量和执行步骤
- 不只是最后结果,中间变量也会成为帮助解释公式的观察点
示例运行结果:
代码可能比公式更长,但代码会把执行顺序展示出来。它先准备数值,再计数,再求和,再相除,最后再存下结果。如果你依次看 4、290、72.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 这一惯例的参考资料。