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

面向 AI 的线性方程:把一个公式变成几何直线

学习一个二元线性方程如何变成一条直线,测试其上的点,处理垂直情形,并读懂线性分类器的得分等值线。

分享这篇文章

一个小型分类器为两个特征赋予一个得分:

s(x1,x2)=2x1+x2−5.s(x_1,x_2)=2x_1+x_2-5.

特征对 (0,5)(0,5)、(1,3)(1,3) 和 (2,1)(2,1) 看起来不同,但它们得到的得分相同:

s(0,5)=s(1,3)=s(2,1)=0.s(0,5)=s(1,3)=s(2,1)=0.

这不是三个互不相关的巧合。它们位于同一条几何直线上,而且这条直线上的每个点都得到零分。学完本课后,你将能够把二元线性方程变成一条直线,生成并测试解,并在一个线性分类器的得分等值线中识别出同样的几何结构。

学习成果: 将二元线性方程转换为一条直线,并测试解。

本课直接承接第 9 课:面向 AI 的方程,在那里方程变成了筛选解集的约束。这里允许的值是 (x,y)∈R2(x,y)\in\mathbb R^2 中的数对,几何图形让我们能够看见这个集合。第 10 课:逐行阅读 AI 推导提供了配套习惯:每次移项都必须精确保留同一批点。

官方的 Mathematics for Machine Learning 配套网站将线性方程组放在线性代数的开端。其第 2.1 节解释了几何视角:二元一次方程表示一条直线,而一个方程组询问这些直线在哪里相交。本课聚焦于这条基础的单条直线。文中的例子、代码、视觉组件和练习题均为原创,下一课将加入第二个方程。

一个方程描述一个位置

考虑一般的二元方程

ax+by=c,ax+by=c,

其中 xx 和 yy 是实数坐标,aa、bb 和 cc 是固定的实数系数。当 xx 和 yy 只以一次幂出现、彼此不相乘,并且只与固定数字相乘时,这个方程就是线性的。

假设 b≠0b\ne0。从两边减去 axax,再除以已知的非零数 bb:

ax+by=c,by=c−ax,y=−abx+cb.\begin{aligned} ax+by&=c,\\ by&=c-ax,\\ y&=-\frac{a}{b}x+\frac{c}{b}. \end{aligned}

这就是斜截式 y=mx+qy=mx+q。斜率为 m=−a/bm=-a/b:在约束保持不变时,xx 增加一个单位会使 yy 改变 −a/b-a/b 个单位。纵轴截距为 q=c/bq=c/b,它在 x=0x=0 时取得。

整理后的公式不只是让绘图更方便。它显露出一个自由选择。任选实数 xx,方程就会计算出恰好一个匹配的 yy。随着 xx 连续变化,解点描出的是一条直线,而不是有限个点的集合。

一条算例直线揭示斜率、截距和点

来看

3x+2y=12.3x+2y=12.

这里 a=3a=3、b=2b=2、c=12c=12。由于 bb 非零,解出 yy 是合法的:

3x+2y=12,2y=12−3x,y=6−32x.\begin{aligned} 3x+2y&=12,\\ 2y&=12-3x,\\ y&=6-\frac32x. \end{aligned}

这条直线的斜率为 −3/2-3/2。如果 xx 增加 22,yy 就减少 33。这个成对的变化使左侧保持不变,因为

3(Δx)+2(Δy)=3(2)+2(−3)=0.3(\Delta x)+2(\Delta y)=3(2)+2(-3)=0.

残差把这个真值测试变成一个数字:

r(x,y):=3x+2y−12.r(x,y):=3x+2y-12.

直线上的点残差为 00。非零残差既表示测试失败,也带有符号:正值意味着加权和高于 1212,负值意味着低于 1212。

候选点代入 3x+2y3x+2y残差 r(x,y)r(x,y)判定
(0,6)(0,6)3(0)+2(6)=123(0)+2(6)=1200在线上
(2,3)(2,3)3(2)+2(3)=123(2)+2(3)=1200在线上
(4,0)(4,0)3(4)+2(0)=123(4)+2(0)=1200在线上
(2,4)(2,4)3(2)+2(4)=143(2)+2(4)=1422不在线上

两个不同的点足以画出这条直线,但它们不是完整的解集。这个受控视觉组件让缺失的点族变得直观。

移动一个坐标,让方程计算另一个坐标:显示的每个数对都位于 3x + 2y = 12 上。
选择直线上的一个点

使用滑块、指针或键盘上的方向键、Page Up、Page Down、Home 和 End 键。

2
计算得到的 y 坐标3由 y = (12 − 3x) ÷ 2 计算

