无解、唯一解,还是多解
学习分类二元线性方程组,将每种解的数量与参数可辨识性联系起来,并处理矛盾数据或重复数据。
三个只有两行的数据集,可能让同一个模型呈现三种截然不同的行为。设仿射预测规则为
其中实数 和 是未知的权重与偏置。
| 数据集 | 第一条观测 | 第二条观测 | 精确拟合结果 |
|---|---|---|---|
| A | 一组: | ||
| B | 无解:同一个输入要求两个不同的输出 | ||
| C | 无穷多组:第二行重复了第一行 |
数据集 A 可以确定两个参数。数据集 B 与精确模型矛盾。数据集 C 增加了一行,却没有增加新的限制。 行数本身无法告诉我们数据包含了多少信息。
学完本课后,你将能够从方程和几何图形中识别不相容、唯一解以及欠定的二元线性方程组;不使用 行列式或矩阵秩来证明每种分类;并解释结果对参数可辨识性意味着什么。
学习成果: 识别不相容、唯一解以及欠定的方程组。
本课承接第 12 课:方程组作为交点, 其中一个解必须满足每项约束,并表现为一个共同点。官方 Mathematics for Machine Learning 配套网站 在第 2.1 和 2.3 节 中介绍无解、唯一解或无穷多解的分类。下面的数据集、推导、代码、探索器和练习题均为原创。
解的数量诊断可用的信息
考虑关于实数未知量 和 的两个方程。每个非退化方程——即其左侧两个系数不同时为零的方程—— 都会在 平面上画出一条直线。方程组的解集就是这些直线的交集。
这三种可能不是需要死记的目录,而是源自直线的几何性质。两条不平行的直线相交一次。不同的平行线永不 相交。如果两条直线共有两个不同的点,那么它们都经过由这两个点确定的那条直线,因此两条直线重合并 共有所有点。因此,两个变量的两个线性方程不可能有恰好两个、三个或任何其他大于一的有限个实数解。
用机器学习的语言说,如果在给定模型下只有一个参数设置能够拟合观测,那么参数就能从给定观测中被辨识。 可辨识性取决于约束提供的信息,而不只是收集了多少行数据。
消元会显露一个值、矛盾或恒等式
在本课程的现阶段,最直接的分类测试是组合方程,同时保留它们的共同解。注意计算的最后一行说了什么。
一个解会留下可代入的值
求解
\begin{aligned} 2u+v&=7, \tag{1}\\ u-v&=2. \tag{2} \end{aligned}将方程 (1) 和 (2) 相加,消去 :
将 代入方程 (2):
无解以矛盾告终
现在考虑
\begin{aligned} u+2v&=4, \tag{3}\\ 2u+4v&=11. \tag{4} \end{aligned}将方程 (3) 乘以 2 得到 。方程 (4) 却要求同一个左侧等于 11。从方程 (4) 中减去方程 (3) 的两倍,就能明确显示冲突:
没有任何 和 的值能让 成立。方程组不相容,其两条直线平行且不同,解集为 。 计算并不是没能找到隐藏的答案;它证明了不存在精确答案。
无穷多解以恒等式告终
最后考虑
\begin{aligned} 3u-v&=5, \tag{5}\\ -6u+2v&=-10. \tag{6} \end{aligned}方程 (6) 是方程 (5) 的 倍。将方程 (5) 的两倍与方程 (6) 相加,得到
恒等式 对所有 和 都成立;它没有增加新的限制。这不意味着每一对数都能解原方程组。 仍然有一个独立方程。为 任意选择实数 ,方程 (5) 就迫使 :
对于每个实数 ,都有
将这个等式乘以 就能验证方程 (6)。自由选择 会沿着共同直线生成无穷多个解。
在一个参数平面中比较三种几何形态
探索器将 保留为一项观测约束,然后改变其余数据所要求的内容。使用原生选择框选择配置。 除非设备请求减少动效,否则直线会在不同状态间过渡。实线、虚线和点线与颜色一起传达相同区别, 带标题的表格则不依赖 SVG 或 JavaScript 来陈述每个结论。
使用方向键浏览选项。图形、状态和表格会更新为所选的精确拟合问题。
直线在 (w, b) = (2, 2) 处相交一次,因此两个参数都可辨识。
| 约束 | 方程 | 它的作用 |
|---|---|---|
| 约束 1(实线) | w + b = 4 | 定义能拟合第一条观测的第一组参数对。 |
| 约束 2(虚线) | 2w + b = 6 | 与第一条直线相交一次,并确定两个参数。 |
| 精确分类 | 唯一且相容 | |
| 解集 | {(2, 2)} | |
| 对模型参数的含义 | 观测确定了权重 w = 2 和偏置 b = 2。 | |
首次由服务器渲染的状态是唯一解系统 和 ,其中包括其状态、图形和语义表。选择噪声 情形会为模型 加入由观测 、 和 产生的三项约束。前两项 选择 ,但第三项要求 ,这是错误的。
不除以零的系数测试
对于两个非退化方程
比较系数对 和 。如果一个系数对是另一个的实数倍,则它们成比例:存在一个数 使得
这种写法比单独比较 和 更安全,因为任一分母都可能为零。
| 系数关系 | 右侧关系 | 几何形态 | 解 |
|---|---|---|---|
| 不存在同一个乘数 能匹配两个系数 | 不需要 | 不平行直线 | 恰好一个 |
| 不同的平行直线 | 无 | ||
| 同一条直线两次 | 无穷多 |
唯一解的情形意味着两个方程在不同方向上施加约束。平行的情形具有相同的左侧模式;将第一个左侧缩放后, 要么重现第二个右侧,要么暴露矛盾。
零系数仍然是普通数据。方程组
不过就是 和 。水平线和竖直线在唯一点 相交。问题在于试图除以 的比值测试; 零系数本身并没有问题。
如果整个左侧都为零,该方程就是退化的,必须直接读取:
| 退化方程 | 含义 | 对更大方程组的影响 |
|---|---|---|
| 对每个实数对都成立的恒等式 | 不增加限制 | |
| 对任何实数对都不成立的矛盾 | 使完整方程组不相容 |
例如, 与 放在一起仍然留下无穷族 。恒等式不会把一条直线升级为一个唯一点。
可辨识性会询问观测增加了什么
回到 。每条观测 都会变成一个参数约束
对于观测 和 ,约束为
相减得到 ,因此 且 。不同的输入值使观测以不同方式约束参数。
把 重复一百次,仍然只是把 写一百次。数据集的行数增加了,但允许的参数族仍然是 。这些观测无法分别确定 和 。
如果重复的输入带有两个目标,例如 和 ,约束就变成 和 。精确仿射模型 无法同时满足二者。这是一个精确拟合诊断,并不是数据毫无价值的证明。测量噪声、四舍五入的标签, 或过于简单的模型,都可能使真实观测不相容。
后面的课程会引入秩,作为计算独立线性信息数量的术语。本课只需要可见的测试:约束是相交、冲突,还是重复?
NumPy 将精确求解与近似拟合分开
上面的唯一解例子可以写成数组方程。A 的每一行包含乘在 上的系数,c 的每个元素包含所要求的右侧:
import numpy as np
A = np.array([
[2.0, 1.0],
[1.0, -1.0],
])
c = np.array([7.0, 2.0])
solution = np.linalg.solve(A, c)
verified = np.allclose(A @ solution, c, rtol=0.0, atol=1e-12)
print("solution:", solution)
print("A @ solution:", A @ solution)
print("passes both equations:", verified)
# Three slightly inconsistent observations of y_hat = w*x + b.
x_observed = np.array([0.0, 1.0, 2.0])
y_observed = np.array([2.0, 4.0, 6.1])
design = np.column_stack((x_observed, np.ones_like(x_observed)))
approximate, _, _, _ = np.linalg.lstsq(design, y_observed, rcond=None)
predictions = design @ approximate
residuals = predictions - y_observed
print("approximate [w, b]:", np.round(approximate, 6))
print("predictions:", np.round(predictions, 6))
print("residuals:", np.round(residuals, 6))
print(
"all three exact:",
np.allclose(residuals, 0.0, rtol=0.0, atol=1e-12),
)
验证后的输出为:
solution: [3. 1.]
A @ solution: [7. 2.]
passes both equations: True
approximate [w, b]: [2.05 1.983333]
predictions: [1.983333 4.033333 6.083333]
residuals: [-0.016667 0.033333 -0.016667]
all three exact: False
官方 numpy.linalg.solve 文档 规定,
对于具有唯一解的方阵系统,它执行精确的数值求解;对于奇异或非方形的系数数组,它会引发 LinAlgError。
但这个错误本身无法区分“无解”和“无穷多解”,因为两种平行配置都无法满足唯一解要求。代数分类必须补充含义。
numpy.allclose 会在选定容差内检查数组。
代码设置 rtol=0.0 和明确的绝对容差,因为参考残差为零;NumPy 警告说,其默认绝对容差并不适合每种小数值尺度。
这个数值检查支持精确推导,但不会重新定义数学相等。
噪声行没有共同的精确参数对,因此第二次计算提出了不同的问题。numpy.linalg.lstsq 文档
说明,当不存在精确解时,返回的向量会最小化残差的欧几里得大小。它产生的
带来小残差,而不是零残差。最小二乘法会在后续课程中专门介绍;在这里,它标记出求解每一项约束与
近似不相容观测之间的边界。
下一行应该改变交集
分类一个方程组,归根结底是在问每项约束增加了什么。相交会确定一个点。矛盾会清空解集。缩放后的重复项 会留下一个自由选择。对于 AI 模型,这些结果分别对应可辨识的参数、不可能的精确拟合,或数据无法区分的参数。
下一课将赋予向量以正式角色,把它们作为 AI 数据的表示。恢复参数之前,请记住本课的诊断:先检查观测是否真的 唯一地选择了它。
检验你的理解
问题 1
求解 2x + y = 8 和 x − y = 1。说明为什么方程组恰好有一个解,并在两个方程中验证该点。
显示分步解答
相加两个方程,使 消去:
将 代入 :
现在在两个原方程中检验 :
消元确定了 ,代入确定了 ,而且该点通过了两个真值检验。因此解集恰好为 。
问题 2
分类 x + 3y = 5 和 2x + 6y = 13。推导决定性的陈述,并解释其几何意义。
显示分步解答
第一个方程的左侧乘以 2 得 。从第二个方程中减去第一个方程的两倍:
这个矛盾不可能对任何实数 或 成立。系数对 是 的两倍,但右侧 13 不是 5 的两倍。 直线平行且不同,因此方程组不相容,解集为 。
问题 3
求出 4p − 2q = 6 和 −2p + q = −3 的所有解。解释为什么 0 = 0 不是最终答案。
显示分步解答
将第二个方程乘以 得到
这就是第一个方程。因此,用一个方程消去另一个方程会得到 ,说明这两个方程重复了同一个限制。
仍有一个限制。将 除以 2:
令 ,其中 任意。于是每个解为
恒等式 诊断出了冗余;参数化的直线,而不是恒等式本身,才是完整的无穷解集。
问题 4
不除以零系数,分类 0x + y = 4 和 3x + 0y = 9。
显示分步解答
直接读取零系数。第一个方程是 ,一条水平线。第二个方程是 ,因此除以非零数 3 得 ,一条竖直线。
两条直线在 处相交一次。验证为
方程组相容且有唯一解。不需要任何类似 的比值。
问题 5
如果第二个方程分别为 (a) 0x + 0y = 0 或 (b) 0x + 0y = 7,方程 x + y = 2 会怎样?给出每种解集。
显示分步解答
对于 (a),第二个方程是 ,对每个实数对都成立。它不增加限制。第一条直线仍然存在,因此令 ,得到 :
方程组相容且欠定,有无穷多个解。
对于 (b),第二个方程是 ,对任何实数对都不成立。一个解必须同时满足这个矛盾和第一条直线,这是不可能的。因此
方程组不相容。
问题 6
模型 ŷ = wx + b 收到观测 (2, 7) 五十次。w 和 b 能被辨识吗?将所有精确拟合参数化,并解释重复行增加了什么。
显示分步解答
每次重复观测都会产生同一个约束:
自由选择权重 。那么偏置必须是
因此所有精确拟合为
五十个副本仍然只画出一条参数直线,因此有无穷多个参数对可以拟合。这些行确认了同一观测,却没有增加不同的限制。 仅凭这个数据集,两个参数都不可辨识。
问题 7
对于模型 ŷ = wx + b 的观测 (0, 2)、(1, 4) 和 (2, 6.1),证明不存在精确拟合。然后解释 NumPy 最小二乘输出 [2.05, 1.983333] 做了什么、没有声称什么。
显示分步解答
第一条观测迫使 。第二条观测接着给出
唯一满足前两行的参数对是 。将它代入第三行:
因此不存在能同时精确满足三项约束的参数对。
最小二乘输出使用 和 。它的预测约为 , 残差约为 。这些数值很小但不为零。该输出最小化了指定的残差度量;它不会把 不相容的精确方程组变成相容的方程组,也没有声称每个观测都被精确匹配。