AI 数学课程 · 第 12 课,共 180

两个观测,一个参数对:面向 AI 的方程组

将方程组看作同时成立的约束,分类两条直线的交点,并从两个观测中恢复仿射模型的权重和偏置。

分享这篇文章

一个微小的预测规则含有两个未知参数:

y^=wx+b.\widehat y=wx+b.

第一个观测表明,输入 x=1x=1 产生了目标 y=5y=5。这并不能分别揭示权重 ww 或偏置 bb,而是给出一个约束 w+b=5w+b=5,其参数对构成一整条直线。第二个观测 (x,y)=(3,9)(x,y)=(3,9) 给出了另一条直线 3w+b=93w+b=9。

两条直线上只有一个共同点:(w,b)=(2,3)(w,b)=(2,3)。在这个点上,同一个模型同时拟合两行数据。 这个共同点正是线性方程组的核心:每个方程施加一个约束,而解必须同时通过所有约束。

学完本课后,你将能够把方程组理解为同时成立的约束,用代入或相减法求解二元方程组, 将两条直线分类为相交、平行或重合,并从两个观测中恢复两个精确的模型参数。

学习成果: 将方程组理解为同时成立的约束,并分类其交点。

本课承接第 11 课:面向 AI 的线性方程, 其中一个方程变成一条几何直线,并用代入检验点是否属于该直线。官方 Mathematics for Machine Learning 配套网站 将线性方程组 放在线性代数的开头,其第 2.1 节 将同时 成立的解与几何交点联系起来。下面的参数恢复场景、推导、代码、视觉组件和练习题均为原创。

一个解必须通过两项真值检验

考虑关于同一组实数未知量 ww 和 bb 的两个线性方程:

a1w+b=c1,a2w+b=c2.\begin{aligned} a_1w+b&=c_1,\\ a_2w+b&=c_2. \end{aligned}

固定实数 a1a_1 和 a2a_2 乘在权重上;固定实数 c1c_1 和 c2c_2 是所要求的输出。 有序对 (w,b)(w,b) 是未知的参数设定。

“同时”一词可以避免常见错误。数对 (0,5)(0,5) 满足 w+b=5w+b=5,但不满足第二个方程,因为 3(0)+5=5≠93(0)+5=5\ne9。数对 (3,0)(3,0) 满足 3w+b=93w+b=9,但不满足第一个方程,因为 3+0≠53+0\ne5。 每个数对只适合一行;都不满足整个方程组。

候选 (w,b)(w,b)检验 w+b=5w+b=5检验 3w+b=93w+b=9满足方程组?
(0,5)(0,5)0+5=50+5=50+5=50+5=5No
(3,0)(3,0)3+0=33+0=39+0=99+0=9No
(2,3)(2,3)2+3=52+3=56+3=96+3=9Yes

只有同一个赋值通过每一项原始真值检验,方程组才算解出。

相减法分离观测发生的变化

开头的方程组为

\begin{aligned} w+b&=5, \tag{1}\\ 3w+b&=9. \tag{2} \end{aligned}

两个方程都含有相同的 +b+b。从方程 (2) 中减去方程 (1) 的整个左侧,并在右侧做同样 的相减,就能消去 bb:

(3w+b)−(w+b)=9−5,3w+b−w−b=4,2w=4,w=2.\begin{aligned} (3w+b)-(w+b)&=9-5,\\ 3w+b-w-b&=4,\\ 2w&=4,\\ w&=2. \end{aligned}

现在将 w=2w=2 代入任一原方程。使用方程 (1),

2+b=5  ⟺  b=3.2+b=5 \iff b=3.

相减法也有 AI 层面的解释。在两个观测之间,输入增加了 3−1=23-1=2,输出增加了 9−5=49-5=4。偏置对两个预测的贡献相同,因此在差值中消失。权重就是输入每增加一个 单位时输出的变化量:

w=9−53−1=42=2.w=\frac{9-5}{3-1}=\frac42=2.

知道类似斜率的权重后,任意一行都能揭示偏置。这是精确的两点拟合,并不是普通大数据 集训练的描述。真实观测可能包含噪声,第三行也可能与前两行确定的直线不一致。后续 课程会为这些情况发展工具。

代数答案就是几何交点

每个观测都可以在 (w,b)(w,b) 参数平面中整理成一条直线:

w+b=5  ⟺  b=5−w,3w+b=9  ⟺  b=9−3w.\begin{aligned} w+b=5 &\iff b=5-w,\\ 3w+b=9 &\iff b=9-3w. \end{aligned}