也可以沿直线左右拖动圆点。

选中的点:(2, 3)。它的残差为 0,因此满足该方程。

3x + 2y = 12 的每个解●选中的解
直线 3x 加 2y 等于 12 上的可移动点直线从负 2、9 下降到 6、负 3。选中的点从 2、3 开始,并且残差始终为零。
选中点的文字替代内容
量当前值计算方式
x 坐标2由范围控件选择
y 坐标3(12 − 3 × 2) ÷ 2
残差03 × 2 + 2 × 3 − 12

首次由服务器渲染的状态是 (2,3)(2,3),图表下方的表格包含同样的计算。这个直线不需要 JavaScript 才能表达它的数学含义;水合过程增加了选择另一个 xx 并观察匹配的 yy 变化的能力。控件使用固定的四分之一单位步长来便于检查,而数学参数可以是任意实数。

一个参数描述整条直线

写出几个点可以暗示规律,但一个参数可以一次描述所有点。令 tt 为任意实数,并设

(x,y)=(t,6−32t),t∈R.(x,y)=\left(t,6-\frac32t\right), \qquad t\in\mathbb R.

这个族中的每个数对都是解,因为

3t+2(6−32t)=3t+12−3t=12.3t+2\left(6-\frac32t\right) =3t+12-3t =12.

反向也很重要。任何满足 3x+2y=123x+2y=12 的数对也必须满足 y=6−32xy=6-\tfrac32x。令 t=xt=x,这个数对就属于参数化族。两个方向合在一起说明:参数化包含直线上的每个点,且不包含直线外的点。

这就是为什么绘图窗口从来不会包含整个数学对象。像素和采样坐标是有限的;直线则是方程所规定的无限解集。

NumPy 生成点;原始方程验证这些点

代码应当映照代数过程。NumPy 对 linspace 的文档说明,它会在指定区间上返回均匀间隔的样本。生成几个 xx 值,计算匹配的 yy 值,然后测试原始约束,而不是盲信整理后的公式:

import numpy as np
import matplotlib.pyplot as plt

# 3x + 2y = 12  ->  y = (12 - 3x) / 2
x = np.linspace(-2.0, 6.0, num=5)
y = (12.0 - 3.0 * x) / 2.0
residual = 3.0 * x + 2.0 * y - 12.0

print("x:", x)
print("y:", y)
print("residual:", residual)
print("on line:", np.isclose(residual, 0.0, rtol=0.0, atol=1e-12))

candidates = np.array([[2.0, 3.0], [2.0, 4.0], [4.0, 0.0]])
candidate_residual = 3.0 * candidates[:, 0] + 2.0 * candidates[:, 1] - 12.0
print("candidate residual:", candidate_residual)
print(
    "candidate on line:",
    np.isclose(candidate_residual, 0.0, rtol=0.0, atol=1e-12),
)

plt.plot(x, y, label="3x + 2y = 12")
plt.plot(candidates[:, 0], candidates[:, 1], "o", label="tested points")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()

执行输出为:

x: [-2.  0.  2.  4.  6.]
y: [ 9.  6.  3.  0. -3.]
residual: [0. 0. 0. 0. 0.]
on line: [ True  True  True  True  True]
candidate residual: [0. 2. 0.]
candidate on line: [ True False  True]

np.isclose用明确的容差比较浮点值。这里 rtol=0.0 和 atol=1e-12 意味着“接受绝对值最多为 10−1210^{-12} 的残差”。这是针对该例规模所作的数值工程决策,而不是对方程成立的符号证明。证明来自代数;代码检查实现是否与代数一致。

绘图调用遵循 Matplotlib 的 plot 约定:提供的数组给出直线节点的水平和垂直坐标。更密集的绘图会显得更平滑,但不会创造更多数学解。

分类器等值线是带有特征名称的同一个方程

回到开头的得分:

s(x1,x2)=2x1+x2−5.s(x_1,x_2)=2x_1+x_2-5.

这里 x1x_1 和 x2x_2 是输入特征,22 和 11 是固定权重,−5-5 是截距。得分等值线收集所有得到某个选定得分的特征对。零得分等值线满足

s(x1,x2)=0  ⟺  2x1+x2=5  ⟺  x2=5−2x1.s(x_1,x_2)=0 \iff 2x_1+x_2=5 \iff x_2=5-2x_1.

这是一条直线。从 (1,3)(1,3) 移动到 (2,1)(2,1) 时,x1x_1 增加 11,x2x_2 减少 22,得分保持不变:

2(1)+3−5=0,2(2)+1−5=0.2(1)+3-5=0, \qquad 2(2)+1-5=0.