这张图不是通常的观测输入 xx 对目标 yy 的图。横坐标是候选权重,纵坐标是候选偏置。 第一条直线上的每个点都拟合观测 1;第二条直线上的每个点都拟合观测 2;它们在 (2,3)(2,3) 处的交点同时拟合两者。

改变下面的第二个观测。实线仍为 w+b=5w+b=5,虚线变为 x2w+b=y2x_2w+b=y_2。原生滑块可以调整 第二个输入 x2x_2 和目标 y2y_2,三个按钮则跳转到有代表性的交点状态。

两个观测变成两个参数约束。它们的共同点恰好是同时拟合两者的模型。
改变第二个观测

设置 x₂w + b = y₂ 中的权重系数。第一个输入固定为 1。

3

设置第二个约束的右侧。第一个目标固定为 5。

9
探索一个代表性配置

一个解:直线在权重 w = 2、偏置 b = 3 处相交。

一个解:直线在权重 w = 2、偏置 b = 3 处相交。
观测 1:w + b = 5(实线)观测 2:x₂w + b = y₂(虚线)⊗共同解(圈加号)
权重和偏置参数平面中的两个观测约束实线为 w 加 b 等于 5。虚线为 3w 加 b 等于 9。结果:一个共同点。权重:2。偏置:3。
当前约束及图形的文字替代
量当前值解释
观测 1 约束w + b = 5实线上的每个点都拟合第一个观测。
观测 2 约束3w + b = 9虚线上的每个点都拟合第二个观测。
交点类别一个共同点一个解:直线在权重 w = 2、偏置 b = 3 处相交。
恢复的权重 w2该坐标属于共同解。
恢复的偏置 b3该坐标属于共同解。

组件首次由服务器渲染的状态就是示例方程组:x2=3x_2=3、y2=9y_2=9,以及 (w,b)=(2,3)(w,b)=(2,3)。 其状态句和表格独立于 SVG 包含结论,即使没有 JavaScript 也仍然有用。直线标签还使用 实线和虚线图案,交点有独立的圈加号形状,因此颜色不是唯一的状态提示。

三种图景涵盖两条直线的全部可能

对于以下方程族,

a1w+b=c1,a2w+b=c2,\begin{aligned} a_1w+b&=c_1,\\ a_2w+b&=c_2, \end{aligned}

从第二个方程中减去第一个方程得到

(a2−a1)w=c2−c1.(a_2-a_1)w=c_2-c_1.

这两个差值无需矩阵就能对几何形状进行分类。

系数比较目标比较几何形状方程组解集
a2≠a1a_2\ne a_1任意值相交一个点
a2=a1a_2=a_1c2≠c1c_2\ne c_1平行空集:∅\varnothing
a2=a1a_2=a_1c2=c1c_2=c_1重合整条共同直线

当 a2≠a1a_2\ne a_1 时可以进行除法,并得到一个权重:

w=c2−c1a2−a1,b=c1−a1w.w=\frac{c_2-c_1}{a_2-a_1}, \qquad b=c_1-a_1w.

当 a2=a1a_2=a_1 时,左侧差值为零。如果目标不同,相减后的方程变为右侧非零的 0=c2−c10=c_2-c_1,产生矛盾。如果目标也相同,相减变成恒等式 0=00=0:第二个方程只是 重复第一个方程,没有增加新的限制。

下一课将把这个预览发展为对无解、唯一解和多解的系统研究。现在只需记住几何检验:相交 直线共有一个点,不同的平行直线没有共同点,重合直线共享其全部点。

NumPy 验证拟合,Matplotlib 绘制约束

无需把计算隐藏在通用求解器中即可实现。下面的函数恰好接收两个观测,处理输入重复的 边界,并将恢复的参数与两个原始数据行进行检验。

import numpy as np
import matplotlib.pyplot as plt


def recover_two_parameter_model(x, y, atol=1e-12):
    delta_x = x[1] - x[0]
    delta_y = y[1] - y[0]

    if np.isclose(delta_x, 0.0, rtol=0.0, atol=atol):
        if np.isclose(delta_y, 0.0, rtol=0.0, atol=atol):
            return "many", None
        return "none", None

    weight = delta_y / delta_x
    bias = y[0] - weight * x[0]
    residual = weight * x + bias - y
    return "one", (weight, bias, residual)


x = np.array([1.0, 3.0])
y = np.array([5.0, 9.0])
classification, result = recover_two_parameter_model(x, y)
weight, bias, residual = result

print("classification:", classification)
print("weight:", weight)
print("bias:", bias)
print("predictions:", weight * x + bias)
print("residual:", residual)
print(
    "both constraints satisfied:",
    np.isclose(residual, 0.0, rtol=0.0, atol=1e-12),
)

candidate_weight = np.linspace(-1.0, 5.0, num=121)
bias_from_first = y[0] - x[0] * candidate_weight
bias_from_second = y[1] - x[1] * candidate_weight

plt.plot(candidate_weight, bias_from_first, label="w + b = 5")
plt.plot(
    candidate_weight,
    bias_from_second,
    "--",
    label="3w + b = 9",
)
plt.plot([weight], [bias], "o", label="shared solution")
plt.xlabel("weight w")
plt.ylabel("bias b")
plt.legend()
plt.show()

相交情形的执行输出为:

classification: one
weight: 2.0
bias: 3.0
predictions: [5. 9.]
residual: [0. 0.]
both constraints satisfied: [ True  True]

numpy.isclose 使用明确的相对和绝对容差比较数字。这里参考值为零,因此 rtol=0.0 与 atol=1e-12 清楚表达了预期的绝对阈值。该测试检验的是这次浮点执行,并不能替代精确的代数推导。

numpy.linspace 在选定区间返回等间距样本。121 个采样权重为 Matplotlib 提供了足够的线节点,使图形 清晰,但这些样本不是数学上的解集。每条直线都包含无穷多个实点。Matplotlib 的 plot 文档规定, 提供的 x 和 y 值是线节点的坐标;调用两次就能绘制两条约束直线。

当数据集要求更多时,精确拟合可能失败

恢复的模型 y^=2x+3\widehat y=2x+3 拟合 (1,5)(1,5) 和 (3,9)(3,9)。假设第三个观测为 (2,8)(2,8)。 模型预测

y^=2(2)+3=7,\widehat y=2(2)+3=7,

因此残差为 7−8=−17-8=-1。在参数平面中,新的一行贡献第三条直线 2w+b=82w+b=8,它不经过 (2,3)(2,3)。不存在一个参数对能够精确拟合三行。

这并不意味着第一次计算错误,而是问题发生了变化。两行数据选出了穿过这两个观测的精确 直线;第三行显示完整数据集不在这条直线上。机器学习实践常把“精确满足每个方程”替换 为“寻找预测总体接近的参数”,但这个近似问题属于后续课程。

另一个误解方向相反。如果两个观测完全相同,例如 (1,5)(1,5) 和 (1,5)(1,5),方程组并没有 学到两个参数,只是把 w+b=5w+b=5 写了两遍。那一条直线上的每个点仍然都能拟合,因此权重 和偏置仍无法确定。

数据集的断言存在于交点

一个观测可以证明某个参数对拟合一行。方程组提高了标准:同一个参数对必须通过每一行的 检验。在两行示例中,相减观测揭示权重,代入恢复偏置,而两条参数直线的交点说明了答案 为何是共同的。

这种几何习惯会延续到下一课。当新约束到来时,检查它增加了什么:新的交点、一个矛盾, 还是仅仅又画了一遍同一条直线。

检查你的理解

问题 1

将 (w, b) = (1, 4)、(2, 3) 和 (3, 0) 代入方程组 w + b = 5 与 3w + b = 9 进行检验。哪个数对(如果有)满足方程组?

显示分步解答

将每个数对代入两个原方程。

对于 (1,4)(1,4),

1+4=5,3(1)+4=7≠9.1+4=5, \qquad 3(1)+4=7\ne9.

它只满足第一个约束。对于 (2,3)(2,3),

2+3=5,3(2)+3=9.2+3=5, \qquad 3(2)+3=9.

它满足两个约束。对于 (3,0)(3,0),

3+0=3≠5,3(3)+0=9.3+0=3\ne5, \qquad 3(3)+0=9.

它只满足第二个约束。因此 (2,3)(2,3) 是所列数对中唯一满足方程组的数对。只通过其中一项 真值检验是不够的。

问题 2

用相减法求解 2u + v = 8 和 5u + v = 17。在两个方程中验证结果,并指出交点。

显示分步解答

从第二个方程中减去第一个方程。括号可以确保相减作用于每一项:

(5u+v)−(2u+v)=17−8,3u=9,u=3.\begin{aligned} (5u+v)-(2u+v)&=17-8,\\ 3u&=9,\\ u&=3. \end{aligned}