这个形式并不是为图示临时发明的。官方的 scikit-learn LinearSVC 示例展示了由特征矩阵乘以学习到的系数再加截距得到决策函数。scikit-learn 的 RidgeClassifier 文档还说明,其二分类置信度得分与到分隔超平面的带符号距离成比例,并记录了高于零的得分会预测其第二个类别。

对于这个教学分类器,采用明确的规则

class^={A,s(x1,x2)>0,B,s(x1,x2)≤0.\widehat{\text{class}}= \begin{cases} \text{A}, & s(x_1,x_2)>0,\\ \text{B}, & s(x_1,x_2)\le0. \end{cases}

在这个约定下,零等值线就是决策边界:跨过它会改变预测类别。一侧的点得分为正,另一侧的点得分为负。直线本身并不指定平局规则或类别名称;这些属于预测约定。原始得分也不会自动成为概率。

特征对得分计算得分按所述规则的结果
(1,3)(1,3)2(1)+3−52(1)+3-500类别 B,位于边界上
(2,2)(2,2)2(2)+2−52(2)+2-511类别 A
(0,4)(0,4)2(0)+4−52(0)+4-5−1-1类别 B

除以零揭示遗漏的情形

“ax+by=cax+by=c 是一条直线”这句话需要一个条件:aa 和 bb 不能同时为零。解出 yy 则需要更强的局部条件 b≠0b\ne0。

系数情形解集几何结果
b≠0b\ne0y=−abx+cby=-\frac abx+\frac cb非垂直直线
b=0b=0, a≠0a\ne0x=cax=\frac ca 且任意实数 yy垂直直线
a=0a=0, b≠0b\ne0y=cby=\frac cb 且任意实数 xx水平直线
a=b=0a=b=0, c=0c=0每个 (x,y)∈R2(x,y)\in\mathbb R^2整个平面,不是一条直线
a=b=0a=b=0, c≠0c\ne0无解空集,不是一条直线

例如,2x+0y=62x+0y=6 简化为 x=3x=3。每个点 (3,y)(3,y) 都成立,所以这条直线是垂直的。尝试除以 b=0b=0 来生成 y=mx+qy=mx+q 并不是一条笨拙的路线,而是未定义的操作。垂直直线没有有限斜率,因为它的 xx 坐标不变,而 yy 可以变化。

还有一个需要避免的实际误解。两个绘出的点可以确定一条非退化直线,但通过两次测试并不能证明任意代码都表示预期方程。交换过系数的代码仍可能把这两个特定点放在预期位置。为几个有意选取的点(包括一个直线外点)计算残差,并保留代数推导作为真值来源。

再加一个约束,直线就会变成交点

一个方程留下一个自由坐标:选择 xx,直线就确定 yy;对于垂直直线,则选择 yy,而 xx 保持不变。这种自由度就是单个方程通常有无穷多个坐标对解的原因。

下一课会对同一个数对施加第二个方程。解届时必须同时位于两条直线上。这里建立的点在线上测试会变成交点测试,几何图形将揭示一个方程组为什么可能有一个解、无解,或有一整条公共直线。

检查你的理解

问题 1

将 4x + 2y = 8 转换为斜截式。写出斜率和两个坐标轴截距,并展示每一步。

显示分步解答

由于 yy 的系数是非零数 22,用可逆步骤隔离 yy:

4x+2y=8,2y=8−4x,y=4−2x.\begin{aligned} 4x+2y&=8,\\ 2y&=8-4x,\\ y&=4-2x. \end{aligned}

将 y=4−2xy=4-2x 与 y=mx+qy=mx+q 比较可得斜率 m=−2m=-2,纵轴截距 q=4q=4,因此一个截距是 (0,4)(0,4)。对于横轴截距,令 y=0y=0:

0=4−2x  ⟺  2x=4  ⟺  x=2.0=4-2x \iff 2x=4 \iff x=2.

另一个截距是 (2,0)(2,0)。两者都满足原始方程:4(0)+2(4)=84(0)+2(4)=8 和 4(2)+2(0)=84(2)+2(0)=8。

问题 2

检验点 (3, 1)、(1, 3) 和 (0, 4) 是否满足 2x + y = 7。分别计算残差,并将其分类为在线上或不在线上。

显示分步解答

使用残差 r(x,y)=2x+y−7r(x,y)=2x+y-7:

r(3,1)=2(3)+1−7=0,r(1,3)=2(1)+3−7=−2,r(0,4)=2(0)+4−7=−3.\begin{aligned} r(3,1)&=2(3)+1-7=0,\\ r(1,3)&=2(1)+3-7=-2,\\ r(0,4)&=2(0)+4-7=-3. \end{aligned}

只有 (3,1)(3,1) 的残差为零,所以它在线上。另两个点不在线上。它们的负残差表示加权和 55 和 44 低于要求的值 77。

问题 3

使用一个实参数参数化 x − 3y = 6 的所有解,然后证明集合相等的两个方向。

显示分步解答

令 y=ty=t,其中 t∈Rt\in\mathbb R 任意。解出 xx 得

x−3t=6  ⟺  x=6+3t.x-3t=6 \iff x=6+3t.

所以提出的族为

(x,y)=(6+3t,t),t∈R.(x,y)=(6+3t,t), \qquad t\in\mathbb R.

首先,列出的每个数对都成立,因为

(6+3t)−3t=6.(6+3t)-3t=6.

其次,原方程的任意解 (x,y)(x,y) 都满足 x=6+3yx=6+3y。令 t=yt=y,就能把该解写成 (6+3t,t)(6+3t,t)。第一个方向排除了直线外的点;第二个方向确保没有遗漏任何解。

问题 4

一名学生将 5x + 0y = 10 重写为 y = (10 − 5x) / 0,并得出方程没有图像的结论。诊断错误并给出正确的解集。

显示分步解答

尝试的整理除以 yy 的系数,而这个系数为零。除以零没有定义,因此这一步不能保留解集。

直接从原方程出发:

5x+0y=10  ⟺  5x=10  ⟺  x=2.5x+0y=10 \iff 5x=10 \iff x=2.

这个方程不限制 yy。其解集是

{(2,t)∣t∈R},\{(2,t)\mid t\in\mathbb R\},

即垂直直线 x=2x=2。图像存在;只是无法使用具有有限斜率的斜截式。

问题 5

分类 0x + 0y = 0 和 0x + 0y = 4 的解集。解释为什么两个方程都不描述一条单独的直线。

显示分步解答

对于每个实数对 (x,y)(x,y),

0x+0y=0.0x+0y=0.

因此,第一个方程的解集是整个 R2\mathbb R^2,即整个坐标平面。它没有筛选出一条直线。

第二个方程简化为 0=40=4,对任何赋值都为假。其解集是空集 ∅\varnothing。它根本不包含直线。这些情形说明,直线的定义要求 aa 或 bb 至少一个非零。

问题 6

对于得分 s(x₁, x₂) = −x₁ + 2x₂ − 4,找出零得分等值线,并使用正得分为类别 A、其他得分为类别 B 的规则分类 (0, 3)、(2, 3) 和 (4, 3)。

显示分步解答

令得分为零并解出 x2x_2:

−x1+2x2−4=0  ⟺  2x2=x1+4  ⟺  x2=12x1+2.-x_1+2x_2-4=0 \iff 2x_2=x_1+4 \iff x_2=\frac12x_1+2.

这条直线是零得分等值线。现在计算三个点:

s(0,3)=−(0)+2(3)−4=2,s(2,3)=−(2)+2(3)−4=0,s(4,3)=−(4)+2(3)−4=−2.\begin{aligned} s(0,3)&=-(0)+2(3)-4=2,\\ s(2,3)&=-(2)+2(3)-4=0,\\ s(4,3)&=-(4)+2(3)-4=-2. \end{aligned}

按照所述约定,(0,3)(0,3) 是类别 A,而 (2,3)(2,3) 和 (4,3)(4,3) 是类别 B。点 (2,3)(2,3) 恰好位于边界上。不同的平局规则可能会给零得分点分配不同类别,因此方程本身不能决定该标签。

问题 7

调试这项 NumPy 检查:on_line = (3 * x + 2 * y == 12)。写出一个考虑容差的残差检查,并解释它能证明什么、不能证明什么。

显示分步解答

先计算残差,然后使用根据计算规模选择的容差将它与零比较:

residual = 3.0 * x + 2.0 * y - 12.0
on_line = np.isclose(residual, 0.0, rtol=0.0, atol=1e-12)

当 ∣r∣≤10−12|r|\le10^{-12} 时,它会接受该元素。浮点运算后的舍入可能留下很小的非零残差,因此这种方法避免要求逐位相等。

结果测试的是给定的数值数组和这个容差。它不能证明对每个实参数值都有符号恒等式 3x+2y=123x+2y=12,而且过大的 atol 可能错误地接受直线外的点。推导建立了公式;数值检查有助于发现实现错误。

资料来源

  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
  6. scikit-learn documentation: RidgeClassifier
  7. scikit-learn example: Plot the support vectors in LinearSVC