将 u=3u=3 代入第一个方程:

2(3)+v=8  ⟺  6+v=8  ⟺  v=2.2(3)+v=8 \iff 6+v=8 \iff v=2.

现在验证两个原方程:

2(3)+2=8,5(3)+2=17.2(3)+2=8, \qquad 5(3)+2=17.

解以及几何交点为 (u,v)=(3,2)(u,v)=(3,2)。

问题 3

仿射模型 ŷ = wx + b 观测到 (x, y) = (−1, 1) 和 (2, 10)。恢复 w 和 b,然后写出拟合后的预测规则。

显示分步解答

将观测转换为参数约束:

−w+b=1,2w+b=10.\begin{aligned} -w+b&=1,\\ 2w+b&=10. \end{aligned}

从第二个方程中减去第一个方程:

(2w+b)−(−w+b)=10−1  ⟺  3w=9  ⟺  w=3.(2w+b)-(-w+b)=10-1 \iff 3w=9 \iff w=3.

将 w=3w=3 代入 −w+b=1-w+b=1:

−3+b=1  ⟺  b=4.-3+b=1 \iff b=4.

拟合规则为 y^=3x+4\widehat y=3x+4。它给出 3(−1)+4=13(-1)+4=1 和 3(2)+4=103(2)+4=10,因此两个残差 都为零。

问题 4

分类 2x + y = 4 与 2x + y = 7 的交点。说明相减法如何证明这一分类。

显示分步解答

从第二个方程中减去第一个方程:

(2x+y)−(2x+y)=7−4  ⟺  0=3.(2x+y)-(2x+y)=7-4 \iff 0=3.

对任何 (x,y)(x,y) 而言,0=30=3 都是错误的。两条直线的左侧相同,因此斜率相同,但右侧 不同使它们具有不同的截距。它们是不同的平行直线。它们没有交点,因此方程组的解集是 ∅\varnothing。

问题 5

分类方程组 2x + 2y = 10 与 x + y = 5。解释为什么写出两个方程不会产生唯一解。

显示分步解答

将第一个方程除以非零数 22:

2x+2y=10  ⟺  x+y=5.2x+2y=10 \iff x+y=5.

结果恰好是第二个方程。因此两个方程画出同一直线。每个满足 t∈Rt\in\mathbb R 的点 (t,5−t)(t,5-t) 都满足两者:

t+(5−t)=5t+(5-t)=5

将该等式乘以 2 可得 2t+2(5−t)=102t+2(5-t)=10。方程组沿一条重合直线有无穷多个解;第二个 方程只是重复,而没有缩小第一个约束。

问题 6

一名学生从 3w + b = 9 中减去 w + b = 5,却写成 2w + 2b = 4。找出第一个错误,正确完成求解并验证。

显示分步解答

相减必须作用于第一个方程的整个左侧:

(3w+b)−(w+b)=3w+b−w−b.(3w+b)-(w+b)=3w+b-w-b.

学生得到 +2b+2b 是符号分配错误。由于 b−b=0b-b=0,正确步骤为

2w=4  ⟺  w=2.2w=4 \iff w=2.

代入 w+b=5w+b=5 得到 2+b=52+b=5,所以 b=3b=3。在两个原方程中验证得到

2+3=5,3(2)+3=9.2+3=5, \qquad 3(2)+3=9.

因此 (w,b)=(2,3)(w,b)=(2,3) 是解。

问题 7

模型 ŷ = 2x + 3 拟合观测 (1, 5) 和 (3, 9)。第三个观测为 (2, 8)。同一个参数对能否满足三个约束?计算并解释残差。

显示分步解答

在第三个输入处计算模型:

y^=2(2)+3=7.\widehat y=2(2)+3=7.

使用残差 r=y^−yr=\widehat y-y,第三个残差为

r=7−8=−1.r=7-8=-1.

参数对 (w,b)=(2,3)(w,b)=(2,3) 仍满足前两个约束,但不满足第三个,因为 2w+b=2(2)+3=7≠82w+b=2(2)+3=7\ne8。因此不能,这个参数对不满足三方程组。负残差表示其预测值比 第三个目标低一个单位。

资料来源

  1. Mathematics for Machine Learning companion website
  2. Mathematics for Machine Learning book PDF
  3. NumPy documentation: numpy.linspace
  4. NumPy documentation: numpy.isclose
  5. Matplotlib documentation: matplotlib.pyplot.plot