斯坦福-ENGR108-矩阵论与应用线性代数笔记-全-
斯坦福 ENGR108 矩阵论与应用线性代数笔记(全)


📚 课程介绍 P1:L1.1
在本节课中,我们将介绍《应用线性代数导论》这门课程及其配套资源。我们将了解课程的基本信息、学习资源的使用方法,以及如何通过实践来掌握这门课程的核心内容。
大家好,我是 Stephen Boyd,我是《应用线性代数导论:向量、矩阵与最小二乘法》一书的合著者之一。我在斯坦福大学教授 ENGR 108 课程,我的合著者则在加州大学洛杉矶分校教授 EE133 课程。这些讲座将紧密跟随幻灯片的内容,而这些幻灯片又紧密地遵循了教材。
在深入细节之前,我将花几分钟时间谈谈你如何利用这些材料,包括讲座、书籍和其他资源。
首先,我需要说明一下学习本课程或阅读本书所需的先决条件。实际上,要求非常少。在课程中,我们会偶尔用到一点微积分,但这并非一个巨大的先决条件。另一个要求是,你应该对任何一门编程语言有简单的了解。你不需要成为专家级程序员,也不需要上完整个计算机科学课程,但需要懂一点基础。稍后我会详细说明这一点。
接下来,让我谈谈如何利用这些资源。第一个资源是教材。需要说明的是,这本书可以在线免费获取。你只需使用谷歌或其他搜索引擎,就能很快找到该书的 PDF 文件。这要感谢剑桥大学出版社的开明态度,允许我们将书籍发布在网上。实际上,我自己也经常使用在线版本,因为它有链接,可以方便地在不同章节间跳转和搜索。
同样,你也会在网上找到这些幻灯片,以及最终会上线的讲座视频。这些资源将对全世界的学习者开放。
现在,让我简要说明一下这些不同资源的特点,以及我认为最佳的学习方式。首先,教材是完整的。你可以像阅读传统书籍一样阅读它,逐章阅读。它内容详尽,语言相对严谨,几乎涵盖了所有内容。
幻灯片则是教材的浓缩版,更为简洁。它旨在从较高层面呈现课程的核心思想,但并非包含所有细节和定义。
最后是这些讲座。你可能会问,既然自己能阅读,为什么还要听讲座?讲座比幻灯片更加非正式。在讲座中,我会分享一些故事和背景知识,但它并不像教材那样完整和精确。
这三种资源如何为你所用,这非常个人化,取决于每个人的偏好。有些人喜欢先阅读一章教材,然后看幻灯片,再听讲座;有些人则喜欢先听讲座。实际上,所有这些方法都有效。
这引出了一个非常重要的话题:我们在本书和课程中将要涵盖的材料,不仅非常有趣,而且极其有用。最关键的一点是,这些知识都是“可行动的”。它不仅仅是理论,虽然其中包含优美的理论,但真正酷的地方在于,你可以实际应用它。它使你能够完成各种事情,例如在机器学习中拟合模型、在信号处理中从噪声中提取信号,甚至模拟流行病传播等。
因此,我认为,跟随课程和教材,使用某种计算机语言进行数值练习,这一点至关重要。即使你的兴趣只是学习理论,实践也能极大地帮助你从不同角度理解和巩固所学知识。例如,如果我展示一个恒等式,你不必完全相信我,可以打开计算机程序,分别计算等式的左右两边,看看数值结果是否一致或非常接近。
线性代数不应只是一项“观赏性运动”。你应该投身其中,亲自动手实践。启动你的工具,跟着课程一起操作,这会有很大帮助。我还要补充一点,如果你将来进行暑期实习或类似工作,需要应用这些知识,那么能够坐下来实际动手操作,而不仅仅是了解理论,将变得至关重要。
接下来,让我谈谈编程语言。在斯坦福的课程中,我们使用 Julia。这是一个相对较新的语言,其语法与我们的数学符号非常接近。另一个选择是 MATLAB,这是一个专有软件,需要付费,但也是跟随本课程思想的绝佳选择。最后一个选择是 Python。这是一个有趣的选择,我知道有些基于本书的课程正在使用 Python。这是一个非常好的选择,因为如今大多数人都在使用 Python 来完成你将在本课程中学到的这类任务。从这个意义上说,从你将来在实习、工作或创业中实际会使用的语言开始学习,是合理的。我没有在自己的课程中选择 Python 的唯一原因是,它的语法略显笨拙,与数学符号略有偏差。不过,总的来说,我强烈建议你在学习本课程时,通过做一些数值例子来跟进。
教材本身很少提及或仅偶尔提及计算。它描述了一些计算概念,但没有指定任何特定的计算机语言。书中会有一些练习,要求你通过计算来验证某些结论。此外,你还会在本书的网站上找到一系列“附加练习”。这些练习每年动态更新,与书中的练习不同,它们包含了真实数据的问题。你可以在网站上找到许多数据文件,可以进行金融投资组合构建、断层扫描成像、模型拟合和预测等实践。我认为这是课程的重要组成部分。
好了,我想这个初步介绍就到这里。接下来,我们将直接开始进入正题。


本节课中,我们一起学习了《应用线性代数导论》课程的基本框架和可用资源。我们明确了课程的先决条件要求不高,介绍了教材、幻灯片和讲座三种资源的特点及使用建议。最重要的是,我们强调了本课程知识的“可行动性”,鼓励大家通过编程实践(无论是使用 Julia、MATLAB 还是 Python)来深化理解,将理论转化为解决实际问题的能力。准备好你的工具,让我们开始这段学习之旅吧。


课程 P10:L3.2 - 距离度量 📏

在本节课中,我们将要学习向量之间的距离概念。这个概念直接源于范数的思想,而范数大致可以理解为向量的长度。
距离的定义 📐
上一节我们介绍了范数,本节中我们来看看如何用它来定义距离。
如果我有两个向量,假设它们代表两个位置,那么它们之间的欧几里得距离就是向量差的范数。距离函数可以写作:
公式: distance(A, B) = ||A - B||
例如,点A和点B之间的向量差(B - A)用蓝色箭头表示,其范数就是A与B之间的距离。这与我们在代数课上学到的普通距离概念一致,对于一维、二维和三维空间都是相同的。
有时人们也会看A和B之间的均方根偏差,但这本质上就是距离除以平方根。因此,我们自动得到了距离的概念。
这里的新意在于,我们现在可以讨论100维向量之间的距离。虽然无法直观想象100维空间,但我们可以计算并谈论它。
三角不等式 🔺
现在,我们来看看三角不等式,并解释它名字的由来。
考虑三个位置A、B和C,它们都是向量。三角形的边长定义如下:
- A与B之间的边长是
||A - B|| - B与C之间的边长是
||B - C|| - A与C之间的边长是
||A - C||
我们将应用三角不等式。首先,通过加B减B,我们有 A - C = (A - B) + (B - C)。然后应用范数的三角不等式:和的范数小于等于范数的和。
公式: ||A - C|| = ||(A - B) + (B - C)|| ≤ ||A - B|| + ||B - C||
这个不等式表明,三角形任意一边的长度小于或等于其他两边长度之和。这正是范数三角不等式名称的由来。
特征距离与最近邻 🔍
即使范数是一个简单的概念,我们已经能看到它非常有用。下面介绍最近邻的概念。
如果你有两个特征向量,它们差值的范数(即它们之间的距离)被称为特征距离。这意味着我们可以谈论两个特征向量是“接近”还是“远离”。
回想一下回归分析中的简单例子,第一个分量是房屋面积,第二个是卧室数量。两个“接近”的房子很可能拥有相似的卧室数量和平方英尺数,其特征距离就小。反之,一个一居室的小房子与一个六居室的大房子之间特征距离就大。这是一种非几何意义上的距离概念。
这引出了最近邻的想法。如果我有一个向量列表 Z1, Z2, ..., Zm,以及另一个查询向量 X,那么在这个列表中,与 X 最接近的那个向量就被称为 X 的最近邻。
例如,在下图中,X 与六个 Z 向量在一起,其中 Z3 距离 X 最近,因此 Z3 是 X 的最近邻。

你可能会问这有什么用。实际上,即使在基础的机器学习和数据分析中,这也是一个非常强大的概念。
实例分析:维基百科文章 📚
让我们看一个例子,希望能让你初步了解这个概念的神奇之处。
我们将使用词频直方图作为特征向量。我们选取了五篇维基百科文章,并有一个包含4423个单词的词典。
以下是处理步骤:
- 对于每一篇维基百科文章,我们统计词典中每个单词在文章中出现的次数。
- 这样,每篇文章就对应一个4423维的向量,向量的每个元素代表一个特定单词的出现次数。
接下来,我们计算这五篇文章向量之间的两两距离。

观察这个距离矩阵,我们可以提出一些问题:
- 对角线:任何文章与自身的距离都是0,因为
||向量 - 自身|| = 0。 - 对称性:距离矩阵是对称的,例如“退伍军人节”到“阵亡将士纪念日”的距离与反过来是相同的。
现在,让我们深入分析:
问题一:哪两篇文章最接近?
扫描矩阵,距离最小的配对是“退伍军人节”和“阵亡将士纪念日”(距离0.095)。这合理吗?是的,这两篇文章都是描述假日的,内容上确实密切相关。
问题二:第二接近的配对是哪两个?
是“奥斯卡金像奖”和“金球奖”(距离0.130)。这两者都是关于娱乐奖项的。
问题三:哪两篇文章距离最远?
似乎是“金球奖”和“超级碗”(距离0.192)。它们在主题上确实相差甚远。
这个简单的例子展示了令人惊讶的一点:我们只是粗暴地统计了单词出现次数,完全忽略了文章的语义、句子结构和段落,但计算出的距离却能反映出文章主题的相似性(如两个假日文章相近,两个奖项文章相近)。
概念的应用前景 🚀
我们可以将这个概念扩展到更宏大的场景。例如,不是分析5篇文章,而是分析5000篇。当有一篇新文章时,我们可以询问:“它的最近邻(或前三名最近邻)是哪几篇?”这常用于文档分类、信息检索等。
这个概念的应用前景非常广阔。以下是几个设想:
- 医疗诊断:一位新病人进入急诊室,我们收集他的特征向量(包含症状、检测结果等,可能长达100或1000维)。然后,将这个向量与过去五年所有病人的特征向量数据库进行比较,找出“最近邻”(即病情最相似的过往病例)。医生可以查看这些相似病例的后续发展(例如,某病例在第二天出现了败血症),从而对新病人采取预防性措施(如提前使用抗生素)。
- 金融交易:客户想购买一种特定债券,但市场上没有完全相同的在售。我们可以创建债券的特征向量(包含发行方、利率、期限等信息),然后在所有可交易债券中寻找“相似债券”并推荐给客户。
这些例子表明,仅仅使用特征向量和距离这两个简单的概念,就已经能够催生出许多强大的实际应用。

总结 📝
本节课中我们一起学习了:
- 向量距离:定义为两向量之差的范数
||A - B||。 - 三角不等式:
||A - C|| ≤ ||A - B|| + ||B - C||,它保证了距离度量的合理性。 - 特征距离与最近邻:在高维特征空间中,距离可以衡量样本的相似性,最近邻是与查询样本最相似的样本。
- 实例与应用:通过维基百科文章的词频例子,我们看到了距离度量如何从简单的计数中揭示语义关联,并展望了其在医疗、金融等领域的巨大应用潜力。


距离度量是连接数据与洞察力的基础桥梁,尽管其数学形式简单,却为更复杂的机器学习算法奠定了坚实的基石。


📊 课程 P11:L3.3 - 方差与标准差
在本节课中,我们将学习两个非常重要的统计概念:方差与标准差。它们不仅在统计学中至关重要,也与我们之前讨论的向量概念紧密相关。我们将从向量的角度来理解它们。
📈 向量的平均值
上一节我们介绍了向量的基本运算,本节中我们来看看如何计算一个向量的平均值。
对于一个 n 维向量 X,其平均值是向量中所有元素的算术平均。用公式可以表示为:
平均值 = (1^T * X) / n
其中,1 是一个所有元素都为 1 的 n 维向量,1^T * X 表示向量 X 所有元素的和,再除以元素个数 n,就得到了平均值。
🔄 去中心化向量
理解了平均值后,我们可以引入一个关键概念:去中心化向量。
去中心化向量是指,从原始向量 X 的每一个元素中减去其平均值。我们通常用 X̃ 来表示这个去中心化向量。其计算公式为:
X̃ = X - (平均值 * 1)
由于我们减去了平均值,因此去中心化向量 X̃ 的平均值必然为 0。这个概念是理解标准差的基础。
📏 标准差
现在,我们可以正式定义标准差了。
标准差本质上就是去中心化向量的均方根值。它衡量了向量中各个元素偏离其平均值的“典型”程度。其公式如下:
标准差 = RMS(X̃) = ||X̃|| / √n
将 X̃ 代入,完整的公式为:
标准差 = √[ (1/n) * Σ (Xi - 平均值)² ]
如果标准差的值较小,说明数据点都紧密围绕在平均值周围;如果值较大,则说明数据点分布得比较分散。
🎯 标准差的特性
以下是标准差的一些重要特性:
- 标准差为零:当且仅当向量 X 是一个常数向量(即所有元素都相同)时,其标准差为零。这很直观,因为所有值都等于平均值,没有任何偏离。
- 常用符号:在统计学和应用数学中,平均值常用希腊字母 μ 表示,标准差常用 σ 表示。
- 基本关系式:一个向量的均方根值的平方,等于其平均值的平方加上标准差的平方。即:
RMS(X)² = (平均值)² + (标准差)²
这个公式的推导是练习内积性质的好机会。
💰 在金融中的应用:风险与回报
标准差和平均值在金融领域有非常直接和重要的应用,尤其是在分析投资回报的时间序列数据时。
假设向量 X 代表一项投资在 n 个时间段内的回报率序列。
- 平均值:代表该投资的平均回报率,通常简称为“回报”。投资者自然希望平均回报率越高越好。
- 标准差:代表回报率偏离平均值的波动程度,在金融中被解释为风险。波动越大,风险越高,投资者通常希望风险越低越好。
通过计算不同投资产品的平均回报和标准差,我们可以将它们绘制在一张“风险-回报”图上。理想的投资位于图的左上角(高回报、低风险),而位于右下角(低回报、高风险)的投资则缺乏吸引力,甚至可以被其他投资“支配”。
📊 切比雪夫不等式与标准差
我们之前学过的切比雪夫不等式,也可以用标准差来重新表述,这使其含义更加直观。
对于一个向量 X,其平均值为 μ,标准差为 σ。切比雪夫不等式指出:
偏离平均值超过 k 个标准差的元素比例,不超过 1/k²。
用公式表示即:比例( |Xi - μ| ≥ kσ ) ≤ 1/k²,其中 k > 1。
例如,对于一个平均回报为 8%、标准差为 3% 的投资回报序列,根据该不等式,出现亏损(回报率 ≤ 0%)的时期比例不会超过 (8%/3%)² 的倒数,即大约 14%。这为评估风险提供了一个理论上的上限。


本节课中我们一起学习了方差与标准差的核心概念。我们了解到,标准差是衡量数据波动性的关键指标,它源于去中心化向量的均方根值。通过金融中“风险-回报”分析的实例,我们看到了标准差在实际中的强大应用。最后,切比雪夫不等式为我们理解数据分布与标准差的关系提供了有力的理论工具。


📐 课程 P12:L3.4 - 向量角度
在本节课中,我们将学习如何定义任意维度向量之间的角度。我们将从柯西-施瓦茨不等式入手,推导出三角不等式,并最终利用这些工具来定义和计算向量间的夹角。这个概念不仅适用于二维和三维空间,也适用于像1000维这样的高维空间,非常有趣。
🔗 柯西-施瓦茨不等式与三角不等式
我们从一个重要的不等式开始,它被称为柯西-施瓦茨不等式。该不等式指出,对于任意两个 n 维向量 a 和 b,其内积的绝对值小于或等于它们范数的乘积。
用公式表示如下:
[
|\mathbf{a}^T \mathbf{b}| \leq |\mathbf{a}| \ |\mathbf{b}|
]
如果用分量形式写出,即:
[
\left| \sum_{i=1}^{n} a_i b_i \right| \leq \sqrt{\sum_{i=1}^{n} a_i^2} \ \sqrt{\sum_{i=1}^{n} b_i^2}
]
一旦我们有了柯西-施瓦茨不等式,就可以用它来证明三角不等式。让我们看看这是如何推导的。
向量和的范数平方可以展开计算:
[
|\mathbf{a} + \mathbf{b}|^2 = (\mathbf{a} + \mathbf{b})^T (\mathbf{a} + \mathbf{b}) = |\mathbf{a}|^2 + 2\mathbf{a}^T\mathbf{b} + |\mathbf{b}|^2
]
现在,我们利用柯西-施瓦茨不等式,将中间项 (\mathbf{a}^T\mathbf{b}) 替换为它的上界:
[
|\mathbf{a} + \mathbf{b}|^2 \leq |\mathbf{a}|^2 + 2|\mathbf{a}||\mathbf{b}| + |\mathbf{b}|^2 = (|\mathbf{a}| + |\mathbf{b}|)^2
]
对不等式两边同时取平方根,就得到了三角不等式:
[
|\mathbf{a} + \mathbf{b}| \leq |\mathbf{a}| + |\mathbf{b}|
]
因此,柯西-施瓦茨不等式是推导三角不等式的关键。
📐 向量夹角的定义
上一节我们介绍了柯西-施瓦茨不等式,本节中我们来看看如何用它来定义向量间的夹角。
对于两个非零向量 a 和 b,根据柯西-施瓦茨不等式,比值 (\frac{\mathbf{a}^T \mathbf{b}}{|\mathbf{a}| |\mathbf{b}|}) 的取值范围在 -1 到 1 之间。
这意味着我们可以取这个比值的反余弦值,并将结果定义为向量 a 和 b 之间的夹角 (\theta):
[
\theta = \arccos\left( \frac{\mathbf{a}^T \mathbf{b}}{|\mathbf{a}| |\mathbf{b}|} \right)
]
夹角 (\theta) 的取值范围是 0 到 (\pi) 弧度(或 0 到 180 度)。这个定义与二维和三维几何中的夹角公式完全一致,但它可以推广到任意维度,例如100维的向量。
这个夹角是衡量两个向量方向差异的一种方式。角度越小,表示向量方向越接近;角度越大,表示方向差异越大。
📏 夹角的分类与应用
基于夹角的大小,我们可以对向量关系进行分类。以下是几种常见情况:
- 正交:如果 (\theta = \pi/2)(90度),则 (\mathbf{a}^T \mathbf{b} = 0)。我们称向量 a 与 b 正交,记作 (\mathbf{a} \perp \mathbf{b})。
- 同向:如果 (\theta = 0),则 (\mathbf{a}^T \mathbf{b} = |\mathbf{a}||\mathbf{b}|)。这意味着两个向量方向完全相同。
- 反向:如果 (\theta = \pi)(180度),则 (\mathbf{a}^T \mathbf{b} = -|\mathbf{a}||\mathbf{b}|)。这意味着两个向量方向完全相反。
- 锐角:如果 (0 < \theta < \pi/2),则内积为正。
- 钝角:如果 (\pi/2 < \theta < \pi),则内积为负。
夹角的一个有趣应用是计算球面距离。假设在一个半径为 (R) 的球面上有两点 a 和 b,它们之间的直线距离(穿过球体)是 (|\mathbf{a} - \mathbf{b}|),而沿着球面的最短路径(大圆弧长)则是 (R \theta),其中 (\theta) 是两点与球心连线的夹角(以弧度为单位)。
📄 实例:文档相似度分析
夹角的概念可以用于衡量高维数据的相似性,例如文档。我们可以将文档表示为词频向量(每个维度代表一个词的出现次数),然后计算向量间的夹角来评估文档内容的相似度。
以下是一个分析五个维基百科页面(词频向量维度约4500)的例子,我们计算了每对页面之间的夹角(以度为单位):
| 页面 | 退伍军人节 | 阵亡将士纪念日 | 奥斯卡金像奖 | 金球奖 | 超级碗 |
|---|---|---|---|---|---|
| 退伍军人节 | 0.0° | 29.2° | 67.8° | 69.4° | 87.0° |
| 阵亡将士纪念日 | 29.2° | 0.0° | 69.7° | 71.5° | 87.5° |
| 奥斯卡金像奖 | 67.8° | 69.7° | 0.0° | 24.2° | 86.1° |
| 金球奖 | 69.4° | 71.5° | 24.2° | 0.0° | 86.0° |
| 超级碗 | 87.0° | 87.5° | 86.1° | 86.0° | 0.0° |
观察结果:
- 夹角最小的两对是“奥斯卡金像奖”与“金球奖”(24.2°),以及“退伍军人节”与“阵亡将士纪念日”(29.2°)。这符合直觉,因为它们主题相近。
- 由于词频向量所有分量非负,其内积也非负,因此夹角都在0到90度之间。
- “超级碗”与其他页面的夹角都很大(约86-87度),表明其内容与其他主题差异显著。如果夹角达到90度,则意味着两篇文档没有共同的词汇。
这个例子表明,通过计算高维向量的夹角,我们可以量化并比较文档(或其他特征数据)之间的相似性。
📈 相关系数:去中心化向量的夹角
最后,我们介绍一个与夹角密切相关的概念——相关系数。这在统计学和数据分析中非常常见。
给定两个向量 a 和 b,我们先对它们进行“去中心化”处理,即减去各自的平均值,得到新向量 (\tilde{\mathbf{a}}) 和 (\tilde{\mathbf{b}})。
这两个去中心化向量的相关系数 (\rho) 定义为:
[
\rho = \frac{\tilde{\mathbf{a}}^T \tilde{\mathbf{b}}}{|\tilde{\mathbf{a}}| \ |\tilde{\mathbf{b}}|} = \cos \theta_{\tilde{a}\tilde{b}}
]
其中 (\theta_{\tilde{a}\tilde{b}}) 是去中心化向量间的夹角。因此,相关系数本质上就是去中心化向量夹角的余弦值。
相关系数的含义:
- (\rho \approx 0):向量不相关(去中心化后正交)。
- (\rho \approx 1):高度正相关。当 a 的值高于其均值时,b 的值也倾向于高于其均值。
- (\rho \approx -1):高度负相关。当 a 的值高于其均值时,b 的值倾向于低于其均值。
实际例子:
- 高度正相关:相邻城市(如帕洛阿尔托和门洛帕克)的日降雨量时间序列;同一行业两家相似公司的股票日收益率;同一主题或作者的两篇文档的词频向量。
- 高度负相关:分处南北半球的两个城市(如帕洛阿尔托和墨尔本)的日气温时间序列。
- 近似不相关:两个毫无关系的长时间序列,如波尔多的日最高气温与亚马逊雨林的日降雨量;两段随机录制的音频信号。
🎯 课程总结
在本节课中,我们一起学习了:
- 柯西-施瓦茨不等式:它给出了向量内积与范数之间关系的基本界限。
- 三角不等式:由柯西-施瓦茨不等式推导而来,描述了向量和范数的性质。
- 向量夹角的定义:利用内积和范数,我们将二维/三维空间中的夹角概念推广到了任意高维空间。
- 夹角的分类与应用:包括正交、同向、反向等概念,以及球面距离的计算。
- 文档相似度分析实例:展示了如何用夹角量化高维数据(如文档)的相似性。
- 相关系数:理解了它是去中心化向量夹角的余弦值,用于衡量两个数据序列之间的线性相关程度。


这些工具为我们理解和分析高维向量空间中的数据关系提供了强大的数学基础。


课程 P13:L4.1 - K均值聚类 🎯
在本节课中,我们将学习一种称为“聚类”的数据分析方法。聚类是一种将大量数据点(向量)自动分组的技术,即使我们目前只掌握了向量的基本概念(如范数和距离),也能实现有趣且实用的应用。
概述 📋
聚类分析的目标是,给定一组 N 个向量(记为 x₁ 到 x_N),将它们划分成 K 个不同的组或“簇”。这些组内的向量应该彼此“接近”。我们将通过一个称为 K均值 的经典算法来实现这一目标,该算法仅依赖于向量间距离的计算。
聚类的应用场景 🌍
以下是聚类技术的一些典型应用场景,展示了其广泛的实用性:
- 文档分类:每个向量可以代表一篇文档的词频直方图。通过聚类,可以将主题相似的文档自动归为一类,即使向量本身并不理解文本的语义。
- 患者分群:在医院数据中,每个向量代表一位患者,其分量可以编码年龄、性别、血压、症状、检测结果等多种属性。聚类有助于发现具有相似健康状况的患者群体。
- 客户细分:在市场营销中,每个向量对应一位客户,包含其购买历史、地理位置、年龄等信息。聚类可以将客户划分为不同的群体,以便进行精准营销。
- 图像颜色压缩:在图像处理中,每个像素的 RGB 值(红、绿、蓝强度)构成一个三维向量。通过将所有像素的颜色向量聚类为较少的类别(例如100种颜色),可以用类别编号代替具体的 RGB 值,从而实现高效的图像压缩。
- 金融部门识别:在金融领域,每个向量代表一家公司,其分量可以包括股票回报率、市值、市盈率、所属行业等信息。聚类可以自动发现业务模式相似的公司群体,即“金融板块”。
聚类的数学描述与目标 📐
为了形式化地描述和评估一个聚类结果,我们需要引入一些符号和优化目标。
符号定义
假设我们有 N 个向量。一种描述聚类的方式是定义 K 个集合 G₁, G₂, ..., G_K,每个 G_j 包含了被分配到第 j 个簇的向量的索引。例如,G₁ = {1, 4} 表示第1个和第4个向量属于第一个簇。
另一种等价的描述方式是使用一个长度为 N 的分配向量 c。其中,c_i 的值表示第 i 个向量 x_i 被分配到的簇的编号。例如,若 c₁ = 1, c₄ = 1,则同样表示 x₁ 和 x₄ 属于第一个簇。
此外,我们为每个簇 j 定义一个 代表向量 z_j。它代表了该簇的中心或典型特征。
聚类目标函数
一个好的聚类应该使同一个簇内的向量都离它们的代表向量很近。因此,我们定义以下聚类目标函数 J_clust:
J_clust = (1/N) * Σ_{i=1}^{N} ||x_i - z_{c_i}||²
这个公式计算了所有向量到其所属簇的代表向量的距离平方的均值。我们的目标就是通过选择最佳的簇分配(c_i)和代表向量(z_j),来最小化 J_clust 的值。J_clust 越小,说明聚类效果越好。
K均值算法 🔄
K均值算法是一种通过迭代优化来近似求解上述最小化问题的启发式方法。它的核心思想是交替优化两个子问题。
算法步骤
K均值算法包含两个核心步骤,并交替执行直到结果稳定:
-
分配步骤:固定所有簇的代表向量 z_j。对于每一个数据向量 x_i,将其分配到距离最近的代表向量所在的簇。即,更新 c_i 为:
c_i = argmin_j ||x_i - z_j||
这一步保证了在给定代表向量的情况下,J_clust 最小。 -
更新步骤:固定所有向量的簇分配 c_i。对于每一个簇 j,将其代表向量 z_j 更新为该簇内所有向量的平均值(质心)。即:
z_j = (1/|G_j|) * Σ_{i in G_j} x_i
这一步保证了在给定簇分配的情况下,J_clust 最小。
算法流程与特性
完整的K均值算法流程如下:
- 初始化:随机选择 K 个点作为初始簇代表(或随机分配向量到 K 个簇)。
- 循环:重复执行“分配步骤”和“更新步骤”。
- 终止:当簇的分配不再发生变化时,算法停止。
K均值算法有两个重要特性:
- 目标函数单调下降:每一次迭代(无论是分配还是更新步骤)都会降低或至少不增加 J_clust 的值。
- 收敛性:算法保证会在有限步内停止,因为可能的分配方案是有限的,且目标函数持续下降。
- 局部最优:算法最终会收敛到一个局部最优解,但不一定是全局最优解。最终的聚类结果可能依赖于初始代表向量的选择。
因此,实践中常采用多次运行K均值算法(使用不同的随机初始化),并选取最终 J_clust 值最小的那次结果作为最终聚类方案。
算法演示与收敛过程 📉
让我们通过一个二维数据集的例子,直观感受K均值算法的运行过程。
上一节我们介绍了算法的理论步骤,本节中我们来看看它在实际数据上是如何迭代的。
下图展示了算法从初始状态到最终收敛的迭代过程。初始时,随机选择了三个点作为簇代表(红、蓝、绿色方块),所有数据点根据距离最近的原则被分配颜色(迭代0)。随后,算法开始交替执行更新质心和重新分配的操作。
- 迭代1:计算各颜色点的平均值,得到新的质心位置(方块移动了)。根据新质心重新分配点的颜色,聚类开始形成。
- 后续迭代:随着迭代进行,质心位置和点所属的簇不断被优化调整。
- 最终迭代:当点的簇归属不再变化时,算法停止,我们得到了最终的三个聚类。
同时,我们可以绘制目标函数 J_clust 随迭代次数变化的曲线。通常,这条曲线会快速下降,然后逐渐趋于平缓,直到不再变化,这标志着算法收敛。
总结 🎓
本节课我们一起学习了聚类的基本概念和K均值这一经典聚类算法。
- 我们了解了聚类的目标是将相似的数据点分组,并看到了其在文档、医疗、市场、图像和金融等多个领域的应用。
- 我们定义了形式化的聚类目标函数 J_clust,即最小化所有点到其簇中心的平均距离平方。
- 我们详细讲解了K均值算法,它通过交替执行“分配向量到最近质心”和“更新质心为簇内均值”两个步骤来优化目标函数。
- 我们认识到K均值算法高效、简单,但可能收敛到局部最优解,因此实践中常需要多次随机初始化以获得更好的结果。


尽管K均值算法只依赖于向量距离这一基本概念,但它仍然是数据科学中一个非常强大且广泛使用的工具。


📊 课程 P14:L4.2 - K均值聚类应用
在本节课中,我们将学习K均值聚类算法的实际应用。我们将通过分析两个真实数据集——手写数字图像和维基百科文章——来展示K均值算法如何在不理解数据具体含义的情况下,仅基于向量和距离,发现数据中隐藏的结构和模式。
🖼️ 手写数字图像聚类
上一节我们介绍了K均值算法的基本原理,本节中我们来看看它在图像数据上的应用。我们将使用著名的MNIST数据集,该数据集包含60,000张28x28像素的手写数字灰度图像。每张图像可以表示为一个长度为784的向量,其中每个元素代表一个像素的灰度强度(我们将其归一化到0到1之间,0代表黑色)。
K均值算法对这些数据“一无所知”。它不知道这些向量代表图像,更不知道它们是数字。它仅仅看到一堆介于0和1之间的数字向量。
我们运行K均值算法,将60,000个向量聚类成20个组,并进行了20次不同初始化的尝试以寻找较好的结果。
以下是算法收敛过程的示例(图中展示了其中3次运行):
- 红色曲线代表找到的目标函数值最差的聚类。
- 蓝色曲线代表找到的目标函数值最好的聚类。
- 这直观地表明K均值是一个启发式算法,可能无法找到全局最优解,但通常能找到足够好的近似解。
算法收敛速度很快,大约在25次迭代内完成。
运行结束后,我们得到了20个聚类中心(即代表向量)。每个中心是所有属于该聚类的图像向量的平均值。令人惊讶的是,这些中心向量可视化后,看起来非常像清晰的数字原型。
例如,其中一个聚类中心看起来像数字“0”,另一个像“1”,还有一个像“5”。算法仅仅通过分析像素灰度值的向量,就自发地将不同手写数字的图像大致区分开来。
这个实验的关键启示在于:K均值算法在完全不了解数据背景(如图像、数字概念)的情况下,仅基于向量间的数值距离,就成功发现了数据中存在的自然类别(即不同的数字)。
📚 维基百科文章主题发现
接下来,我们看一个更贴近实际应用的例子:从文档集合中自动发现主题。我们使用了500篇维基百科文章和一个包含约4,400个单词的词典。
我们采用了一种非常简单的“词袋”模型来表示每篇文章:统计词典中每个单词在文章中出现的频率,形成一个长度为4,400的向量(词频直方图)。这个表示方法非常“笨拙”,它完全忽略了单词的顺序、句法、段落结构和语义,仅仅保留了单词的计数信息。
同样,K均值算法对这些向量背后的语言含义毫无概念。我们设定将500篇文章聚类成9个主题。
我们再次运行K均值算法20次,并选择目标函数值最小(即最好)的那次聚类结果。随后,我们得到了9个聚类中心向量,每个向量代表一个“主题”的典型词频分布。
为了理解每个聚类代表什么主题,我们可以查看每个中心向量中数值最高的几个单词(即在该主题文章中最常出现的词)。
以下是其中三个聚类的分析:
聚类一分析
该聚类的中心向量中,权重最高的单词是:
- fight(战斗)
- win(获胜)
- event(事件)
- champion(冠军)
- fighter(斗士)
这些单词显然与“搏击体育”相关。为了验证,我们可以找出距离这个中心最近的几篇原始文章,它们的标题是:“Floyd Mayweather Jr.”, “Kimbo Slice”等,这证实了该主题确实是关于拳击等格斗运动的。
聚类二分析
该聚类的中心向量中,权重最高的单词是:
- holiday(假日)
- celebrate(庆祝)
- festival(节日)
- celebration(庆典)
- calendar(日历)
这些单词与“节日庆祝”相关。最近的文章标题包括:“Halloween”, “Diwali”, “Hanukkah”,验证了这是一个关于节日的主题。
聚类三分析
该聚类的中心向量中,权重最高的单词是:
- United(联合)
- family(家庭)
- party(政党)
- president(总统)
- government(政府)
这些单词暗示了“政治与历史”主题。最近的文章包括关于“Frederick Douglass”, “Fidel Castro”等人物的页面。
我们称这个过程为“主题发现”。K均值算法仅基于词频向量,成功地将维基百科文章分成了我们人类可以理解的、有意义的主题类别,如音乐、体育、电视、电影等。
这个结果令人印象深刻,因为算法在完全不懂英语、无视所有语言结构的情况下,仅仅通过数学计算就揭示了文档集合的潜在主题结构。
此外,这个模型可以用于自动化分类。当有一篇新的维基百科文章时,我们可以计算其词频向量,然后判断它与哪个聚类中心最接近,从而自动将其归入某个已发现的主题中。
💎 课程总结
本节课中我们一起学习了K均值聚类算法的两个经典应用。
首先,我们看到了它在MNIST手写数字数据集上的表现。算法在不理解图像和数字概念的情况下,成功地将不同数字的图像聚类在一起,生成了有代表性的数字原型图像。
其次,我们探索了它在文本主题发现中的应用。通过简单的“词袋”模型将文章表示为词频向量,K均值算法成功地从500篇维基百科文章中自动发现了诸如“体育搏击”、“节日庆祝”、“政治历史”等有意义的主题,展示了仅从简单的数值特征中提取高级见解的强大能力。


这两个案例共同揭示了一个重要主题:在许多机器学习应用中,即使从看似过于简单、丢失了大量信息(如图像的二维结构、语言的语法语义)的数据表示出发,通过像K均值这样的算法,仍然能够获得有意义且有用的结果。


课程 P15:L5.1 - 线性无关 📚

在本节课中,我们将要学习线性代数中一个核心且抽象的概念——线性无关。虽然这个概念目前看起来可能不那么有趣,但好消息是,它将是贯穿本书后续内容的重要基础。随着学习的深入,其重要性会逐渐显现。本节课首先描述线性无关的含义,然后讨论一个密切相关且非常重要的概念——基。
线性相关与线性无关 🔍
首先,我们来定义什么是线性相关。
一个包含 K 个 n 维向量的集合 {a₁, a₂, ..., aₖ} 被称为线性相关,如果存在一组不全为零的系数 β₁, β₂, ..., βₖ,使得以下线性组合等于零向量:
β₁a₁ + β₂a₂ + ... + βₖaₖ = 0
这里的关键是系数不能全为零,即至少有一个 βᵢ ≠ 0。这意味着集合中至少有一个向量可以表示为其他向量的线性组合。在许多应用场景中,这表示该向量是“冗余”的。
在数学表述上,我们应说“这个向量集合是线性相关的”。虽然口语中常说“这些向量线性相关”,但严格来说,集合是单数。
线性相关的例子
以下是线性相关的一些具体例子:
- 单向量集合:仅包含一个向量 a₁ 的集合。它线性相关当且仅当 a₁ 是零向量。因为如果 a₁ = 0,我们可以取 β₁ = 2(或其他非零数),得到 2 * 0 = 0。
- 双向量集合:包含两个向量 a₁ 和 a₂ 的集合。它们线性相关当且仅当其中一个向量是另一个的标量倍数,几何上意味着它们位于同一条直线上。
- 多向量集合:对于两个以上的向量,没有简单的直观判断条件。我们稍后会学习一种算法,用于计算并判断任意向量集合是否线性相关。
例如,考虑以下三个向量:
a₁ = [1; 2; 3], a₂ = [4; 5; 6], a₃ = [7; 8; 9]
可以验证,存在一组非零系数 (1, 2, -3),使得:
1a₁ + 2a₂ + (-3)*a₃ = 0
因此,这个三向量集合是线性相关的。这意味着其中任何一个向量(例如 a₂)都可以表示为其他向量的线性组合:
a₂ = (-1/2)a₁ + (3/2)a₃
在不同的应用领域,线性相关可能有其他名称。例如在金融中,如果现金流向量线性相关,可能被称为“复制”了某项现金流。
线性无关的定义 ✅
如果一个向量集合不是线性相关的,那么它就是线性无关的。这才是我们真正需要的核心概念。
一个向量集合 {a₁, a₂, ..., aₖ} 是线性无关的,当且仅当:使得线性组合 β₁a₁ + β₂a₂ + ... + βₖaₖ = 0 成立的唯一一组系数是 β₁ = β₂ = ... = βₖ = 0。
换句话说,你无法用一组不全为零的系数将这些向量组合成零向量。这也等价于:集合中没有任何一个向量可以表示为其他向量的线性组合。
一个经典的例子是 n 维标准单位向量 e₁, e₂, ..., eₙ 的集合。它们是线性无关的,因为要使它们的线性组合为零向量,每个向量前的系数必须为零。
线性无关的重要性:唯一表示法 🎯
线性无关概念的第一个重要提示是其有用性。假设一个向量 x 是一组线性无关向量 {a₁, a₂, ..., aₖ} 的线性组合:
x = β₁a₁ + β₂a₂ + ... + βₖaₖ
那么,系数 β₁, β₂, ..., βₖ 是唯一的。也就是说,如果 x 有另一种表示法 x = γ₁a₁ + γ₂a₂ + ... + γₖaₖ,那么必然有 β₁ = γ₁, β₂ = γ₂, ..., βₖ = γₖ。
这意味着,原则上我们可以从向量 x 本身推导出这些系数(具体方法后续会学)。证明很简单:将两个表达式相减,得到 (β₁-γ₁)a₁ + ... + (βₖ-γₖ)aₖ = 0。由于向量组线性无关,所有系数差必须为零,即 βᵢ = γᵢ。
基的概念 🏗️
上一节我们看到了线性无关如何带来唯一表示法,这自然引出了“基”这个超级重要的概念。
首先是一个关键定理(有时被称为线性代数基本定理):在 n 维空间中,一组线性无关的向量最多有 n 个。等价地说,任意 n+1 个或更多的 n 维向量必定是线性相关的。这被称为独立维数不等式。
基于此,我们定义基:如果一组 n 个 n 维向量 {a₁, a₂, ..., aₙ} 是线性无关的,那么它被称为空间的一组基。
这意味着:任何 n 维向量 b 都可以被唯一地表示为这组基向量的线性组合:
b = β₁a₁ + β₂a₂ + ... + βₙaₙ
这个表达式被称为向量 b 在基 {a₁, a₂, ..., aₙ} 下的展开。
一个最显然的例子是标准单位向量 e₁, e₂, ..., eₙ,它们构成一组基(称为标准基)。向量 b 在标准基下的展开就是:
b = b₁e₁ + b₂e₂ + ... + bₙeₙ
这看起来平凡,但正是基概念的体现。
正交与标准正交向量 📐
现在,我们来看一类性质特别好的向量——标准正交向量,它们在本书后续内容中也将扮演重要角色。
一组向量 {a₁, a₂, ..., aₖ} 被称为:
- 相互正交:如果其中任意两个不同向量的内积为零,即对于所有 i ≠ j,有 aᵢᵀaⱼ = 0。
- 归一化:如果每个向量的范数(长度)都为 1,即 ||aᵢ|| = 1。
- 标准正交:如果它们同时满足正交和归一化两个条件。
标准正交条件可以用内积简洁地表达:对于集合中的向量,
aᵢᵀaⱼ = 1 (如果 i = j)
aᵢᵀaⱼ = 0 (如果 i ≠ j)
标准正交向量组一定是线性无关的(简单的计算即可证明)。根据独立维数不等式,在 n 维空间中,你不可能有超过 n 个标准正交向量。当恰好有 n 个标准正交的 n 维向量时,它们被称为一组标准正交基。
例子
- 标准单位向量:e₁, e₂, ..., eₙ 就是一组标准正交基。
- 三维空间中的一组标准正交基:例如:
a₁ = [0; 0; -1]
a₂ = [1/√2; 1/√2; 0]
a₃ = [1/√2; -1/√2; 0]
可以验证,它们两两正交,且每个长度均为 1。
标准正交展开式 ✨
最后,我们来看标准正交基的一个美妙性质。假设 {a₁, a₂, ..., aₙ} 是一组标准正交基。那么,对于任何 n 维向量 x,它在基下的展开式具有非常简单的形式:
x = (a₁ᵀx) a₁ + (a₂ᵀx) a₂ + ... + (aₙᵀx) aₙ
这被称为 x 的标准正交展开。系数 βᵢ 正好就是 x 与对应基向量 aᵢ 的内积。
推导很简单:因为 {aᵢ} 是基,所以 x 有展开式 x = Σ βᵢ aᵢ。将等式两边同时与 aⱼ 做内积:
左边:aⱼᵀx
右边:Σ βᵢ (aⱼᵀaᵢ)
由于标准正交性,当 i = j 时,aⱼᵀaᵢ = 1;当 i ≠ j 时,aⱼᵀaᵢ = 0。因此右边只剩下 βⱼ * 1。
所以 aⱼᵀx = βⱼ,即系数 βⱼ 等于内积 aⱼᵀx。


总结 📝
本节课我们一起学习了线性代数的核心基础概念:
- 线性相关/无关:定义了向量集合中是否存在“冗余”信息。
- 唯一表示法:线性无关性保证了向量在给定组下的线性组合系数是唯一的。
- 基:一组能唯一表示空间中所有向量的线性无关向量,是描述空间的“坐标系”。
- 标准正交向量与基:具有内积为零和长度为1的良好性质的向量,其构成的基使得向量的展开系数计算变得极其简单(就是内积)。


虽然这些概念初看可能抽象,但它们构成了后续所有线性代数应用的基石。随着课程深入,你会越来越熟悉并体会到它们的威力。


课程 P16:L5.2 - Gram-Schmidt 正交化 🧮
在本节课中,我们将学习一个非常著名的算法——Gram-Schmidt 正交化算法。该算法以两位数学家 Gram 和 Schmidt 的名字命名。我们将探讨它与线性独立性的关系,并了解其基本工作原理。虽然目前看来它可能有些抽象,但后续课程中我们将看到它在许多实际应用中的巨大价值。
算法概述
Gram-Schmidt 算法的主要目的是检测一组向量是线性相关还是线性独立。它逐个处理向量,最终生成一组正交归一化的向量。如果算法提前终止,则表明输入向量是线性相关的。
算法步骤详解
以下是 Gram-Schmidt 算法的具体步骤。
给定一组向量 a₁, a₂, ..., aₖ,算法将生成一组正交归一化向量 q₁, q₂, ..., qₖ。
初始化:算法开始时,没有已处理的正交向量。
迭代过程:对于第 i 个向量 aᵢ,执行以下操作。
-
正交化:计算中间向量 q̃ᵢ。
q̃ᵢ = aᵢ - (q₁ᵀaᵢ)q₁ - (q₂ᵀaᵢ)q₂ - ... - (qᵢ₋₁ᵀaᵢ)qᵢ₋₁这一步从 aᵢ 中减去其在所有已生成正交向量 q₁ 到 qᵢ₋₁ 方向上的投影,以确保 q̃ᵢ 与它们正交。
-
检查零向量:判断 q̃ᵢ 是否为零向量。
- 如果 q̃ᵢ = 0,则算法终止。这表明 aᵢ 是前面向量 a₁ 到 aᵢ₋₁ 的线性组合,因此原向量组线性相关。
- 如果 q̃ᵢ ≠ 0,则继续下一步。
-
归一化:将 q̃ᵢ 除以其范数,得到单位长度的正交向量 qᵢ。
qᵢ = q̃ᵢ / ||q̃ᵢ||
如果算法处理完所有 k 个向量均未提前终止,则表明原向量组是线性独立的,并且成功生成了一组正交归一化向量 q₁, q₂, ..., qₖ。
算法示例
为了更好地理解,我们通过一个具体例子来演示算法的执行过程。
假设有两个二维向量 a₁ 和 a₂。下图中的灰色圆圈表示所有范数为1的向量(单位圆)。

第一步:处理 a₁
- 由于没有之前的正交向量,所以 q̃₁ = a₁。
- q̃₁ 不为零,因此进行归一化:q₁ = a₁ / ||a₁||。
- 结果 q₁ 是一个位于单位圆上的绿色向量(范数为1)。

第二步:处理 a₂
- 从 a₂ 中减去其在 q₁ 方向上的投影:q̃₂ = a₂ - (q₁ᵀa₂)q₁。图中红色向量即为 q̃₂。
- 可以验证,q̃₂ 与 q₁ 正交。
- q̃₂ 不为零,因此进行归一化:q₂ = q̃₂ / ||q̃₂||。
- 最终得到两个绿色的正交归一化向量 q₁ 和 q₂。

通过这个简单的例子,我们直观地看到了 Gram-Schmidt 算法如何将任意两个向量转化为一组正交归一化的向量。
算法性质分析
上一节我们通过例子直观感受了算法,本节我们来分析它的一些重要数学性质。
正交归一性:算法输出的向量 q₁, q₂, ..., qₖ 是正交归一化的。这是因为在每一步的正交化过程中,我们精确地减去了 aᵢ 在所有先前 q 向量方向上的分量,确保了 q̃ᵢ 与它们正交。随后的归一化步骤保持了正交性,同时将范数变为1。
线性组合关系:
- 如果算法未提前终止,那么每个输入向量 aᵢ 都可以表示为 q₁ 到 qᵢ 的线性组合。具体地:
aᵢ = ||q̃ᵢ|| * qᵢ + Σ_{j=1}^{i-1} (qⱼᵀaᵢ) * qⱼ - 反之,每个输出向量 qᵢ 也是输入向量 a₁ 到 aᵢ 的线性组合(可通过归纳法证明)。
提前终止的意义:如果算法在第 j 步因 q̃ⱼ = 0 而终止,根据上述线性组合关系,这意味着 aⱼ 是 a₁ 到 aⱼ₋₁ 的线性组合。这正是向量组线性相关的定义。
算法复杂度
了解算法的计算成本对于评估其效率很重要。我们来估算一下 Gram-Schmidt 算法的浮点运算次数。
在第 i 次迭代中,需要计算:
- (i-1) 次内积,每次内积约需 2n - 1 次浮点运算。
- 从 aᵢ 中减去 (i-1) 个向量的线性组合,约需 2n(i-1) 次浮点运算。
- 计算 q̃ᵢ 的范数并进行归一化,约需 3n 次浮点运算。
将以上对所有 i 从 1 到 k 求和,并利用公式 Σ_{i=1}^{k} (i-1) = k(k-1)/2,可以得到总运算量的近似表达式。在复杂度分析中,我们通常只保留最高阶项(主导项)。因此,Gram-Schmidt 算法的复杂度约为:
~ 2nk² 次浮点运算
这表明算法的计算量与向量维度 n 成线性关系,但与向量数量 k 的平方成正比。当 k 较大时,计算成本会显著增加。
总结


本节课我们一起学习了 Gram-Schmidt 正交化算法。我们首先了解了该算法的基本目的——判断向量组的线性独立性并生成正交归一化向量。接着,我们逐步剖析了算法的三个核心步骤:正交化、零向量检查和归一化。通过一个二维向量的具体示例,我们直观地观察了算法的执行过程。然后,我们分析了算法输出的正交归一性以及输入输出向量之间的线性组合关系,并解释了算法提前终止与线性相关的联系。最后,我们讨论了算法的计算复杂度,得出其主要与向量数量的平方成正比的结论。虽然目前这个算法看起来有些理论化,但它是后续许多重要应用(如QR分解、最小二乘法等)的基础。


📘 课程 P17:L6.1 - 矩阵标记与表示
在本节课中,我们将开始学习本书的第二部分——矩阵。第一部分我们学习了向量,第三部分将涉及最小二乘法。现在,我们将从矩阵的基本记法和术语开始。
📐 矩阵的基本概念
矩阵是一个写在方括号内的矩形数字阵列。有时人们也会使用圆括号,但方括号是标准记法。矩阵的尺寸由行数乘以列数决定。例如,一个具有三行四列的矩阵被称为 3×4 矩阵。
矩阵内部的数字称为元素、系数或条目。我们通过行索引和列索引来引用它们。在标准数学记法中,索引从 1 开始。如果我们将一个矩阵称为 B,那么 Bij 指的是第 i 行、第 j 列的元素。例如,如果 B23 = -0.1,则表示矩阵 B 中第 2 行第 3 列的元素是 -0.1。
两个矩阵相等的条件是:首先,它们必须具有相同的尺寸;其次,所有对应位置的元素必须相等。
🔲 矩阵的形状分类
对于一个 m × n 的矩阵 A(即 m 行 n 列),我们可以根据其形状进行分类:
- 高矩阵:行数多于列数(m > n)。
- 宽矩阵:列数多于行数(n > m)。
- 方阵:行数与列数相等(m = n)。
向量是矩阵的特殊情况。一个 n 维列向量可以看作一个 n × 1 的矩阵。一个 1 × 1 的矩阵就是一个标量。需要特别注意,列向量(如 [2; -1])和行向量(如 [2, -1])是不同的,在本课程中我们会严格区分这两种记法。
🧩 矩阵的列、行与分块
对于一个 m × n 的矩阵 A,其第 j 列是一个 m 维列向量,记作 aj。其第 i 行是一个 n 维行向量,记作 biT。
我们可以使用冒号记法表示索引范围,例如 p:q 表示从 p 到 q 的整数序列。这可以用来提取子矩阵。
分块矩阵是指由更小的矩阵(子矩阵)组合而成的大矩阵。组合时,水平拼接的子矩阵必须具有相同的行数,垂直堆叠的子矩阵必须具有相同的列数。例如,矩阵 A 可以表示为:
A = [ B C ]
[ D E ]
其中 B 和 C 的行数必须相同,B 和 D 的列数必须相同,依此类推。
一个矩阵可以按列分块写作 A = [a1 a2 ... an],其中每个 aj 是一个列向量。这通常用于存储一系列向量。同样,矩阵也可以按行分块表示。
💡 矩阵的应用实例
矩阵在许多领域都有广泛应用,以下是一些简单例子:
- 图像:一张灰度图像可以表示为一个矩阵,其中每个元素代表一个像素的亮度值。
- 数据表:矩阵 Aij 可以表示第 i 个地点在第 j 天的降雨量。此时,矩阵的一列代表所有地点在某一天的降雨量(一个向量),一行代表某个地点在所有日期的降雨量(一个时间序列)。
- 资产收益:矩阵 Rij 可以表示第 i 个资产在第 j 个交易日的收益率。一列是单个资产的时间序列,一行是所有资产在某个交易日的收益率。
- 特征矩阵:在数据科学中,特征矩阵 X 的每一列 xj 代表一个实体(如客户)的特征向量,Xij 是第 i 个特征在第 j 个实体上的取值。
- 图与关系:一个有向图(关系)可以用邻接矩阵 A 表示。如果存在一条从节点 j 指向节点 i 的边,则 Aij = 1,否则为 0。
⭐ 特殊矩阵
- 零矩阵:所有元素均为 0 的矩阵,记作 0(可能带下标标明尺寸)。
- 单位矩阵:方阵,其主对角线元素均为 1,其余元素为 0,记作 I。例如,2×2 单位矩阵为:
I = [1 0] [0 1] - 稀疏矩阵:大多数元素为零的矩阵(如零矩阵、单位矩阵)。稀疏矩阵可以更高效地存储和计算。
- 对角矩阵:方阵,非对角线元素均为 0,记作 diag(a1, ..., an)。
- 三角矩阵:
- 下三角矩阵:主对角线以上的元素均为 0。
- 上三角矩阵:主对角线以下的元素均为 0。
- 一个矩阵如果同时是上三角和下三角矩阵,那么它就是对角矩阵。
🔄 矩阵基本运算
- 转置:矩阵 A 的转置记作 AT,通过交换行和列得到。
(A<sup>T</sup>)<sup>T</sup> = A。列向量的转置是行向量,反之亦然。 - 加法、减法与标量乘法:对于同尺寸矩阵,加减法对应元素相加减。标量乘法是矩阵每个元素乘以该标量。这些运算满足结合律、交换律和分配律等性质。
- 矩阵范数:用于衡量矩阵的“大小”。我们主要使用 Frobenius 范数,定义为所有元素平方和的平方根:
||A|| = sqrt(Σ<sub>i</sub> Σ<sub>j</sub> A<sub>ij</sub><sup>2</sup>)
当 A 是向量时,这与向量的欧几里得范数一致。基于范数,可以定义两个矩阵之间的距离,例如||A - B||。
📝 总结


本节课我们一起学习了矩阵的基础知识。我们介绍了矩阵的定义、记法、形状分类以及如何将其视为列向量或行向量的集合。我们还探讨了分块矩阵的概念,并列举了矩阵在图像、数据、金融和图论中的多种应用实例。最后,我们学习了零矩阵、单位矩阵、对角矩阵等特殊矩阵,以及矩阵的转置、加法、标量乘法和范数等基本运算。这些概念是后续学习更复杂矩阵运算和应用的基础。

📘 课程 P18:L6.2 - 矩阵向量乘法

在本节课中,我们将要学习矩阵向量乘法。这是一种非常重要的运算,它将贯穿整个课程和教材。我们将从基本定义开始,逐步探讨其多种解释方式,并通过具体例子帮助理解。
概述
矩阵向量乘法是线性代数中的核心运算之一。它涉及一个 m × n 矩阵 A 和一个 n 维向量 x 的乘法,结果是一个 m 维向量 y。其运算规则是:结果向量 y 的第 i 个元素,等于矩阵 A 的第 i 行与向量 x 的内积。
用公式表示如下:
如果 A 是一个 m × n 矩阵,x 是一个 n 维向量,那么 y = A x 是一个 m 维向量,其中:
y_i = a_i1 * x_1 + a_i2 * x_2 + ... + a_in * x_n
基本运算规则
上一节我们介绍了矩阵向量乘法的基本概念。本节中,我们来看看具体的运算规则和维度匹配要求。
进行矩阵向量乘法时,矩阵的列数必须与向量的维度相匹配。即,若 A 是 m × n 矩阵,则 x 必须是 n 维向量,结果 y 将是 m 维向量。
以下是计算步骤:
- 确认矩阵 A 的列数与向量 x 的维度相同。
- 结果向量 y 的每个元素 y_i,通过计算矩阵 A 的第 i 行与向量 x 的点积得到。
让我们通过一个例子来巩固理解。
示例计算
假设我们有一个 2 × 3 的矩阵 A 和一个 3 维向量 x:
A = [ [0, 2, 1],
[1, -1, 0] ]
x = [1, 1, -1]^T
计算 y = A x:
- 结果 y 将是一个 2 维向量。
- y_1 = (0 * 1) + (2 * 1) + (1 * -1) = 0 + 2 - 1 = 1
- y_2 = (1 * 1) + (-1 * 1) + (0 * -1) = 1 - 1 + 0 = 0
因此,y = [1, 0]^T。
行视角解释
理解了基本计算后,我们可以从不同角度来解读矩阵向量乘法。首先,从行的视角来看。
矩阵向量乘法可以看作是依次取矩阵的每一行,与向量 x 做内积。如果我们将矩阵 A 的每一行记为行向量 b_i^T,那么运算可以表示为:
y = [ b_1^T • x, b_2^T • x, ..., b_m^T • x ]^T
其中 • 表示内积运算。
以下是一个重要的特例:
- 当 x 是全1向量(即所有元素都为1)时,A x 的结果就是矩阵 A 的各行元素之和。
例如:
A = [ [0, 1, -1],
[2, 0, 1] ]
1 = [1, 1, 1]^T
A * 1 = [ (0+1-1), (2+0+1) ]^T = [0, 3]^T
结果向量的第一个元素0是第一行的和,第二个元素3是第二行的和。
列视角解释
除了行视角,列视角为我们提供了另一种深刻的理解方式,它关联了我们之前学过的线性组合概念。
矩阵向量乘法 y = A x 也可以解释为:结果向量 y 是矩阵 A 的各列向量的线性组合,组合系数由向量 x 的元素给出。
如果 a_1, a_2, ..., a_n 是矩阵 A 的列向量,那么:
y = x_1 * a_1 + x_2 * a_2 + ... + x_n * a_n
以下是一个关键的例子:
- 用矩阵 A 乘以第 j 个单位向量 e_j(即第 j 个元素为1,其余为0的向量),结果恰好是矩阵 A 的第 j 列。
用公式表示:A * e_j = a_j
让我们验证一下:
A = [ [0, -1, 3],
[1, 0, 2] ]
e_2 = [0, 1, 0]^T
A * e_2 = [ (0*0 + -1*1 + 3*0), (1*0 + 0*1 + 2*0) ]^T = [-1, 0]^T
结果 [-1, 0]^T 正是矩阵 A 的第二列。
与线性独立性的关联
最后,我们来看看矩阵向量乘法如何用简洁的矩阵符号来表达线性独立性这一重要概念。
一组向量线性独立,意味着它们的任何线性组合等于零向量时,所有系数必须为零。用矩阵向量乘法的语言可以紧凑地表述为:
矩阵 A 的列向量是线性独立的,当且仅当方程 A x = 0 的唯一解是 x = 0。
这可以做一个类比:对于数字,如果 a * x = 0 且 a ≠ 0,那么必然有 x = 0。矩阵的线性独立性条件 A x = 0 ⇒ x = 0 在某种意义上类似于“矩阵 A 可以被‘消去’”,这暗示了 A 的列向量之间没有冗余的依赖关系。我们将在后续课程中深入探讨这一思想。
总结


本节课中我们一起学习了矩阵向量乘法。
我们首先学习了其基本定义和计算规则,即用矩阵的每一行与向量做内积。
接着,我们从行视角将其理解为一系列内积运算,从列视角将其理解为列向量的线性组合,并看到了乘以单位向量可以选取特定列的例子。
最后,我们了解了如何用 A x = 0 这一简洁的矩阵方程来刻画列向量的线性独立性。
掌握矩阵向量乘法的这些多种视角,是理解后续更复杂线性代数概念的基础。


课程 P19:L6.3 - 矩阵向量乘法示例 🧮
在本节课中,我们将通过一系列具体的例子来学习矩阵向量乘法。这些例子将帮助我们理解矩阵向量乘法在不同领域(如数据处理、金融、特征评分等)的实际应用,并建立从矩阵形式到其实际功能的双向理解能力。
概述
矩阵向量乘法是线性代数中的核心运算。本节我们将看到,这个看似抽象的运算能简洁地描述许多实际问题,例如计算投资组合收益、对数据进行去均值处理、计算时间序列的连续差值等。理解这些例子,有助于我们将来看到一个新矩阵时,能快速推断其功能。
基础示例
首先,我们来看两个非常基础的例子,它们展示了矩阵向量乘法的边界情况。
-
零矩阵:任何向量与零矩阵相乘,结果都是零向量。
- 公式:
0 * x = 0 - 这里,
0是零矩阵,x是向量,结果0是零向量。
- 公式:
-
单位矩阵:任何向量与单位矩阵相乘,得到向量本身。单位矩阵是一个方阵,其主对角线元素为1,其余元素为0。
- 公式:
I * x = x - 例如,一个4x4的单位矩阵乘以向量
[x1, x2, x3, x4],结果仍然是[x1, x2, x3, x4]。单位矩阵的作用类似于数字1。
- 公式:
内积的矩阵表示
在向量部分的课程中,我们将两个向量 a 和 b 的内积写作 a^T * b。现在我们可以用矩阵向量乘法的视角来理解这个记号。
a^T将一个n维列向量转置为1 x n的行向量。- 这个行向量与
n维列向量b进行矩阵乘法,结果是一个1 x 1的矩阵,我们将其视为一个标量(数字)。 - 因此,内积的记号
a^T * b与矩阵向量乘法的规则完全一致。
应用示例:数据预处理
现在,我们来看一些更有实际意义的例子。第一个例子是关于数据预处理中的“去均值”操作。
去均值矩阵
对一个向量 x 进行去均值操作,意味着计算 x 所有元素的平均值,然后从每个元素中减去这个平均值。这可以通过一个特定的矩阵 A 与 x 相乘来实现。
设 x 是一个 n 维向量。去均值操作 x_tilde = x - avg(x) 等价于 x_tilde = A * x,其中矩阵 A 定义为:
A = I - (1/n) * 11^T
(这里 I 是单位矩阵,1 是全1向量)。
它的作用:矩阵 A 乘以向量 x,会生成一个新的向量,其每个元素都是原向量对应元素减去所有元素的平均值。这个矩阵常被称为“去均值矩阵”。
双向理解:我们应该培养这样的能力:看到一个矩阵(如去均值矩阵),能说出它的功能;反之,听到一个功能(如“去均值”),能构想出对应的矩阵形式。
差分矩阵
另一个常见的矩阵是差分矩阵 D,它非常稀疏(大部分元素为0)。
对于一个 n 维向量 x,(n-1) x n 的差分矩阵 D 定义为:
D = [-1, 1, 0, ..., 0]
[ 0, -1, 1, ..., 0]
...
[ 0, 0, ..., -1, 1]
它的作用:D * x 的结果是一个 (n-1) 维向量,其第 i 个元素是 x_{i+1} - x_i。也就是说,它计算了向量中连续元素之间的差值。
应用场景:如果 x 代表一个时间序列(例如每日降雨量),那么 D*x 就表示每日的变化量。正数表示增加,负数表示减少。这在信号处理、金融分析中非常有用。
狄利克雷能量
基于差分矩阵,我们可以定义一个称为“狄利克雷能量”的量,它是 D*x 的范数平方:
Energy = ||D*x||^2 = sum_{i=2}^{n} (x_i - x_{i-1})^2
它的含义:狄利克雷能量衡量了时间序列 x 的“波动性”或“崎岖程度”。
- 如果
x是常数向量(所有元素相同),能量为0。 - 如果
x剧烈上下波动(如[+10, -10, +10, ...]),能量会很高。
应用示例:金融分析
在金融领域,矩阵向量乘法可以优雅地描述投资组合的收益计算。
- 设定:设
R是一个T x n的资产收益矩阵。- 行(
T)代表连续的时间段(如交易日)。 - 列(
n)代表不同的资产(资产池)。 - 因此,
R_{ij}表示在第i个时间段,资产j的收益率。
- 行(
- 投资组合:用一个
n维向量w表示一个投资组合,其元素w_j代表投资在资产j上的权重。权重之和通常为1(表示100%配置),且允许负权重(代表做空)。 - 组合收益:投资组合在整个时间序列上的收益率向量,可以通过简单的矩阵乘法得到:
portfolio_returns = R * w- 结果是一个
T维向量,第i个元素代表投资组合在第i个时间段的收益率。
- 结果是一个
示例:假设有3个交易日,2种资产,收益矩阵 R 和投资组合权重 w = [0.5, 0.5](等权重投资)。
R = [ 0.02, -0.01 ]
[ 0.03, 0.01 ]
[-0.04, 0.01 ]
R * w = [ (0.02*0.5 + (-0.01)*0.5) ] = [ 0.005 ]
[ (0.03*0.5 + 0.01 *0.5) ] = [ 0.02 ]
[ (-0.04*0.5 + 0.01 *0.5) ] = [ -0.015]
结果向量 [0.005, 0.02, -0.015] 就是该投资组合在这三天的日收益率序列。
进一步分析:得到 portfolio_returns 后,我们可以计算其平均值(组合的平均回报)和标准差(组合的风险),从而对不同投资组合 w 进行评价和比较。
应用示例:特征评分系统
矩阵向量乘法也可用于构建评分系统,例如信用评分。
- 设定:设
X是一个N x n的特征矩阵,用于描述N个个体(如申请人)。- 每一列代表一个个体,是一个
n维特征向量(例如:年收入、负债比、历史违约次数等)。
- 每一列代表一个个体,是一个
- 权重向量:设
w是一个n维权重向量,表示每个特征在总分中的重要程度。 - 评分计算:所有个体的评分可以通过以下运算得到:
scores = X^T * w- 注意维度检查:
X^T是n x N,w是n x 1,结果scores是N x 1。直接写X * w是维度不匹配的,这是需要养成的“语法检查”习惯。 - 实际上,第
i个个体的评分就是其特征向量x_i与权重向量w的内积:score_i = x_i^T * w。
- 注意维度检查:
可解释性:权重 w_j 的大小和正负直接解释了特征 j 的影响。例如,如果“近5年破产记录”是一个取值为0或1的特征,我们预期其对应的权重为很大的负数,因为破产记录会显著降低信用评分。
通用解释:输入-输出系统
矩阵向量乘法可以抽象地理解为一种输入-输出系统或映射。
- 公式:
y = A * x - 解释:
x被视为输入或动作。y被视为输出或结果。- 矩阵
A定义了从输入到输出的映射规则。
- 矩阵元素的意义:
A_{ij}这个数值,表示第j个输入x_j对第i个输出y_i的影响因子。- 如果
A_{ij} = 0,则y_i不依赖于x_j。 - 如果
A_{ij}是大的正数,则x_j增加会显著提高y_i。 - 如果
A_{ij}是大的负数,则x_j增加会显著降低y_i。
- 如果
- 特殊结构:如果矩阵
A是下三角矩阵(即主对角线上方元素全为0),则意味着输出y_i只依赖于输入x_1, x_2, ..., x_i。在时间序列背景下,这体现了因果性——当前的输出只依赖于当前及过去的输入,而不依赖于未来的输入。
计算复杂度分析
最后,我们粗略估算一下矩阵运算的计算成本(以浮点运算次数 FLOPs 衡量)。
- 矩阵存储:
- 稠密矩阵:存储为一个
m x n的数组。 - 稀疏矩阵:通常只存储非零元素的位置和值(例如使用坐标列表)。
- 稠密矩阵:存储为一个
- 基本运算成本:
- 矩阵加法:
C = A + B需要m*n次加法。≈mnFLOPs。 - 标量乘矩阵:
B = α * A需要m*n次乘法。≈mnFLOPs。 - 矩阵转置:
B = A^T理论上需要0次浮点运算,因为它只涉及数据移动。但这不代表没有时间开销。
- 矩阵加法:
- 矩阵向量乘法:
- 稠密矩阵:
y = A * x(A为m x n)。- 计算每个
y_i需要计算一个n维内积,约2n次运算(n次乘,n次加)。 - 总共约
2 * m * nFLOPs。
- 计算每个
- 稀疏矩阵:成本与非零元素数量成正比,远低于
2mn。
- 稠密矩阵:
- 实例估算:
- 假设有一个
1000 x 1000的资产收益矩阵R(1000天,1000种资产)和一个1000维的投资组合权重w。 - 计算
R * w需要约2 * 10^6FLOPs。 - 在一台每秒能进行
10^10FLOPs(100亿次)的笔记本电脑上,此计算大约需要2 * 10^{-4}秒,即 200微秒。 - 这意味着,一秒钟内可以评估超过5000个不同的投资组合。这展示了矩阵运算在现代计算中的高效性。
- 假设有一个
总结


本节课我们一起学习了矩阵向量乘法的多个具体示例。我们从基础的单位矩阵和零矩阵出发,探讨了其在数据去均值、时间序列差分计算中的应用。接着,我们看到了它在金融领域用于计算投资组合收益,在评分系统中用于计算特征加权得分。我们还学习了将矩阵乘法抽象为输入-输出系统的通用解释,并最后分析了其计算复杂度。通过这些例子,我们认识到矩阵向量乘法不仅仅是一个抽象的代数运算,更是一个强大且高效的工具,能够简洁、清晰地描述和解决现实世界中的诸多问题。掌握这些例子,是培养线性代数直觉和应用能力的重要一步。


📘 课程 P2:L1.2 - 向量标记与符号
概述
在本节课中,我们将学习向量的基本概念、符号表示以及一些核心术语。向量是线性代数的基础,理解其表示方法是后续学习的关键。
向量的定义与符号
向量是一个有序的数字列表。在数学中,我们通常使用两种标准符号来表示向量:垂直堆叠的列形式或水平排列的行形式。
例如,一个向量可以表示为:
[
\begin{bmatrix}
1 \
0 \
-7 \
2
\end{bmatrix}
]
或者写作:
[
(1, 0, -7, 2)
]
这两种表示是等价的,都是描述同一个向量的合理方式。
向量的元素与维度
向量中的数字称为元素、条目、系数或分量。例如,在上述向量中,第二个分量是 0,第四个条目是 2。
向量中元素的数量称为其维度或长度。例如,上述向量有 4 个元素,因此它是一个 4 维向量,或简称为 4-向量。
如果向量有 ( n ) 个元素(( n ) 为整数),则称其为 n-向量。
标量与抽象表示
向量中的数字本身是标量,通常是实数(如 -1.1, π, 3.267)。在某些应用中,条目也可能是复数,但本课程主要关注实数。
向量常用抽象符号表示,例如小写字母 ( a )、( x ) 或大写字母 ( P )、( \beta )。在某些领域(如物理学),向量可能用粗体(如 a)或带箭头的符号(如 (\vec{a}))表示,但本课程将使用简单的字母表示。
向量的第 ( i ) 个元素用下标表示,例如 ( a_i )。这里,( i ) 称为索引,通常用 ( i, j, k, l, m ) 表示。索引从 1 开始,到 ( n ) 结束。
例如,如果向量 ( a = (1, 0, -7, 2) ),则 ( a_2 = 0 )。
向量的相等
两个大小相同的向量 ( a ) 和 ( b ) 相等,当且仅当它们所有对应的元素都相同。这是一个重载的概念:等号既用于标量相等,也用于向量相等。
例如:
[
(0, -1) = (0, -1)
]
表示两个向量相等。
数学符号与计算机符号
数学符号是标准且通用的,但计算机语言(如 Python、Julia)可能有不同的语法(例如使用分号或特定函数)。学习时需区分数学符号与编程符号,避免混淆。
块向量与堆叠
块向量是通过堆叠多个向量形成的。例如,给定向量 ( b )(维度 ( m ))、( c )(维度 ( n ))和 ( d )(维度 ( p )),它们的堆叠向量为:
[
\begin{bmatrix}
b \
c \
d
\end{bmatrix}
]
这是一个维度为 ( m + n + p ) 的向量。
例如,设 ( s = (-1, 2) )(2-向量),( t = (0, 1, 2) )(3-向量),则堆叠向量为:
[
\begin{bmatrix}
-1 \
2 \
0 \
1 \
2
\end{bmatrix}
]
这是一个 5-向量。
特殊向量
以下是几种常见的特殊向量:
零向量
零向量是所有元素都为 0 的向量,用符号 ( 0 ) 表示(再次重载)。如需指定维度,可写为 ( 0_n )。例如,( 0_3 = (0, 0, 0) )。
全一向量
全一向量是所有元素都为 1 的向量,用粗体 ( \mathbf{1} ) 表示。例如,( \mathbf{1}_2 = (1, 1) )。
单位向量
单位向量是仅有一个元素为 1、其余为 0 的向量。例如,( e_2 = (0, 1, 0) ) 是一个 3 维单位向量,其中第二个元素为 1。
稀疏向量
如果一个向量的大部分元素为零,则称其为稀疏向量。稀疏性在处理高维数据时非常重要,可以节省存储空间并提高计算效率。
非零元素数量(nnz)用于描述向量的稀疏程度。例如:
- 零向量 ( 0_n ) 的 nnz = 0。
- 单位向量 ( e_{17} )(100 维)的 nnz = 1。


总结
本节课我们一起学习了向量的基本概念:定义、符号表示、元素与维度、相等性、块向量、特殊向量(零向量、全一向量、单位向量)以及稀疏向量。这些是线性代数的基石,后续课程将基于这些概念展开更深入的操作与应用。

📊 课程 P20:L7.1 - 矩阵采样与数据选择
在本节课中,我们将学习矩阵在实际应用中的具体例子,特别是几何变换矩阵和选择器矩阵。我们将了解这些矩阵的形式、含义以及它们如何通过矩阵乘法作用于向量。

🔄 几何变换矩阵
上一节我们介绍了矩阵应用的整体背景,本节中我们来看看几何变换矩阵。许多二维或三维的几何变换可以通过矩阵乘法来表示,其形式为 y = Ax。在这里,矩阵 A 可以被视为执行特定几何变换的操作符。
例如,考虑一个将向量旋转 θ 弧度的映射或变换。假设有一个向量 x,经过旋转后得到向量 y,其长度保持不变,但方向改变了 θ 弧度(在数学正方向上,即逆时针方向)。这个旋转映射可以表示为 y = Ax。
为了得到矩阵 A 的各个元素,一个简单的方法是观察它对单位向量的作用。当 x 等于第一个单位向量 e₁ 时,y 就是矩阵 A 的第一列。将 e₁ 旋转 θ 弧度后,其坐标变为 (cos θ, sin θ),这构成了矩阵的第一列。
同理,要得到第二列,我们观察 A 乘以第二个单位向量 e₂ 的结果。将 e₂ 旋转 θ 弧度后,其坐标变为 (-sin θ, cos θ),这构成了矩阵的第二列。
因此,旋转矩阵 A 的形式如下:
A = [ [cos θ, -sin θ],
[sin θ, cos θ] ]
这种矩阵被称为旋转矩阵,因为它将向量旋转 θ 弧度。这只是众多几何变换中的一个例子,其他例子还包括通过平面的反射等。旋转矩阵在力学、图形学等众多领域有广泛应用。
🎯 选择器矩阵
在了解了用于空间变换的矩阵后,我们接下来看看另一类非常通用的矩阵:选择器矩阵。一个矩阵被称为选择器矩阵,当且仅当它的每一行都恰好有一个元素为 1,其余元素均为 0。换句话说,每一行都是一个转置的单位向量。
以下是一个选择器矩阵的例子:
A = [ [0, 0, 1],
[1, 0, 0],
[0, 0, 1] ]
当我们用这个矩阵乘以一个向量 x = [x₁, x₂, x₃]ᵀ 时,结果 y = Ax 的每个元素都是 x 中某个元素的选取。例如,根据上面的矩阵,y₁ = x₃, y₂ = x₁, y₃ = x₃。因此,矩阵乘法的作用就是从原始向量中选择(并可能重复)特定的元素。
以下是选择器矩阵的一个实际应用示例:
假设有一个矩阵 A,它是一个 m × 2m 的矩阵,其形式如下(每一行都是一个转置的单位向量,但位置间隔出现):
第一行: e₁ᵀ (即 [1, 0, 0, 0, ...])
第二行: e₃ᵀ (即 [0, 0, 1, 0, ...])
第三行: e₅ᵀ (即 [0, 0, 0, 0, 1, ...])
...
当我们用这个矩阵乘以一个长向量 x 时,会发生以下情况:
- 结果向量的第一个分量是 x₁。
- 第二个分量是 x₃。
- 第三个分量是 x₅。
- 依此类推。
如果 x 代表一个时间序列信号,那么这种操作在信号处理中被称为“下采样”(downsampling),即只保留序列中第1、3、5、7……个采样点。类似地,在图像处理中,如果将一个图像表示为一个长向量,那么裁剪图像中某个特定区域的操作,也对应一个选择器矩阵,它只选择代表目标区域像素的那些向量元素。
📝 总结


本节课中我们一起学习了两种重要的应用矩阵:几何变换矩阵和选择器矩阵。我们了解到,旋转矩阵 A = [[cos θ, -sin θ], [sin θ, cos θ]] 可以表示向量的旋转变换。同时,选择器矩阵通过其特殊的结构(每行仅有一个1),实现了从输入向量中选择特定元素的功能,这在信号下采样、图像裁剪等场景中非常实用。理解这些具体矩阵的形式和含义,有助于我们更好地将线性代数知识应用于实际问题。

📊 课程 P21:L7.2 - 关联矩阵

在本节课中,我们将学习一种在众多领域中频繁出现的矩阵——图的关联矩阵。我们将了解其基本定义、结构,并探讨它在描述网络流和节点势能方面的应用。
🧠 关联矩阵的定义
上一节我们介绍了矩阵的基本概念,本节中我们来看看如何用矩阵来描述一个图。
一个图通常由顶点(或称为节点)和连接顶点的有向边(或称为链接、分支)组成。我们考虑一个有 n 个顶点和 m 条边的图。
关联矩阵 A 是一个 n 行 m 列的矩阵,它将图的结构信息编码其中。其定义如下:
- 矩阵的行索引
i对应图中的第i个顶点。 - 矩阵的列索引
j对应图中的第j条边。 - 矩阵元素
A[i][j]的值由边j与顶点i的关系决定:- 如果边
j指向 顶点i,则A[i][j] = +1。 - 如果边
j从 顶点i指出,则A[i][j] = -1。 - 如果边
j与顶点i无关,则A[i][j] = 0。
- 如果边
根据定义,每条边连接且仅连接两个顶点(一个起点,一个终点)。因此,关联矩阵的每一列都恰好包含一个 +1 和一个 -1,其余元素均为 0。
📝 关联矩阵示例
为了更直观地理解,我们来看一个具体的例子。下图展示了一个包含4个顶点和5条边的有向图。

其对应的关联矩阵 A 如下所示:

让我们来解读这个矩阵:
- 列的含义:每一列描述一条边。例如,第一列
[ -1, +1, 0, 0 ]^T对应边1,它从顶点1(-1)出发,指向顶点2(+1)。 - 行的含义:每一行聚焦于一个顶点,描述了与该顶点相关的所有边。例如,第三行
[ 0, 0, +1, -1, -1 ]对应顶点3。其中的+1表示边3指向该顶点(流入),-1表示边4和边5从该顶点指出(流出),0表示边1和边2与该顶点无关。
🌊 关联矩阵与网络流
在理解了关联矩阵的结构后,我们来看看它在描述网络流时的应用。
在许多场景中(如交通、电力、物流网络),图可以表示一个网络,边上的数值 x_j 可以表示流量(如车流、电流、货物流)。我们定义一个流量向量 x,它是一个 m 维向量,x_j 表示边 j 上的流量。通常约定:x_j > 0 表示流量方向与边的方向一致;x_j < 0 则表示流量方向与边的方向相反。
当我们用关联矩阵 A 左乘流量向量 x 时,会发生一件非常有趣的事情:
y = A * x
结果 y 是一个 n 维向量。它的第 i 个分量 y_i 等于流入顶点 i 的总流量减去流出顶点 i 的总流量,即顶点 i 的净流入流量。
例如,在上图的例子中,对于顶点2,计算 y_2:
y_2 = (来自边1的流入 x1) - (从边3的流出 x3) = x1 - x3
⚖️ 流量守恒与环流
基于上述理解,一个非常重要的方程是:
A * x = 0
这个方程被称为流量守恒方程。它意味着对于图中的每一个顶点,流入的总流量等于流出的总流量,净流量为零。在电路理论中,这对应于基尔霍夫电流定律。
满足 A * x = 0 的流量向量 x 被称为一个环流。环流在图中形成闭合的循环。例如,在我们的示例图中,一个可能的环流是:x = [1, 0, 1, 1, 0]^T,它对应着沿路径 2 -> 3 -> 1 -> 2 的循环流动。
🔋 关联矩阵的转置与节点势能
除了描述流量,关联矩阵的转置 A^T 也有重要的物理意义。
现在我们引入一个 n 维向量 v,称为势能向量(或电势向量)。v_i 表示顶点 i 的势能值(如电压、高度、压力)。
当我们用 A^T 左乘势能向量 v 时:
d = A^T * v
结果 d 是一个 m 维向量。它的第 j 个分量 d_j 恰好等于边 j 两端顶点之间的势能差。在电路中,这就是边(元件)两端的电压降。
📏 Dirichlet 能量
与势能相关的一个有趣概念是 Dirichlet 能量,其定义为:
D(v) = || A^T * v ||^2 = Σ_{(i,j)是边} (v_i - v_j)^2
这个公式对所有边求和,计算每条边两端势能差的平方和。
Dirichlet 能量衡量了势能 v 在整个图上的“平滑”或“起伏”程度:
- 当
v是常数向量(所有顶点势能相同)时,D(v) = 0。 D(v)的值越小,说明势能v在图上的变化越平缓;值越大,则说明变化越剧烈。
这个概念在图像处理、机器学习等领域有广泛应用。
🎯 课程总结
本节课中我们一起学习了图的关联矩阵。
我们首先定义了关联矩阵 A,它用 +1、-1 和 0 精确描述了图中顶点与边的关系。接着,我们探讨了它的两种核心应用:
- 描述网络流:
A * x计算了每个节点的净流量,方程A * x = 0对应着流量守恒定律和环流。 - 描述节点势能:
A^T * v计算了每条边上的势能差,由此引出的 Dirichlet 能量|| A^T * v ||^2可以衡量势能在图上的平滑程度。
关联矩阵是连接图论与线性代数的一个强大工具,在电路分析、网络优化、数据科学等众多领域都发挥着基础性作用。






📘 课程 P22:L7.3 - 卷积与矩阵
在本节课中,我们将要学习卷积的概念。卷积是一种在概率论、信号处理等多个领域都会出现的数学运算,理解它非常重要。
📖 卷积的定义
上一节我们介绍了卷积的基本概念,本节中我们来看看它的具体定义。
给定一个 N 维向量 A 和一个 M 维向量 B,它们的卷积(用星号 * 表示)是一个 N+M-1 维的向量 C。向量 C 的每个元素 C_k 由以下公式给出:
C_k = Σ_{i+j=k+1} A_i * B_j
这个公式的含义是:对于 C 的第 k 个元素,我们需要将所有满足 i + j = k + 1 条件的 A_i 和 B_j 相乘,然后将这些乘积相加。
🔍 一个具体例子
为了更好地理解,让我们看一个具体的例子。假设 A 是一个4维向量,B 是一个3维向量。
以下是计算卷积 C = A * B 的步骤:
- C₁ 是 i+j=2 的所有乘积之和,只有 A₁B₁ 一种组合。
- C₂ 是 i+j=3 的所有乘积之和,有 A₁B₂ 和 A₂B₁ 两种组合。
- C₃ 是 i+j=4 的所有乘积之和,有 A₁B₃、A₂B₂ 和 A₃B₁ 三种组合。
- 以此类推,直到计算出所有 N+M-1 个元素。
🧮 卷积与多项式乘法
看到这里,你可能会觉得卷积的规则很复杂。但实际上,卷积有一个非常直观的解释:它就是多项式乘法。
我们可以把向量 A 看作是多项式 P(x) 的系数,把向量 B 看作是多项式 Q(x) 的系数。那么,两个多项式相乘得到的新多项式 R(x) = P(x) * Q(x),其系数向量恰好就是 A 和 B 的卷积结果 C。
这个解释让卷积的许多性质变得显而易见。例如:
- 交换律:
A * B = B * A,因为多项式乘法满足交换律。 - 结合律:
(A * B) * C = A * (B * C),因为多项式乘法满足结合律。 - 零元性质:只有当 A 或 B 为零向量时,卷积结果才为零向量。
🧱 卷积的矩阵表示
上一节我们看到了卷积与多项式乘法的关系,本节中我们来看看如何用矩阵来表示卷积运算。
卷积运算 C = A * B 可以写成矩阵向量乘法的形式:C = T(B) * A。其中,T(B) 是一个特殊的矩阵,称为 托普利茨矩阵。
托普利茨矩阵的特点是:矩阵的每条对角线上的元素都相同。对于一个给定的向量 B,我们可以构造出对应的 T(B) 矩阵,用它乘以向量 A,就能得到卷积结果 C。
🌐 卷积的实际应用
理解了卷积的基本原理后,我们来看看它在现实世界中的两个重要应用场景。
时间序列平滑
在时间序列分析中,卷积常被用来进行平滑处理。例如,如果我们有一个表示每日股价的向量 X,用一个元素均为 1/3 的3维向量 A 与之进行卷积,得到的新序列 Y 就是3日移动平均线。
以下是其效果:
- 每个 Y_k 都是 X 中连续三个值的平均值。
- 这能有效平滑掉数据中的短期波动和噪声,让长期趋势更清晰。
- 在金融、经济学中,5日、20日、200日移动平均线是非常常用的分析工具。
线性时不变系统
在系统理论与信号处理中,卷积是描述线性时不变系统输入输出关系的核心模型。
考虑一个系统,其输入时间序列为 U,输出时间序列为 Y。对于许多物理系统(如电路、机械结构、热传导),其输出可以表示为输入与一个特定向量 H 的卷积:Y = H * U。
以下是相关概念:
- H 被称为系统的冲激响应或卷积核。
- 这个公式表明,系统在当前时刻的输出,是过去多个时刻的输入经过加权(权重由 H 决定)后的叠加。
- 这种模型在控制工程、信号处理、图像处理等领域无处不在。
📝 总结


本节课中我们一起学习了卷积运算。我们从其定义公式出发,通过具体例子理解了计算过程。更重要的是,我们掌握了卷积的核心本质——多项式乘法,这解释了它的交换律和结合律等性质。我们还学习了如何用托普利茨矩阵来表示卷积运算。最后,我们探讨了卷积在两个重要领域的应用:时间序列的平滑处理(如移动平均)和线性时不变系统的建模。卷积是一个连接代数、系统理论和数据处理的关键概念。


📘 课程 P23:L8.1 - 线性函数
在本节课中,我们将学习线性函数的核心概念。线性函数是一种将向量映射到向量的特殊函数,它在数学和许多应用领域中都非常重要。我们将从定义开始,探讨其性质,并通过具体例子来加深理解。
📖 线性函数定义
线性函数是一种映射,它将一个 n 维向量转换为一个 m 维向量。这种映射关系可以表示为 F: Rⁿ → Rᵐ。这意味着函数 F 接受一个 n 维向量作为输入,并输出一个 m 维向量。
我们可以用多种方式表示这个函数。例如,可以将其写为 f(x) = [f₁(x), f₂(x), ..., fₘ(x)],其中每个 fᵢ(x) 都是函数的一个分量。或者,我们也可以明确写出输入向量的各个分量,即 f(x₁, x₂, ..., xₙ)。
🔍 叠加性质
线性函数的核心特征是满足叠加性质。对于任意 n 维向量 x 和 y,以及任意标量 α 和 β,如果函数 F 满足以下等式,则它是线性的:
F(αx + βy) = αF(x) + βF(y)
这个性质表明,先对输入向量进行线性组合再应用函数,与先应用函数再对结果进行线性组合,得到的结果是相同的。换句话说,线性函数与线性组合运算是可交换的。
上一节我们介绍了线性函数的定义,本节中我们来看看如何验证一个函数是否满足叠加性质。我们需要对等式两边进行语法检查,确保所有运算(如标量乘法、向量加法)在维度上都是合法的。
🧮 矩阵向量乘法:典型的线性函数
一个最典型且重要的线性函数是矩阵向量乘法。给定一个 m×n 矩阵 A,我们可以定义一个函数 f(x) = Ax。这个函数将 Rⁿ 映射到 Rᵐ。
我们可以验证它满足叠加性质:
f(αx + βy) = A(αx + βy) = αAx + βAy = αf(x) + βf(y)
事实上,任何线性函数都可以表示为矩阵向量乘法的形式。矩阵 A 的列向量就是函数在标准基向量 e₁, e₂, ..., eₙ 上的输出值,即 A = [f(e₁) f(e₂) ... f(eₙ)]。
这个性质有重要的应用价值。例如,如果我们知道一个映射是线性的,那么只需要通过 n 次实验(对每个基向量应用函数)就能确定整个矩阵 A。之后,对于任意输入向量,我们只需进行矩阵乘法就能得到结果,而无需再次进行实验。
📊 线性函数示例
以下是识别和理解线性函数的一些具体例子。
以下是反转函数的例子。该函数将一个向量 x = [x₁, x₂, ..., xₙ] 的顺序完全颠倒,输出 f(x) = [xₙ, xₙ₋₁, ..., x₁]。这是一个线性函数,其对应的矩阵 A 是一个“反转矩阵”,其第 i 行是第 (n-i+1) 个单位向量。
以下是累加和函数的例子。该函数计算输入向量的累积和,即 f(x) = [x₁, x₁+x₂, x₁+x₂+x₃, ..., Σxᵢ]。这也是一个线性函数,其对应的矩阵 A 是一个下三角矩阵,所有下三角元素均为 1。这个函数在金融分析中很有用,例如,将现金流向量转换为累积现金流向量。
➕ 仿射函数
仿射函数与线性函数密切相关,它是线性函数加上一个常数项。一个函数 F: Rⁿ → Rᵐ 是仿射的,如果它可以写成 F(x) = Ax + b 的形式,其中 A 是一个 m×n 矩阵,b 是一个 m 维向量。
仿射函数满足一个受限的叠加性质:仅当系数 α 和 β 满足 α + β = 1 时,等式 F(αx + βy) = αF(x) + βF(y) 才成立。这种线性组合通常被称为“混合”。
与线性函数类似,任何仿射函数都可以通过计算 F(0) 和 F(e₁), F(e₂), ..., F(eₙ) 来唯一确定矩阵 A 和向量 b。需要注意的是,在日常用语中,人们有时会不严格地将仿射函数也称为“线性”函数。
🎯 课程总结


本节课中我们一起学习了线性函数的核心内容。我们首先定义了从 Rⁿ 到 Rᵐ 的线性函数,并深入探讨了其关键的叠加性质。我们了解到,矩阵向量乘法是线性函数的典型代表,并且任何线性函数都可以用矩阵来表示。通过反转函数和累加和函数的例子,我们练习了如何识别和用矩阵描述线性函数。最后,我们介绍了仿射函数作为线性函数的推广,它是线性函数加上一个常数偏移。掌握这些概念是理解更复杂线性代数主题的基础。

📘 课程 P24:L8.2 - 线性函数模型
在本节课中,我们将学习线性函数模型。线性模型是许多应用领域的基础,它们用于近似描述输入向量与输出向量之间的关系。我们将探讨线性模型在不同场景下的应用,包括经济学、微积分以及统计学中的回归模型。

📈 线性模型的应用场景
在许多应用中,输入向量与输出向量之间的关系通常可以近似为线性关系。这种近似有时非常精确,有时则适用于特定范围。
- 在某些领域,如电磁学或声学,线性近似可以达到极高的精度。
- 在飞机动力学中,对于常规飞行范围内的速度和角度变化,力和力矩的关系可以很好地用线性模型近似。
- 在计量经济学模型中,线性近似可能误差较大,但仍然非常有用,例如能预测变化方向(正负号)就具有价值。
🛒 示例一:经济学中的价格需求弹性模型
上一节我们介绍了线性模型的普遍性,本节中我们来看看一个具体的经济学例子。
我们假设市场中有 n 种商品或服务。商品的市场价格构成一个 n 维向量 p,需求量构成另一个 n 维向量 d。
我们关注价格和需求的相对变化。对于第 i 种商品,其价格相对变化 δp_i 定义为:
δp_i = (p_i_new - p_i) / p_i
这表示价格的百分比变化(例如,+0.1 表示价格上涨 10%)。
同样,需求的相对变化 δd_i 定义为:
δd_i = (d_i_new - d_i) / d_i
价格与需求之间的关系由一个称为弹性矩阵 E 的 n×n 矩阵来描述。模型公式为:
δd = E * δp
这个矩阵的每个元素都具有明确的经济学解释:
以下是弹性矩阵 E 中元素的含义:
E_11 = -0.3:如果商品1的价格上涨1%,则商品1的需求预计下降0.3%。这反映了商品自身的价格弹性。E_12 = +0.1:如果商品2的价格上涨1%,则商品1的需求预计上升0.1%。这表明商品1和商品2是替代品。E_23 = -0.05:如果商品3的价格上涨1%,则商品2的需求预计下降0.05%。这表明商品2和商品3是互补品。
这个线性模型对于小的价格变化预测效果很好,被广泛用于分析定价策略对需求的影响,进而评估利润和供应链规划。
∫ 示例二:微积分中的一阶泰勒近似
线性模型的另一个重要来源是微积分。对于可微函数,一阶泰勒展开提供了在局部最佳的线性近似。
假设有一个可微函数 f: R^n → R^m。在点 z 附近,函数 f 的一阶泰勒近似 f̂ 可以表示为:
f̂(x) = f(z) + Df(z) * (x - z)
其中:
Df(z)是一个m×n矩阵,称为在点z处的导数矩阵或雅可比矩阵。- 其第
i行是第i个分量函数f_i在点z处的梯度向量的转置。 - 矩阵的第
(i, j)个元素是偏导数∂f_i / ∂x_j在点z处的值。
我们可以将这个近似写成标准仿射函数的形式:
f̂(x) = (Df(z)) * x + (f(z) - Df(z)*z)
这里,A = Df(z),b = f(z) - Df(z)*z。因此,一阶泰勒展开是产生仿射函数的一个通用方法。
📊 示例三:统计学与机器学习中的回归模型
最后,我们来看线性模型在统计学和机器学习预测中的核心应用——回归模型。
基本的线性回归模型形式如下:
ŷ = x^T * β + v
其中:
x是一个n维向量,代表特征或回归变量。β是一个n维向量,代表模型参数(权重)。v是一个标量,代表偏移参数(截距)。ŷ是预测的标量输出,旨在近似真实观测值y。
当我们拥有一个包含 N 个样本的数据集时,情况如下:
- 我们有特征向量
x_1, ..., x_N。 - 以及对应的真实响应值
y_1, ..., y_N。
对于每个样本,我们可以计算其预测值:
ŷ_i = x_i^T * β + v
为了进行整体分析,我们可以将数据堆叠成矩阵和向量形式:
- 定义真实响应向量
y_data = (y_1, ..., y_N)。 - 定义特征矩阵
X,其第i列是特征向量x_i(注意:有些领域习惯将x_i作为行向量,此时矩阵为X^T,原理相同)。 - 则所有样本的预测向量可以简洁地表示为:
ŷ_data = X^T * β + v * 1
其中1是一个所有元素为1的N维向量。
预测误差向量定义为:
e = y_data - ŷ_data
误差的均方根值(RMS)可以用来衡量模型在整个数据集上的预测精度。例如,RMS误差为0.1意味着模型的预测平均来看偏差约为±0.1。
请注意:本节课我们主要关注如何解释和理解一个给定的回归模型。如何从数据中拟合出最优的参数
β和v(即“训练模型”),将是本课程后续章节的重点内容。
📝 总结
本节课中我们一起学习了线性函数模型及其在多个领域的应用:
- 在经济学中,我们使用弹性矩阵
E构建了δd = E * δp模型,来分析价格变动对需求的线性影响。 - 在微积分中,函数的一阶泰勒展开
f̂(x) = f(z) + Df(z)*(x-z)提供了在局部最有效的线性近似。 - 在统计学和机器学习中,线性回归模型
ŷ = x^T * β + v是进行预测的基础工具,我们可以将数据集堆叠后用矩阵向量形式ŷ_data = X^T * β + v * 1统一表示。


这些线性模型虽然简单,但因其可解释性强、数学处理方便,成为理解和分析复杂系统关系的重要起点。


📘 课程 P25:L8.3 - 线性方程组

在本节课中,我们将要学习线性方程组,或者更准确地说,是线性方程组系统。我们将看到,使用矩阵和向量符号可以非常方便地表示这些系统。
概述
线性方程组是数学和许多应用科学中的基础概念。它涉及多个线性方程,每个方程包含多个变量。通过矩阵表示法,我们可以将复杂的方程组简化为一个紧凑的形式,从而更容易进行分析和求解。
线性方程组的矩阵表示

一个线性方程组包含 M 个方程和 n 个变量。变量通常记为 x₁, x₂, ..., xₙ。每个方程的形式如下:
A₁₁x₁ + A₁₂x₂ + ... + A₁ₙxₙ = b₁
这里,Aᵢⱼ 是系数,bᵢ 是常数项。
如果我们把所有变量 x₁ 到 xₙ 收集成一个向量 x,这个向量被称为方程组的未知数向量或变量向量。
系数 Aᵢⱼ 可以排列成一个 M × n 的矩阵 A,这个矩阵被称为方程组的系数矩阵。
同样地,常数项 b₁ 到 bₘ 可以收集成一个向量 b,这个向量传统上被称为右侧向量。
于是,整个线性方程组可以非常简洁地用矩阵向量形式表示为:
A x = b
这个表示法非常强大。例如,一个包含 5000 个变量和 3000 个方程的庞大系统,也可以用这四个字符 A x = b 来概括。这与单个标量方程 a x = b 在形式上相似,但求解方法完全不同。标量方程的解是 x = b / a,而矩阵方程的解则需要更复杂的方法,我们将在课程后续部分学习。
线性方程组的分类
根据系数矩阵 A 的维度,我们可以对线性方程组进行分类:
以下是三种主要类型:
- 欠定系统:当
M < n时,即方程数量少于变量数量。系数矩阵 A 是一个“宽”矩阵(列数多于行数)。 - 方阵系统:当
M = n时,即方程数量等于变量数量。系数矩阵 A 是一个方阵。 - 超定系统:当
M > n时,即方程数量多于变量数量。系数矩阵 A 是一个“高”矩阵(行数多于列数)。
这些名称的含义在后续学习中会变得更加清晰。
解的概念
一个向量 x 如果满足 A x = b,即它同时满足所有 M 个方程,那么它就被称为该线性方程组的解。
根据系数矩阵 A 和右侧向量 b 的不同,一个线性方程组可能有零个解、恰好一个解,或者无穷多个解。在本课程结束时,我们将能够完整地分析这些情况,更重要的是,我们将学会如何实际计算解(尤其是在解唯一的情况下)。
应用实例:配平化学方程式
为了展示线性方程组在实际问题中的应用,我们来看一个来自化学的例子:配平化学方程式。
一个化学反应涉及 P 种反应物和 Q 种生成物。化学反应式通常写作:
a₁R₁ + ... + aₚRₚ → b₁P₁ + ... + b_qP_q
这表示消耗 a₁ 个单位分子 R₁,...,aₚ 个单位分子 Rₚ,生成 b₁ 个单位分子 P₁,...,b_q 个单位分子 P_q。系数 aᵢ 和 bⱼ 通常是正整数。
化学反应必须遵循质量守恒定律,即每种原子在反应前后的总数必须相等。这就是“配平”方程式的含义。
建立数学模型
假设反应涉及 M 种原子。
我们定义一个 M × P 的反应物矩阵 R,其中 Rᵢⱼ 表示在第 j 种反应物分子中,第 i 种原子的数量。
定义反应物系数向量 a = [a₁, ..., aₚ]ᵀ。
那么,R a 的结果是一个 M 维向量,其第 i 个分量表示所有反应物中第 i 种原子的总数。
类似地,我们定义一个 M × Q 的生成物矩阵 P,以及生成物系数向量 b = [b₁, ..., b_q]ᵀ。
那么,P b 表示所有生成物中各种原子的总数。
质量守恒定律要求:R a = P b
为了将其转化为标准的线性方程组形式 A x = b(注意此处的 b 是常数项向量,与生成物系数向量 b 不同),我们进行如下操作:
- 将守恒式改写为:R a - P b = 0
- 使用分块矩阵将其表示为:
[R | -P] * [a; b] = 0
这里[a; b]表示将向量 a 和 b 上下堆叠成一个长向量,[R | -P]表示将矩阵 R 和-P左右拼接。 - 然而,a = 0, b = 0 总是上述方程的一个解(即不进行任何反应),但这没有意义。为了找到一个非零解,我们需要额外设定一个条件。通常,我们可以指定第一种反应物的系数
a₁ = 1。 - 将条件
a₁ = 1也写成一个方程:e₁ᵀ a = 1,其中 e₁ 是第一个元素为1,其余为0的单位向量。 - 最终,我们将质量守恒方程和这个附加方程组合起来,得到一个
(M+1)个方程、(P+Q)个变量的线性方程组:
[[R, -P]; [e₁ᵀ, 0ᵀ]] * [a; b] = [0; 1]
这就是标准的 A x = b 形式。
具体例子:水的电解
水的电解反应为:? H₂O → ? H₂ + ? O₂
我们需要找到系数 x, y, z 使得:x H₂O → y H₂ + z O₂
设原子种类为氢(H)和氧(O),则:
- 反应物矩阵 R (H₂O): H原子数=2, O原子数=1。所以 R =
[2, 1]ᵀ(这里P=1)。 - 生成物矩阵 P (H₂, O₂): 对于H₂: H=2, O=0;对于O₂: H=0, O=2。所以 P =
[[2, 0], [1, 2]]。 - 设 a =
[x], b =[y; z]。 - 质量守恒:R a = P b ->
[2; 1] * x = [[2, 0]; [1, 2]] * [y; z] - 展开得方程组:
- 对于H原子:
2x = 2y + 0z->2x = 2y - 对于O原子:
1x = 0y + 2z->x = 2z
- 对于H原子:
- 我们还需要设定一个系数,令
x = 1(即1份水分子)。 - 代入方程:由
2*1 = 2y得y=1;由1 = 2z得z=0.5。 - 为了得到整数系数,将所有系数乘以2:
x=2, y=2, z=1。 - 因此,配平后的方程式为:2 H₂O → 2 H₂ + O₂
更复杂的例子

考虑一个更复杂的氧化还原反应(如图):
? Cr₂O₇²⁻ + ? Fe²⁺ + ? H⁺ → ? Cr³⁺ + ? Fe³⁺ + ? H₂O
这里涉及铬(Cr)、氧(O)、铁(Fe)、氢(H)四种原子以及电荷。我们可以按照上述通用方法,构建一个6×6的线性方程组(5种原子/电荷 + 1个设定条件)。求解该方程组(我们将在后续课程中学到方法),即可得到配平的系数:1, 6, 14, 2, 6, 7。
因此,配平后的方程式为:
Cr₂O₇²⁻ + 6Fe²⁺ + 14H⁺ → 2Cr³⁺ + 6Fe³⁺ + 7H₂O

总结


本节课我们一起学习了线性方程组的基本概念。我们首先介绍了如何用矩阵向量形式 A x = b 来简洁地表示一个线性方程组系统。接着,我们根据方程与变量数量的关系,将系统分为欠定、方阵和超定三类。然后,我们探讨了“解”的定义以及解可能存在的不同情况(无解、唯一解、无穷多解)。最后,我们通过“配平化学方程式”这一具体应用实例,详细展示了如何将一个实际问题建模并转化为线性方程组 A x = b 的形式。这个例子充分说明了线性方程组在化学、物理、工程、经济学等众多领域的广泛应用。在接下来的课程中,我们将重点学习如何求解这些方程组。


课程 P26:L9 - 动态系统 🚀
在本节课中,我们将学习线性动态系统。这是一个在许多领域都有广泛应用的重要概念,其核心本质仅涉及我们已经掌握的矩阵向量乘法。
什么是线性动态系统?
上一节我们介绍了课程主题,本节中我们来看看线性动态系统的具体定义。
我们有一个由 n 维向量组成的序列,记作 x₁, x₂, x₃, ...。下标 t 通常表示时间或周期,例如天、小时或金融中的交易日。xₜ 被称为在时间 t 的状态,整个序列被称为状态轨迹。
如果 t 表示当前时间,那么:
- xₜ 是当前状态。
- xₜ₋₁ 是前一个状态。
- xₜ₊₁ 是下一个状态。
状态 xₜ 可以代表许多事物,例如人口年龄分布、经济产出或机械系统中的位置和速度。
线性动态系统遵循一种特殊形式,它表示下一个状态是通过当前状态乘以一个矩阵得到的:
xₜ₊₁ = Aₜ xₜ
其中 Aₜ 是一个 n×n 矩阵,通常称为动态矩阵或更新矩阵。其元素 Aₜᵢⱼ 表示当前状态的第 j 个分量对下一个状态第 i 个分量的影响程度。
在许多情况下,矩阵 A 不随时间变化,此时系统被称为线性时不变动态系统。其公式简化为:
xₜ₊₁ = A xₜ
这可以解释为一种递归关系。通过反复进行矩阵向量乘法,我们可以模拟系统状态的未来演化。
以下是动态系统的一些常见变体:
- 带输入和偏移的系统:公式为 xₜ₊₁ = Aₜ xₜ + Bₜ uₜ + cₜ。其中 uₜ 是输入(如控制信号),Bₜ 是输入矩阵,cₜ 是偏移量。
- K阶马尔可夫模型:公式为 xₜ₊₁ = A₁ xₜ + A₂ xₜ₋₁ + ... + Aₖ xₜ₋ₖ₊₁。这表明下一个状态依赖于当前及之前多个时刻的状态,K 被称为系统的记忆长度。
状态的定义是:它是过去信息的摘要,足以预测未来。在基本线性动态系统中,xₜ 本身就是状态。在 K 阶马尔可夫模型中,状态是 xₜ, xₜ₋₁, ..., xₜ₋ₖ₊₁ 的集合。
实例一:人口动态学 👥
了解了基本概念后,我们来看一个实际应用:人口动态学模型。这是一个简化但能揭示核心思想的例子。
我们设定时间 t 以年为单位。状态 xₜ 是一个 100 维向量,代表一个国家的人口年龄分布:
xₜ = (xₜ₁, xₜ₂, ..., xₜ₁₀₀)ᵀ
其中 xₜᵢ 表示在第 t 年,年龄为 i-1 岁的人口数量(i=1 对应 0 岁,i=100 对应 99 岁)。为简化,假设无人能活过 99 岁。
要计算总人口,可使用向量内积:1ᵀ xₜ。要计算特定年龄区间(如 70 岁及以上)的人口,可构造一个选择向量 c(前 70 个元素为 0,后 30 个元素为 1),然后计算 cᵀ xₜ。
我们需要找到动态矩阵 A,使得 xₜ₊₁ = A xₜ。这需要定义出生率和死亡率。
- 出生率向量 b:bᵢ 表示一个 i-1 岁个体在一年内平均生育的子女数。
- 死亡率向量 d:dᵢ 表示 i-1 岁个体在一年内死亡的比例(d₁₀₀ = 1)。
根据这些定义,可以推导出矩阵 A:
- 下一年 0 岁人口数 = 本年度总出生数 = bᵀ xₜ。因此,A 的第一行就是 bᵀ。
- 下一年 i 岁人口数(i=1,...,99) = 本年度 i-1 岁人口数 × (1 - 死亡率 dᵢ)。因此,A 的第 i+1 行在第 i 列有一个元素 (1-dᵢ),其余为 0。
由此得到的矩阵 A 非常稀疏(100×100 中仅 199 个非零元),它被称为伴随矩阵。每一行代表如何计算下一年特定年龄的人数,每一列代表当前特定年龄群体对下一年的贡献(顶部是生育贡献,下方是存活贡献)。
假设 A 是时不变的,并给定 2010 年(t=1)的初始人口分布 x₁,我们可以通过迭代计算 x₂ = A x₁, x₃ = A x₂, ... 来模拟未来年份的人口分布,例如预测 2020 年的情况。这种模型可用于规划学校、养老设施等。
实例二:流行病动力学 🦠
现在,我们来看另一个例子:流行病动力学。当前背景下,这是一个非常相关的话题。
我们介绍一个高度简化的 SIR 模型。状态 xₜ 是一个 4 维向量,表示在时间 t(例如每天),人群中处于不同健康状态的比例:
xₜ = [ susceptibleₜ, infectedₜ, recoveredₜ, deceasedₜ ]ᵀ
- 易感者:可能感染疾病。
- 感染者:当前患有疾病。
- 康复者:曾感染且现已免疫。
- 死亡者:因疾病去世。
我们需要定义每天人群状态转移的概率。假设一个简化的每日转移规则:
- 易感者:5% 被感染,95% 保持易感。
- 感染者:1% 死亡,10% 康复并获得免疫,4% 康复但不获得免疫(重新变为易感者),85% 保持感染状态。
- 康复者(免疫):100% 保持免疫(假设免疫永久)。
- 死亡者:100% 保持死亡状态。
根据这些规则,我们可以构建一个 4×4 的动态矩阵 A,使得 xₜ₊₁ = A xₜ。矩阵 A 的每个元素 Aᵢⱼ 表示当前处于状态 j 的人,在下一天转移到状态 i 的比例。
例如:
- A₁₁ = 0.95:今天易感者,明天仍易感的比例。
- A₁₂ = 0.04:今天感染者,明天变为易感者的比例(康复但无免疫)。
- A₄₂ = 0.01:今天感染者,明天死亡的比例。
通过仔细审核矩阵的每个元素,可以确保它准确反映了我们定义的转移规则。
假设初始时刻所有人都是易感者:x₁ = [1, 0, 0, 0]ᵀ。通过迭代计算 xₜ₊₁ = A xₜ,我们可以模拟疫情的演变。
模拟结果可能显示:感染人数迅速上升,达到峰值(如占人群的 20%),然后由于部分人口死亡或获得免疫(群体免疫效应),感染人数开始下降。康复者(免疫)的比例会逐渐增加。这个简单模型展示了如何用线性动态系统来分析和预测疫情的发展趋势。


本节课中我们一起学习了线性动态系统的基本概念。我们了解到,它通过状态向量和动态矩阵来描述系统随时间的变化,核心运算是矩阵向量乘法。我们探讨了人口动态学和流行病动力学两个实例,看到了如何将实际问题建模为 xₜ₊₁ = A xₜ 的形式,并通过迭代乘法来模拟系统的未来状态。这种框架是控制理论、经济学、生态学等众多领域的基础。

课程 P27:L10.1 - 矩阵乘法 🧮

在本节课中,我们将学习矩阵乘法的定义、性质、多种解释以及其计算复杂度。矩阵乘法是线性代数中的核心运算,它将两个矩阵组合成一个新的矩阵。
矩阵乘法的定义
上一节我们介绍了矩阵与向量的乘法,本节中我们来看看两个矩阵之间如何相乘。
如果有一个 M × P 的矩阵 A 和一个 P × N 的矩阵 B,并且矩阵 A 的列数 P 等于矩阵 B 的行数 P,那么我们可以将 A 和 B 相乘,得到一个新的 M × N 矩阵 C,记作 C = AB。
矩阵 C 的第 i 行第 j 列元素 C_ij 的计算公式如下:
C_ij = Σ (A_ik * B_kj),其中 k 从 1 求和到 P。
简单来说,要得到 C 的第 (i, j) 个元素,需要取 A 的第 i 行和 B 的第 j 列,计算它们对应元素的乘积之和(即内积)。
矩阵乘法示例
以下是计算矩阵乘积的步骤说明。
首先,进行语法检查:确保第一个矩阵的列数等于第二个矩阵的行数。例如,一个 2×3 的矩阵 A 可以乘以一个 3×2 的矩阵 B,因为中间维度 3 匹配。结果 C 将是一个 2×2 的矩阵。
让我们计算一个具体例子。假设:
A = [[-1, 3, 2], [1, -1, 0]]
B = [[5, -1], [0, -2], [1, 0]]
计算 C_11(结果矩阵第一行第一列):
取 A 的第一行 [-1, 3, 2] 和 B 的第一列 [5, 0, 1],计算内积:(-1)5 + 30 + 2*1 = -5 + 0 + 2 = -3。
计算 C_22(结果矩阵第二行第二列):
取 A 的第二行 [1, -1, 0] 和 B 的第二列 [-1, -2, 0],计算内积:1(-1) + (-1)(-2) + 0*0 = -1 + 2 + 0 = 1。
按照此规则可以计算出结果矩阵的所有元素。
作为特例的其他乘法
矩阵乘法是更一般的运算,我们之前学过的几种乘法都可以看作是它的特例。
- 标量乘法:标量 α 乘以向量 x。虽然从维度上看不是标准的矩阵乘法(因为 α 是 1×1,x 是 n×1),但如果写成 xα(向量在右),则符合矩阵乘法规则。不过,传统上我们总是将标量写在左边。
- 内积:两个 n 维向量 a 和 b 的内积 a^T b。这里 a^T 是 1×n 的行向量,b 是 n×1 的列向量,相乘得到一个 1×1 的矩阵(即标量)。
- 矩阵向量乘法:矩阵 A (m×n) 乘以向量 x (n×1),得到向量 b (m×1)。这可以看作是矩阵乘法 Ax 的特例。
- 外积:两个向量 a (m×1) 和 b (n×1) 的外积是 a b^T。这里 a 是 m×1,b^T 是 1×n,相乘得到一个 m×n 的矩阵,其元素是 a_i * b_j。
矩阵乘法的性质
了解矩阵乘法的性质对于正确操作矩阵至关重要。以下是其主要性质(假设所有乘法和加法在维度上都合法):
- 结合律:(AB)C = A(BC)。这意味着多个矩阵相乘时,乘法的结合顺序不影响结果,我们可以直接写作 ABC。
- 分配律:A(B + C) = AB + AC。注意,这里的 B 和 C 必须维度相同才能相加。
- 转置性质:(AB)^T = B^T AT**。乘积的转置等于各自转置后以相反顺序相乘。**切记:(AB)T ≠ A^T B^T,后者通常维度不匹配且结果错误。
- 单位矩阵:AI = A 且 IA = A。其中 I 是适当维度的单位矩阵(左乘和右乘的 I 维度可能不同)。
- 不可交换性:这是最关键的一点。一般情况下,AB ≠ BA。即使两个乘积都有定义,结果也通常不同。只有当两个矩阵可交换时,等式才成立(例如,任意矩阵与同阶单位矩阵相乘)。
分块矩阵乘法
矩阵乘法可以按分块进行,这有时能简化计算或揭示结构。
假设我们将矩阵 A 和 B 分块为 2×2 的分块矩阵:
A = [[A, B], [C, D]], B = [[E, F], [G, H]]
那么它们的乘积 AB 可以按照类似标量矩阵的规则计算,但注意块之间的乘法顺序不可交换:
AB = [[AE+BG, AF+BH], [CE+DG, CF+DH]]
这要求所有涉及的分块矩阵乘法在维度上都是合法的。
矩阵乘法的多种解释
矩阵乘法可以从不同角度理解,每种解释在不同场景下都很有用。
列视角解释
如果将矩阵 B 按列拆分,即 B = [b1, b2, ..., bn],那么乘积 AB 可以理解为:
AB = [A b1, A b2, ..., A bn]
也就是说,AB 的每一列都是矩阵 A 乘以 B 的对应列。这可以看作是对 B 的所有列进行“批量”的矩阵-向量乘法。
这种视角的一个应用是紧凑地表示多个具有相同系数矩阵的线性方程组。方程组 Ax_i = b_i(i=1 to k)可以合并写作 AX = B,其中 X 的列是 x_i,B 的列是 b_i。
行-列内积解释
矩阵 C = AB 的第 (i, j) 元素是 A 的第 i 行与 B 的第 j 列的内积。
因此,整个矩阵 AB 可以看作是一个矩阵,其元素是所有 A 的行向量与所有 B 的列向量的内积结果。
Gram 矩阵
Gram 矩阵是一个非常重要的概念。对于一个 m×n 的矩阵 A,其列向量为 a1, a2, ..., an,则 A 的 Gram 矩阵定义为:
G = A^T A
根据内积解释,G 的第 (i, j) 元素就是 a_i^T a_j,即列向量 a_i 和 a_j 的内积。因此:
- G 的对角线元素 G_ii = ||a_i||^2,是各列向量范数的平方。
- G 是非对角线元素是不同列向量之间的内积。
- G 是一个对称矩阵,因为 G^T = (A^T A)^T = A^T (AT)T = A^T A = G。
一个特别重要的情形是当 A^T A = I(单位矩阵)时。这意味着:
- 对角线元素为1:每个列向量的范数都为1(归一化)。
- 非对角线元素为0:任意两个不同的列向量内积为0(正交)。
满足 A^T A = I 的矩阵的列向量组被称为标准正交组。
计算复杂度
最后,我们来了解一下矩阵乘法的计算成本。
按照定义计算两个矩阵 A (m×p) 和 B (p×n) 的乘积 C (m×n),需要计算 m*n 个元素,每个元素是长度为 p 的内积。计算一个长度为 p 的内积大约需要 2p 次浮点运算(乘法和加法)。因此,总的浮点运算量约为:
浮点运算次数 ≈ 2 * m * p * n
例如,计算两个 1000×1000 的矩阵相乘,大约需要 2 * 1000 * 1000 * 1000 = 20亿 次浮点运算。在现代计算机上,这可能在零点几秒内完成,这体现了计算技术的巨大威力。在学习过程中,亲自进行这样规模的计算并体会其速度,是理解现代数值计算的一个有趣环节。
总结
本节课中我们一起学习了矩阵乘法的核心内容:
- 定义与计算:矩阵乘法的规则是取第一个矩阵的行与第二个矩阵的列做内积。
- 特例与性质:标量乘法、内积、外积等都是矩阵乘法的特例。矩阵乘法满足结合律、分配律和特定的转置规则,但不满足交换律。
- 多种解释:我们可以从“列的变换”、行与列的内积集合等角度理解矩阵乘法,并引入了重要的 Gram 矩阵 G = A^T A 及其在描述标准正交组时的作用。
- 计算成本:矩阵乘法的计算复杂度与三个维度的乘积成正比,现代计算机能高效处理大规模矩阵乘法。


理解矩阵乘法是掌握后续线性代数概念和应用的基础。


📘 课程 P28:L10.2 - 矩阵乘法示例
在本节课中,我们将要学习线性函数的复合。我们将看到,这为矩阵乘法提供了另一种解释。
线性函数的复合
上一节我们介绍了矩阵乘法的基本概念,本节中我们来看看如何通过线性函数的复合来理解它。
假设 A 是一个 m × p 的矩阵,B 是一个 p × n 的矩阵。我们可以计算它们的乘积 C = A B。
现在,我们定义两个线性函数:
- 函数 F 将
p维向量映射到m维向量,定义为 F(u) = A u。 - 函数 G 将
n维向量映射到p维向量,定义为 G(v) = B v。
这两个函数都是线性的,因为它们由矩阵向量乘法定义。
复合函数与矩阵乘法
接下来,我们考虑这两个函数的复合。复合函数 H 的定义是:H(x) = F(G(x))。
让我们解析这个过程:
- 输入一个
n维向量 x。 - 函数 G 作用于 x,得到
p维向量 B x。 - 函数 F 作用于 B x,得到
m维向量 A (B x)。
因此,复合函数 H 的公式为:
H(x) = A (B x)
根据矩阵乘法的结合律,上式等价于:
H(x) = (A B) x
这个结果非常精妙:两个线性函数的复合仍然是线性的,并且其对应的矩阵就是两个函数对应矩阵的乘积。这为矩阵乘法 A B 提供了“函数复合”的解释。
需要注意的一点是,在复合 F(G(x)) 中,G 是先作用的函数,对应矩阵 B。而在乘积 A B 中,B 在书写顺序上位于后面,但在运算逻辑上却是“先”作用于向量的矩阵。理解这一点后,一切就顺理成章了。
一个具体示例:差分矩阵
为了加深理解,我们来看一个具体的例子。这个例子涉及我们之前课程中介绍过的差分矩阵。
以下是差分矩阵的核心概念:
- Dₙ 是一个
(n-1) × n的矩阵。当它乘以一个n维向量时,会计算该向量的“一阶差分”(即相邻元素的差)。 - Dₙ₋₁ 是一个
(n-2) × (n-1)的矩阵,功能类似,但维度更小。
现在,让我们考虑它们的复合。我们可以计算矩阵 Dₙ₋₁ Dₙ,这将得到一个 (n-2) × n 的矩阵。
这个新矩阵的作用是:
- 先用 Dₙ 计算输入向量的“一阶差分”。
- 再用 Dₙ₋₁ 对得到的一阶差分结果再次计算差分,即得到“二阶差分”。
因此,矩阵 Δ = Dₙ₋₁ Dₙ 被称为二阶差分矩阵。它的效果类似于对离散序列求“二阶导数”。
以 n=5 为例
让我们以 n=5 为例进行具体说明。
首先,4 × 5 的一阶差分矩阵 D₅ 作用于一个5维向量,会得到4个差值(x₂ - x₁, x₃ - x₂, x₄ - x₃, x₅ - x₄)。
然后,3 × 4 的差分矩阵 D₄ 再作用于这个4维的差值向量,最终得到一个3维的二阶差分向量。
通过直接计算矩阵乘积 D₄ D₅,我们得到的 3 × 5 矩阵,其每一行确实对应着计算原始5维向量的二阶差分(例如,x₁ + x₃ - 2x₂ 这样的形式)。
这个例子清晰地展示了:对两个差分函数进行复合,等价于将它们的矩阵相乘,结果得到了一个计算高阶差分的新函数。
总结
本节课中我们一起学习了线性函数复合与矩阵乘法的关系。我们了解到:
- 两个线性函数 F(x) = A x 和 G(x) = B x 的复合 H(x) = F(G(x)) 仍然是线性函数。
- 复合函数 H 对应的矩阵,正是两个原函数对应矩阵的乘积 A B。这为矩阵乘法提供了“函数复合”这一直观解释。
- 我们通过差分矩阵的实例验证了这一结论,看到计算一阶差分的函数再复合一次,就得到了计算二阶差分的函数,其对应矩阵正是两个差分矩阵的乘积。


理解这种对应关系,有助于我们从更高、更统一的视角看待线性代数的核心运算。


📘 课程 P29:L10.3 - 矩阵次方与分解
在本节课中,我们将学习矩阵的次方运算及其应用,并了解如何将格拉姆-施密特正交化过程表示为一种简洁的矩阵分解形式。
🧮 矩阵的次方
上一节我们介绍了矩阵乘法。本节中我们来看看,当一个矩阵是方阵时,我们可以将其与自身相乘,这引出了矩阵次方的概念。
- 只有方阵
A才能进行次方运算,否则无法进行自乘。 A的平方定义为A² = A × A。- 更高次方以此类推,例如
A³ = A × A × A。由于矩阵乘法满足结合律,A³也等于(A × A) × A或A × (A × A)。 - 我们沿用数字的记法,将矩阵的
k次方记为Aᵏ。 - 为了记法统一,我们定义
A⁰ = I(单位矩阵)。这类似于数字的0次方等于1,而单位矩阵I在矩阵运算中扮演着数字1的角色。 - 定义了
A⁰后,矩阵次方也满足指数法则:Aᵏ × Aˡ = Aᵏ⁺ˡ。 - 在本课程后续部分,我们会学习矩阵的负次方,即逆矩阵
A⁻¹。更高级的课程中还会涉及分数次方(如A^(1/2),即矩阵的平方根),但本课程暂不讨论。目前我们只讨论正次方和零次方(约定为I)。
以下是矩阵次方的一个简单示例:
设矩阵 A = [[1, -1], [2, 0]],则 A² 计算如下:
A² = A × A = [[1, -1], [2, 0]] × [[1, -1], [2, 0]] = [[-1, -1], [2, -2]]
🕸️ 邻接矩阵及其次方的意义
矩阵次方有许多有趣的应用。我们来看一个涉及有向图的例子。在之前的课程中,我们通过节点和边来描述有向图。另一种描述方式不使用边列表,而是使用邻接矩阵。
- 对于一个有
n个节点的图,其邻接矩阵A是一个n × n的矩阵。 - 矩阵元素
A[i][j]的定义为:如果存在一条从节点j指向节点i的边,则A[i][j] = 1;否则为0。- 注意这里的顺序:
A[i][j]对应j → i的边。有些教材会使用相反的约定(i → j),两者仅相差一个转置关系。
- 注意这里的顺序:
以下是一个邻接矩阵的例子,我们可以验证其正确性:
- 若存在边
3 → 2,则A[2][3]应为1。 - 若存在边
4 → 5,则A[5][4]应为1。 - 若不存在边
2 → 4,则A[4][2]应为0。
邻接矩阵的平方 A² 具有非常美妙的解释。
- 根据矩阵乘法,
(A²)[i][j] = Σₖ (A[i][k] × A[k][j])。 - 由于
A的元素非0即1,乘积A[i][k] × A[k][j]仅在两项均为1时才为1。 A[k][j] = 1表示存在路径j → k。A[i][k] = 1表示存在路径k → i。- 因此,
(A²)[i][j]的值等于所有满足“从j到k再到i”的中间节点k的数量。这正好是从节点j到节点i的长度为 2 的路径总数。
更一般地,邻接矩阵 A 的 L 次方 Aᴸ 中,(Aᴸ)[i][j] 的值等于从节点 j 到节点 i 的长度为 L 的路径总数。
- 当
L=1时,A本身表示长度为 1 的路径(即单条边),这与定义一致。 - 例如,在示例图中,
(A²)[3][4] = 2,表示从节点4到节点3存在两条长度为 2 的路径(一条经过自环4→4→3,另一条经过4→5→3)。
🔧 格拉姆-施密特与 QR 分解
我们的最后一个主题是展示如何利用强大的矩阵记号,来极其紧凑地描述格拉姆-施密特正交化的结果(而非算法本身)。实际上,格拉姆-施密特过程可以解释为一种矩阵分解,即 QR 分解。
假设我们有一个 n × k 的矩阵 A,其列向量为 a₁, a₂, ..., aₖ(均为 n 维向量)。如果这些列向量线性无关,那么对它们执行格拉姆-施密特正交化,将得到一组标准正交向量 q₁, q₂, ..., qₖ。
- 我们定义一个新的
n × k矩阵Q,其列就是这些标准正交向量q₁, ..., qₖ。 Q的列是标准正交的这一事实,可以简洁地表示为:QᵀQ = I(k × k的单位矩阵)。这个等式意味着:对角线元素qᵢᵀqᵢ = 1(范数为1),非对角线元素qᵢᵀqⱼ = 0(相互正交)。
从格拉姆-施密特算法的公式 aᵢ = r₁ᵢq₁ + r₂ᵢq₂ + ... + rᵢᵢqᵢ 出发(其中 rᵢᵢ > 0),我们可以发现:
- 每个
aᵢ都可以表示为q₁到qᵢ的线性组合,而不需要qᵢ₊₁及之后的向量。 - 这意味着,如果我们构造一个
k × k的上三角矩阵R,使其第i列的元素由上式的系数(r₁ᵢ, r₂ᵢ, ..., rᵢᵢ, 0, ..., 0)构成,并且对角线元素rᵢᵢ > 0,那么整个变换关系就可以写成矩阵形式:
A = Q × R
这就是著名的 QR 分解:将矩阵 A 分解为一个列标准正交的矩阵 Q 和一个上三角矩阵 R 的乘积,且 R 的对角线元素为正。
总结一下:
- 对一组向量(视为矩阵
A的列)执行格拉姆-施密特正交化,等价于对该矩阵进行 QR 分解。 - 格拉姆-施密特是计算 QR 分解的一种算法。在数值计算软件中,你更常听到的是“QR 分解”这个术语。
- 目前,格拉姆-施密特(或 QR 分解)的主要用途是判断一组向量是否线性独立。虽然这个应用在当前阶段可能显得抽象,但在后续课程中,你会发现它在求解线性方程组、最小二乘问题等方面具有极其重要的实际意义。
📝 本节课总结


在本节课中,我们一起学习了:
- 矩阵的次方运算:定义了方阵的正整数次方和零次方(单位矩阵),并了解了其运算规则。
- 邻接矩阵的应用:将有向图表示为邻接矩阵,并揭示了
Aᴸ的(i, j)元素表示从节点j到节点i的长度为L的路径数这一深刻含义。 - QR 分解:将格拉姆-施密特正交化过程表示为矩阵
A分解为列标准正交矩阵Q和上三角矩阵R的乘积,即A = QR。这是将算法思想转化为紧凑矩阵表示的一个典范。


📚 课程 P3:L1.3 - 向量示例
在本节课中,我们将通过一系列具体的例子来探索向量在不同领域中的应用。这些例子将帮助你理解向量不仅仅是抽象的数学概念,更是描述现实世界中各种事物的强大工具。
上一节我们介绍了向量的基本概念,如元素、相等性和堆叠。本节中,我们来看看向量在实际场景中的具体应用。
📍 位置与位移
在物理学或力学课程中,你经常会遇到向量。这些向量通常是二维或三维的,用于描述位置或位移。
- 位置向量:一个向量可以表示平面或空间中的一个点。例如,一个二维向量 X = [x1, x2] 表示平面中的一个位置。在三维空间中,向量 X = [x1, x2, x3] 则表示空间中的一个点。这需要事先约定好坐标系。
- 位移向量:向量也可以描述位置的移动或变化。它通常被画成一个箭头,表示从起点到终点的方向和距离。例如,向量 [x1, x2] 表示向右移动
x1个单位,向上移动x2个单位。
🎨 颜色表示
人眼感知的颜色可以用三维向量来描述,即 RGB(红、绿、蓝)强度值。
- 每个颜色分量用一个数字表示,例如
1代表最大强度,0代表关闭。 - 向量 [1, 0, 0] 代表纯红色。
- 向量 [0, 0, 1] 代表纯蓝色。
- 向量 [1, 0, 1] 代表红色和蓝色混合,产生紫色。
因此,任何颜色都可以用一个三维向量 C = [R, G, B] 来精确描述。
📦 物料清单与稀疏向量
一个 n 维向量可以用来表示一份物料清单或数量列表。
- 例如,制造一个产品需要 10 种原材料,向量 M = [m1, m2, ..., m10] 可以表示生产一个单位产品所需的各种原材料的数量。
- 如果这个向量中大部分元素都是零,那么它就是一个稀疏向量。这在现实中很常见,比如一个复杂产品可能只用到所有可能原材料中的一小部分。
💰 金融投资组合
在金融领域,投资组合(持有的资产集合)通常用向量表示。
- 向量可以表示每种资产持有的美元价值,例如 P = [100, 50, 20] 表示持有价值 100 美元的股票、50 美元的债券和 20 美元的现金。
- 向量也可以表示每种资产在总组合中的比例。
- 值得注意的是,向量中的元素可以是负数,这代表空头头寸,即你借入并需要在未来归还的资产。
- 投资组合的总价值就是向量所有元素之和:
total_value = sum(P)。
💸 现金流
向量可以用来表示现金流,即在不同时间点发生的一系列支付。
- 向量 CF = [cf1, cf2, ..., cfn] 中的每个元素
cfi代表在第i个时期(如天、月、年)的现金流入(正数)或流出(负数)。 - 如果现金流向量是稀疏的,意味着在大多数时间段内没有支付发生。
🔊 音频信号
声音可以被编码为一个很长的向量。
- 声音是气压的快速变化。常见的编码方式是将时间分割成极小的间隔(如每秒 44,100 个样本)。
- 向量 A = [a1, a2, ..., an] 中的每个元素
ai表示在特定时刻的声压水平(通常减去平均气压,因此可正可负)。 - 因此,一段音频本质上就是一个高维向量。
🔍 特征向量(机器学习核心)
在机器学习和统计学中,向量被广泛用于描述实体的特征或属性。
- 每个实体(如一位病人、一家公司)对应一个特征向量。
- 向量的每个元素代表一个特定的特征。例如,描述病人的向量可能包含:
[体重, 身高, 舒张压, 收缩压, ...]。 - 特征可以用数字编码,例如用
+1表示女性,-1表示男性。 - 特征向量可以很小,也可以非常庞大。例如,描述一家上市公司的特征向量可能包括:
[总市值, 股价波动率, 上季度收益率, 营收, ...]。
🛒 客户购买记录
在电子商务中,单个客户的购买行为可以用一个向量表示。
- 向量的长度等于商品总数(SKU 数量)。
- 每个元素代表该客户在特定时期内购买某件商品的金额或数量。
- 这个向量天然是稀疏的,因为任何单个客户只可能购买所有商品中的极小一部分。例如,在亚马逊的数百万商品中,一个用户可能只购买了几百件。这种向量通常以稀疏格式存储,只记录非零项(商品ID和数量)。
📖 词频向量(文档表示)
一个文档可以用一个词频向量来表示,这是自然语言处理中的基础概念。
- 首先需要一个预定义的词典(单词列表)。
- 向量 W = [w1, w2, ..., wn] 的长度等于词典大小。
- 每个元素
wi表示词典中第i个单词在该文档中出现的次数。 - 例如,对于词典
[“the”, “cat”, “sat”, “mat”],句子 “The cat sat on the mat.” 对应的词频向量(忽略大小写)是[2, 1, 1, 1]。 - 对于大多数文档(如一篇产品评论),词频向量是稀疏的,因为文档只包含词典中一小部分单词。
让我们看一个具体的例子。假设有一个简短的文档片段和一个小词典。
词典:[“a”, “the”, “dog”, “cat”, “chases”, “runs”]
文档:“The dog chases the cat.”
以下是构建词频向量的步骤:
- 将文档转换为小写并分词:
[“the”, “dog”, “chases”, “the”, “cat”] - 统计每个词典单词在文档中的出现次数:
- “a”: 0
- “the”: 2
- “dog”: 1
- “cat”: 1
- “chases”: 1
- “runs”: 0
- 得到词频向量:
[0, 2, 1, 1, 1, 0]
这个向量 [0, 2, 1, 1, 1, 0] 就是该文档基于给定词典的数学表示。在后续课程中,我们将探索如何利用这些向量进行比较、分类等操作。


本节课中我们一起学习了向量在多个领域的广泛应用示例。从表示物理位置和颜色,到描述金融投资组合、音频信号,再到作为机器学习的特征表示和自然语言处理的词频统计,向量为我们提供了一种统一、强大的方式来数字化和量化现实世界中的复杂信息。理解这些例子是掌握向量应用价值的关键第一步。


课程 P30:L11.1 - 逆矩阵 🧮
在本节课中,我们将学习矩阵的逆。这个概念是标量(数字)中“倒数”概念的推广,但矩阵的情况要复杂得多。我们将从介绍左逆和右逆开始,逐步深入到矩阵逆的定义、性质和应用。
概述
对于数字,如果 x * a = 1,则 x 是 a 的逆,记作 x = 1/a。这仅在 a ≠ 0 时成立。对于矩阵,我们也有类似的概念,但情况更复杂。我们将探讨满足 XA = I 的矩阵 X(称为左逆),以及满足 AX = I 的矩阵 X(称为右逆)。
左逆与列独立性
上一节我们介绍了矩阵逆的类比概念。本节中我们来看看左逆及其与矩阵列独立性的关系。
如果存在矩阵 X 使得 XA = I,则称 X 为矩阵 A 的左逆。如果矩阵 A 有左逆,则称它是左可逆的。
以下是关于左逆的一个关键性质:
如果矩阵
A有左逆C,则A的列是线性无关的。
证明:为了证明列线性无关,我们考虑方程 Ax = 0。假设 C 是 A 的左逆,即 CA = I。我们在方程两边左乘 C:
C(Ax) = C * 0
(CA)x = 0
Ix = 0
x = 0
因此,Ax = 0 的唯一解是 x = 0,这意味着 A 的列线性无关。
这个性质告诉我们,左可逆矩阵必须是高矩阵或方阵(即行数 ≥ 列数)。因为如果它是宽矩阵(列数 > 行数),其列必然是线性相关的,从而不可能有左逆。
利用左逆求解线性方程组
上一节我们介绍了左逆与列独立性的关系。本节中我们来看看如何利用左逆求解线性方程组。
假设我们有线性方程组 Ax = b,并且 A 有一个左逆 C(这意味着 A 是高矩阵或方阵)。我们可以对方程两边左乘 C:
C(Ax) = Cb
(CA)x = Cb
Ix = Cb
x = Cb
这表明,x = Cb 是方程组 Ax = b 的一个解。这与标量情况类似:对于方程 a * x = b,解为 x = (1/a) * b,其中 1/a 可以看作是 a 的“左逆”。
以下是关于左逆求解的一个例子:
考虑矩阵 A 和向量 b:
A = [[1, 2],
[3, 4],
[5, 6]]
b = [7, 8, 9]
假设 B 和 C 是 A 的两个不同的左逆。计算 Bb 和 Cb,如果方程组 Ax = b 有唯一解,那么两者将得到相同的解 x。这是因为解的唯一性决定的,即使左逆不唯一。
右逆与行独立性
上一节我们探讨了左逆。本节中我们来看看与之对应的右逆。
如果存在矩阵 X 使得 AX = I,则称 X 为矩阵 A 的右逆。如果矩阵 A 有右逆,则称它是右可逆的。
左逆和右逆通过矩阵转置紧密相关。如果 X 是 A 的右逆(AX = I),那么对等式两边转置:
(AX)^T = I^T
X^T A^T = I
这表明 X^T 是 A^T 的左逆。因此,A 是右可逆的,当且仅当 A^T 是左可逆的。而 A^T 左可逆意味着 A^T 的列线性无关,即 A 的行线性无关。
这个性质告诉我们,右可逆矩阵必须是宽矩阵或方阵(即列数 ≥ 行数)。
利用右逆求解线性方程组
上一节我们介绍了右逆。本节中我们来看看如何利用右逆求解线性方程组。
考虑方程组 Ax = b,其中 A 是方阵或宽矩阵(即行数 ≤ 列数),并且 A 有一个右逆 B(AB = I)。那么 x = Bb 是方程组的一个解。
证明:
A x = A (B b) = (A B) b = I b = b
这表明对于任何 b,方程组 Ax = b 至少有一个解(实际上可能有很多解)。这与左逆情况不同,左逆给出的是超定方程组的(唯一)解,而右逆给出的是欠定方程组的一个(可能不唯一的)特解。
以下是关于右逆求解的一个例子:
考虑 A 的转置 A^T,以及 A 的左逆 B 和 C 的转置 B^T 和 C^T,它们都是 A^T 的右逆。对于欠定方程组 A^T x = [1, 2]^T,用 B^T 和 C^T 分别右乘 [1, 2]^T,可能会得到两个不同的解向量,但验证后会发现它们都满足原方程。
矩阵的逆
上一节我们分别讨论了左逆和右逆。本节中我们将两者结合起来,介绍更常见、更简单的矩阵逆。
如果一个方阵 A 同时具有左逆和右逆,那么这两个逆矩阵是唯一且相等的。我们称这个唯一的矩阵为 A 的逆,记作 A^{-1}。它满足:
A^{-1} A = I 且 A A^{-1} = I
这与数字的逆性质类似:如果 a ≠ 0,则存在唯一的 a^{-1} 使得 a^{-1} * a = 1 且 a * a^{-1} = 1。
证明唯一性:假设 X 是右逆(AX = I),Y 是左逆(YA = I)。那么:
X = I X = (Y A) X = Y (A X) = Y I = Y
因此 X = Y,左逆和右逆是同一个矩阵。
对于可逆矩阵 A,其逆的逆是其本身:(A^{-1})^{-1} = A。
利用逆矩阵求解线性方程组
上一节我们定义了矩阵的逆。本节中我们来看看如何利用逆矩阵求解方阵线性方程组。
假设 A 是一个 n x n 的可逆方阵,考虑线性方程组 Ax = b。那么这个方程组对于任何 b 都有唯一解,并且解可以由逆矩阵直接给出:
x = A^{-1} b
这是标量方程 a x = b 的解 x = a^{-1} b 在矩阵形式下的直接推广。这里,矩阵可逆 (A^{-1} 存在) 扮演了标量中 a ≠ 0 的角色。
这个简单的公式 x = A^{-1} b 是无数应用的基础。例如,在结构工程中,通过建立方程组 Ax = b 来模拟桥梁在荷载下的形变,然后通过计算 x = A^{-1} b 来求解形变量。
可逆性的等价条件
上一节我们看到了逆矩阵在解方程中的应用。本节中我们总结一下方阵可逆的几个等价条件。
对于一个 n x n 方阵 A,以下陈述是等价的(只要其中一个成立,则其他都成立):
A是可逆的(即存在A^{-1}使得A^{-1}A = I且A A^{-1} = I)。A的列是线性无关的。A有左逆。A的行是线性无关的。A有右逆。
需要注意的是,对于非方阵,谈论其逆矩阵是没有意义的。如果你写 A^{-1} 而 A 不是方阵,那在矩阵代数中是不被允许的。
逆矩阵的例子与计算
上一节我们列出了可逆的等价条件。本节中我们来看一些具体的逆矩阵例子。
以下是一些常见或简单的逆矩阵:
- 单位矩阵:
I的逆是它自身,I^{-1} = I。 - 正交矩阵:如果方阵
Q满足Q^T Q = I(即列是标准正交的),则Q是可逆的,并且其逆就是它的转置:Q^{-1} = Q^T。这也意味着Q Q^T = I。 - 2x2 矩阵的逆:对于矩阵
A = [[a, b], [c, d]],其逆存在的条件是ad - bc ≠ 0(这个值称为行列式)。逆矩阵公式为:
建议记住这个公式,它类似于二次方程的求根公式,是一个基础工具。A^{-1} = (1 / (ad - bc)) * [[d, -b], [-c, a]] - 更大矩阵的逆:对于更大的矩阵(如3x3, 4x4),存在理论上的逆公式,但极其复杂,不用于实际计算。实际计算逆矩阵有系统的方法。
一个计算示例:
考虑矩阵 A = [[1, 2, 3], [0, 1, 4], [5, 6, 0]]。可以验证它是可逆的,其逆为:
A^{-1} = (1/30) * [[-24, 18, 5], [20, -15, -4], [-5, 4, 1]]
可以通过计算 A^{-1} A 的 (1,1) 元素来验证:(-24*1 + 18*0 + 5*5)/30 = (-24 + 0 + 25)/30 = 1/30 * 1 = 1,符合单位矩阵的要求。
逆矩阵的性质
上一节我们看了一些逆矩阵的例子。本节中我们总结一下逆矩阵的一些重要运算性质。
假设所涉及的矩阵都是可逆的方阵,以下性质成立:
- 乘积的逆:
(AB)^{-1} = B^{-1} A^{-1}。注意顺序相反,这与转置性质(AB)^T = B^T A^T类似。 - 转置的逆:
(A^T)^{-1} = (A^{-1})^T。有时也记作A^{-T}。 - 矩阵的幂:对于可逆方阵
A,我们可以定义负整数次幂:A^{-k} = (A^{-1})^k。结合已有的A^0 = I和A^k(k为正整数),指数法则依然成立:A^k * A^l = A^{k+l},其中k和l可以是任意整数(正、负或零)。
三角矩阵的可逆性
上一节我们介绍了逆矩阵的一般性质。本节中我们来看一类特殊矩阵——三角矩阵的可逆性。
一个方阵被称为下三角矩阵,如果其主对角线以上的所有元素都为零。类似地,上三角矩阵是主对角线以下所有元素为零的方阵。
重要性质:一个下三角(或上三角)矩阵是可逆的,当且仅当其主对角线上的所有元素都非零。
证明思路(以下三角矩阵 L 为例):要证明 L 可逆,只需证明其列线性无关。考虑方程 Lx = 0:
- 第一个方程是
L_{11} x_1 = 0。由于L_{11} ≠ 0,推出x_1 = 0。 - 第二个方程是
L_{21} x_1 + L_{22} x_2 = 0。由于x_1 = 0且L_{22} ≠ 0,推出x_2 = 0。 - 以此类推,可以逐步推出所有
x_i = 0。因此Lx = 0只有零解,列线性无关,故L可逆。
对于上三角矩阵 R,其可逆性条件相同(对角线元素非零),因为 R 可逆等价于其转置 R^T(一个下三角矩阵)可逆。
通过 QR 分解求逆
上一节我们讨论了三角矩阵的可逆性。本节中我们将看到如何利用之前学过的 QR 分解来计算矩阵的逆。
假设 A 是一个 n x n 的可逆方阵。因为可逆意味着列线性无关,我们可以对其列向量应用格拉姆-施密特正交化过程,得到 QR 分解:
A = Q R
其中:
Q是一个n x n的正交矩阵(Q^T Q = I,因此Q^{-1} = Q^T)。R是一个n x n的上三角矩阵,并且由于格拉姆-施密特过程,其对角线元素为正数(因此非零),根据上一节的结论,R是可逆的。
现在,我们可以利用 QR 分解来求 A 的逆:
A^{-1} = (Q R)^{-1} = R^{-1} Q^{-1} = R^{-1} Q^T
因此,问题转化为求上三角矩阵 R 的逆 R^{-1}。求上三角矩阵的逆有高效的系统方法(如前向/后向替代),这将在后续课程中介绍。这里的关键是,QR 分解将求任意可逆矩阵的逆,转化为了求一个上三角矩阵的逆和一次矩阵乘法。
总结


本节课中我们一起学习了矩阵逆的核心概念。我们从标量的倒数出发,引入了矩阵的左逆和右逆,并发现它们分别与矩阵的列独立性和行独立性相关。对于方阵,当左逆和右逆同时存在时,它们相等且唯一,这就是我们通常所说的矩阵逆 A^{-1}。逆矩阵使得求解方阵线性方程组 Ax = b 变得直接:x = A^{-1}b。我们还探讨了可逆的等价条件、逆矩阵的运算性质,以及特殊矩阵(如三角矩阵、正交矩阵)的逆。最后,我们看到了如何通过 QR 分解将求逆问题简化。理解矩阵逆是线性代数及其应用的基石。


课程 P31:L11.2 - 求解线性方程组 📐
在本节课中,我们将学习如何求解线性方程组。我们将从一种名为“回代”的方法开始,然后结合QR分解,构建一个完整的求解算法。我们还会探讨其计算复杂度,并了解如何高效地求解多组具有相同系数矩阵的方程组。
回代法 🔄
上一节我们介绍了上三角矩阵。本节中,我们来看看如何利用上三角矩阵的特性来求解线性方程组。
我们有一个上三角矩阵 R,其对角线元素均不为零,这意味着 R 是可逆的。我们要解的方程是:
R x = b
当然,我们可以通过计算 x = R⁻¹ b 来求解。由于 R 是上三角矩阵且对角线元素非零,我们可以使用一种更高效的方法——回代法。
让我们将方程以标量形式写出。对于一个上三角矩阵,方程组看起来是这样的:
- 第一个方程:r₁₁ x₁ + r₁₂ x₂ + ... + r₁ₙ xₙ = b₁
- 第二个方程:r₂₂ x₂ + ... + r₂ₙ xₙ = b₂
- ...
- 最后一个方程:rₙₙ xₙ = bₙ
以下是回代法的具体步骤:
-
从最后一个方程开始求解。由于 rₙₙ ≠ 0,我们可以直接解出 xₙ:
xₙ = bₙ / rₙₙ -
代入倒数第二个方程求解。现在我们知道 xₙ 的值,倒数第二个方程是:
rₙ₋₁ₙ₋₁ xₙ₋₁ + rₙ₋₁ₙ xₙ = bₙ₋₁
我们可以将其改写为:
xₙ₋₁ = (bₙ₋₁ - rₙ₋₁ₙ xₙ) / rₙ₋₁ₙ₋₁
由于 rₙ₋₁ₙ₋₁ ≠ 0,我们可以计算出 xₙ₋₁。 -
继续向后迭代。知道 xₙ 和 xₙ₋₁ 后,我们可以用同样的方法解出 xₙ₋₂,依此类推,直到解出 x₁。
这个过程被称为“回代”,因为我们是从最后一个变量开始,逐步向后代入并求解的。
回代法的计算复杂度 ⚙️
现在我们来分析回代法的计算成本(以浮点运算次数衡量)。
- 求解 xₙ 需要 1 次运算(除法)。
- 求解 xₙ₋₁ 需要 3 次运算(一次乘法、一次减法、一次除法)。
- 求解 xₙ₋₂ 需要 5 次运算。
- 以此类推。
总运算次数是 1 + 3 + 5 + ... + (2n-1)。这是一个著名的恒等式,其和为 n²。因此,回代法的计算复杂度是 O(n²) 量级,这与矩阵与向量相乘的复杂度相同。
通过QR分解求解线性方程组 🧩
上一节我们介绍了回代法。本节中,我们来看看如何将其与QR分解结合,求解一般的线性方程组。
对于一个可逆的方阵 A,我们要解方程 A x = b,即计算 x = A⁻¹ b。
由于 A 可逆,其列向量线性无关,我们可以对其进行QR分解:
A = Q R
其中,Q 是正交矩阵(QᵀQ = I),R 是具有正对角线元素的上三角矩阵(因此可逆)。
那么,A 的逆可以表示为:
A⁻¹ = (Q R)⁻¹ = R⁻¹ Q⁻¹ = R⁻¹ Qᵀ
因此,解 x 可以这样计算:
x = A⁻¹ b = R⁻¹ (Qᵀ b)
以下是求解算法的伪代码步骤:
- QR分解:对矩阵 A 进行QR分解,得到 Q 和 R。
- 计算新向量:计算 y = Qᵀ b(这是一个矩阵-向量乘法)。
- 回代求解:解上三角方程组 R x = y,使用回代法得到 x。
算法复杂度分析 📊
现在我们来分析上述三步算法的总计算成本。
- 第一步:QR分解。对于一个 n×n 矩阵,其复杂度约为 2n³ 次浮点运算。
- 第二步:矩阵-向量乘法。计算 Qᵀ b 的复杂度为 2n² 次运算。
- 第三步:回代。求解 R x = y 的复杂度为 n² 次运算。
当 n 很大时(例如成千上万),n³ 量级的运算成本远高于 n² 量级。因此,总成本主要由QR分解决定,约为 2n³ 次运算。第二步和第三步的成本可以忽略不计。
这带来了一个令人惊讶的结论:求解线性方程组的主要成本在于对系数矩阵进行QR分解。
求解多组方程组 🚀
上一节我们看到,求解的主要成本是QR分解。本节中,我们来看看这对求解多组方程组意味着什么。
假设我们需要求解 k 组具有相同系数矩阵 A,但不同右侧向量 bᵢ 的方程组:
A xᵢ = bᵢ, 对于 i = 1, 2, ..., k
一个“聪明”的方法是:
- 只进行一次QR分解:计算 A = Q R。(成本:~2n³)
- 对每个右侧向量重复后续步骤:对于每个 bᵢ,计算 yᵢ = Qᵀ bᵢ(~2n²)并进行回代 R xᵢ = yᵢ(~n²)。
总成本约为:2n³ + 3k n²。
只要 k 远小于 n,那么 k n² 项与 n³ 项相比就微不足道。这意味着,求解10组(甚至更多)具有相同系数矩阵的方程组,所需时间与求解一组方程组的时间几乎相同! 因为最耗时的QR分解只需要做一次。
应用示例:多项式插值 📈
线性方程组求解有广泛的应用。这里我们看一个简单的例子:多项式插值。
假设我们想找到一个三次多项式:
p(x) = c₁ + c₂ x + c₃ x² + c₄ x³
使其图像经过四个给定点:(-1, b₁), (-0.4, b₂), (0.1, b₃), (0.8, b₄)。
将点的x坐标代入多项式,就得到关于系数 c₁, c₂, c₃, c₄ 的线性方程组:
A c = b
其中矩阵 A 是一个范德蒙矩阵:
A = [[1, -1, (-1)², (-1)³],
[1, -0.4, (-0.4)², (-0.4)³],
[1, 0.1, (0.1)², (0.1)³],
[1, 0.8, (0.8)², (0.8)³]]
向量 b = [b₁, b₂, b₃, b₄]ᵀ, c = [c₁, c₂, c₃, c₄]ᵀ。
求解 c = A⁻¹ b 即可得到多项式系数。矩阵 A⁻¹ 的列有特殊的几何意义:第 j 列对应的多项式,在第 j 个插值点取值为1,在其他插值点取值为0。这类多项式被称为拉格朗日基多项式。
总结 🎯
本节课中我们一起学习了:
- 回代法:一种高效求解上三角线性方程组的方法,复杂度为 O(n²)。
- QR分解求解法:通过将矩阵 A 分解为 Q 和 R,将一般线性方程组 A x = b 的求解转化为两步:计算 y = Qᵀ b 和回代求解 R x = y。
- 复杂度洞察:求解的主要成本在于QR分解(2n³),后续步骤成本(n²)可忽略。这使得求解多组具有相同系数矩阵的方程组异常高效。
- 应用实例:多项式插值问题可以自然地转化为线性方程组求解。


掌握这些方法,你就能理解并实现高效、稳定的线性方程组数值解法。


📘 课程 P32:L11.3 - 矩阵伪逆
在本节课中,我们将学习矩阵伪逆的概念。伪逆是矩阵理论中的一个重要工具,尤其当矩阵不是方阵或不可逆时,它提供了一种“求逆”的推广方法。我们将从格拉姆矩阵与矩阵本身的关系开始,逐步推导出高矩阵和宽矩阵的伪逆公式,并探讨其与QR分解的联系。
🔗 格拉姆矩阵与矩阵的线性无关性
上一节我们讨论了矩阵的基本性质。本节中,我们来看看矩阵的列线性无关性与其格拉姆矩阵可逆性之间的重要关系。
定理:矩阵 A 具有线性无关列,当且仅当其格拉姆矩阵 AᵀA 可逆。
证明:
矩阵 A 具有线性无关列,意味着方程 Ax = 0 的唯一解是 x = 0。我们需要证明 Ax = 0 与 AᵀAx = 0 等价。
- 假设 Ax = 0。在等式两边左乘 Aᵀ,得到 AᵀAx = Aᵀ0 = 0。因此,Ax = 0 蕴含 AᵀAx = 0。
- 反之,假设 AᵀAx = 0。在等式两边左乘 xᵀ,得到 xᵀAᵀAx = 0。我们可以将其重写为 (Ax)ᵀ(Ax) = 0,即向量 Ax 的范数平方为零。范数平方为零的唯一可能是向量本身为零向量,因此 Ax = 0。
由此,我们建立了 A 列线性无关与 AᵀA 可逆之间的等价关系。
📏 高矩阵的伪逆
基于上述关系,我们现在可以定义高矩阵(列数小于行数)的伪逆。
对于一个具有线性无关列的 m × n 矩阵 A(其中 m ≥ n),其伪逆(记为 A†)定义为:
A† = (AᵀA)⁻¹Aᵀ
以下是维度检查,确保公式有效:
- A 是 m × n 矩阵。
- Aᵀ 是 n × m 矩阵。
- AᵀA 是 n × n 矩阵(格拉姆矩阵),根据定理它是可逆的。
- (AᵀA)⁻¹ 是 n × n 矩阵。
- 因此,A† = (AᵀA)⁻¹Aᵀ 是 n × m 矩阵。
伪逆是左逆:
我们可以验证 A† 是 A 的一个左逆:
A†A = (AᵀA)⁻¹AᵀA = Iₙ
这证明了如果矩阵 A 具有线性无关列,则它至少存在一个左逆,并且我们给出了一个具体的计算公式。
特殊情况:方阵:
当 A 是 n × n 可逆方阵时,伪逆退化为普通的逆矩阵:
A† = (AᵀA)⁻¹Aᵀ = A⁻¹(Aᵀ)⁻¹Aᵀ = A⁻¹
因此,伪逆可以看作是矩阵逆在非方阵情况下的推广。
📐 宽矩阵的伪逆
类似地,我们可以定义宽矩阵(行数小于列数)的伪逆。
对于一个具有线性无关行的 m × n 矩阵 A(其中 m ≤ n),其伪逆定义为:
A† = Aᵀ(AAᵀ)⁻¹
伪逆是右逆:
我们可以验证 A† 是 A 的一个右逆:
AA† = AAᵀ(AAᵀ)⁻¹ = Iₘ
同样,当 A 是方阵且可逆时,该公式也退化为 A⁻¹。
🔢 伪逆与QR分解
伪逆的计算可以通过QR分解高效实现。这对于具有线性无关列的高矩阵尤其有用。
设矩阵 A 具有线性无关列,其QR分解为 A = QR,其中 Q 的列是标准正交的,R 是上三角矩阵且对角线元素为正。
我们可以将伪逆用 Q 和 R 表示:
- 首先计算格拉姆矩阵:AᵀA = (QR)ᵀ(QR) = RᵀQᵀQR = RᵀR(因为 QᵀQ = I)。
- 代入伪逆公式:
A† = (AᵀA)⁻¹Aᵀ = (RᵀR)⁻¹(QR)ᵀ = R⁻¹(Rᵀ)⁻¹ Rᵀ Qᵀ = R⁻¹Qᵀ
因此,我们得到了一个简洁的公式:
A† = R⁻¹Qᵀ
计算方法:
要计算 A†,我们可以按列进行:
- 对 A 进行QR分解,得到 Q 和 R。
- 对于单位矩阵 I 的每一列 eᵢ(即欲求 A† 的第 i 列),计算 R⁻¹(Qᵀeᵢ)。
- 由于 R 是上三角矩阵,R⁻¹(Qᵀeᵢ) 可以通过回代法快速求解。
通过这种方式,我们可以高效地计算出整个伪逆矩阵。
🎯 总结
本节课中我们一起学习了矩阵伪逆的核心内容:
- 我们首先建立了矩阵列线性无关与其格拉姆矩阵可逆之间的等价关系。
- 基于此,我们分别推导了高矩阵和宽矩阵的伪逆公式:
- 对于列线性无关的高矩阵 A,伪逆 A† = (AᵀA)⁻¹Aᵀ,它是 A 的一个左逆。
- 对于行线性无关的宽矩阵 A,伪逆 A† = Aᵀ(AAᵀ)⁻¹,它是 A 的一个右逆。
- 我们看到了当矩阵为可逆方阵时,伪逆退化为普通的矩阵逆。
- 最后,我们探讨了伪逆与QR分解的紧密联系,并得到了利用QR分解高效计算伪逆的公式 A† = R⁻¹Qᵀ。


伪逆是线性代数中一个非常强大的工具,它使得我们能够处理非方阵或列/行不满秩的情况。在接下来的课程中,我们将看到它在求解近似线性方程组等实际问题中的关键应用。


📊 课程 P33:L12.1 - 最小二乘法
在本节课中,我们将学习最小二乘法。这是一种处理超定方程组(即方程数量多于未知数数量)的重要方法。我们将了解其基本概念、几何与代数解释,并学习如何通过公式和计算来求解最小二乘问题。
最小二乘问题定义
我们从一个 m × n 矩阵 A 开始,其中 m > n。这意味着方程组 Ax = b 是超定的。对于大多数右侧向量 b 而言,不存在精确解 x 使得 Ax = b 成立。
因此,我们引入残差向量 r:
r = Ax - b
如果 r = 0,则 x 是方程组的精确解。但在超定情况下,我们通常无法使残差为零。
我们的目标是选择一个 x,使得残差的范数平方尽可能小。我们最小化的是目标函数:
f(x) = ||Ax - b||²
这是一个非负标量。我们称 x̂ 为最小二乘问题的解,如果对于所有其他 x,都有:
f(x̂) ≤ f(x)
即,x̂ 使得残差的范数平方最小。
注意:x̂ 通常不满足 Ax̂ = b,它仅仅是使残差最小的近似解。不应称其为“在最小二乘意义下的解”,因为这种说法容易引起混淆。
最小二乘法的两种解释
上一节我们定义了最小二乘问题,本节中我们来看看它的两种重要解释。
列空间解释(几何解释)
令 a₁, …, aₙ 为矩阵 A 的列向量。那么 Ax 就是这些列向量的线性组合:
Ax = x₁a₁ + … + xₙaₙ
此时,目标函数 ||Ax - b||² 表示向量 b 与 A 的列空间(所有列向量线性组合构成的子空间)中某个向量之间的距离平方。
因此,最小二乘问题可以理解为:在 A 的列空间的所有向量中,寻找一个最接近 b 的向量。解 x̂ 对应的向量 Ax̂ 就是这个最接近的点。
行空间解释(代数解释)
令 ã₁ᵀ, …, ãₘᵀ 为矩阵 A 的行向量。那么残差的第 i 个分量可以写为:
rᵢ = ãᵢᵀx - bᵢ
目标函数则是所有残差分量的平方和:
f(x) = (ã₁ᵀx - b₁)² + … + (ãₘᵀx - bₘ)²
求解方程组 Ax = b 意味着让每一个残差 rᵢ 都为零。在超定情况下,这通常无法实现。最小二乘法作为一种折衷方案,试图让所有残差的平方和最小化,从而在整体上让所有方程都“尽可能接近”成立。
一个简单示例
让我们通过一个简单的例子来直观理解最小二乘法。
考虑矩阵 A 和向量 b:
A = [2, 0; 0, 0; 0, 2]
b = [1; 0; -1]
方程组 Ax = b 无解。如果我们强行令 x₁ = 1/2, x₂ = -1/2 来满足第一个和第三个方程,那么第二个方程的残差为 -1。
最小二乘法的目标是最小化目标函数:
f(x) = (2x₁ - 1)² + (0 - 0)² + (2x₂ + 1)²
通过微积分求导(或后文将介绍的方法),可以找到最优解:
x̂ = [1/3; -1/3]
此时,对应的残差范数平方 f(x̂) = 2/3,小于之前尝试得到的 1。向量 Ax̂ = [2/3; 0; -2/3] 是列空间中最接近 b 的向量。
最小二乘解的推导与计算
上一节我们通过例子感受了最小二乘法,本节中我们来看看如何系统地求解它。我们假设矩阵 A 的列是线性无关的。
1. 通过微积分推导(正规方程)
目标函数 f(x) = ||Ax - b||² 对 x 求梯度,并令其为零:
∇f(x) = 2Aᵀ(Ax - b) = 0
整理后得到著名的正规方程:
AᵀA x̂ = Aᵀb
由于 A 列满秩,矩阵 AᵀA(格拉姆矩阵)可逆。因此,最小二乘解为:
x̂ = (AᵀA)⁻¹ Aᵀb
这正是我们之前学过的伪逆矩阵 A† 与 b 的乘积:
x̂ = A†b
当 A 是方阵且可逆时,伪逆就是普通的逆,上式退化为精确解 x = A⁻¹b。因此,最小二乘解是线性方程组求解的自然推广。
编程提示:在许多数值计算语言(如MATLAB、Python的NumPy)中,常用反斜杠运算符
x = A \ b来统一表示求解线性方程组(当A方阵)或最小二乘问题(当A高矩阵)。这背后通常对应着高效的QR分解算法。
2. 直接验证与正交性原理
我们可以直接验证 x̂ = A†b 确实是最小解。将任意解 x 的残差范数平方进行分解:
||Ax - b||² = ||A(x - x̂) + (Ax̂ - b)||²
= ||A(x - x̂)||² + ||Ax̂ - b||² + 2 * [A(x - x̂)]ᵀ (Ax̂ - b)
利用正规方程 Aᵀ(Ax̂ - b) = 0,可知上式中最后一项交叉项为零。因此:
||Ax - b||² = ||Ax̂ - b||² + ||A(x - x̂)||²
由于 ||A(x - x̂)||² ≥ 0,我们得到对于任意 x:
||Ax - b||² ≥ ||Ax̂ - b||²
这直接证明了 x̂ 是最小解。同时,等式成立仅当 A(x - x̂) = 0,由于 A 列满秩,这意味着 x = x̂,解是唯一的。
从推导中我们还得到一个关键结论:最优残差向量 r̂ = Ax̂ - b 与 A 的所有列向量正交(即 Aᵀ r̂ = 0)。这被称为正交性原理。
3. 通过QR分解进行计算
在实际计算中,我们通常通过QR分解来高效稳定地求解最小二乘问题。
首先,对 A 进行QR分解(假设列满秩):
A = QR
其中 Q 是列正交矩阵,R 是上三角矩阵。
那么,最小二乘解可以高效地计算如下:
x̂ = R⁻¹ Qᵀ b
计算步骤为:
- 计算QR分解
A = QR(复杂度约2mn²浮点运算)。 - 计算向量
c = Qᵀb(复杂度约2mn浮点运算)。 - 通过回代法求解上三角系统
R x̂ = c(复杂度约n²浮点运算)。
总计算成本主要由QR分解决定。值得注意的是,这与求解可逆方阵方程组 Ax = b 的算法完全一致,体现了数学上的统一性。
总结
本节课中我们一起学习了最小二乘法。
- 核心问题:在方程组 Ax = b 超定(无精确解)时,寻找 x 最小化残差范数平方
||Ax - b||²。 - 几何意义:在 A 的列空间中寻找最接近 b 的点。
- 代数解:在 A 列满秩的假设下,解由伪逆给出
x̂ = A†b = (AᵀA)⁻¹Aᵀb,等价于求解正规方程AᵀA x̂ = Aᵀb。 - 关键性质:最优残差与 A 的列空间正交(正交性原理)。
- 计算方法:通常通过QR分解
A=QR来稳定高效地计算x̂ = R⁻¹(Qᵀb)。


最小二乘法是数据拟合、回归分析、信号处理等众多领域的基石。理解其原理和计算方法至关重要。


📊 课程 P34:L12.2 - 最小二乘法应用示例
在本节课中,我们将学习最小二乘法在实际中的两个简单应用。我们将通过广告投放预算分配和区域均匀照明这两个例子,来理解如何将抽象的数学公式转化为解决实际问题的工具。
🛒 应用一:广告投放预算分配
上一节我们介绍了最小二乘法的基本概念,本节中我们来看看如何将其应用于广告预算分配。广告商希望将预算分配到不同的广告渠道,以达到对不同人群(即“人口统计群体”)的特定曝光目标。
问题建模
假设我们有 M 个不同的人口统计群体(例如“18-22岁大学生”、“35-40岁女性”),以及 N 个广告投放渠道(例如搜索引擎、杂志、网站)。我们的目标是让每个群体获得特定的曝光次数(即“印象数”)。
- 目标向量
v_desired:一个M维向量,表示我们希望每个群体获得的印象数。 - 花费向量
s:一个N维向量,表示我们计划在每个广告渠道上花费的金额。 - 覆盖矩阵
R:一个M x N的矩阵。矩阵元素R_ij表示在渠道j上每花费1美元,能在群体i中获得多少印象数。
当我们执行矩阵乘法 v = R * s 时,得到的结果 v 就是一个 M 维向量,表示根据我们的花费计划 s,实际能在每个群体中获得的印象数。
我们的目标是找到一个花费向量 s,使得实际获得的印象数 v 尽可能接近目标印象数 v_desired。这可以表述为一个最小二乘问题:
公式: minimize ||v_desired - R * s||^2
其中,||...|| 表示向量的范数(长度)。通过求解这个最小二乘问题,我们可以得到最优花费计划 s_hat。
理解矩阵 R
在深入计算前,理解矩阵 R 的含义至关重要。
- 矩阵
R的一行:代表一个特定的人口统计群体。该行向量显示了在每个广告渠道上花费1美元,能从这个群体中获得多少印象数。如果你想专门针对某个群体(例如大学生),你会扫描对应行,找到数值最大的渠道,因为那是针对该群体最“划算”的渠道。 - 矩阵
R的一列:代表一个特定的广告渠道。该列向量显示了在该渠道上花费1美元,能触达每个群体多少人。通过查看一列,你可以知道哪个群体是该渠道的主要受众。
求解与示例
通过最小二乘法求解,在代码中通常表示为:
代码: s_hat = R \ v_desired
假设一个简化例子:有10个人口统计群体(M=10)和3个广告渠道(N=3)。目标是为每个群体获得1000(千次)印象。覆盖矩阵 R 和求解得到的最优花费 s_hat 可能如下所示:
s_hat的结果可能显示,大部分预算应投入渠道三,少量投入渠道一和二。- 实际获得的印象数
v = R * s_hat将非常接近目标值1000,大部分群体的误差在±20%以内。
这个方法的强大之处在于,无论群体数 M 和渠道数 N 变得多大(例如上万个群体和数百个渠道),求解的代码 R \ v_desired 保持不变,可以高效计算出人工无法手动调整的最优方案。
注意:通过标准最小二乘法求得的
s_hat可能包含负值(即“应在某个渠道上获得退款”),这在实际中不可行。解决此问题需要引入额外的约束(如s >= 0),这属于更高级的优化范畴。
💡 应用二:区域均匀照明
现在,我们来看最小二乘法的另一个应用:设计灯光功率,使一个区域获得均匀的照明。
问题建模
假设我们有一个需要照明的区域(例如房间地面),并将其划分为 M 个小区域(像素)。区域上方有 N 盏灯,每盏灯的位置和高度可能不同。
- 目标照明向量
b:一个M维向量,表示我们希望每个小区域达到的照明强度。为了均匀照明,b的所有元素可以都设为同一个值(例如1)。 - 灯光功率向量
x:一个N维向量,表示每盏灯的设置功率。 - 照明矩阵
A:一个M x N的矩阵。矩阵元素A_ij表示当仅打开第j盏灯且功率为1时,在第i个小区域产生的照明强度。这个值通常与距离的平方成反比。
当我们执行矩阵乘法 illumination = A * x 时,得到的结果就是所有灯共同作用下,每个小区域的实际照明强度。
我们的目标是找到一个灯光功率向量 x,使得实际照明强度尽可能接近目标强度 b。这同样是一个最小二乘问题:
公式: minimize ||b - A * x||^2
理解矩阵 A
同样,理解矩阵 A 的物理意义很重要。
- 矩阵
A的一列:代表一盏灯。该列向量显示了当这盏灯以单位功率打开时,在整个区域产生的照明分布图。正下方的区域最亮,随着距离增加亮度衰减。 - 矩阵
A的一行:代表一个小区域。该行向量显示了所有灯对该区域的“照明效率”。距离该区域近的灯,对应的行元素值较大;距离远的灯,对应的值较小。
求解与示例
假设我们将地面划分为25x25=625个区域(M=625),上方有若干盏灯。如果简单地将所有灯设置为相同功率(x 为全1向量),得到的照明可能不均匀:区域中央因灯光叠加而过亮,角落则较暗。
通过求解最小二乘问题 x_hat = A \ b,我们可以得到优化的功率设置 x_hat。结果可能显示:
- 位于区域中央、灯光密集处的灯,其功率应调低。
- 位于边缘、灯光稀疏处的灯,其功率应调高。
应用优化后的 x_hat,整个区域的照明均匀性将得到显著改善。照明的直方图分布会更集中地围绕目标强度,误差范围(如从±25%缩小到±10%)大大减小。
📝 总结
本节课中我们一起学习了最小二乘法的两个实际应用案例。
- 广告预算分配:我们利用覆盖矩阵
R,将花费向量s映射到各群体印象数v,并通过最小化||v_desired - R*s||^2来找到最优预算分配方案。 - 区域均匀照明:我们利用照明矩阵
A,将灯光功率向量x映射到各区域照明强度,并通过最小化||b - A*x||^2来找到使照明最均匀的灯光功率设置。


这两个例子展示了最小二乘法如何将复杂的多变量调整问题,转化为一个可以通过 矩阵 \ 向量 这样简洁计算求解的数学问题。其核心思想是通过线性模型描述系统,并寻找使目标与实际结果之间差距(以平方和衡量)最小的参数。尽管示例经过简化,但同样的原理可以扩展到海量变量和约束的实际场景中。


📊 课程 P35:L13.1 - 最小二乘数据拟合
在本节课中,我们将学习最小二乘数据拟合。这是最小二乘法最重要的应用之一。我们将从一个简单的模型开始,逐步理解如何利用数据来构建预测模型。
概述
数据拟合的核心问题是:我们有一个标量结果 y 和一个 n 维向量 x,我们相信它们之间存在某种函数关系,即 y 近似等于 f(x)。这里的 x 通常被称为自变量或特征向量,y 被称为结果或响应变量。
然而,我们通常并不知道这个真实的函数 f。实际上,在许多实际应用中,可能根本不存在一个完美的 f。我们的目标是通过一组已知的数据点,构建一个近似的模型 f̂ 来预测 y。
数据与模型
我们基于一组数据来构建模型。这组数据包含 N 个数据点,每个数据点由自变量 x⁽ⁱ⁾ 和对应的结果 y⁽ⁱ⁾ 组成,其中 i = 1, 2, ..., N。
我们的模型 f̂ 将采用一种简单的形式:它是 p 个基函数 f₁(x), f₂(x), ..., fₚ(x) 的线性组合。模型参数是系数 θ₁, θ₂, ..., θₚ。
模型公式:
f̂(x) = θ₁ f₁(x) + θ₂ f₂(x) + ... + θₚ fₚ(x)
基函数是我们预先选定的,它们决定了模型的结构。参数 θ 则是我们需要通过数据来确定的。
对于已知的数据点 (x⁽ⁱ⁾, y⁽ⁱ⁾),模型的预测值为 ŷ⁽ⁱ⁾ = f̂(x⁽ⁱ⁾)。我们当然希望预测值 ŷ⁽ⁱ⁾ 能尽可能接近真实值 y⁽ⁱ⁾。
最小二乘拟合
上一节我们介绍了模型的基本形式,本节中我们来看看如何确定最优的参数 θ。我们通过最小化预测误差来实现。
对于第 i 个数据点,其预测误差或残差 r⁽ⁱ⁾ 定义为真实值与预测值之差:
r⁽ⁱ⁾ = y⁽ⁱ⁾ - ŷ⁽ⁱ⁾
最小二乘数据拟合的目标是:选择参数 θ,使得在整个数据集上的均方根(RMS)预测误差最小。
RMS 误差公式:
RMS = sqrt( (1/N) * Σ (r⁽ⁱ⁾)² )
由于平方根是单调函数,最小化 RMS 误差等价于最小化残差的平方和。这可以转化为一个我们熟悉的最小二乘问题。
转化为最小二乘问题
为了清晰地展示参数 θ 如何影响预测,我们引入矩阵表示法。
首先,我们构造一个 N × p 的矩阵 A,其元素 Aᵢⱼ 是第 j 个基函数在第 i 个数据点 x⁽ⁱ⁾ 处的取值:
Aᵢⱼ = fⱼ(x⁽ⁱ⁾)
令 y_d 为所有真实结果 y⁽ⁱ⁾ 组成的向量,ŷ_d 为所有预测值 ŷ⁽ⁱ⁾ 组成的向量。那么预测向量可以简洁地表示为:
ŷ_d = A θ
残差向量 r_d = y_d - ŷ_d = y_d - A θ。我们的目标是最小化残差向量的范数平方:
minimize || y_d - A θ ||²
这正是标准的最小二乘问题。假设矩阵 A 的列是线性无关的,其最优解为:
最优参数公式:
θ̂ = (Aᵀ A)⁻¹ Aᵀ y_d
在实际计算中,我们通常使用更稳定的数值方法(如 QR 分解)来求解。在许多编程语言中,这可以简单地写为:
θ̂ = A \ y_d (这是代码表示,而非数学公式)
求得最优参数 θ̂ 后,对应的最小残差平方和 || y_d - A θ̂ ||² 除以 N,称为最小均方误差(MMSE)。
简单示例:常数模型
理解了最小二乘拟合的一般框架后,我们来看一个最简单的例子:常数模型。
我们只使用一个基函数,即 p = 1,且 f₁(x) = 1。这意味着我们的模型形式为:
f̂(x) = θ₁ * 1 = θ₁
换句话说,无论输入 x 是什么,模型都预测同一个常数 θ₁。
根据前面的公式,此时矩阵 A 就是一个所有元素都为 1 的 N 维列向量。将其代入最优解公式:
θ̂₁ = (Aᵀ A)⁻¹ Aᵀ y_d = (N)⁻¹ (Σ y⁽ⁱ⁾) = mean(y_d)
结果非常直观:最优的常数预测值就是数据 y 的平均值。
此时,最小的均方误差恰好是数据 y 的方差,而 RMS 误差就是数据的标准差。
这个简单的模型为我们提供了一个重要的基线。任何更复杂的模型,其性能都必须与这个仅仅预测平均值的常数模型进行比较。如果一个复杂模型的 RMS 误差只比数据的标准差小一点点,那么它的实际价值可能非常有限。
总结
本节课中我们一起学习了最小二乘数据拟合的核心思想。
- 我们定义了数据拟合问题,即用近似模型
f̂来预测变量y。 - 我们介绍了使用基函数线性组合的模型形式。
- 我们将寻找最优参数的问题,转化为最小化预测误差的平方和,即一个最小二乘问题。
- 我们推导了最优参数
θ̂的矩阵解公式。 - 我们分析了一个最简单的常数模型案例,发现其最优解就是数据的均值,并且其误差与数据的标准差直接相关,这为评估更复杂模型提供了基准。


理解这个基线模型至关重要,它是衡量任何数据拟合模型性能的起点。


📊 课程 P36:L13.2 - 单变量函数拟合
在本节课中,我们将学习如何对单变量函数进行拟合。这意味着我们的特征向量或自变量 X 是一个标量。我们将从最简单的常数拟合出发,逐步探讨直线拟合、多项式拟合,并了解如何将这些方法应用于时间序列分析等实际问题。
🎯 单变量数据与散点图
当特征 X 的维度为 1 时,我们可以将数据绘制成散点图。例如,横轴是 X,纵轴是 y,数据点可能呈现为一系列分散的点。当我们创建一个模型函数 y_hat = f_hat(x) 时,我们可以为每个 x 值计算预测值,从而在图上绘制出一条曲线。在这种情况下,我们不仅可以通过计算均方根误差等指标来评估拟合效果,还可以直观地用肉眼判断拟合的好坏。
📈 直线拟合
在上一节我们介绍了常数拟合之后,本节我们来看看比它稍复杂一点的模型:直线拟合。这个模型有两个系数,即 p=2。
以下是该模型使用的基函数:
- 第一个基函数是常数 1。
- 第二个基函数是
x。
因此,模型的形式为:
f_hat(x) = θ_1 + θ_2 * x
我们需要确定参数 θ_1 和 θ_2。与常数模型类似,我们可以构造矩阵 A。矩阵 A 的行代表不同的数据点,第一列是基函数 f1 在这些点上的取值(恒为 1),第二列是 x 值本身,即 [x1, x2, x3, ...]^T。这是一个 n x 2 的矩阵。
我们可以通过计算 (A^T * A)^-1 * A^T * y 来得到最优参数 θ_hat。对于这个 2x2 的矩阵,我们可以直接推导出解析解。这个解析解具有很好的可解释性,其预测公式如下:
y_hat = avg(y) + ρ * (std(y) / std(x)) * (x - avg(x))
其中,ρ 是 x 和 y 的相关系数。公式中 (x - avg(x)) / std(x) 部分就是 x 的 z 分数,它表示 x 偏离其均值的标准差倍数。如果 x 和 y 不相关(ρ=0),则整个第二项消失,模型退化为常数模型(即最佳直线是水平的)。如果相关性很高(ρ 接近 1),则当 x 高于均值时,预测的 y 也会倾向于高于其均值。
需要强调的是,推导这个解析解只是为了帮助理解,在实际计算中,它并没有任何优势。在代码中,我们通常直接使用矩阵运算来求解。
以下是在代码中实现直线拟合的典型方式:
# 构造矩阵 A
A = np.column_stack([np.ones_like(x), x])
# 使用最小二乘法求解 θ_hat
theta_hat = np.linalg.lstsq(A, y, rcond=None)[0]
# 或者使用伪逆
theta_hat = np.linalg.pinv(A) @ y
因为这个模型的图像是一条直线(更准确地说,是一个仿射函数),所以它被称为直线拟合。有些人也称之为线性拟合,尽管严格来说仿射函数并非线性函数。
💹 直线拟合示例:市场模型
直线拟合的一个经典应用是金融中的市场模型。在这个模型中,标量 X 代表整个市场的日收益率,y 代表某个特定资产(例如苹果公司股票)的日收益率。通过收集每日的 (X, y) 数据对,我们可以建立一个直线模型来根据市场收益率预测资产收益率。
该模型通常写作以下形式:
y_hat = r_f + α + β * (x - μ_market)
其中:
r_f是无风险利率(例如美国国债利率,日度下近似为0)。μ_market是市场收益率的均值。α和β是模型的参数,分别被称为该资产的 Alpha 和 Beta。
Beta 衡量了资产相对于市场波动的敏感度。如果 Beta=1,意味着当市场上涨1%时,预计该资产也会上涨约1%。Alpha 则代表了超出市场基准的额外收益。尽管有些理论认为 Alpha 应为零,但实证中许多对冲基金认为它存在。这个模型本质上就是一个直线拟合。
⏳ 直线拟合示例:趋势线
直线拟合的另一个重要应用是时间序列的趋势分析。假设 X_i 是时间戳,为简化可令 X_i = i,这表示我们在等间隔时间点上采样了 y 值。用直线模型拟合这样的数据,得到的直线被称为 趋势线。模型的斜率 θ_2 具有明确的解释:它代表了 y 值随时间推移的大致平均变化量(例如,每年石油消费量增加多少百万桶)。
从原始数据中减去趋势线,就得到了 去趋势化的时间序列。这个过程可以揭示数据围绕长期趋势的波动情况,例如哪些年份高于趋势,哪些年份低于趋势,从而可能显示出周期性等结构。
🧮 多项式拟合
在掌握了直线拟合之后,我们可以尝试更灵活的模型,例如多项式拟合。我们选择以下形式的基函数:
f_i(x) = x^(i-1),其中 i = 1 到 p。
这意味着:
f1(x) = 1(常数项)f2(x) = xf3(x) = x^2- ... 以此类推
用参数 θ_i 对这些基函数进行线性组合,就得到了一个关于 x 的多项式模型:
f_hat(x) = θ_1 + θ_2*x + θ_3*x^2 + ... + θ_p*x^(p-1)
此时,矩阵 A 的构造方式是:每一行对应一个数据点,第 j 列是第 j 个基函数在所有数据点上的取值。这个矩阵在数学上被称为 范德蒙矩阵。我们通过最小二乘法求解参数 θ_hat。
在代码中,实现多项式拟合的模板非常清晰:
# 1. 构造范德蒙矩阵 A
A = np.vander(x, p, increasing=True) # 方法之一
# 或手动构造:A = np.column_stack([x**i for i in range(p)])
# 2. 求解最小二乘解
theta_hat = np.linalg.lstsq(A, y, rcond=None)[0]
随着多项式次数(p-1)的增加,模型可以更紧密地贴合数据,捕捉更细微的波动。但这也引出了一个关键问题:我们应该选择多少次数的多项式?答案并非越高越好,过度拟合(Overfitting)的风险我们将在后续章节讨论。
🔄 回归模型与线性参数模型的关系
我们已经看到了回归模型和这里的“线性参数最小二乘拟合”模型,它们之间联系非常紧密,甚至可以看作是同一事物的两种不同表示。
回顾一下,回归模型的形式为:
y_hat = v + β_1*x_1 + β_2*x_2 + ... + β_n*x_n
其中 v 是截距,β_i 是系数,具有清晰的解释性(例如 β_3 表示 x_3 每变化一单位对预测值的影响)。
我们可以将回归模型纳入我们的通用框架,只需定义基函数为:
f1(x) = 1, f2(x) = x_1, f3(x) = x_2, ..., f_{n+1}(x) = x_n。
这样,我们的通用模型 f_hat = θ_1 + θ_2*x_1 + ... + θ_{n+1}*x_n 就与回归模型完全一致,其中 θ_1 对应 v,其余 θ 对应 β。因此,回归是我们通用拟合框架的一个特例。
反过来,我们也可以将通用的线性参数模型视为一种特殊的回归。只需将原始特征 x 通过基函数 f_i 进行变换,得到新的特征 f_2(x), f_3(x), ..., f_p(x),然后对这个新的特征集进行回归。这被称为 特征变换 或 特征映射。因此,这两种建模思路本质上是相通的,只是 notation 不同。
🤖 自回归时间序列模型
最后,我们探讨一个强大而实用的模型:自回归(AR)时间序列模型。假设我们有一个时间序列数据 z_1, z_2, z_3, ...(例如每小时温度、每日股价)。
自回归模型的目标是预测下一个时间点的值(一步超前预测),其形式为:
z_hat_{t+1} = θ_1 * z_t + θ_2 * z_{t-1} + ... + θ_M * z_{t-M+1}
其中 M 称为模型的 记忆长度。这个模型非常直观:它用过去 M 个时刻的值来预测下一个时刻的值。例如,一个 AR(2) 模型预测明天的值等于 θ_1 * (今天的值) + θ_2 * (昨天的值)。
我们将该预测问题转化为我们的标准拟合形式:将“下一时刻的真实值 z_{t+1}”作为 y,将“过去 M 个时刻的值 [z_t, z_{t-1}, ..., z_{t-M+1}]”作为特征向量 x。然后构造数据矩阵,用最小二乘法求解参数 θ。
🌡️ 自回归模型示例:温度预测
我们以洛杉矶机场2016年5月的每小时温度数据为例。简单的预测策略包括:
- 常数预测:总是猜平均温度61.76°F,其RMS误差约为3°F。
- 持久性预测:预测下一小时温度等于当前温度,RMS误差约为1.16°F。
- 周期性预测:预测下一小时温度等于24小时前的温度,RMS误差约为2°F。
当我们使用一个记忆长度 M=8 的自回归(AR(8))模型时,RMS误差可以降低到1°F以下。这个简单的模型仅用过去8小时的数据来预测下一小时,其表现优于上述的简单策略。在实践中的启示是:在尝试复杂模型之前,永远应该先建立并评估简单基准模型,以此衡量复杂模型带来的实际提升是否值得。
📝 总结
本节课我们一起学习了单变量函数的拟合。
- 我们从直观的散点图开始,理解了单变量拟合的特点。
- 接着,我们深入探讨了 直线拟合 的原理、解析解的可解释性及其在金融(市场模型)和时间序列(趋势分析)中的应用。
- 然后,我们介绍了更灵活的 多项式拟合,并了解了其实现方式。
- 我们澄清了 回归模型 与 线性参数最小二乘模型 本质上是相通的,只是表述方式不同。
- 最后,我们学习了 自回归(AR)时间序列模型,这是一个用历史数据预测未来值的强大工具,并通过温度预测的实例看到了其效果。


这些模型是数据拟合的基础,掌握它们为后续处理更复杂的模型和评估方法打下了坚实的基础。


课程 P37:L13.3 - 拟合效果验证 🧪
在本节课中,我们将要学习一个在构建预测模型时至关重要的主题:验证。我们将探讨如何评估模型在未知数据上的表现,以确保其在实际应用中的有效性。
概述
构建预测模型时,我们的目标并非仅仅预测已知数据的结果,因为对于已知数据,我们早已清楚其真实结果。真正的目标是让模型能够准确预测新的、未见过的数据。一个能在新数据上做出合理预测的模型,被称为泛化能力好。反之,如果模型在新数据上表现不佳,则可能出现了过拟合。
验证的基本思想
验证的核心思想非常简单,它模拟了模型在实际中的使用方式。
以下是验证的基本步骤:
- 划分数据集:将初始数据集划分为两部分。一部分是训练集,用于构建模型;另一部分是测试集(或验证集),被保留起来,在模型构建阶段完全不使用。
- 训练模型:使用训练集来拟合或“训练”模型。
- 测试模型:将训练好的模型应用于测试集,进行预测。
- 评估性能:因为我们知道测试集的真实结果,所以可以计算预测值与真实值之间的误差,从而评估模型在未知数据上的表现。
通过这种方式,我们可以得到一个对模型未来表现的合理估计。虽然这不是绝对的保证,但提供了一个强有力的参考。
验证的实践与评估
上一节我们介绍了验证的基本思想,本节中我们来看看如何具体操作和评估结果。
在验证过程中,我们可以做以下几件事:
- 比较误差:检查模型在训练集和测试集上的均方根预测误差。如果两者大致相当,会让我们对模型更有信心。通常,测试集误差会略高于训练集误差。
- 报告测试误差:在实践中,真正重要的是模型在测试数据上的误差。这是向他人展示模型性能时应报告的数字。
如果验证结果良好,我们可以推测模型将具有良好的泛化能力。例如,你可以说:“我用前一年半的数据训练了模型,然后用过去六个月的数据(模型从未见过)进行测试,预测误差在±7%左右。”这是一个令人信服的证据。
当然,你无法保证模型在未来一定表现良好,因为现实世界可能会发生变化。验证提供的是一个基于历史数据的合理推测。
验证的核心作用:模型选择
验证的一个极其有用的作用是解决“哪个模型更好”的争论。在实际工作中,我们常常会生成多个候选模型。
例如,对于一个数据集,我们是应该用三次多项式拟合,还是用八次多项式拟合?仅看训练数据无法回答这个问题,因为更高次数的多项式在训练集上总能拟合得更好,但这并不意味着它在未来数据上也会更好。
验证可以清晰地回答这个问题。以下是使用验证进行模型选择的典型方法:
- 在所有候选模型中,选择在测试集上误差最小的那个。
- 在误差相近的情况下,倾向于选择更简单的模型(例如,选择三次多项式而非十次多项式)。
一个验证示例:多项式拟合
让我们通过一个具体例子来观察验证的效果。我们使用一个包含200个数据点的数据集,其中100个作为训练集,用于拟合不同次数的多项式模型(二次、六次、十次、十五次)。另外100个数据点作为测试集。
下图展示了模型在测试集上的预测效果(蓝色曲线),这是一个对模型未来表现的诚实模拟。

随着模型次数增加,训练误差(蓝色曲线)持续下降,这是必然的。

然而,测试误差(红色曲线)的变化则揭示了关键信息:
- 对于低次模型(如二次、四次),训练误差和测试误差都较高,但相差不大。
- 当模型复杂度增加到一定程度(如六次)时,测试误差达到最低。
- 继续增加复杂度(如十次、十五次),训练误差虽然继续降低,但测试误差反而开始显著上升。例如,二十次多项式的训练误差约为0.21,但测试误差却高达0.4。
这个例子清晰地展示了过拟合:模型过度学习了训练数据中的噪声和细节,导致在新数据上表现变差。传统的经验法则是选择测试误差最小的模型(本例中为六次)。但考虑到模型的简洁性,测试误差与之接近的四次多项式也是一个不错的选择。
交叉验证:更稳健的评估方法
除了简单的训练-测试集划分,还有一种更常用、更稳健的验证方法,称为交叉验证。
其工作原理如下:
- 将原始数据随机分成K个大小相似的组,称为“折”。
- 进行K轮迭代。在每一轮中:
- 将其中一折作为测试集。
- 用剩余的K-1折数据训练模型。
- 用训练好的模型对当前这一折测试集进行预测并计算误差。
- 最终,我们会得到K个不同的“诚实”测试误差(因为每一折数据都曾作为模型未见过的测试集)。
以下是交叉验证的常见形式:
- 5折交叉验证:K=5
- 10折交叉验证:K=10
交叉验证的工程实践价值很高,因为它允许我们进行一些常识性检查:
- 检查误差一致性:如果测试误差显著大于训练误差,这是一个危险信号。
- 评估稳定性:如果K次迭代得到的测试误差都比较一致,且与训练误差处于同一量级,那么我们可以更有信心地认为模型在未来会表现稳定。
当然,这依然不是绝对的保证。如果数据背后的系统发生根本性变化(例如,市场环境剧变),即使经过完美验证的模型也可能失效。
交叉验证实例:房价预测
让我们看一个简单的房价预测例子,使用5折交叉验证。
模型:我们用一个非常简单的线性模型来预测房价(千美元),特征只有两个:房屋面积(千平方英尺)和卧室数量。
数据:774条房屋销售记录,随机分为5折,每折约155条记录。
我们进行5轮验证,每一轮用4折数据训练,用剩下1折数据测试。结果如下表所示:
| 轮次 | 偏移量 (θ₀) | 面积系数 (θ₁) | 卧室系数 (θ₂) | 训练RMS误差 | 测试RMS误差 |
|---|---|---|---|---|---|
| 1 | 54.5 | 163.1 | -18.4 | 74.3 | 71.8 |
| 2 | 58.3 | 157.5 | -20.3 | 75.1 | 73.2 |
| 3 | 60.1 | 155.8 | -19.7 | 76.8 | 79.5 |
| 4 | 56.7 | 159.2 | -18.9 | 73.9 | 77.1 |
| 5 | 55.2 | 161.5 | -19.2 | 74.5 | 75.6 |
观察结果:
- 模型参数(θ₀, θ₁, θ₂)在不同轮次中虽然不完全相同,但处于同一数量级,这是一个好迹象。
- 训练误差稳定在74-77之间。
- 测试误差在72-80之间,与训练误差处于同一水平,且没有出现异常大的值。
基于此,我们可以对该模型建立信心。我们可以用全部数据重新拟合一个最终模型,并合理预期其在新数据上的预测误差大约在70-85之间。
特征工程简介
在构建预测模型时,除了验证,另一个非常重要的环节是特征工程。这可以理解为对我们之前讨论的基函数的一种设计和选择。
基本流程如下:
- 从原始特征
x开始。 - 通过设计特征映射或变换
f,生成新的特征(即基函数)。这个过程就是特征工程。 - 使用这些新特征来拟合模型:
ŷ = θ₁ f₁(x) + θ₂ f₂(x) + ... + θ_p f_p(x)。 - 必须使用验证(如交叉验证)来检查模型性能。在报告时,应汇报测试误差,而非训练误差。
以下是一些常见的特征变换方法:
- 标准化:将特征减去其均值,再除以其标准差,得到近似服从标准正态分布的新特征(Z分数)。这使得不同特征具有可比性。公式为:
z_i = (x_i - mean(x)) / std(x)。 - 对数变换:如果特征
x_i非负且取值范围很大(如计数数据),常用log(1 + x_i)进行变换以压缩尺度。例如,产品销量可能从10到350,000,取对数后范围变得合理。 - 创建交互特征或非线性特征:
- 多项式特征:
x,x²,x³等。 - 分段线性特征:例如
f(x) = max(x - 1.5, 0)。当x < 1.5时,该特征为0;当x > 1.5时,该特征表示x超出1.5的部分。这可以捕捉“超过某个阈值后效应增强”的现象。
- 多项式特征:
特征工程实例:改进的房价预测
现在,我们用一个更复杂的特征工程例子来预测房价,并与之前的简单模型对比。
原始特征:
x1: 房屋面积(千平方英尺)x2: 卧室数量x3: 布尔特征(1=公寓,0=独栋屋)x4: 邮政编码(分类特征,有62个不同值)
特征工程(设计8个基函数):
f1(x) = 1(偏移量)f2(x) = x1(面积)f3(x) = max(x1 - 1.5, 0)(超过1500平方英尺的面积部分)f4(x) = x2(卧室数)f5(x) = x3(房屋类型)f6(x), f7(x), f8(x): 将62个邮政编码归类为4个区域,并用3个布尔特征进行“独热编码”表示。
我们使用5折交叉验证来评估这个模型。结果发现:
- 训练误差在67-70之间。
- 测试误差与训练误差处于同一量级(略高),大约在68-75之间。
- 模型参数在不同折之间保持相对稳定。
与之前仅使用面积和卧室数的简单模型(测试误差约70-88)相比,这个经过特征工程的模型表现更好(测试误差约68-75)。这表明我们设计的特征确实提升了模型的预测能力。
关于如何找到这些特征,答案通常是尝试和验证。你可能会尝试几十甚至上百种不同的特征组合、变换和阈值(例如,max(x1 - B, 0) 中的 B 可以尝试1.0, 1.5, 2.0等)。然后,通过交叉验证的测试误差来选择表现最好的模型。在性能相近时,优先选择更简单的模型。
最终模型的选择也取决于应用场景。有些场景(如向监管机构解释)需要模型简单可解释;而另一些场景(如某些量化交易)则只关心预测精度,不关心模型本身的意义。


总结
本节课中我们一起学习了预测模型构建中的关键环节——验证。
- 我们理解了验证的目的是评估模型在未知数据上的泛化能力,避免过拟合。
- 我们掌握了简单的训练-测试集划分验证法。
- 我们学习了更稳健的K折交叉验证方法及其工程实践意义。
- 我们探讨了特征工程的基本概念,即通过设计特征变换来提升模型表现,并认识到其效果必须通过验证来确认。
- 我们通过实例看到,验证是进行模型选择和超参数调优(如多项式次数、特征变换阈值)的客观依据。


记住,一个模型的最终价值在于其解决实际问题的能力,而验证是我们连接模型与实际问题之间最重要的桥梁。


📊 课程 P38:L14.1 - 分类问题
在本节课中,我们将学习什么是分类问题。我们将了解它与回归预测的区别,探讨其核心概念,并学习如何评估分类器的性能。
什么是分类问题
上一章我们学习了最小二乘回归,即预测一个数值。现在,我们将学习另一种预测形式——当你要预测的事物只取有限个值时,例如“真”或“假”,这被称为分类。在本讲中,我们将了解其工作原理,并看看如何使用最小二乘法来实现它。
分类本质上是数据拟合,但其输出(或称结果)通常是非数值的,例如:
- 真或假
- 垃圾邮件或非垃圾邮件
- 狗、马或老鼠
这些输出值被称为标签或类别。这种取有限个非数值结果的变量,可以称为类别变量。我们进行数据拟合的目标,就是完成分类。
布尔分类
我们将从最简单、也是最常见的情况开始:布尔分类。这意味着只有两种可能的结果,例如“真”和“假”,或“垃圾邮件”和“非垃圾邮件”。
为了便于数学处理,我们需要将它们编码为数值。一种常见的编码方式是:
- +1 代表“真”
- -1 代表“假”
另一种常见编码是“1”代表真,“0”代表假。
因此,一个分类器可以看作一个函数。它接收一个 n 维向量 x(我们的特征值),然后输出 -1 或 +1。输出 +1 表示模型预测结果为“真”,输出 -1 表示预测结果为“假”。
分类的应用
分类有非常广泛的应用,以下是一些例子:
以下是几个典型的应用场景:
- 电子邮件垃圾邮件检测:特征向量 x 可以包含邮件的词频统计、发件来源等信息。我们根据这些特征预测邮件是否为垃圾邮件。
- 金融交易欺诈检测:特征向量 x 包含交易信息(如金额、时间、商户)和发起者信息。分类器需要判断该交易是正常还是欺诈。实践中,这常被设计为“红-黄-绿”三分类系统。
- 文档分类:例如,从大量文档中找出与政治相关的文章。特征 x 可以是文档的词频直方图。
- 疾病检测:特征 x 包含患者的特征、医学检测结果和症状。分类器预测患者是否患有特定疾病。
- 数字通信接收器:特征 x 是接收到的信号(如不同天线或时间点的测量值)。需要预测传输的比特位是“真”还是“假”。
分类与数值预测的差异
分类与预测一个数值有本质区别。对于一个数据点 (x, y),其中 y 是真实标签(-1 或 +1),我们的预测结果是 ŷ = f̂(x),也取 -1 或 +1。
在数值预测中,我们通过误差大小(如均方根误差)来衡量预测的好坏。但在布尔分类中,真实值和预测值都只有两种可能,因此总共只有四种可能的情况:
以下是四种可能的预测结果:
- 真阳性:真实值为 +1(真),预测值也为 +1(真)。预测正确。
- 真阴性:真实值为 -1(假),预测值也为 -1(假)。预测正确。
- 假阳性:真实值为 -1(假),但预测值为 +1(真)。预测错误。
- 假阴性:真实值为 +1(真),但预测值为 -1(假)。预测错误
假阳性和假阴性在不同场景下可能带来严重后果。例如,在欺诈检测中,假阳性会错误地阻止合法交易;假阴性则会漏过欺诈交易。
混淆矩阵与性能评估
当我们对一个数据集(如测试集)应用分类器后,可以将所有数据点根据其真实标签和预测标签,归入上述四个类别,并统计数量。将这些计数放入一个矩阵中,就得到了混淆矩阵。
混淆矩阵的格式通常如下:
| 预测为 +1 | 预测为 -1 | |
|---|---|---|
| 真实为 +1 | 真阳性 (TP) | 假阴性 (FN) |
| 真实为 -1 | 假阳性 (FP) | 真阴性 (TN) |
- 对角线元素(TP, TN) 代表预测正确的次数。
- 非对角线元素(FN, FP) 代表预测错误的次数,体现了模型的“混淆”程度。一个完美的分类器,其混淆矩阵将是对角矩阵。
从混淆矩阵中,可以衍生出多种性能评估指标:
以下是几个核心的评估指标:
- 错误率:
(FP + FN) / (TP + TN + FP + FN)。即预测错误的数据点占总数的比例。 - 真阳性率 / 召回率:
TP / (TP + FN)。即在所有真实为正例的样本中,被正确预测出来的比例。 - 假阳性率:
FP / (FP + TN)。即在所有真实为负例的样本中,被错误预测为正例的比例。
评估一个分类器时,我们至少会关注一个(如错误率),有时会关注两到三个指标(如召回率和假阳性率)。需要注意的是,这些评估必须在测试集上进行,在训练集上计算没有意义。
实例:垃圾邮件过滤器
假设一个垃圾邮件过滤器在一个包含约1300封邮件的测试集上,得到如下混淆矩阵:
| 预测为垃圾邮件 | 预测为非垃圾邮件 | |
|---|---|---|
| 真实为垃圾邮件 (127) | 95 (TP) | 32 (FN) |
| 真实为非垃圾邮件 (1139) | 19 (FP) | 1120 (TN) |
我们可以计算:
- 错误率 =
(19 + 32) / 1266 ≈ 4.0% - 假阳性率 =
19 / 1139 ≈ 1.67%
错误率计算隐含了一个假设:假阳性和假阴性两种错误的严重程度相同。但在许多实际应用中,这个假设并不成立,我们可能更关心其中一种错误。因此,有时需要同时查看多个指标来全面评估模型性能。
总结


本节课我们一起学习了分类问题的基础知识。我们明确了分类是预测有限个类别标签的任务,并重点讨论了最常见的布尔分类。我们了解了分类与回归的区别,认识了真阳性、假阳性等四种预测结果,并学习了如何使用混淆矩阵及其衍生指标(如错误率、召回率)来评估分类器的性能。最后,通过一个垃圾邮件过滤器的实例,我们巩固了这些概念的实际应用。


📊 课程 P39:L14.2 - 最小二乘分类
在本节课中,我们将学习如何利用最小二乘法来构建、调整或拟合一个分类器。我们将从一个简单的二分类问题入手,了解其基本原理,并通过一个经典的手写数字识别案例来实践。最后,我们还会探讨分类中一个重要的概念——ROC曲线。
🧠 最小二乘分类的基本思想
上一节我们介绍了最小二乘法的基本概念,本节中我们来看看如何将其应用于分类问题。
其方法非常直接。我们将进行标准的最小二乘数据拟合,只不过此时的目标变量(或称“标签”)是 +1 或 -1。例如,在医疗诊断中,+1可能代表“患病”,-1代表“健康”。我们构建的模型会直接去拟合这个数值标签。
我们把这个拟合出的模型称为 f̃(x),而不是 f̂(x)。这是因为 f̃(x) 的输出是一个连续数值,而一个真正的分类器 f̂(x) 必须输出离散的类别(+1或-1)。我们的期望是:当真实标签 y 是 +1 时,f̃(x) 的值接近 +1;当 y 是 -1 时,f̃(x) 的值接近 -1。
为了得到最终的分类结果,我们需要一个决策函数 s(·) 来将连续值转换为类别:
def s(f_tilde_x):
if f_tilde_x >= 0:
return +1
else:
return -1
这个函数在 f̃(x) = 0 时(即决策边界)将结果判为 +1,当然,判为 -1 也可以,这在实际中影响不大。
我们可以这样理解 f̃(x) 的值:如果它接近 +1,模型对“正类”很有信心;如果接近 -1,则对“负类”很有信心;如果值在 0 附近(如 +0.01),则模型不太确定,但根据我们的规则,它仍会被归类为 +1。
✍️ 实战案例:MNIST 手写数字识别
现在,我们来看一个具体的例子,使用的是著名的 MNIST 数据集。该数据集包含 70,000 张 28x28 像素的手写数字图像(0到9),其中笔迹风格多样。
我们将问题简化为一个二分类任务:判断一张图片是否是数字 0。
- 如果是 0,则标签 y = +1。
- 如果是 1-9 中的任何一个,则标签 y = -1。
数据准备:
每张图片被展开为一个向量 x。由于图像边缘的像素总是黑色(值为0),这些像素不提供信息,因此我们实际使用的特征维度是 493,并额外添加一个常数项 1。
以下是我们在训练集(60,000张图片)和测试集(10,000张图片)上得到的结果:
训练集结果(混淆矩阵):
- 真正例 (TP):模型预测为0,实际也是0的图片数。约 5000+ 张。
- 假负例 (FN):模型预测不是0,但实际是0的图片数。765 张。
- 假正例 (FP):模型预测是0,但实际不是0的图片数。167 张。
- 真负例 (TN):模型预测不是0,实际也不是0的图片数。占大多数。
总体错误率约为 1.6%。
测试集结果:
在未见过的测试集上,我们得到了与训练集非常接近的错误率(同样约1.6%)。这表明我们的模型没有过拟合,泛化能力良好,可以用于识别新的手写数字0。
补充说明:虽然1.6%的错误率听起来不错,但在现代机器学习中,更先进的方法(包括本课程后续会介绍的一些方法)可以达到远低于此、甚至超越人类水平的性能。最小二乘分类是一个非常基础但有效的入门方法。
📈 深入分析:得分分布与系数解读
一个非常有趣的分析是观察模型在训练集上输出的 f̃(x) 值的分布。
下图展示了这个分布:
- 蓝色点:代表真实标签为 0(正类)的样本的 f̃(x) 值。
- 红色点:代表真实标签为非 0(负类)的样本的 f̃(x) 值。
我们的分类器在 f̃(x) = 0 处设置了一个阈值。位于阈值右侧(f̃(x) ≥ 0)的样本被分类为 0,左侧(f̃(x) < 0)的则被分类为非 0。
从图中可以清晰地看到两个类别的分离。虽然存在一些重叠(导致了错误分类),但整体上模型成功地区分了“0”和“非0”。
我们还可以查看分类器的系数(即模型学到的权重)。这些系数可以直观解释:
- 系数为负的像素:如果该像素位置较亮,会显著降低图像被判断为 0 的可能性。
- 系数为正的像素:如果该像素位置较亮,则会增加图像被判断为 0 的可能性。
- 从系数热力图中,我们甚至能隐约看到一个环状结构,这与数字 0 的书写形状是吻合的。
⚖️ 决策阈值与 ROC 曲线
在之前的讨论中,我们默认使用了 0 作为决策阈值。但有时,调整这个阈值可以优化分类器的表现,以适应不同的应用需求。
我们可以选择一个任意的阈值 α,并重新定义决策规则:
def f_hat(x, alpha):
if f_tilde(x) >= alpha:
return +1
else:
return -1
当 α = 0 时,就回到了我们之前的情况。α 被称为决策阈值。
- 提高 α(如设为 0.2):模型会更“保守”地预测正类(0)。这会减少假正例 (FP)(将非0误判为0),但同时也可能增加假负例 (FN)(将0误判为非0)。
- 降低 α(如设为 -0.3):模型会更“积极”地预测正类。这会减少假负例,但增加假正例。
通过系统性地改变 α,并计算对应的真正例率 (TPR) 和假正例率 (FPR),我们可以绘制出一条曲线,称为接收者操作特征曲线,即 ROC 曲线。
ROC 曲线解读:
- 曲线的横轴是假正例率 (FPR),纵轴是真正例率 (TPR)。
- 一个完美的分类器的 ROC 曲线会紧贴左上角(FPR=0, TPR=1)。
- 对角线(从原点到右上角的直线)代表随机猜测的性能。
- 我们的分类器的 ROC 曲线越靠近左上角,性能越好。
如何选择 α:
这没有统一的数学答案,完全取决于实际应用。我们需要权衡两种错误的代价:
- 假正例代价高:例如,垃圾邮件过滤器将重要邮件误判为垃圾邮件。我们应提高 α,减少误报。
- 假负例代价高:例如,疾病筛查中未检测出患者。我们应降低 α,确保尽可能捕捉所有病例。
🎯 课程总结
本节课中,我们一起学习了如何将最小二乘法应用于分类问题。
- 核心思想:通过最小二乘回归拟合数值标签(+1/-1),再通过阈值函数将连续输出转换为离散类别。
- 实战演练:我们使用 MNIST 数据集构建了一个区分数字“0”和“非0”的分类器,取得了约1.6%的错误率,并验证了其泛化能力。
- 模型分析:我们通过得分分布图直观看到了分类效果,并通过系数图对模型决策进行了解释。
- 高级话题:我们引入了决策阈值 α 的概念,并学习了如何通过绘制和分析 ROC 曲线 来评估和优化分类器在不同错误代价下的表现。


最小二乘分类是一个简单而有效的分类入门方法。在其他课程中,你将会学到更复杂、性能通常也更优的分类算法(如逻辑回归、支持向量机、神经网络等),但它们的许多核心概念(如决策边界、阈值、ROC分析)与本节课所学是相通的。理解最小二乘分类为你进一步探索机器学习领域奠定了坚实的基础。


课程 P4:L1.4 - 标量乘法与加法 📐
在本节课中,我们将学习向量的两种基本运算:加法与标量乘法。到目前为止,我们只是认识了向量,但还没有对它们进行任何操作。本节将正式介绍如何对向量进行相加和与数字相乘,并探讨这些运算的实际意义。
向量加法 ➕
上一节我们介绍了向量的例子,本节中我们来看看如何将两个向量相加。
向量加法要求两个向量维度相同。我们使用熟悉的加号 + 来表示向量加法,但其含义是逐元素相加。
以下是向量加法的定义和示例:
- 定义: 若
a和b都是 n 维向量,则它们的和a + b也是一个 n 维向量,其每个元素是a和b对应元素之和。- 公式:
(a + b)_i = a_i + b_i,其中i = 1, ..., n
- 公式:
- 示例:
- 设
a = [1, 7, 3],b = [2, 2, -1] - 则
a + b = [1+2, 7+2, 3+(-1)] = [3, 9, 2]
- 设
重要:不能对维度不同的向量进行加法运算,例如 [1, 2] + [1, 2, 3] 是无意义的。
向量加法具有一些基本性质,这些性质与数字加法类似,但运算对象是向量:
- 交换律:
a + b = b + a - 结合律:
(a + b) + c = a + (b + c) - 零向量: 存在一个所有元素均为0的零向量
0,使得a + 0 = 0 + a = a - 负向量: 对于任意向量
a,存在一个向量-a(每个元素是a对应元素的相反数),使得a + (-a) = 0
阅读这些等式时,需要“ mindful equation reading ”,即留意其中的 +、-、= 都是作用于向量的运算,而 0 代表与 a 同维的零向量。
标量乘法 ✖️
除了向量间的加法,我们还可以将一个数(称为标量)与一个向量相乘。
标量乘法的定义很简单:用标量乘以向量的每一个元素。
- 定义: 若
β是一个标量(实数),a是一个 n 维向量,则βa也是一个 n 维向量,其每个元素是β与a对应元素的乘积。- 公式:
(βa)_i = β * a_i,其中i = 1, ..., n
- 公式:
- 示例:
- 设
β = -2,a = [1, 9, 6] - 则
βa = [-2*1, -2*9, -2*6] = [-2, -18, -12]
- 设
标量乘法同样具有一些性质,理解这些等式时需仔细分辨运算对象是标量还是向量:
- 结合律(对标量):
(βγ)a = β(γa)(β,γ是标量,a是向量) - 分配律(对标量):
β(a + b) = βa + βb - 分配律(对向量):
(β + γ)a = βa + γa
线性组合:核心概念 ⚙️
将标量乘法与向量加法结合起来,我们就得到了本课程乃至许多数学领域的核心概念——线性组合。
以下是线性组合的定义:
- 定义: 给定一组向量
a1, a2, ..., am(每个都是 n 维向量)和一组标量β1, β2, ..., βm,表达式β1*a1 + β2*a2 + ... + βm*am称为这些向量的一个线性组合。标量β1, ..., βm称为系数。
一个重要的特例是,任何向量都可以表示为标准单位向量的线性组合。
- 公式: 对于 n 维向量
b = [b1, b2, ..., bn],有b = b1*e1 + b2*e2 + ... + bn*en,其中ei是第 i 个元素为1、其余为0的单位向量。
实际应用示例 🌟
到目前为止,运算规则本身可能略显枯燥。现在,我们通过几个例子来看看这些运算在实际中的意义。
1. 位移的合成 🧭
在物理学中,向量可以表示位移。向量加法对应着连续执行两个位移。
- 示例: 向量
a = [5, 1]表示向右5个单位,向上1个单位。向量b = [-1, 3]表示向左1个单位,向上3个单位。 - 合成位移:
a + b = [4, 4],表示从起点出发,最终净位移是向右4个单位,向上4个单位。这等价于先执行位移a再执行b,或先执行b再执行a。
向量减法 p - q 可以表示从点 q 到点 p 的位移向量。
2. 现金流组合 💰
在金融中,向量可以表示不同时间点的现金流。
- 示例: 考虑三个时期的现金流。
c1 = [1, -1.1, 0]: 现在借入1美元(现金流入),一年后偿还1.1美元(现金流出)。这是一个利率为10%的一期贷款。c2 = [0, 1, -1.1]: 一年后借入1美元,两年后偿还1.1美元。这是另一个一期贷款。
- 线性组合: 现在,考虑组合
c1 + 1.1 * c2。- 计算:
[1, -1.1, 0] + 1.1 * [0, 1, -1.1] = [1, 0, -1.21]
- 计算:
- 解释: 这个组合现金流表示:现在获得1美元,一年后无现金流,两年后支付1.21美元。这恰好等价于一个年化利率10%的两期贷款的现金流。我们通过两个一期贷款的线性组合,“复制”出了一个两期贷款。
总结 📝
本节课中我们一起学习了向量的基本运算:
- 向量加法: 将两个同维向量的对应元素相加。
- 标量乘法: 将一个标量与向量的每个元素相乘。
- 线性组合: 上述两种运算的结合,是贯穿本课程的核心概念。我们通过位移和金融现金流的例子,看到了线性组合如何描述现实世界中的合成与复制现象。


理解这些运算的规则是基础,而洞察它们在不同领域(如物理、金融、数据科学等)中的应用,才是学习线性代数的关键所在。


机器学习课程 P40:L14.3 - 多类分类 🎯
概述
在本节课中,我们将要学习多类分类。多类分类是指预测结果 y 的可能取值不止两个,而是有 K 个(K > 2)的情况。我们将介绍多类分类的基本概念、应用场景,并学习如何使用最小二乘法构建一个简单的多类分类器。
多类分类简介
上一节我们讨论了二分类问题,本节中我们来看看当类别数量超过两个时的情况。在多类分类中,标签集通常是整数 1 到 K,每个整数代表一个类别(例如,类别3可能代表“大象”、“橙色”或“欺诈”)。预测器 f̂ 是一个从特征空间 R^n 映射到这些标签的函数,即 f̂: R^n → {1, 2, ..., K}。这实质上将特征空间划分成了 K 个区域,每个区域对应一个预测类别。
对于给定的预测器和数据集,混淆矩阵现在是 K×K 的,而不再是二分类时的 2×2 矩阵。在某些应用中,混淆矩阵中不同非对角线位置的错误可能具有不同的严重程度。
多类分类的应用示例
以下是多类分类的一些典型应用场景:
- 手写数字识别:输入一张数字图片,预测它是
0到9中的哪一个(K=10)。 - 市场营销人口统计分类:根据客户的购买历史等数据,将其划分到数十个人口统计群组之一。
- 疾病诊断:根据患者的症状、检测结果和历史记录,从多种候选疾病(包括“无病”)中做出诊断。
- 翻译中的词义选择:根据上下文,确定一个多义词(如英文的“bank”)在目标语言(如波斯语)中对应的正确词汇。
- 文档主题预测:根据文档内容(如词频统计),将其归类到预设的多个主题(如体育、政治、科学)之一。
基于最小二乘法的多类分类方法
与二分类类似,虽然存在更复杂、效果更好的多类分类方法,但最小二乘法因其简单且能引入重要概念而值得学习。该方法的核心思想是为每个类别构建一个独立的二分类器。
以下是具体步骤:
-
为每个类别构建分类器:对于
K个类别,我们构建K个最小二乘分类器。第l个分类器f̂_l的任务是判断一个样本是否属于类别l(正类),还是属于其他所有类别(负类)。其输出为+1(属于类别l)或-1(不属于类别l)。 -
获取原始分数:我们实际使用的是分类器决策函数
f̃_l(x)的原始输出值(一个实数),而不是最终的±1符号。这个值可以理解为模型对“样本属于类别l”的置信度。值越接近+1,表示越确信属于该类别;越接近-1,表示越确信不属于该类别;值在0附近则表示不确定。 -
最终决策规则:对于一个新样本
x,我们计算所有K个分类器的原始分数f̃_1(x), f̃_2(x), ..., f̃_K(x)。最终的预测类别是给出最高原始分数的那个分类器所对应的类别。这可以用数学公式表示为:
f̂(x) = argmax_{l=1,...,K} f̃_l(x)
其中,argmax返回使函数值最大的索引l。
举例说明:假设有三个类别:苹果、香蕉、桃子。对于一个样本 x,三个分类器的原始输出为:f̃_苹果(x) = -0.7, f̃_香蕉(x) = +0.2, f̃_桃子(x) = +0.8。虽然 f̃_香蕉(x) 也是正数,但 f̃_桃子(x) 的置信度最高,因此最终预测为桃子。
手写数字识别实例
将上述方法应用于 MNIST 手写数字数据集(K=10),我们得到一个 10×10 的混淆矩阵。测试集上的错误率约为 14%。虽然这个错误率不低(大约每六次预测错一次),但考虑到这是最简单的模型,效果尚可。观察混淆矩阵可以发现,模型犯的错误大多是人类也容易混淆的数字对,例如将 9 误判为 4,或将 9 误判为 7。
通过特征工程提升性能
仅仅使用原始像素特征可能限制了模型性能。一个有趣且有效的方法是特征工程,即构造新的特征。这里介绍一种简单甚至有些“疯狂”的方法:添加随机特征。
具体操作是:生成一个 5000 × 784 的随机矩阵(784 是 28×28 图片的像素数),矩阵元素随机为 +1 或 -1。然后将原始特征向量 x 乘以这个随机矩阵,得到 5000 个新的随机特征,与原始特征拼接,形成总共 5784 维的新特征向量。
使用这个扩展后的特征集重新训练模型,性能得到显著提升:训练错误率降至约 1.5%,测试错误率降至约 2.6%。混淆矩阵中的非对角线元素大多变成了很小的个位数(如 0, 1, 3),表明模型性能大幅改善。
这揭示了机器学习中的一个重要观点:有时增加特征(即使是随机特征)可以扩展模型的表示能力,从而提升性能。当然,如果能够根据领域知识精心设计有意义的特征,性能还可以进一步提升。目前最先进的方法在手写数字识别上的错误率已经极低,甚至在某些测试集上可以达到接近零错误。
总结


本节课中我们一起学习了多类分类。我们了解了多类分类与二分类的区别,看到了它在诸多领域的应用。我们重点学习了如何使用最小二乘法构建多类分类器,其核心是为每个类别训练一个“一对多”的二分类器,并通过比较各分类器的原始输出置信度来做出最终决策。最后,我们通过手写数字识别的例子,演示了该方法的应用,并展示了通过添加随机特征进行特征工程可以显著提升模型性能。这为我们理解更复杂的分类模型奠定了基础。


课程 P41:L15.1 - 多目标最小二乘 🎯
在本节课中,我们将要学习多目标最小二乘。这是最小二乘法在实际应用中的一个重要扩展。我们将看到,这个问题可以非常迅速地转化为一个标准的最小二乘问题,因此我们能够轻松地处理它。多目标最小二乘在实践中非常有用。
什么是多目标最小二乘问题? 🤔
上一节我们介绍了标准最小二乘,本节中我们来看看它的多目标版本。多目标最小二乘问题的核心是:我们需要选择一个 n 维向量 x,这与标准最小二乘相同。但不同之处在于,我们现在不是只有一个最小二乘目标(即一个范数平方项),而是有 k 个这样的目标。
具体来说,我们有 k 个希望最小化的目标:
- J₁(x) = ||A₁x - b₁||²
- J₂(x) = ||A₂x - b₂||²
- ...
- Jₖ(x) = ||Aₖx - bₖ||²
其中,每个 Aᵢ 是一个 mᵢ × n 的矩阵(不同目标的矩阵可以有不同行数),bᵢ 是相应的 mᵢ 维向量。我们称 Jᵢ 为多目标优化问题中的“目标”,也称为“多准则”问题,因为我们同时关心 k 件事。唯一确定的是,我们希望所有这些目标都尽可能小。
加权求和法:将多目标转化为单目标 ⚖️
当我们有多个需要优化的目标时,一个传统且有效的方法是给它们分配权重,然后相加,形成一个单一的“主目标”。
我们定义加权和的目标函数 J 为:
J(x) = λ₁J₁(x) + λ₂J₂(x) + ... + λₖJₖ(x)
这里的权重 λ₁, λ₂, ..., λₖ 必须是正数。如果权重为负,则意味着鼓励对应的目标变大,这与我们的初衷相悖。这种方法被称为多准则问题的“标量化”——我们将 k 个不同的关切转化为一个单一的标量 J。
由于所有权重同时乘以任意正数不会改变优化结果,我们通常将第一个权重 λ₁ 设为 1。此时,J₁ 被称为“主要目标”,通常是我们最关心、最希望使其变小的量。而其他权重 λᵢ (i>1) 则表示我们关心第 i 个目标 Jᵢ 相对于主要目标 J₁ 的程度。例如,λ₂ = 5 意味着 J₂ 变大带来的“不适感”是 J₁ 变大的 5 倍。这些权重参数有时也被称为“超参数”。
一个重要的特例是双准则问题(k=2),其目标函数为:
J(x) = ||A₁x - b₁||² + λ ||A₂x - b₂||²
这里的 λ 直接衡量了第二个目标相对于第一个目标的重要性。
转化为标准最小二乘问题 🔄
现在,我们的任务是最小化这个加权目标函数 J(x)。我们可以利用矩阵和向量的技巧,轻松地将其转化为一个标准的最小二乘问题,从而直接套用已知的解法。
我们可以将 J(x) 重写为:
J(x) = ||Ãx - b̃||²
其中,Ã 和 b̃ 是通过堆叠原始数据并乘以权重的平方根得到的:
à = [ √(λ₁) A₁;
√(λ₂) A₂;
...
√(λₖ) Aₖ ]
b̃ = [ √(λ₁) b₁;
√(λ₂) b₂;
...
√(λₖ) bₖ ]
这样,多目标加权最小二乘问题就被完美地转化为了一个关于 Ã 和 b̃ 的标准最小二乘问题。假设 Ã 的列是线性无关的,其解为:
x̂ = (ÃᵀÃ)⁻¹ Ãᵀ b̃
或者用伪逆表示为 x̂ = Æ b̃。我们可以通过 à 的 QR 分解等多种方法来求解。
一个有趣的点是:单个目标对应的矩阵 Aᵢ 的列可以是相关的,但堆叠后形成的 Ã 必须保证列线性无关,才能得到唯一解。
帕累托最优与最优权衡曲线 📈
上一节我们介绍了如何求解,本节中我们来看看解的性质,特别是在双准则问题下的意义。当我们求解 min J₁(x) + λJ₂(x) 并让 λ 取遍所有正数时,会得到一系列解 x̂(λ)。这些解具有一个非常重要的性质:它们都是“帕累托最优”的。
以下是帕累托最优的定义:
- 支配:如果一个点 x 在所有目标(J₁ 和 J₂)上的值都严格小于另一个点 x̃,则称 x 支配 x̃。
- 帕累托最优:如果一个点 x 不被任何其他点所支配,则称它是帕累托最优的。
当我们变动 λ 时,解 x̂(λ) 对应的目标值对 (J₁(x̂), J₂(x̂)) 在平面上描绘出一条曲线,这条曲线被称为“最优权衡曲线”。曲线上的每一个点都是帕累托最优点。
为了更直观地理解,请看下图示例。图中横轴是主要目标 J₁,纵轴是次要目标 J₂。左下方向代表更优(两个目标值都更小)。最优权衡曲线展示了为了减少 J₂,你必须在 J₁ 上付出多少代价,反之亦然。曲线有时会有一个明显的“拐点”,在拐点附近,稍微牺牲一点 J₁ 可以换来 J₂ 的大幅改善。
如何在实践中使用多目标最小二乘? 🛠️
了解了原理后,我们来看看如何在实践中应用多目标最小二乘。其使用流程通常遵循以下步骤:
以下是具体的使用步骤:
- 确定主要目标:首先,明确你最想最小化的那个核心量,将其作为 J₁。
- 选择次要目标:然后,选择一个或多个你“希望”也能小的量作为 J₂, J₃, ...。这些目标通常用于引入一些期望的属性,例如希望解向量比较“平滑”,或者希望控制变化幅度不要太大。
- 调整权重:通过调整权重 λ 来获得不同的解 x̂(λ),直到找到一个你满意或至少可以接受的解。
调整权重的经验法则是:
- 如果你觉得 J₂ 太大了,就增加 λ。这会给第二个目标施加更大的惩罚,迫使优化后的 J₂ 变小(但通常 J₁ 会变大)。
- 如果你觉得 J₁ 太大了,就减小 λ。这会降低对第二个目标的关注,让优化更专注于减小 J₁。
这个过程有时是系统性的,但更多时候是通过手动“调试”来完成:输入一个 λ,观察得到的解和对应的目标值,进行一些模拟或评估,如果不满意就修改 λ 再试,直到获得满意的结果。
总结 📝


本节课中我们一起学习了多目标最小二乘。我们首先定义了同时最小化多个目标函数的问题。然后,我们介绍了通过加权求和法将其转化为单一目标的标准最小二乘问题,并给出了具体的转化公式。接着,我们探讨了双准则情形下的帕累托最优概念和最优权衡曲线,这帮助我们理解不同目标之间的取舍关系。最后,我们介绍了在实践中如何使用多目标最小二乘,核心在于通过调整权重参数来获得符合我们偏好的解。这种方法将权重作为“旋钮”,是处理具有多个竞争目标的优化问题的强大而实用的工具。


课程 P42:L15.2 - 多目标最小二乘控制 🎯
在本节课中,我们将学习多目标最小二乘在控制领域的一般应用。我们将了解如何通过选择输入来获得期望的输出,并探讨如何平衡多个相互冲突的目标。
概述 📖
控制的核心是选择一个动作或输入,以实现某个期望的输出或结果。我们将使用一个线性或仿射的输入-输出模型来描述系统,并应用多目标最小二乘方法来优化多个与输入和输出相关的目标。
控制问题的一般形式
上一节我们介绍了课程主题,本节中我们来看看控制问题的一般数学描述。
我们有一个 n 维向量 x,代表我们的动作或输入。我们有一个 m 维向量 y,代表使用输入 x 后产生的结果或输出。
输入和输出由一个线性或仿射的输入-输出模型关联,其形式如下:
y = A * x + b
矩阵 A 和向量 b 是已知的,它们可能来自物理原理模型,也可能来自数据拟合。控制的目标是选择输入 x(它决定了输出 y),并优化与 x 和 y 相关的多个目标。这正是我们使用多目标最小二乘的原因。
典型的目标函数
以下是控制问题中常见的两个目标函数。
-
主要目标 J₁:通常我们希望输出接近一个给定的目标值 y_desired。这个目标衡量了与期望输出的偏差,公式为:
J₁ = ||y - y_desired||² = ||A*x + b - y_desired||² -
次要目标 J₂:通常我们希望输入本身较小,这代表效率或成本。其公式为:
J₂ = ||x||²
另一种常见形式是希望输入接近某个标称值 x_nom,公式为:
J₂ = ||x - x_nom||²
这在顺序控制中很常见,x_nom 可以是上一时刻的控制动作,这有助于保证控制动作随时间平滑变化。
多目标控制的思想就是在达成主要目标(如接近期望输出)和次要目标(如控制输入不要过大或变化过快)之间进行权衡。
应用示例:产品需求塑造
让我们看一个具体的应用实例,虽然从事这项工作的人可能不称之为“控制”,但其数学形式是相同的。
假设我们有一组产品,当前价格向量为 p。我们计划通过一个相对价格变化向量 Δp 来调整价格。例如,Δp₃ = -0.1 意味着将产品3的价格降低10%。
价格变化会引发需求变化,两者通过需求价格弹性矩阵 Eᴰ 关联,其线性模型为:
Δd = Eᴰ * Δp
其中 Δd 是需求的变化量。
我们的目标是:
- 主要目标 J₁:使需求变化接近一个目标变化 Δd_target(例如,匹配我们的生产能力)。
J₁ = ||Δd - Δd_target||² = ||Eᴰ*Δp - Δd_target||² - 次要目标 J₂:不希望价格变动过大。
J₂ = ||Δp||²
然后,我们通过最小化加权目标函数来寻找最优的 Δp:
最小化 J₁ + λ * J₂
其中 λ 是一个权衡参数。
- 当 λ 非常小时,我们几乎只最小化 J₁,力求最接近目标需求变化。如果 Eᴰ 可逆,解将趋近于 Δp = (Eᴰ)⁻¹ * Δd_target,但这可能导致价格剧烈变动,超出线性模型的有效范围。
- 当 λ 非常大时,我们几乎只最小化 J₂,价格变动会越来越小。极限情况下,λ → ∞ 会得到 Δp = 0,即不调整价格。
因此,整个设置就是在偏离目标需求(J₁)和价格变动幅度(J₂)之间进行权衡。
进阶主题:鲁棒控制 🤖
上一节我们看了一个具体应用,本节中我们来探讨一个更高级但非常重要的主题——鲁棒控制。“鲁棒”指的是系统能够处理变化和不确定性。鲁棒控制指的是一种能够处理模型不确定性的控制方案。
假设我们有 K 个不同的输入-输出模型(例如,基于不同日期数据拟合得到,它们相似但不完全相同),每个模型称为一个“场景”:
y⁽ᵏ⁾ = A⁽ᵏ⁾ * x + b⁽ᵏ⁾, k = 1, ..., K
我们选择一个单一的输入 x,那么 y⁽ᵏ⁾ 就表示如果第 k 个模型是正确时的输出。
我们仍然希望输出接近 y_desired,但由于不知道哪个模型绝对正确,我们采取一种稳健的策略:最小化所有场景下偏差的均方值。
最小化 (1/K) * Σₖ ||y⁽ᵏ⁾ - y_desired||² = (1/K) * Σₖ ||A⁽ᵏ⁾*x + b⁽ᵏ⁾ - y_desired||²
这种方法得到的 x 将在所有可能场景下,以均方误差衡量的整体表现都较好,而不会为了某一个场景的最优而牺牲其他所有场景。这是一个在实践中极其有用的方法。
总结 🎓
本节课中我们一起学习了多目标最小二乘在控制中的应用。
- 我们首先建立了控制问题的一般形式,即通过输入 x 和仿射模型
y = A*x + b来影响输出 y。 - 我们定义了典型的目标函数:主要目标 J₁ 追求输出接近期望值,次要目标 J₂ 追求输入本身较小或变化平滑。
- 我们通过“产品需求塑造”的例子,展示了如何在调整价格以匹配目标需求与保持价格稳定之间进行权衡。
- 最后,我们介绍了鲁棒控制的基本思想,即当存在多个可能的系统模型时,通过最小化所有场景下的平均偏差来选择一个稳健的输入 x。


这种方法为我们处理具有多个、可能相互冲突目标的工程优化问题提供了一个清晰而强大的框架。


📊 课程 P43:L15.3 - 预估与正则化
在本节课中,我们将学习如何利用多目标最小二乘法进行参数估计和反演。我们将从一个基础的测量模型出发,探讨如何通过观测数据来估计未知参数,并引入正则化技术来处理实际问题中的先验信息。课程内容将涵盖最小二乘估计的基本思想、正则化的概念及其应用,并通过图像去模糊和断层扫描重建两个具体实例,展示这些方法在实际问题中的强大作用。
📐 测量模型与最小二乘估计
上一节我们介绍了多目标最小二乘法的基本框架。本节中,我们来看看它在参数估计问题中的应用。
在许多科学和工程领域,我们常常无法直接测量我们感兴趣的参数。例如,我们可能想了解地下岩层的密度,但无法在每个位置都进行钻孔测量。相反,我们只能在地表进行一些间接的观测。
这种情况可以用一个线性测量模型来描述:
y = Ax + v
其中:
x是一个m维向量,代表我们想要估计的未知参数。y是一个n维向量,代表我们实际观测到的测量值。A是一个n x m的矩阵,它根据物理原理或其他知识,描述了参数x如何映射到无噪声的理想观测值。v是一个n维向量,代表测量噪声、误差或干扰。
我们的目标是:在已知矩阵 A 和观测向量 y 的情况下,猜测出参数 x。
一个直观的想法是,假设噪声 v 很小。如果我们猜测了一个 x,那么对应的噪声估计就是 v = y - Ax。为了使噪声最小化,我们选择使这个差值最小的 x。这引出了最小二乘估计:通过最小化 ||Ax - y|| 来猜测 x。
换句话说,我们选择一个 x,使得模型预测的输出 Ax 尽可能接近我们实际观测到的 y。这完全符合直觉。
🛡️ 正则化估计
上一节我们介绍了基础的最小二乘估计。然而在实际问题中,我们通常对参数 x 有一些先验知识。例如,我们可能知道 x 的数值不应该太大,或者 x 的变化应该是平滑的。这些先验信息可以通过正则化技术融入到估计过程中。
以下是两种常见的正则化项及其数学表达:
-
Tikhonov 正则化:用于表达
x本身应该较小的先验信念。
公式为:J₁ = ||x||² -
平滑正则化:用于表达
x应该平滑变化的先验信念。通常通过一个差分算子D来实现。
公式为:J₂ = ||Dx||²
例如,如果x是一个时间序列,D可以是差分矩阵,那么Dx就代表了序列的差分(变化率)。最小化||Dx||²就意味着寻找一个变化平缓的x。
我们将这些先验信息与原始的数据拟合目标结合起来,形成一个多目标优化问题:最小化 ||Ax - y||² + λJ,其中 J 是正则化项(如 J₁ 或 J₂),λ 是一个正的正则化参数。
参数 λ 控制着我们对先验信息的重视程度:
λ很小时,解主要致力于拟合观测数据y。λ很大时,解会更多地满足先验约束(如更小、更平滑)。
在实际应用中,λ 的选择常常是经验性的:调整 λ 直到结果在视觉上或物理上看起来合理。也可以在有真实数据的情况下,通过交叉验证等更有原则的方法来选择。
一个有趣的性质是,即使矩阵 A 的列不是线性独立的(即测量数量少于参数数量,形成一个“宽”系统),加入正则化项后,最小二乘问题仍然是良定义的。这意味着正则化允许我们在数据不足的情况下进行估计。
🖼️ 实例一:图像去模糊
现在,让我们通过一个具体例子来看看正则化最小二乘的应用。第一个例子是图像去模糊。
假设 x 代表一张原始的灰度图像(按像素排列成一个长向量)。矩阵 A 是一个模糊算子(例如,一个卷积矩阵),它模拟了相机或光学系统对图像的模糊效果。观测值 y 就是一张模糊且带有噪声的图像。
我们的目标是:从模糊噪声图像 y 中,恢复出清晰的原始图像 x。
我们构建以下正则化最小二乘问题:
最小化 ||Ax - y||² + λ||Dx||²
其中:
- 第一项
||Ax - y||²要求去模糊后的图像x在经过模糊模型A后,应该接近观测到的模糊图像y。 - 第二项
||Dx||²是正则化项。这里D是一个差分算子矩阵,它计算图像水平和垂直方向的梯度。最小化这项意味着我们希望恢复的图像x是平滑的(没有过多噪声和伪影)。这符合我们对自然图像的先验认知。
我们通过调整 λ 来获得不同的结果。下图展示了从模糊噪声图像出发,使用不同 λ 值进行去模糊重建的效果:

以下是不同 λ 值对应的效果分析:
- λ = 10⁻⁶:正则化权重极低,重建图像虽然锐利,但充满了噪声和不平滑的斑点,因为算法几乎只专注于拟合数据。
- λ = 10⁻⁴:增加正则化权重,图像在保持锐利的同时变得平滑了一些。
- λ = 10⁻²:进一步平滑,去模糊效果良好,是视觉上较好的结果。
- λ = 1:正则化权重过高,图像过于平滑,丢失了许多重要的边缘和细节。
- λ = 100(图中未展示):图像会变成一个几乎无法辨认的灰色色块。
这个例子清晰地展示了正则化参数 λ 如何在“拟合观测数据”和“满足先验平滑性”之间进行权衡。
🧪 实例二:断层扫描重建
上一个例子展示了在图像处理中的应用。本节我们来看一个在医学和工业检测中非常重要的应用:断层扫描重建。
在断层扫描(如CT)中,x 代表感兴趣区域内各体素(三维)或像素(二维)的某种物理属性(如密度)。我们无法直接测量每个体素的值,但可以测量穿过该区域的许多“线积分”。例如,一束X射线穿过物体,其衰减程度就是沿路径密度的线积分。
设我们有 n 条测量路径,m 个像素。矩阵 A 的每一行对应一条路径,A(i,j) 表示第 i 条路径穿过第 j 个像素的长度。观测向量 y 就是测量到的所有线积分值。
我们的任务是:从线积分测量值 y 中,反推出每个像素的属性值 x。
我们同样使用正则化最小二乘:
最小化 ||Ax - y||² + λ₁||x||² + λ₂||Dx||²
这里我们甚至可以使用两个正则化项:
||x||²(Tikhonov正则化):倾向于让像素值本身较小。||Dx||²(平滑正则化):倾向于让图像在空间上是平滑的。
λ₁和λ₂是两个超参数,分别控制两种先验的强度。
下图展示了一个模拟的断层扫描重建例子。我们有一个包含特定形状物体的区域,通过从不同角度发射射线获取了4000个线积分测量值,目标是重建出100x100像素的图像。

以下是不同正则化强度下的重建结果:
- λ 较小:重建图像能捕捉细节,但可能包含噪声和伪影。
- λ 适中:在保持物体形状的同时,图像较为平滑清晰。
- λ 过大:图像过于平滑,细节丢失严重,物体特征变得模糊。
在实际应用中(如医学诊断),参数的选择可能需要领域专家(如放射科医生)的参与,以判断哪种重建结果最有利于做出准确判断。
断层扫描的思想非常通用,其核心“从投影(线积分)重建内部结构”的理念,也适用于交通流量分析、网络探测等众多领域。
📝 总结
在本节课中,我们一起学习了多目标最小二乘法在预估与反演问题中的应用。
我们首先从基础的线性测量模型 y = Ax + v 出发,介绍了最小二乘估计的基本思想,即通过最小化 ||Ax - y|| 来估计未知参数 x。

接着,我们引入了正则化技术,它允许我们将关于参数的先验知识(如“值较小”或“变化平滑”)融入到估计过程中。通过解决形如 最小化 ||Ax - y||² + λJ(x) 的问题,并在 λ 和 J(x)(如 ||x||² 或 ||Dx||²)之间进行权衡,我们可以得到更稳健、更符合物理意义的估计结果。

最后,我们通过图像去模糊和断层扫描重建两个生动的实例,具体展示了正则化最小二乘法如何解决实际问题。这两个例子充分说明了,通过巧妙地构建模型和设计正则化项,我们可以从间接、嘈杂的观测数据中,有效地恢复出我们感兴趣的信息。


📊 课程 P44:L15.4 - 正则化数据拟合
在本节课中,我们将学习一种强大的模型拟合改进方法——正则化数据拟合。这是多目标最小二乘法的一个重要应用。
🎯 概述
上一节我们介绍了多目标最小二乘法的基本概念。本节中,我们将探讨如何利用它来解决一个实际问题:正则化数据拟合。这种方法通过在标准拟合目标之外,增加一个使模型系数“变小”的额外目标,来提升模型的泛化能力和稳定性。
🧠 动机与基本思想
首先,我们来理解正则化的动机。假设我们有一个数据模型,用于描述变量 y 和 x 之间我们猜测存在的关系,即 y ≈ f(x),其中 f 是未知函数。
我们采用一个参数线性模型来拟合。具体做法是选择一组基函数 f₁(x), f₂(x), ..., fₚ(x),然后拟合这些基函数前的参数 θ₁, θ₂, ..., θₚ。通常,我们假设 f₁(x) = 1,即常数项,这意味着模型的第一项 θ₁ 是偏移量。
参数 θᵢ 的一个解释是:它衡量了我们的预测 ŷ 对基函数 fᵢ(x) 变化的敏感度。例如:
- 如果
θ₃ = 0,则f₃(x)对预测没有影响。 - 如果
θ₄非常大,那么f₄(x)的微小变化会导致预测值ŷ的巨大变化,即模型非常敏感。
直觉上,我们不希望 θ₂ 到 θₚ 这些系数过大,因为过大的系数意味着模型对输入数据(基函数值)的微小波动过于敏感,这通常不是好现象。我们一般不关心偏移量 θ₁ 的大小。
基于此,正则化的核心思想是:在优化时同时考虑两个目标。
- 第一个目标是传统的最小二乘拟合误差,我们希望它小。
- 第二个目标是希望
θ₂到θₚ这些系数本身也小。
📝 正则化数据拟合公式
假设我们有训练数据集。我们将训练数据上的预测误差表示为 Aθ - y,其中 y 是观测值向量,A 是由基函数在数据点上取值构成的矩阵。
正则化数据拟合问题定义如下:
主要目标是通常的最小二乘目标:
J₁(θ) = ||Aθ - y||²
我们希望这个目标小。
我们将其转化为一个双目标问题,增加第二个目标:
J₂(θ) = θ₂² + θ₃² + ... + θₚ²
这个目标希望系数 θ₂ 到 θₚ 小。
我们将这两个目标结合,形成一个加权和的单目标优化问题:
最小化:||Aθ - y||² + λ (θ₂² + θ₃² + ... + θₚ²)
其中,λ 被称为正则化参数。这个过程就叫做正则化数据拟合。
对于回归模型 ŷ = xᵀβ + ν·1(其中 ν 对应 θ₁,β 对应 θ₂ 到 θₚ),正则化问题可以具体写为:
最小化:||Xβ + 1ν - y||² + λ||β||²
这里我们不正则化偏移量 ν,只正则化系数 β。
🔧 正则化参数 λ 的影响
理解参数 λ 的影响至关重要:
- 当
λ = 0时,我们完全恢复了标准的最小二乘数据拟合。 - 当
λ变得非常大时,第二项的成本极高,会迫使θ₂到θₚ趋向于零。此时,模型会退化为一个常数模型(即ŷ等于y的均值)。此时的均方预测误差就是y的 RMS 值的平方。
正则化在统计学中也常被称为收缩,因为它会使系数向零收缩,变得比没有正则化项时更小。
🧪 如何选择正则化参数 λ
选择 λ 有一个很好的实践方法:
- 我们通常在一系列
λ值上构建模型。传统上,会尝试20到30个不同的λ值,这些值在一个很大的范围内(例如从10⁻⁵到10⁵)呈对数均匀分布。 - 对于每一个
λ值,我们得到一个不同的模型。 - 然后,我们在一个独立的测试数据集上评估每一个模型的表现(计算测试误差)。
- 我们寻找使测试误差最小的那个
λ值。实际上,人们有时会选择比最优值稍大一点的λ,因为更大的λ通常意味着系数更小,模型对数据波动的敏感性更低,这通常被认为是更稳健的。
📈 实例分析
让我们通过一个简单的例子来直观理解正则化的效果。
我们有一个由正弦函数加噪声生成的“真实”函数。我们用10个蓝点作为训练数据,用20个红点作为测试数据。我们的模型使用一组正弦基函数进行拟合。
以下是观察结果:
- 当
λ非常小(接近0)时,我们进行的是标准最小二乘拟合。训练误差很低(约0.05),但测试误差较高(约0.2)。 - 随着
λ增大,训练误差自然上升(因为我们在两个目标间权衡)。但有趣的是,测试误差先下降后上升,在λ ≈ 0.1附近出现了一个明显的“谷底”。 - 当
λ非常大(>100)时,模型退化为常数模型,测试误差稳定在一个较高的水平。
这个“谷底”表明,存在一个最优的 λ 值(本例中约为0.1),能显著提升模型在未见数据上的表现(泛化能力)。
我们还可以绘制正则化路径,即系数 θ₁ 到 θ₅ 随 λ 变化的曲线。在本例中,当 λ 取在测试误差最低点附近时,拟合出的系数值意外地接近生成数据时使用的“真实”参数值(图中虚线所示)。这展示了正则化如何帮助我们在数据有限(10个点拟合5个参数)的情况下,得到更接近真实情况的模型。
💎 总结
本节课我们一起学习了正则化数据拟合。
- 我们首先了解了其动机:防止模型系数过大,从而降低模型对输入数据的过度敏感。
- 然后,我们学习了其数学形式:在最小二乘损失函数基础上,增加一个对系数大小的惩罚项
λ||β||²。 - 我们探讨了正则化参数
λ的作用:λ=0对应普通最小二乘,λ→∞对应常数模型。 - 接着,我们掌握了通过在测试集上验证来选择合适
λ的实用方法。 - 最后,通过一个实例,我们直观看到了正则化如何通过权衡拟合优度与模型复杂度,有效降低测试误差,提升模型的泛化性能。


掌握带正则化的最小二乘数据拟合,就拥有了构建有效预测模型的强大基础工具。虽然未来从统计学等角度还会有更深入的理解,但这是实践中最核心、最实用的方法之一。


📘 课程 P45:L16.1 - 受约束的最小二乘法


在本节课中,我们将学习受约束的最小二乘法。这是对普通最小二乘法的一种扩展,允许我们在最小二乘问题中添加线性等式约束。这实际上将我们已知的两项技能——求解线性方程组和最小二乘法——结合在了一起。
问题定义与术语
首先,我们来定义什么是线性约束最小二乘问题,我们将其简称为 CLS。这是一个优化问题,描述如下:
最小化: ||Ax - b||²
约束条件: Cx = d
这里的变量是我们希望求解的 n 维向量 x。目标函数 ||Ax - b||² 越小越好。约束条件 Cx = d 意味着我们只考虑满足该等式的 x。满足约束的 x 称为可行解。在可行解中,目标函数值最小的那个就是最优解。
在这个问题中,矩阵 A 是 m×n 维,向量 b 是 m 维。矩阵 C 是 p×n 维,表示有 p 个线性等式约束,向量 d 是 p 维。A, b, C, d 是已知的问题数据。
一个向量 x̂ 是此问题的解,需要满足两个条件:
- 可行性:
Cx̂ = d - 最优性: 对于任何满足
Cx = d的向量x,都有||Ax̂ - b||² ≤ ||Ax - b||²
这个问题可以看作是双目标优化问题在权重趋于无穷大时的极限。考虑以下问题:
最小化: ||Ax - b||² + λ||Cx - d||²
当 λ → ∞ 时,为了最小化目标,必须迫使 Cx = d,这就回到了我们的 CLS 问题。
示例:分段多项式拟合
为了理解 CLS 的应用,我们来看一个拟合分段多项式的例子。
假设我们想用一个分段函数 f̂(x) 来拟合数据点 (x_i, y_i)。这个函数在 x < a 时是一个三次多项式 P(x),在 x ≥ a 时是另一个三次多项式 Q(x)。我们不仅希望拟合误差小,还希望函数在连接点 a 处连续且导数连续(这构成了一个三次样条)。
因此,我们的优化问题是:
最小化: ∑ (f̂(x_i) - y_i)²
约束条件:
P(a) = Q(a)(连续性)P'(a) = Q'(a)(导数连续性)
我们可以将两个多项式的所有系数(例如 θ₁, θ₂, θ₃, θ₄ 对应 P, θ₅, θ₆, θ₇, θ₈ 对应 Q)组合成一个参数向量 θ。拟合误差可以写成 ||Aθ - y||² 的形式。两个约束条件则是关于 θ 的线性方程,可以写成 Cθ = d(这里 d 是零向量)。这样,问题就完全转化成了标准的 CLS 形式。
通过求解这个 CLS 问题,我们得到的拟合曲线会在点 a 处平滑连接,避免了函数值或斜率的跳跃。
特例:最小范数问题
在深入如何求解一般 CLS 问题之前,我们先看一个重要的特例:最小范数问题。
当 CLS 问题中的 A = I(单位矩阵)且 b = 0 时,问题简化为:
最小化: ||x||²
约束条件: Cx = d
其几何意义是:在所有满足线性方程组 Cx = d 的解中,寻找欧几里得范数(即长度)最小的那个 x。这在许多应用中意味着寻找“最省力”或“最经济”的解决方案,尤其当 Cx = d 有很多解时。
示例:质量块的最优控制
考虑一个在无摩擦面上的单位质量块,初始静止。我们可以在 10 秒内,每秒施加一个力 f_t(共10个力,构成向量 f)。目标是设计一个力序列,使得 10 秒后质量块恰好移动到位置 1 处,并且速度为零。
根据物理定律,最终位置和速度与力序列 f 的关系是线性的,可以写成 Cf = d 的形式,其中 d = [0, 1]ᵀ(速度为零,位置为1)。这个方程组通常有无穷多解。
一种简单的“砰砰”解是:前 1 秒施加 +1 牛顿的力,接着 1 秒施加 -1 牛顿的力,最后 8 秒施加 0 牛顿的力。这个解的范数平方为 1² + (-1)² = 2。
然而,我们可以寻找最小范数解,即最小化 ||f||² 且满足 Cf = d 的力序列。通过求解这个最小范数问题(方法将在后面介绍),我们得到一个完全不同的力序列。它的范数平方仅为 0.0121,远小于“砰砰”解的 2。这个力序列从很小的正力开始,逐渐减小并过渡为负力,最终平滑地将质量块送到目标位置。这种平滑、能量效率高的解在实际控制工程中非常常用。
总结
本节课我们一起学习了受约束的最小二乘法的基本概念。我们首先定义了 CLS 问题,它结合了最小二乘拟合和线性等式约束。然后,我们通过分段多项式拟合的例子,展示了如何将实际问题建模为 CLS 形式。接着,我们探讨了一个重要的特例——最小范数问题,其目标是在满足线性方程组的解中找到范数最小的一个。最后,通过质量块控制这个生动例子,我们看到了最小范数解如何产生平滑、高效的解决方案。在接下来的课程中,我们将介绍求解这些问题的具体方法。






📘 课程 P46:L16.2 - 受约束的最小二乘求解
在本节课中,我们将学习如何求解受约束的最小二乘问题。我们将看到,这个问题可以转化为一个涉及线性方程组求解或QR分解的熟悉形式。课程将从传统的拉格朗日乘数法推导开始,然后介绍一个更清晰、更简单的直接验证方法。最后,我们会探讨一个特例——最小范数问题,并揭示它与伪逆之间的优美联系。
🧮 拉格朗日乘数法推导
上一节我们介绍了受约束的最小二乘问题。本节中,我们将使用微积分中的拉格朗日乘数法来推导其求解方法。这是一种传统方法,其核心思想是引入一组称为拉格朗日乘子的变量,将约束条件融入目标函数中。
首先,我们构造拉格朗日函数 L(x, z):
L(x, z) = ||Ax - b||² + z₁(c₁ᵀx - d₁) + ... + zₚ(cₚᵀx - dₚ)
其中,z₁, ..., zₚ 是拉格朗日乘子,cᵢᵀx = dᵢ 是约束条件。
最优性条件要求拉格朗日函数对所有变量的偏导数为零。
以下是需要满足的条件:
- 对 x 的偏导数为零:∂L/∂x = 0
- 对每个拉格朗日乘子 zᵢ 的偏导数为零:∂L/∂zᵢ = 0
第二个条件直接给出了原始约束 Cx = d。第一个条件经过计算后,可以得到以下矩阵形式的方程:
2AᵀA x̂ + Cᵀz = 2Aᵀb
⚙️ KKT 条件与求解
上一节我们得到了两个最优性条件。本节中,我们将它们组合成一个统一的线性方程组,即著名的KKT(Karush-Kuhn-Tucker)条件。
将两个条件组合,我们得到以下KKT方程组:
[ 2AᵀA Cᵀ ] [ x̂ ] = [ 2Aᵀb ]
[ C 0 ] [ z ] [ d ]
这是一个包含 n + p 个方程和 n + p 个变量(x̂ 和 z)的方形线性系统。我们可以将其视为普通最小二乘问题中正规方程在受约束情况下的推广。
假设这个KKT矩阵是可逆的,那么求解受约束最小二乘问题就简化为求解这个线性方程组。我们通常只关心解 x̂,而乘子 z 在计算后可以丢弃。一个直接的求解方法是计算该矩阵的QR分解。
关于可解性,一个关键条件是矩阵 C 的行线性无关,且矩阵 [A; C] 的列线性无关。
✅ 一个更简单的直接验证
上一节通过拉格朗日方法得到了候选解。本节中,我们将提供一个更简单、更清晰的直接验证,证明由KKT方程给出的 x̂ 确实是全局最优解。
这个验证不依赖复杂的微积分,只使用基本的向量范数性质。思路是:对于任意满足约束 Cx = d 的可行向量 x,证明其目标函数值都不小于 x̂ 的目标函数值。
证明过程如下,我们比较 ||Ax - b||² 和 ||A x̂ - b||²:
||Ax - b||² = ||A(x - x̂) + (A x̂ - b)||²
= ||A(x - x̂)||² + ||A x̂ - b||² + 2 (A(x - x̂))ᵀ (A x̂ - b)
利用 x̂ 满足 2Aᵀ(A x̂ - b) + Cᵀz = 0 以及 x 和 x̂ 都满足 Cx = C x̂ = d 的事实,可以证明交叉项 2 (A(x - x̂))ᵀ (A x̂ - b) 为零。因此:
||Ax - b||² = ||A x̂ - b||² + ||A(x - x̂)||²
≥ ||A x̂ - b||²
这就直接证明了 x̂ 是最优解。这种方法无需担心拉格朗日方法可能找到的驻点并非极值点的问题。
🎯 特例:最小范数问题
上一节我们讨论了一般约束最小二乘的求解。本节中,我们来看一个重要的特例——最小范数问题,它将与我们之前学过的伪逆概念联系起来。
最小范数问题是:在满足 Cx = d 的条件下,最小化 ||x||²。此时,矩阵 A 是单位矩阵 I,b 是零向量。其KKT方程组简化为:
[ 2I Cᵀ ] [ x̂ ] = [ 0 ]
[ C 0 ] [ z ] [ d ]
假设 C 行满秩,这个系统总是可解的。
我们可以手动求解这个简单的系统。以下是推导步骤:
- 由第一个方程得:x̂ = -(1/2) Cᵀz
- 代入第二个方程 C x̂ = d:C(-(1/2) Cᵀz) = d
- 解得:z = -2 (C Cᵀ)⁻¹ d
- 代回第一步得:x̂ = Cᵀ (C Cᵀ)⁻¹ d
最终解为:
x̂ = Cᵀ (C Cᵀ)⁻¹ d
这正是矩阵 C 的伪逆 C† 作用于 d 的结果。因此,最小范数问题的解就是 x̂ = C† d。
这个结论非常优美:对于行满秩矩阵 C,其伪逆 C† 不仅是一个右逆(保证 C C† d = d),而且给出的解 x̂ 是所有满足方程的解中范数最小的那个。这完美地将最小范数解、伪逆和QR分解联系在了一起。
📝 总结
本节课中我们一起学习了受约束最小二乘问题的求解。
- 我们首先通过拉格朗日乘数法将问题转化为求解KKT线性方程组。
- 接着,我们介绍了一个更基础的直接验证方法,证明了KKT解的最优性。
- 最后,我们探讨了最小范数问题这一特例,并发现其解就是约束矩阵的伪逆,这统一了之前学过的多个重要概念。


最终,求解受约束优化问题的核心被简化为求解一个特定的线性系统,这可以通过标准的数值线性代数方法(如QR分解)高效完成。


📊 课程 P47:L17.1 - 组合优化
在本节课中,我们将学习如何将约束最小二乘法应用于一个重要的实际问题:投资组合优化。我们将了解如何通过数学方法,在给定历史数据的情况下,构建一个在风险和回报之间取得平衡的投资组合。
概述与背景
第17章是关于约束最小二乘法的应用。投资组合优化本身是一个庞大的领域,可以开设多门课程。本节课程将提供一个非常简单的入门介绍,展示如何利用约束最小二乘法解决实际问题。
投资组合基础
投资组合与权重向量
假设我们计划投资总额为 V 美元(V > 0)到 n 种不同的资产中。这些资产可以是不同的股票、债券、ETF等,投资周期可以是天、周或月。
我们的投资可以包含空头头寸。空头头寸本质上是持有负数量的资产,意味着你借入资产(例如谷歌股票的一股),立即卖出以获得现金,但未来有义务归还一股谷歌股票。这相当于最初持有负一股谷歌股票。
我们可以用一个投资组合权重向量 W 来描述我们的投资组合。其中,W_j 表示你投资在资产 j 上的资金占总资产价值 V 的比例。因此,投资在资产 j 上的美元价值为 V * W_j。
根据定义,权重之和为 1:1^T W = 1。权重可以是负数,负权重代表空头头寸。一个不包含空头头寸(即所有权重非负)的投资组合被称为纯多头投资组合。
示例:假设有三个资产,权重向量 W = [-0.2, 0, 1.2]。所有权重之和为 1。这意味着我们对资产1持有空头头寸(价值为 -0.2V),不持有资产2,并超配持有资产3(价值为 1.2V)。只有当预期资产1价格下跌、资产3价格上涨时,才会构建这样的组合。
杠杆率
杠杆率有不同的定义。我们将使用的定义是所有权重绝对值的和:L = ||W||_1 = |w_1| + ... + |w_n|。
当所有权重非负时,杠杆率 L = 1,这是最小的杠杆率,对应纯多头投资组合。当杠杆率大于1时,意味着至少有一个权重为负,即持有空头头寸,并利用所得资金超配其他投资。
另一个常见的投资组合是等权重投资组合,即 W = (1/n) * 1,也称为均匀投资组合。
无风险资产
我们通常假设第 n 种资产(或其他某种资产)是无风险资产,例如现金或国债。这意味着其价值波动风险极低。如果我们令 W = e_n(即第n个元素为1的单位向量),则表示将所有资金投入无风险资产。
回报与风险
资产回报与投资组合回报
设 r_j 为资产 j 在一个周期内的回报率,定义为资产价值的变化比例(可正可负)。投资组合的总价值也会变化。
设初始投资组合价值为 V,投资周期结束后的价值为 V^+。投资组合的回报率 R 定义为价值变化除以初始价值:R = (V^+ - V) / V。
可以证明,投资组合的回报率 R 恰好等于各资产回报率向量 r 与权重向量 W 的内积:R = r^T W。这本质上是一个加权平均。
如果持有投资组合 T 个周期,每个周期的回报率为 R_1, R_2, ..., R_T,那么最终价值为:V_T = V_1 * (1+R_1) * (1+R_2) * ... * (1+R_T)。这体现了复利效应。
回报矩阵
假设我们计划在 T 个周期内持有权重为 W 的投资组合。我们可以定义一个 T × n 的资产回报矩阵 R。
- 每一行对应一个时间周期(例如一天),包含了该周期内所有资产的回报率。
- 每一列对应一种资产,包含了该资产在 T 个周期内的时间序列回报数据。
那么,投资组合回报时间序列 r 就是矩阵与向量的乘积:r = R W。这是一个长度为 T 的向量,记录了投资组合在每个周期的回报率。
如果第 n 种资产是无风险资产,那么矩阵 R 的第 n 列将是一个常数向量:μ_riskfree * 1,其中 μ_riskfree 是每周期的无风险利率。该列的标准差为零,体现了“无风险”特性。
衡量表现:平均回报与风险
对于一个给定的投资组合回报时间序列 r(由权重 W 和矩阵 R 决定):
- 平均回报:即 r 的均值,记为 ρ。它衡量了投资组合的盈利能力。
- 风险:通常用 r 的标准差来衡量,记为 σ。它衡量了投资组合回报的波动性或不确定性。
如果 W = e_n(全仓无风险资产),则投资组合回报恒为 μ_riskfree,风险 σ = 0。
平均回报与最终资产价值相关。通过近似分析可知,经过 T 期后,投资组合价值 V_T ≈ V_1 * (1 + T * ρ)。这直观地说明了为什么希望平均回报 ρ 更高。
在实际中,回报和风险通常被年化以便比较。假设每年有 P 个投资周期(如250个交易日):
- 年化回报 ≈ P * ρ
- 年化风险 ≈ √P * σ
组合优化问题
核心问题与思路
现在来到核心问题:我们应如何选择权重向量 W?我们有两个目标:
- 希望投资组合的平均回报高。
- 希望投资组合的风险低。
这是一个双目标优化问题。棘手之处在于,我们不知道未来的回报。但我们拥有历史回报数据(矩阵 R)。
我们的方法是:选择一个在历史数据上表现良好的权重向量 W,并希望它在未来也能表现良好。这类似于数据拟合中的思想:利用过去的数据构建模型,并用于预测未来。
构建约束最小二乘问题
我们将通过约束最小二乘问题来形式化这个想法。具体步骤如下:
- 指定一个目标要求回报率 ρ_req(例如10%)。
- 在满足以下两个约束的前提下,最小化投资组合回报时间序列 r = R W 的方差:
- 权重之和为 1:1^T W = 1
- 历史平均回报等于目标要求:(1/T) * 1^T R W = ρ_req,等价于 μ^T W = ρ_req,其中 μ = (R^T 1)/T 是各资产的历史平均回报向量。
因此,优化问题可以写为:
最小化 ||R W - (ρ_req * 1)||^2
约束条件 1^T W = 1
μ^T W = ρ_req
这里去掉了常数因子 1/T,因为它不影响优化结果。这正是一个标准的线性等式约束最小二乘问题。
求解与解释
该问题可以通过求解对应的KKT方程组来解决:
[ 2R^T R 1 μ ] [ W ] = [ 0 ]
[ 1^T 0 0 ] [ ν_1 ] [ 1 ]
[ μ^T 0 0 ] [ ν_2 ] [ ρ_req ]
其中 ν_1, ν_2 是拉格朗日乘子。我们关心的是解出的权重向量 W。
一个特例:如果要求回报率等于无风险利率(ρ_req = μ_riskfree),那么最优解显然是 W = e_n(全仓无风险资产),此时方差为零,达到绝对最小风险。
有效前沿与两基金定理
当我们改变目标要求回报率 ρ_req 时,会得到一系列最优投资组合。将这些组合的(风险,回报)点画在图上,会形成一条直线。这条线被称为有效前沿(在均值-方差框架下)。
原因在于,最优权重 W 可以表示为 ρ_req 的线性函数:W = W_0 + ρ_req * W_1,其中 W_0 和 W_1 是固定向量。这意味着所有最优投资组合都可以由两个特定“基金”(即两个基础投资组合)的线性组合生成。这被称为两基金定理。
这条直线的一端是无风险资产点(风险为0,回报为 μ_riskfree)。
重要假设与实例分析
“大假设”
上述所有方法都基于一个核心的、隐含的“大假设”:未来的回报将与过去的回报相似。
这个假设并非总是成立。市场可能发生结构性变化或“机制转换”。然而,许多量化投资策略都建立在这个假设之上,类似于统计建模中利用历史数据预测未来的思想。投资者通常会被提醒“过往业绩并不预示未来表现”,这正是在警示这一假设的风险。
实例分析
假设我们有20种资产(例如20只ETF)超过2000天(约8年)的历史日回报数据。
- 单个资产表现:在风险-回报图上,每个资产是一个点。有些资产回报高但风险也高,有些则回报低或为负。帕累托最优的资产是那些在同等风险下回报最高,或同等回报下风险最低的资产。
- 最优投资组合表现:通过求解约束最小二乘问题,我们可以得到不同目标回报率下的最优投资组合。这些组合点连成一条直线(有效前沿),它们通常比大多数单一资产更优,体现了分散化的好处。
- 样本外测试:我们可以将前8年数据作为训练集来求解权重 W,然后用之后2年的数据作为测试集来检验其表现。
- 在训练集上,由于约束条件,投资组合的平均回报会精确等于目标要求 ρ_req。
- 在测试集上,平均回报和风险会与训练集结果有所差异,但通常会在合理范围内。这验证了(或挑战了)“大假设”。
- 投资组合价值走势:观察不同目标回报率对应的投资组合在训练期和测试期的价值增长曲线。
- 高风险(高目标回报、高杠杆)组合价值波动剧烈,可能带来高收益也可能导致大幅回撤。
- 低风险(目标回报接近无风险利率)组合增长平稳。
- 等权重投资组合的表现可能在某些时期不尽如人意。
- 这直观展示了风险与回报的权衡。
总结与延伸
本节课我们一起学习了如何利用约束最小二乘法进行基本的投资组合优化。我们定义了投资组合的权重、回报、风险和杠杆,并将寻找给定目标回报下最小风险组合的问题,形式化为一个线性等式约束最小二乘问题。通过求解该问题,我们可以得到有效前沿,并在历史数据上验证其表现。
需要牢记的是,整个方法依赖于“未来类似于过去”的假设。在实际应用中,还有许多更复杂的扩展,例如:
- 定期(如每日)重新计算和调整权重。
- 在优化问题中加入不等式约束(如限制权重范围、限制杠杆率等),这需要更一般的凸优化方法。
- 从统计学角度重新审视和推导模型,其结果在数学上是等价的。


投资组合优化是约束最小二乘法一个非常有力且实用的应用领域。


课程 P48:L17.2 - 线性二次控制 📈
在本节课中,我们将学习线性二次控制,这是约束最小二乘法的一个重要应用。我们将看到,一个看似复杂的控制问题,如何被优雅地转化为一个标准的约束最小二乘问题来求解。
概述
线性二次控制,例如投资组合优化,是一个应用广泛的领域。其核心思想是,对于一个线性动态系统,我们希望在给定的时间范围内,选择一系列控制输入,使得系统的输出(通常代表偏离期望状态的量)和控制输入的能量都尽可能小。这是一个多目标优化问题。
线性动态系统
首先,我们需要理解系统模型。我们有一个线性动态系统,其状态、输入和输出关系如下:
- 状态:
x_t是一个 n 维向量,代表系统在时刻 t 的状态。 - 输入:
u_t是一个 m 维向量,代表我们在时刻 t 施加的控制。 - 输出:
y_t是一个 p 维向量,通常与状态相关,代表我们实际关心的量。
它们之间的关系由以下公式描述:
x_{t+1} = A_t * x_t + B_t * u_t
y_t = C_t * x_t
其中,A_t 是动态矩阵,B_t 是输入矩阵,C_t 是输出矩阵。通常,这些矩阵不随时间变化,这样的系统称为线性时不变系统。
一个重要的细节是,这里的 x_t、u_t、y_t 通常表示实际物理量与其标准工作点(或期望值)的偏差。因此,我们希望这些偏差尽可能小(接近零),这意味着系统运行良好。
线性二次控制问题
现在,我们定义要解决的问题。我们考虑一个从 t=1 到 t=T 的时间范围。
我们的目标是选择一系列输入 u_1, ..., u_{T-1} 和对应的状态序列 x_1, ..., x_T,同时优化两个目标:
-
输出偏差小:我们希望输出
y_t的累积平方和尽可能小。这衡量了系统偏离期望状态的程度。
J_output = ||y_1||^2 + ... + ||y_T||^2 = ||C_1 x_1||^2 + ... + ||C_T x_T||^2 -
控制输入能量小:我们希望控制输入
u_t的累积平方和尽可能小。这衡量了控制动作的“代价”或“能量”。
J_input = ||u_1||^2 + ... + ||u_{T-1}||^2
显然,我们希望两者都小,但它们是相互冲突的(通常需要更大的控制动作才能更快地减小输出偏差)。因此,我们引入一个正参数 ρ 来权衡这两个目标,构成一个综合目标函数:
J = J_output + ρ * J_input
ρ 越大,表示我们越不希望使用大的控制输入;ρ 越小,表示我们更关注快速减小输出偏差。在实践中,ρ 通常通过仿真和观察效果来调整。
此外,问题还包含以下约束:
- 动态约束:状态必须遵循系统动力学方程
x_{t+1} = A_t x_t + B_t u_t。 - 初始状态约束:
x_1 = x_init(给定初始状态)。 - 终端状态约束:
x_T = x_des(给定期望终端状态)。当x_des = 0时,这被称为调节器问题,即让系统状态回归零点。
综上所述,线性二次控制问题就是在满足动态方程和边界条件的前提下,最小化综合目标函数 J,以求解最优的状态序列 x_t 和控制序列 u_t。
转化为约束最小二乘问题
上一节我们定义了线性二次控制问题。本节中,我们将看到这个复杂的问题可以精确地转化为一个标准的约束最小二乘问题。
我们定义决策变量 z,它是一个很长的向量,将所有变量堆叠在一起:
z = [x_1; ...; x_T; u_1; ...; u_{T-1}]
接下来,我们构造矩阵和向量,将原问题重写为:
最小化 ||Ãz - b̃||^2, 满足 C̃z = d̃
以下是各个部分的构造方法:
-
目标函数部分 (Ã, b̃):
我们构造一个块对角矩阵Ã,使得||Ãz||^2恰好等于我们的目标函数J。Ã = blkdiag(C_1, ..., C_T, sqrt(ρ)*I, ..., sqrt(ρ)*I) b̃ = 0计算
||Ãz||^2会得到||C_1 x_1||^2 + ... + ||C_T x_T||^2 + ρ||u_1||^2 + ... + ρ||u_{T-1}||^2,这正是J。 -
约束条件部分 (C̃, d̃):
我们将所有线性等式约束(动态方程和边界条件)组合成一个大的矩阵方程C̃z = d̃。- 动态方程
x_{t+1} = A_t x_t + B_t u_t可以写成A_t x_t - x_{t+1} + B_t u_t = 0。这些方程构成了C̃的大部分行。 - 初始条件
x_1 = x_init和终端条件x_T = x_des作为额外的行加入C̃,对应的d̃部分分别为x_init和x_des。
- 动态方程
通过这种构造,原始的线性二次控制问题就完全等价于上面的约束最小二乘问题。值得注意的是,矩阵 Ã 和 C̃ 都是高度稀疏的,这意味着对应的 KKT 系统也是稀疏的,可以利用高效的稀疏矩阵求解器快速计算,即使变量数量很大(例如数百甚至数千)。
示例:调节器问题
让我们通过一个简单例子来直观理解。考虑一个三维状态、一维输入的系统:
A = [[0.8, 0.1, 0], [0, 0.9, 0.1], [0, 0, 0.7]]
B = [[0.1], [0], [0.3]]
C = [[1, 0, 0]]
初始状态 x_init 是一个随机向量,期望终端状态 x_des = 0,时间范围 T=100。
我们解决这个约束最小二乘问题,并观察权衡参数 ρ 的影响。
以下是不同 ρ 值下的结果:
- ρ = 1.0:较看重控制输入代价。控制输入
u_t幅度较小,但输出y_t收敛到零的速度较慢。 - ρ = 0.2:降低了对输入代价的权重。控制输入
u_t幅度增大,但输出y_t能更快地被驱动到零。 - ρ = 0.05:进一步降低输入权重。控制输入变得更大、更剧烈,以换取输出更迅速地归零。
这个例子清晰地展示了 ρ 如何在控制能量 (J_input) 和调节性能 (J_output) 之间进行权衡。
线性状态反馈控制
上一节我们解决了有限时间范围的优化问题。但在许多实际应用中(如飞机巡航),我们并不指定一个精确的终端时间,而是希望系统能持续、渐近地稳定在期望状态。这就引出了线性状态反馈控制。
线性状态反馈控制是一种极其广泛使用的策略,其形式非常简单:
u_t = K * x_t
其中 K 是一个固定的矩阵,称为状态反馈增益矩阵。它的思想是:根据当前时刻观测到的状态 x_t,直接通过矩阵 K 计算出应施加的控制输入 u_t。
那么,如何设计一个好的增益矩阵 K 呢?一个经典且有效的方法正是从我们刚刚解决的线性二次调节器问题中推导出来。
具体方法是:
- 求解一个终端状态为零 (
x_des=0)、时间范围T较长的线性二次调节器问题。 - 观察其解:最优的第一个控制输入
u_1总是初始状态x_init的一个线性函数,即存在某个矩阵K使得u_1 = K * x_init。 - 我们可以通过令
x_init分别为单位向量e_1, e_2, ..., e_n,多次求解该问题,从而拼凑出这个矩阵K。
一旦得到 K,我们就可以实施 u_t = K x_t 的反馈控制律。与有限时间优化相比,这种反馈控制是持续作用的,并且通常能使状态渐近地趋于零,而不需要在某个特定时刻精确到达。
在下图中,蓝色轨迹代表有限时间 (T=100) 最优控制的结果,在 t=100 后控制停止。红色轨迹代表使用上述方法导出的状态反馈控制律 u_t = K x_t 的结果,它持续作用,使状态渐近收敛到零。
(注:此处应有一张对比图,展示有限时间最优控制与持续状态反馈控制下,状态 y_t 随时间变化的曲线对比。)
总结
本节课中,我们一起学习了线性二次控制的核心内容。
我们首先介绍了线性动态系统模型。然后,定义了线性二次控制问题,其目标是在满足系统动力学和边界条件的前提下,权衡最小化输出偏差和控制输入能量。
最关键的一步是,我们将这个复杂的控制问题精确转化为了一个约束最小二乘问题。通过构造适当的决策变量和稀疏矩阵,我们可以利用已知的数值方法高效求解。
最后,我们探讨了其与线性状态反馈控制的联系。通过求解一个特定的线性二次调节器问题,可以推导出广泛使用的状态反馈增益矩阵 K,从而实现持续、渐近稳定的控制。


这种方法将控制理论中的经典问题与数值优化紧密连接,展示了约束最小二乘法的强大应用能力。


📊 课程 P49:L17.3 - 线性二次约束状态预估
在本节课中,我们将学习约束最小二乘法的最后一个应用:线性二次状态估计。我们将了解其基本概念、问题设定、数学公式,以及如何处理缺失测量值,并学习如何通过交叉验证来选择关键参数。
🎯 问题设定
上一节我们介绍了约束最小二乘法在控制问题中的应用。本节中,我们来看看它在状态估计问题中的应用。状态估计问题与控制问题在设定上非常相似,但目标却截然不同。
我们从一个线性动态系统模型开始。与控制问题不同,这里的输入 W_t 并非我们可以控制的量,它代表过程噪声或输入扰动。而输出 Y_t 除了包含 C_t * x_t 外,还附加了一个测量噪声 V_t。
在状态估计问题中,我们已知系统矩阵 A_t、B_t、C_t 以及一系列测量值 y_1 到 y_T。我们的目标是估计或猜测出对应的状态序列 x_1 到 x_T。过程噪声 W_t 和测量噪声 V_t 是未知的,但通常假设它们很小,这正是我们将状态估计问题构建为约束最小二乘问题的基础。
📝 数学公式化
接下来,我们看看如何将状态估计问题构建为一个优化问题。其核心思想是在两个目标之间进行权衡:使测量误差小,或使过程噪声小。
我们定义以下目标函数:
J = ||v_1||^2 + ... + ||v_T||^2 + λ * (||w_1||^2 + ... + ||w_{T-1}||^2)
其中,第一部分是测量误差的平方和,第二部分是过程噪声的平方和,λ 是一个用于权衡两者的正参数。
我们需要在满足系统动力学方程的约束下,最小化这个目标函数。优化变量包括整个状态序列 x_1, ..., x_T 和过程噪声序列 w_1, ..., w_{T-1}。
与控制问题类似,我们可以将这个问题重写为一个巨大的、稀疏的约束最小二乘问题。具体来说,我们将所有变量拼接成一个向量 z,并构建相应的矩阵 C_tilde 和向量 d_tilde,使得约束条件可以表示为 C_tilde * z = d_tilde。这个问题的结构与控制问题中的矩阵非常相似,体现了二者之间深刻的数学对偶关系,尽管它们解决的实际问题不同。
🔍 处理缺失测量值
现在,我们讨论一个更实际的情况:缺失测量值。这不仅是现实应用中常见的问题,也为我们提供了一种非启发式的、有原则的方法来选择参数 λ。
假设我们只在某些时间点 t ∈ T(其中 T 是时间索引的子集)获得了测量值 y_t。在其他时间点,测量值是缺失的。这在实际中可能由于传感器故障、通信中断等原因造成。
以下是处理缺失测量值的步骤:
- 在构建目标函数
J时,我们只对拥有实际测量值的时间点t ∈ T计算测量误差项。 - 我们照常求解状态估计问题。
- 对于没有测量值的时间点
t ∉ T,状态估计器会给出一个状态估计x_t_hat,进而可以预测出“假设存在”的测量值y_t_hat = C_t * x_t_hat。
这种处理方式的关键在于,它为实现交叉验证铺平了道路。我们可以故意将一部分已知的测量值“隐藏”起来,视为缺失,不提供给状态估计器。然后,用估计器预测的 y_t_hat 与真实隐藏的 y_t 进行比较,以此来评估估计器的性能。
🧪 示例与交叉验证
让我们通过一个具体例子来理解整个过程,并展示如何使用交叉验证来选择 λ。
考虑一个在二维平面中运动的质点模型。状态 x_t 是一个四维向量,包含位置和速度。我们获得的是带有噪声的位置测量值(绿色圆圈),真实轨迹是黑色实线。
我们尝试用不同的 λ 值进行状态估计:
- 当
λ = 1时,估计轨迹(蓝色线)过于跟随噪声测量值,波动很大。 - 当
λ = 10^3时,估计轨迹平滑且能很好地跟踪真实轨迹。 - 当
λ = 10^5时,估计轨迹过于平滑,几乎忽略了测量值,导致估计不准。
这个例子中,我们恰好知道真实轨迹,所以能直观判断 λ = 10^3 是合适的。但在实际应用中,我们并不知道真实状态。
因此,我们需要一个系统的方法来选择 λ,这就是交叉验证:
- 随机移除一部分(例如20%)的测量值,作为测试集。
- 对于一系列候选的
λ值,使用剩余的测量值(训练集)进行状态估计。 - 对于每个
λ,计算状态估计器在测试集上的预测值y_hat与真实隐藏值y之间的均方根误差。 - 选择能够使测试集均方根误差近似最小的
λ值。
这个过程与数据拟合中的正则化参数选择完全一致。通过这种方法,我们可以在不知道真实状态的情况下,客观地选择一个性能良好的 λ 参数。
📚 总结


本节课中,我们一起学习了线性二次约束状态估计。
- 我们首先介绍了状态估计问题的设定,它旨在根据带有噪声的测量值来推测系统的内部状态。
- 接着,我们学习了如何将其公式化为一个权衡测量误差和过程噪声的约束最小二乘问题。
- 然后,我们探讨了如何处理缺失测量值,并指出这为实现交叉验证提供了可能。
- 最后,我们通过一个运动质点的示例,演示了不同
λ值对估计结果的影响,并详细说明了如何使用交叉验证这一有原则的方法来自动选择最优的λ参数,从而在实际应用中实现有效的状态估计。


📚 课程 P5:L1.5 - 向量与内积
在本节课中,我们将要学习向量的一种重要运算——内积。内积在后续课程中会频繁出现并被大量使用。
概述
内积,也被称为点积或标量积,是一种作用于两个同维度向量上的运算。它的计算结果是一个标量(即一个数字)。理解内积的计算方式及其几何与物理意义,是学习线性代数和许多应用领域的基础。
内积的定义与计算
内积的运算符号有多种表示方法,例如 aᵀb、<a, b> 或 a · b。在本课程中,我们主要使用 aᵀb 这种记法,其含义将在后续课程中变得清晰。
内积的计算规则非常简单:将两个向量对应位置的元素相乘,然后将所有乘积相加。
用公式表示,对于两个 n 维向量 a = [a₁, a₂, ..., aₙ] 和 b = [b₁, b₂, ..., bₙ],它们的内积为:
aᵀb = a₁b₁ + a₂b₂ + ... + aₙbₙ
让我们通过一个具体例子来理解这个计算过程。
以下是计算内积的步骤:
- 将第一个向量的第一个元素与第二个向量的第一个元素相乘。
- 将第一个向量的第二个元素与第二个向量的第二个元素相乘。
- 以此类推,对向量中所有对应位置的元素进行相乘。
- 最后,将所有乘积结果相加,得到的内积是一个标量。
示例:
假设有两个三维向量:
a = [-1, 2, 2]
b = [1, 0, -3]
计算它们的内积 aᵀb:
(-1 × 1) + (2 × 0) + (2 × -3) = -1 + 0 - 6 = -7
所以,向量 a 和 b 的内积是 -7。
内积的基本性质
理解了内积的计算方法后,我们来看看它的一些重要数学性质。掌握这些性质有助于我们更灵活地运用内积。
以下是内积的几个关键性质:
- 交换律:aᵀb = bᵀa
- 这意味着两个向量内积的顺序可以互换,结果不变。因为数字乘法满足交换律。
- 与标量乘法结合律:(γa)ᵀb = γ(aᵀb)
- 等式左边是先将向量 a 与标量 γ 相乘得到一个新向量,再与 b 做内积。
- 等式右边是先计算 a 和 b 的内积得到一个数,再乘以标量 γ。
- 两者结果相等。
- 分配律:(a + b)ᵀc = aᵀc + bᵀc
- 这表示向量和的内积可以分配到每个向量上分别进行。
- 双重分配律:(a + b)ᵀ(c + d) = aᵀc + aᵀd + bᵀc + bᵀd
- 这是分配律的扩展,涉及两个向量和的内积。
内积的特例与应用
现在,我们来看一些特殊向量内积的结果,以及内积在现实世界中的几个典型应用场景。这些例子将帮助我们直观理解内积的意义。
特例1:与单位向量内积
单位向量 eᵢ 是第 i 个位置为 1,其余位置为 0 的向量。向量 a 与第 i 个单位向量的内积,结果恰好是 a 的第 i 个元素 aᵢ。
公式:eᵢᵀa = aᵢ
示例:若 a = [2, 1, -5],e₂ = [0, 1, 0],则 e₂ᵀa = (0×2)+(1×1)+(0×-5) = 1,正好是 a 的第二个元素。
特例2:与全1向量内积
全1向量是所有元素都为1的向量。一个向量与全1向量的内积,等于该向量所有元素之和。
特例3:向量与自身的内积
向量 a 与自身的内积 aᵀa,等于其所有元素平方之和。
公式:aᵀa = a₁² + a₂² + ... + aₙ²
这个结果在后续课程中非常重要。
理解了这些基本特例后,我们来看看内积在实际问题中是如何发挥作用的。
以下是内积的几个常见应用场景:
- 加权评分:在信息检索或机器学习中,f 可以是一个特征向量(如文档的词频),w 是一个权重向量。内积 wᵀf 的结果可以解释为一个“相关性分数”。权重 wᵢ 的大小决定了对应特征 fᵢ 对总分的贡献程度。
- 计算总成本:在商业中,p 可以是一个价格向量(每件商品单价),q 是一个数量向量(购买每件商品的数量)。内积 pᵀq 的结果就是总成本,因为它是每个商品的单价乘以数量再求和。
- 计算净现值:在金融中,c 是一个现金流向量(未来各期收到的金额),d 是一个折现因子向量(将未来价值折算成当前价值的系数)。内积 cᵀd 的结果就是该现金流的净现值,它反映了考虑时间价值后的当前总价值。
- 计算投资组合价值:在金融中,s 是一个投资组合向量(持有各股票的数量),p 是当前股价向量。内积 pᵀs 的结果就是该投资组合的当前总市值。
总结


在本节课中,我们一起学习了向量的内积运算。
我们首先定义了内积,并学会了如何通过对应元素相乘再求和来计算它。
接着,我们探讨了内积的数学性质,如交换律、结合律和分配律。
最后,我们通过几个特例和丰富的实际应用场景(如加权评分、成本计算、金融估值等),深入理解了内积的强大功能和广泛用途。
内积是连接向量与标量的一座关键桥梁,是后续学习更复杂线性代数概念和应用的重要基础。


📘 课程 P50:L18.1 - 非线性方程与最小二乘法
在本节课中,我们将学习非线性方程与非线性最小二乘法的基本概念。我们将从非线性方程的定义开始,逐步探讨非线性最小二乘问题,并了解其最优性条件。最后,我们会通过几个实际例子来展示这些概念的应用。
📝 非线性方程
上一节我们介绍了课程概述,本节中我们来看看非线性方程的具体形式。
一组非线性方程的形式如下:我有一些变量 ( x_1 ) 到 ( x_n ),这些是标量变量。我将它们整体视为一个向量 ( x )。然后我有一组方程,形式为 ( f_i(x) = 0 ),共有 ( M ) 个这样的方程。如果 ( f ) 是线性的,这就变成了一组线性方程。
我们将 ( f_i(x) = 0 ) 称为第 ( i ) 个方程。如果我选择一个 ( x ),那么 ( f_i(x) ) 就是第 ( i ) 个残差。残差通常类似于误差,或者表示某个条件未能满足的程度。在这种情况下,如果 ( f_i(x) ) 是 0,意味着该方程成立;如果是 0.0003,意味着它几乎成立;如果是 -0.0001,也意味着它几乎成立。
我们可以用非常紧凑的格式来书写这个方程组,即 ( f(x) = 0 )。这里 ( f ) 是一个从 ( R^n ) 映射到 ( R^m ) 的函数。这意味着它接受 ( n ) 个标量参数 ( x_1 ) 到 ( x_n ),并返回一个 ( M ) 维向量,这些就是残差,即 ( M ) 个残差。有时可以这样写:( f(x) = [f_1(x), ..., f_M(x)]^T )。
如果 ( f ) 是线性的,方程组 ( f(x) = 0 ) 就是一组线性方程。我们将沿用线性方程的命名法来称呼这些非线性方程:如果方程数量多于变量数量(( M > n )),我们称之为超定;如果方程数量少于变量数量(( M < n )),称之为欠定;如果两者相等(( M = n )),称之为适定。
🎯 非线性最小二乘问题
上一节我们定义了非线性方程,本节中我们来看看非线性最小二乘问题。
非线性最小二乘问题是:找到一个向量 ( \hat{x} ),使得以下范数最小化:
[
| f(x) |^2 = f_1(x)^2 + ... + f_M(x)^2
]
这本质上是方程残差的平方和。这包含了求解方程 ( f(x) = 0 ) 的问题,因为如果存在一个 ( x ) 使得 ( f(x) = 0 ),那么这个 ( x ) 肯定能最小化上述范数,因为此时范数平方为 0,而范数平方不可能小于 0。所以这是一个特例。但就像线性最小二乘一样,它本身也非常有用。换句话说,即使不存在使 ( f(x) = 0 ) 的 ( x ),这个方法也能找到一个很好的折衷方案,它最小化了残差的平方和。这与线性最小二乘非常相似,但这是非线性最小二乘问题。因此,我们有这些函数,目标就是最小化 ( f(x) ) 的范数平方,其中 ( f(x) ) 是从 ( R^n ) 到 ( R^m ) 的映射。
🔍 最优性条件
上一节我们提出了非线性最小二乘问题,本节中我们通过微积分来推导其最优性条件。
首先,微积分告诉我们,如果一个多变量函数在某点 ( x ) 处最优,那么在该点梯度为零。否则,你可以沿着某个轴的方向移动一个很小的量,从而找到一个目标值(即 ( | f(x) |^2 ))更小的点。同时,需要记住,有些点梯度为零,但并非最小值点,例如可能是最大值点。
满足梯度为零的点有时被称为驻点,因为这意味着如果你向任何方向移动一点点,函数值不会快速下降(或仅下降极小的量)。( | f(x) |^2 ) 的梯度可以展开计算。这个公式与标量情况下的公式完全类似。其结果是:
[
\nabla | f(x) |^2 = 2 Df(\hat{x})^T f(x) = 0
]
这就是最优性条件。如果 ( F ) 是标量函数,我们问最小化的条件是什么,我们会取这个函数的导数,得到 ( 2 f'(x) f(x) ),并希望它为零。在标量情况下很简单:要么 ( f(x) = 0 ),要么 ( f'(x) = 0 )。上面的矩阵形式就是这个标量方程的类比。当然,标量情况下没有转置,因为都是标量。
这里的矩阵 ( Df(x) ) 在 ( \hat{x} ) 处取值,是函数 ( F ) 的导数或雅可比矩阵。它简单地是偏导数的矩阵,其第 ( ij ) 个元素是 ( F_i ) 对变量 ( x_j ) 的偏导数在 ( \hat{x} ) 处的值。
如果 ( F ) 是线性的,那么这个条件就简化为线性最小二乘中看到的正规方程。当我们讨论非线性最小二乘时,我们称普通最小二乘为线性最小二乘以示区分。
⚠️ 求解的困难性与启发式算法
上一节我们讨论了最优性条件,本节中我们承认求解非线性方程的困难性,并介绍启发式算法。
这里需要承认的是:求解非线性方程非常困难。即使只有 10 或 20 个变量,要最小化 ( | f(x) |^2 ) 也异常困难。特别是,它比求解线性方程要难得多。我们可以轻松求解具有数千个变量和方程组的线性方程,总能得到精确解,而且速度非常快。非线性方程和非线性最小二乘则是另一回事。事实上,即使我给出一个非线性函数 ( f ),然后简单地问:是否存在一个解?即找到一个 ( x ) 使得 ( f(x) = 0 ),这个问题本身也很难。
当我说它很难时,我是在解释“解决问题”意味着什么:找到一个点,其范数平方小于任何其他点。这实际上很难做到。但事实证明,仍然有一些方法在实践中表现很好,我们将使用所谓的启发式算法。启发式算法并不总是保证能找到真正最小化目标函数的点,但它们在实践中通常效果很好。即使它们未能找到真正最小化的点,也常常能找到一个相当好的点。事实上,它们常常确实能解决问题。我们之前遇到过这种情况。
K 均值算法就是解决二次聚类问题的一种启发式方法。这意味着,运行 K 均值算法时,绝对不能保证能找到最小化 K 均值问题目标函数的点。我们甚至看到过这种情况,因为我们会运行 K 均值几次,有时会发现一个值,后来又发现一个更低的值,这意味着第一次找到的不是最优解。后来找到的也可能不是最优的。然而,像这样的启发式方法在实践中仍然非常有效。这并没有阻止 K 均值的应用,K 均值在全世界数百个应用和领域中一直被使用,并且效果很好。
从实践意义上讲,如果有人问你是否真的最小化了目标函数,如果你在法庭上或者周围有数学家之类的人,你的回答可能必须是:技术上,我不知道我是否真的最小化了它,但这是一个相当好的聚类结果,不是吗?对于非线性方程也是如此,通常我们只是使用启发式方法,唯一的问题是,你不能肯定地说那确实是使 ( | f(x) |^2 ) 最小的点。
📊 应用实例
上一节我们讨论了求解的困难,本节中我们来看几个非线性最小二乘方程的例子,看看它们可能是什么样子。
以下是几个例子:
计算平衡点
这在许多领域都非常常见。一般情况是,你有一组变量(n 个),然后通常有某种平衡条件。平衡条件通常意味着消费与生产相匹配等。这被称为平衡点。我将看两个例子:一个来自经济学,一个来自化学。
经济学中的均衡价格:我有一个函数 ( S ),它的作用是:当我们改变 n 种商品的价格(向量 ( p ))时,( S(p) ) 告诉我们这些商品的供应量。例如,当你提高某种商品的价格时,更多的人会制造或供应它,所以供应量会增加,这大致是直观的想法。我们也有需求函数 ( D ),需求会朝另一个方向变化。如果我有一个需求函数,并且我增加一种商品的供应,其需求可能会下降。我们已经在价格弹性矩阵中看到过,当你提高一种价格时,对其他商品的需求可能上升或下降,这取决于它们是替代品还是互补品。
我们的目标是:找到一组价格,使得供应与需求平衡。这是一个非常经典的问题。我们将设 ( F(p) = S(p) - D(p) )。当 ( F(p) = 0 ) 时,意味着价格使得供应恰好平衡需求。这被称为一组均衡价格,即均衡价格向量。这是求解非线性方程的一个例子。需要补充的是,如果供应和需求函数都是线性的,这就是一组线性方程,我们可以用课程前面学过的方法精确求解。
化学平衡:虽然表面上看起来完全不同,但实际上是一种类似的例子。我有一个 n 维浓度向量 ( c ),代表 n 种不同物质的浓度。我有各种反应,有些反应消耗物质,有些反应生成新物质。这些是反应物和产物。它们由反应速率给出。函数 ( C(c) ) 告诉你作为浓度函数的物质消耗率。通常,如果反应物的浓度上升,那么消耗会更多,因为有反应消耗它。我们还有 ( G(c) ),这是物质的生成率,这些本质上是产物。这意味着作为浓度的函数,它告诉你物质产生的速率,这意味着这些物质是反应右侧的产物,而不是反应物。
我们希望找到这些物质在溶液中的浓度,使得消耗恰好等于生成。这意味着反应物和产物达到平衡。化学反应可能仍在进行,但在平衡时,每秒消耗的某种氢离子量将恰好等于作为产物每秒生成的氢离子量(由于多个反应)。这就是化学平衡的概念。为此,我们将其设置为 ( F(c) = C(c) - G(c) )。当 ( F(c) = 0 ) 时,意味着达到化学平衡。所以,计算平衡点通常就是非线性方程组,而且通常方程数量与变量数量相等,即通常是适定系统。
定位估计
这在很多领域都会出现,但它是全球定位系统(GPS)的一部分。这里我有一个三维位置向量 ( x ),你的任务是估计它。我们有的是所谓的距离测量。例如,在二维中,这是 ( x ),你可能有一个信标或卫星在这里,我们测量的是距离。我们知道距离,但带有噪声。( v_i ) 是我们不知道的噪声,只是测量误差。
给定这些有噪声的距离测量(称为测距),你的任务是找出 ( x ) 是什么。最小二乘定位估计所做的就是:我们将最小化 ( v_i ) 的平方和。这里 ( \rho_i ) 是测量的距离或范围,这当然是 ( x ) 的函数,绝对不是线性的。我们想要最小化这个,这就是非线性最小二乘。GPS 中使用的是这个的一个变体。在 GPS 中,除了到卫星的距离外,还有一个额外的偏移项,取决于你的时钟与真实时钟的偏差,除非你碰巧带着原子钟(很少有人有)。所以那里有一个额外的变量,但除此之外基本上就是这个。事实上,GPS 使用的是这个与我们在上一讲中看到的卡尔曼滤波或状态估计的结合,但这是基本思想。
🎓 总结


在本节课中,我们一起学习了非线性方程与非线性最小二乘法的基本概念。我们首先定义了非线性方程组,并引入了非线性最小二乘问题,即最小化残差平方和。我们通过微积分推导了其最优性条件,即梯度为零的条件。同时,我们认识到求解非线性最小二乘问题非常困难,因此在实际中常常依赖启发式算法,这些算法虽不能保证找到全局最优解,但在实践中往往表现良好。最后,我们通过计算平衡点(如经济学中的均衡价格和化学平衡)以及定位估计(如 GPS 原理)等实例,具体展示了非线性最小二乘问题的广泛应用。


📘 课程 P51:L18.2 - LM(Levenberg–Marquardt)算法
在本节课中,我们将学习一种用于近似或启发式求解非线性最小二乘问题的方法——Levenberg–Marquardt(LM)算法。我们将探讨其基本思想、算法步骤,并通过一个实例来理解其工作原理。
🎯 概述
非线性最小二乘问题在许多科学和工程领域都有应用。我们无法直接求解这类问题,因此需要借助迭代方法进行近似。LM 算法结合了线性近似和信任域思想,在实践中表现优异。
🔍 基本思想
上一节我们介绍了非线性最小二乘问题。本节中我们来看看 LM 算法的核心思想。
我们想要最小化目标函数 norm(F(x))²,其中 F 是一个非线性函数。如果 F 是线性的,我们可以直接使用最小二乘法求解。但 F 是非线性的,因此我们需要在其当前点附近构建一个线性(仿射)近似。
以下是构建仿射近似的步骤:
- 设当前点为 z。
- 利用一阶泰勒展开(即微分)在 z 附近对 F 进行线性近似。
- 得到的近似函数 F̂(x; z) 在 x 接近 z 时非常准确,远离时则不可信。
这个近似函数的形式为:
F̂(x; z) = F(z) + Df(z) * (x - z)
其中 Df(z) 是 F 在 z 处的雅可比矩阵(导数矩阵)。
⚙️ LM 算法步骤
基于上述思想,LM 算法通过迭代来寻找最优解。每次迭代,我们都会解决一个带正则化项的最小二乘子问题。
算法迭代过程如下:
- 初始化:给定初始点 x⁰ 和初始参数 λ⁰(通常设为 1)。
- 迭代:对于第 k 次迭代:
- 在当前点 xᵏ 处计算 F 的值 F(xᵏ) 和雅可比矩阵 Df(xᵏ)。
- 求解以下子问题,得到候选点 xᵏ⁺¹:
xᵏ⁺¹ = argminₓ ( || F̂(x; xᵏ) ||² + λᵏ || x - xᵏ ||² )
这个子问题有解析解:
xᵏ⁺¹ = xᵏ - ( Df(xᵏ)ᵀ Df(xᵏ) + λᵏ I )⁻¹ Df(xᵏ)ᵀ F(xᵏ) - 参数更新:根据新点的表现更新 λ 和 x。
- 如果 ||F(xᵏ⁺¹)||² < ||F(xᵏ)||²(目标函数下降),则接受该点,令 xᵏ⁺¹ = xᵏ⁺¹,并减小 λ(例如乘以 0.8),表示我们更信任模型,下次可以更大胆。
- 否则(目标函数未下降),则拒绝该点,令 xᵏ⁺¹ = xᵏ,并增大 λ(例如乘以 2.0),表示我们需要更谨慎,缩小信任域。
λ 被称为“信任域”参数。λ 越大,算法越保守,步长越小;λ 越小,算法越激进,步长越大。
📊 算法实例:距离定位问题
为了更直观地理解 LM 算法,我们来看一个距离定位(Range Estimation)的例子。
问题描述:假设我们在一个平面上,有多个已知位置的信号塔(灯塔)。我们测量了自身到每个信号塔的距离(包含噪声),目标是估计出自己的位置 x。
这是一个典型的非线性最小二乘问题,目标函数是测量距离与计算距离之差的平方和。
以下是算法从三个不同起点运行的轨迹:
- 轨迹1(蓝色)和轨迹2(棕色):算法成功收敛到了全局最优解(红色星标处),即目标函数值最小的点。
- 轨迹3(红色):算法收敛到了一个“局部最优解”。该点的目标函数值比全局最优解大,算法在此处停止了改进。
这个例子说明,LM 算法的结果可能依赖于初始点,并可能收敛到局部最优解而非全局最优解。在实际高维问题中,我们无法可视化,因此算法的这种特性需要被考虑。
✅ 总结
本节课中,我们一起学习了 Levenberg–Marquardt 算法:
- 核心思想:通过在当前迭代点构造线性近似,将复杂的非线性最小二乘问题转化为一系列可精确求解的带正则化线性最小二乘子问题。
- 关键参数:信任域参数 λ 动态调整,平衡了“基于模型前进”和“保持可靠性”两者。目标函数下降时减小 λ 以加速,上升时增大 λ 以保证稳定。
- 算法特性:LM 算法在实践中非常有效,但其解可能是一个局部最优解,收敛结果受初始点影响。


该算法巧妙结合了课程中学习的线性最小二乘、多目标优化和微积分的思想,是解决非线性优化问题的强大工具。


📘 课程 P52:L18.3 - 非线性模型拟合
在本节课中,我们将学习非线性最小二乘法的另一个重要应用:非线性模型拟合。我们将探讨当模型参数以非线性方式进入模型时,如何通过优化方法找到最佳参数,并了解其在分类问题中的应用。
🔍 非线性模型拟合概述
上一节我们介绍了非线性最小二乘法的基本概念,本节中我们来看看它在模型拟合中的具体应用。当模型参数以仿射(线性)方式进入时,我们得到的是线性最小二乘问题,这我们已经知道如何求解。而非线性模型拟合则允许模型参数以非线性方式影响预测结果。
非线性模型拟合的形式如下:我们有一个预测器(或称模型)F̂(xᵢ; θ),其中 xᵢ 是第 i 个特征向量,θ 是我们希望选择的参数。模型的预测值为 ŷᵢ = F̂(xᵢ; θ)。我们的目标是最小化预测误差的平方和。
目标函数公式:
minimize ∑ (yᵢ - F̂(xᵢ; θ))²
这里的关键区别在于,我们不假设 F̂ 是参数 θ 的线性函数。在“参数线性模型”中,F̂ 是参数的线性函数(尽管它可能是特征 x 的非线性函数)。而非线性模型拟合则允许 F̂ 是参数 θ 的任意非线性函数,这能提高模型的表达能力和可解释性。
📈 示例:衰减正弦波拟合
让我们看一个快速示例。假设我们有一些数据,并且我们相信它符合衰减正弦波的形式。
以下是该模型的公式:
ŷ = θ₁ * exp(θ₂ * x) * cos(θ₃ * x + θ₄)
其中:
- θ₁ 控制振幅。
- θ₂ 控制衰减率(若为负)或增长率(若为正)。
- θ₃ 控制正弦波的频率。
- θ₄ 控制相位偏移。
给定一组数据点(如图中的绿色圆圈),我们的任务是选择 θ₁, θ₂, θ₃, θ₄ 以获得对数据的最佳拟合。这就形成了一个非线性最小二乘问题,因为目标函数对于 θ₂, θ₃, θ₄ 是非线性的(尽管对 θ₁ 是线性的)。这类问题通常可以使用 Levenberg-Marquardt 等算法有效求解。
📏 正交距离回归
在传统的模型拟合中,我们测量的是数据点与模型预测值之间的垂直距离(即Y方向的误差)。这适用于将模型视为函数的情况。
然而,有时我们想拟合的是一条曲线,而不仅仅是函数。在这种情况下,更合理的做法是测量数据点到曲线的实际最短距离(即垂直距离和水平距离的综合)。这种方法称为正交距离回归。
以下是正交距离回归的思想:
- 我们不仅允许调整参数 θ,还允许为每个数据点微调其对应的特征值。我们将原始特征值 xᵢ 调整为一个新变量 uᵢ。
- 目标是最小化调整后的特征值 uᵢ 与原始值 xᵢ 的差异,以及基于 uᵢ 的预测值 F̂(uᵢ; θ) 与真实值 yᵢ 的差异。
正交距离回归的目标函数公式:
minimize ∑ [ (yᵢ - F̂(uᵢ; θ))² + (uᵢ - xᵢ)² ]
我们需要同时优化模型参数 θ 和调整后的特征值 uᵢ。即使 F̂ 对 θ 是线性的,由于引入了变量 uᵢ,这仍然是一个非线性最小二乘问题。这种方法在需要考虑特征测量误差的场景中非常有用。
🧮 非线性最小二乘分类
回忆一下线性最小二乘分类器的工作原理:我们首先通过最小二乘法拟合一个函数 f(x),使其预测值尽可能接近标签值(例如 +1 或 -1)。然后,我们通过取 sign(f(x)) 来得到最终的分类结果(+1 或 -1)。
非线性最小二乘分类器在此基础上进行了改进。它直接考虑我们最终将使用 sign 函数这一事实。我们观察到,对于分类任务,我们真正关心的是最小化分类错误的数量。
分类错误数量与平方误差的关系:
∑ ( sign( F̂(xᵢ; θ) ) - yᵢ )² = 4 * (错误分类的数量)
因为当预测正确时,差值为0;预测错误时,差值为 ±2,平方后为4。
因此,理想情况下,我们希望最小化上述表达式。然而,sign 函数在零点不连续、不可微,这给基于梯度的优化带来了困难。
解决方案:用一个可微的函数来近似 sign 函数,例如 Sigmoid 函数(σ)。Sigmoid 函数是 sign 函数的一个平滑近似。
使用Sigmoid近似的目标函数:
minimize ∑ ( σ( F̂(xᵢ; θ) ) - yᵢ )² + λ * ||θ||²
其中,λ 是正则化参数,用于防止过拟合。这样,我们就把问题转化为了一个可以使用 Levenberg-Marquardt 等算法求解的非线性最小二乘问题。
✍️ 实践案例:手写数字识别
我们将上述方法应用于著名的 MNIST 手写数字数据集。每个样本是一个 493 维的特征向量(包含像素强度和一个常数项)。
以下是构建多类分类器的步骤:
- 我们为每个数字类别(0-9)训练一个独立的非线性最小二乘分类器(采用“一对多”策略)。
- 使用 Sigmoid 函数作为 sign 的近似。
- 在目标函数中加入正则化项。
通过调整正则化参数 λ,我们可以在验证集上获得约 7.5% 的错误率。这个结果已经非常有竞争力。
进一步的性能提升:如果我们进行一些特征工程,例如生成大量随机特征(例如,通过随机线性组合后取正部),测试错误率可以进一步降至 2% 左右。有趣的是,这个水平已经与人类在该任务上的表现相当。
这个例子表明,即使使用相对简单的模型和优化技术(如本课程所授),也能在复杂任务上取得接近人类水平的性能。这也揭示了现代许多机器学习方法(包括神经网络)背后的核心思想——通过优化非线性模型来拟合数据。
📚 课程总结


本节课中我们一起学习了非线性最小二乘法在模型拟合中的应用。我们首先介绍了非线性模型拟合的基本形式,并与线性情况进行了对比。接着,我们通过衰减正弦波的例子展示了具体应用。然后,我们探讨了正交距离回归这一更精确的曲线拟合方法。最后,我们将非线性最小二乘的思想扩展到分类问题,通过使用 Sigmoid 函数近似 sign 函数,构建了非线性分类器,并在手写数字识别任务上验证了其有效性。这些内容将非线性优化与实际问题联系起来,为我们理解更复杂的机器学习模型奠定了基础。

📘 课程 P53:L19.1 - 受约束的非线性最小二乘法

在本节课中,我们将学习受约束的非线性最小二乘法。与之前讨论的线性约束不同,这里我们将面对非线性等式约束。我们将探讨问题的定义、最优性条件,并介绍一种基础的求解方法——惩罚函数法。
🎯 问题定义
第19章的主题是受约束的非线性最小二乘法。这意味着我们不仅要处理非线性最小二乘问题,还要满足一组等式约束。这些约束不再是线性的,而是非线性的。
问题的数学形式如下:
最小化:
[
|f(x)|^2
]
约束条件:
[
g(x) = 0
]
其中:
- ( f(x) ) 是一个向量函数,其范数的平方即为目标函数。
- ( g(x) ) 是一个向量函数,代表 ( p ) 个标量等式约束。( g(x) = 0 ) 表示所有约束必须同时满足。
我们称满足 ( g(x) = 0 ) 的点 ( x ) 为可行点。一个点 ( \hat{x} ) 是问题的解,当且仅当它是可行的,并且对于任何其他可行点,其目标函数值都不小于 ( f(\hat{x}) ) 的值。
与非线性最小二乘法类似,精确求解此类问题通常非常困难。但在实践中,存在一些非常有效的启发式算法,它们通常能给出足够好的解,从而在众多领域得到广泛应用。
🔍 最优性条件与拉格朗日函数
为了推导受约束非线性最小二乘问题的最优性条件,我们引入拉格朗日函数。
首先,构造拉格朗日函数。我们在目标函数 ( |f(x)|^2 ) 的基础上,为每个约束 ( g_i(x) = 0 ) 引入一个拉格朗日乘子 ( z_i ),并将约束乘以对应的乘子后加到目标函数上。
拉格朗日函数 ( L(x, z) ) 的向量形式为:
[
L(x, z) = |f(x)|^2 + g(x)^T z
]
其中 ( z ) 是拉格朗日乘子向量。
拉格朗日乘子法指出,如果 ( \hat{x} ) 是问题的一个解,那么必然存在一组最优拉格朗日乘子 ( \hat{z} ),使得拉格朗日函数 ( L ) 对 ( x ) 和 ( z ) 的梯度在 ( (\hat{x}, \hat{z}) ) 处为零(同时需要满足一些技术性条件,本课程暂不深入讨论)。
满足此条件的点 ( \hat{x} ) 被称为驻点。需要注意的是,与无约束非线性最小二乘一样,驻点不一定就是全局最优解。
梯度计算
接下来,我们具体计算这两个梯度。
-
对 ( x ) 的梯度:
[
\nabla_x L = 2 Df(x)^T f(x) + Dg(x)^T z
]
其中 ( Df(x) ) 和 ( Dg(x) ) 分别是 ( f ) 和 ( g ) 在 ( x ) 处的雅可比矩阵(导数矩阵)。第一项与无约束非线性最小二乘的梯度形式相同,第二项则来自约束条件。 -
对 ( z ) 的梯度:
[
\nabla_z L = g(x)
]
这非常简单,因为拉格朗日函数中关于 ( z ) 的部分是线性的。
因此,最优性条件可以写为:
[
\begin{cases}
2 Df(\hat{x})^T f(\hat{x}) + Dg(\hat{x})^T \hat{z} = 0 \
g(\hat{x}) = 0
\end{cases}
]
第一个条件被称为对偶可行性条件,第二个条件就是原始的可行性条件(即解必须满足约束)。如果去掉约束(即 ( g(x) ) 不存在),那么最优性条件就退化回我们熟悉的无约束非线性最小二乘形式。
🔗 线性约束作为特例
为了加深理解,我们来看一个特例:线性约束最小二乘。此时,函数 ( f ) 和 ( g ) 都是线性的(仿射函数)。
设:
[
f(x) = Ax - b, \quad g(x) = Cx - d
]
那么,它们的导数(雅可比矩阵)就是常数矩阵:( Df(x) = A ), ( Dg(x) = C )。
将上述定义代入一般形式的最优性条件,我们得到:
[
\begin{cases}
2 A^T (A\hat{x} - b) + C^T \hat{z} = 0 \
C\hat{x} - d = 0
\end{cases}
]
这正是线性约束最小二乘问题的 KKT 条件。通常,我们会将其组装成以下的矩阵方程进行求解:
[
\begin{bmatrix}
2A^TA & C^T \
C & 0
\end{bmatrix}
\begin{bmatrix}
\hat{x} \
\hat{z}
\end
\begin{bmatrix}
2A^Tb \
d
\end{bmatrix}
]
左侧的矩阵称为 KKT 矩阵。对于线性问题,直接求解这个线性方程组即可得到精确解 ( \hat{x} ) 和对应的最优拉格朗日乘子 ( \hat{z} )。
⚙️ 惩罚函数法简介
对于一般的非线性约束问题,我们无法直接求解。本节介绍一种基础的近似求解方法——惩罚函数法。其核心思想非常直观:既然约束要求 ( g(x) = 0 ),我们可以将违反约束的“惩罚”直接加到目标函数中,通过增大惩罚系数来迫使解趋向可行域。
我们构造一个新的无约束优化问题:
[
\text{最小化} \quad |f(x)|^2 + \mu_k |g(x)|^2
]
其中 ( \mu_k > 0 ) 是一个惩罚参数。直观上,当 ( \mu_k ) 变得非常大时,为了使总目标函数值最小化,算法将不得不让 ( |g(x)|^2 ) 变得非常小,从而近似满足 ( g(x) \approx 0 )。
算法步骤
以下是惩罚函数法的基本步骤:
- 选择一个递增的惩罚参数序列,例如 ( \mu_1 = 1, \mu_2 = 2, \mu_3 = 4, \dots )。
- 对于每个 ( \mu_k ),求解无约束问题 ( \min |f(x)|^2 + \mu_k |g(x)|^2 )。
- 求解时,使用 Levenberg-Marquardt 等非线性最小二乘算法。
- 关键技巧(热启动):在求解第 ( k+1 ) 个问题时,将第 ( k ) 个问题的解 ( x_k ) 作为迭代的初始点。这比每次都从零或随机点开始(冷启动)效率高得多。
与最优性条件的联系
惩罚函数法有一个有趣的性质。对于每个子问题,其最优性条件为:
[
2 Df(x_k)^T f(x_k) + 2 \mu_k Dg(x_k)^T g(x_k) = 0
]
如果我们定义 ( z_k = 2 \mu_k g(x_k) ),那么上述条件可以重写为:
[
2 Df(x_k)^T f(x_k) + Dg(x_k)^T z_k = 0
]
这恰好与原始问题最优性条件中的第一个条件(对偶可行性)形式一致。而第二个条件(可行性 ( g(x)=0 ))则通过 ( \mu_k ) 增大来逐渐逼近。
因此,惩罚函数法可以看作在产生一个序列 ( (x_k, z_k) ),使得对偶可行性条件自动满足,而算法的主要任务是驱动 ( g(x_k) ) 趋向于零(即趋向可行性)。我们通常当 ( |g(x_k)| ) 足够小时停止算法。
📊 算法示例
考虑一个简单的二维示例问题:
- 目标函数:( f(x) = [x_1 + e^{-x_2}, \quad x_1^2 + 2x_2 + 1]^T )
- 约束条件:( g(x) = x_1 + x_1^3 + x_2 + x_2^2 = 0 ) (单个约束 ( p=1 ))
下图展示了求解过程。虚线是可行集 ( g(x)=0 ),实线是惩罚函数 ( |f(x)|^2 + \mu_k g(x)^2 ) 的等高线。

随着 ( \mu_k ) 从 1 增大到 32,算法求得的解 ( x_k ) (图中点)沿着可行集移动,并最终收敛到真正的最优解 ( \hat{x} ) 附近。
收敛过程如下图所示,蓝线表示约束违反度 ( |g(x)| ),红线表示对偶条件的残差。随着迭代进行(横轴是Levenberg-Marquardt算法的总迭代次数),两者都逐渐趋近于零。

📝 本节总结
在本节课中,我们一起学习了受约束的非线性最小二乘法。
- 我们首先定义了包含非线性等式约束的优化问题。
- 接着,通过引入拉格朗日函数,推导出了问题的最优性条件(KKT条件),并验证了线性约束情形是其特例。
- 最后,我们介绍了一种基础的求解算法——惩罚函数法。该方法通过将约束 violation 作为惩罚项加入目标函数,并逐步增大惩罚系数,来迫使解逼近可行域并满足最优性条件。我们还通过一个示例直观展示了该方法的运行过程。


惩罚函数法概念简单,但有一个潜在缺点:当惩罚系数 ( \mu_k ) 非常大时,优化问题的条件数可能变差,导致数值计算困难。在下一节中,我们将介绍一种改进的方法——增广拉格朗日法,它能更好地克服这个缺点。


课程 P54:L19.2 - 拓展拉格朗日法 🚀
在本节课中,我们将要学习拓展拉格朗日法。这是一种对惩罚法的改进方法,它保留了惩罚法的优点,但克服了其关键缺陷,即无需将惩罚参数 mu 增大到无穷大也能获得良好解。在实践中,它的表现通常也更好。
惩罚法的缺陷
上一节我们介绍了惩罚法。惩罚法的一个缺点是,其惩罚参数 mu 需要迅速增大,并且必须变得非常大才能将约束 g(x) 驱动到零。当 mu 非常大时,非线性最小二乘子问题会变得难以求解。我们观察到,对于非常大的 mu,Levenberg-Marquardt 算法要么需要大量迭代,要么会失败(在实践中,这意味着计算时间过长或无法收敛)。
为了纠正这个问题,我们将展示一种方法,它实际上只是对惩罚法的一个微小修改,但通过维护并更新另一个向量,避免了惩罚法的上述缺陷。
拓展拉格朗日法介绍
这种方法被称为拓展拉格朗日法,是优化领域的标准方法。拓展拉格朗日函数定义如下:
L_aug(x, z, mu) = f(x) + z^T * g(x) + mu * ||g(x)||^2
其中,f(x) 是原目标函数,z 是拉格朗日乘子向量,mu 是惩罚参数,g(x) 是约束函数。最后一项 mu * ||g(x)||^2 是拓展项。
你可能会觉得这个拓展项是多余的,因为对于任何可行点(即满足 g(x) = 0 的点),这一项都为零。这意味着原问题与这个带拓展项的问题是等价的,它们具有相同的最优解集。那么,为什么添加这个项会有帮助呢?令人惊讶的是,它确实有效。
拓展拉格朗日函数的等价形式
我们可以重写拓展拉格朗日函数,使其结构更清晰。通过展开平方项并进行整理,可以得到以下等价形式:
L_aug(x, z, mu) = || [ sqrt(mu) * g(x) + z/(2*sqrt(mu)) ] ||^2 + f(x) - (1/(4*mu)) * ||z||^2
这个表达式表明,拓展拉格朗日函数看起来像一个非线性最小二乘目标(第一项),然后减去一个依赖于 z 的项。
几点说明:
- 当
z = 0时,该方法退化为标准的惩罚法。 - 固定
mu和z后,我们可以通过最小化L_aug(x, z, mu)来求解x。这与惩罚法非常相似,只是在对应对可行性的部分(即g(x)相关项)增加了一个巧妙设计的项。
最优性条件与乘子更新
我们尚未确定 z 应该是什么。接下来,我们将从最优性条件中推导出 z 的更新规则。
最小化拓展拉格朗日函数 L_aug(x, z, mu) 得到的解 x_tilde,其最优性条件为:
∇f(x_tilde) + Dg(x_tilde)^T * (z + 2*mu * g(x_tilde)) = 0
我们定义一个新的乘子 z_tilde:
z_tilde = z + 2 * mu * g(x_tilde)
利用这个定义,上面的最优性条件可以重写为:
∇f(x_tilde) + Dg(x_tilde)^T * z_tilde = 0
这非常棒,因为第一个方程(关于目标函数和约束梯度的条件)自动满足了。剩下的就是驱动 g(x) 趋于零以满足可行性条件。
这个推导表明,如果 g(x_tilde) 不够小,那么 z_tilde 是对乘子 z 的一个很好更新。这直接引出了拓展拉格朗日算法。
拓展拉格朗日算法步骤
以下是拓展拉格朗日法的具体步骤:
- 初始化: 选择初始点
x0,初始乘子z0(通常设为0),初始惩罚参数mu0 > 0,以及缩减因子ρ > 1(例如ρ=10)和进度阈值τ(例如τ=0.25)。 - 主循环(对于
k = 0, 1, 2, ...):- 最小化子问题: 以
x_k为起点,使用 Levenberg-Marquardt 等方法,近似求解无约束优化问题min_x L_aug(x, z_k, mu_k),得到解x_{k+1}。 - 乘子更新: 使用公式
z_{k+1} = z_k + 2 * mu_k * g(x_{k+1})更新拉格朗日乘子。 - 惩罚参数更新: 检查可行性进展。如果
||g(x_{k+1})|| > τ * ||g(x_k)||(即可行性改进不足),则增大惩罚参数:mu_{k+1} = ρ * mu_k;否则,保持mu_{k+1} = mu_k。 - 终止条件: 如果
||g(x_{k+1})||足够小,则停止迭代,输出x_{k+1}作为近似解。
- 最小化子问题: 以
与惩罚法每次都必须增大 mu 不同,拓展拉格朗日法只在必要时才增大 mu,因此 mu 的增长更缓慢,这使得子问题更容易求解。
算法示例
让我们看一个与之前惩罚法相同的简单例子。应用拓展拉格朗日法后,效果非常显著:
- 第一步后,我们未取得足够进展,因此将
mu从1增加到2。 - 第二步后,进展仍不足,将
mu增加到4。 - 从第三步开始,已经非常接近可行域。此时算法保持
mu=4,仅需几次迭代就得到了高质量的解。 - 在大约6步之后,残差就达到了
10^{-4}量级。
关键对比: 在惩罚法中,mu 最终需要增长到 10000;而在拓展拉格朗日法中,mu 只增长到4就停止了。这体现了后者的优势。
应用实例:车辆轨迹规划 🚗
最后,我们通过一个车辆轨迹规划的例子来展示拓展拉格朗日法的实际应用。我们使用一个简化的车辆模型(如Dubins车模型),其连续时间动力学方程为:
dx/dt = v * cos(θ)
dy/dt = v * sin(θ)
dθ/dt = (v / L) * tan(φ)
其中 (x, y) 是位置,θ 是航向角,v 是速度,φ 是前轮转向角,L 是轴距。
我们将时间离散化(例如使用前向欧拉法),定义状态向量 x_k = [x_k, y_k, θ_k]^T 和控制输入 u_k = [v_k, φ_k]^T。离散化后的模型为 x_{k+1} = f(x_k, u_k)。
控制问题: 我们希望找到一系列控制输入,使车辆从给定的初始状态 (x_init, y_init, θ_init) 运动到期望的最终状态 (x_final, y_final, θ_final),同时希望控制输入较小且变化平缓(避免急加速和急转弯)。
我们可以将其建模为一个约束非线性最小二乘问题:
- 目标函数:最小化控制量的平方和及其平滑度惩罚项。
- 约束:离散动力学方程
x_{k+1} = f(x_k, u_k),以及初始和终端状态约束。
使用拓展拉格朗日法求解此问题,算法能够自动生成复杂的轨迹。例如:
- 平行泊车: 算法规划出的轨迹包括前进、倒车、调整方向等一系列操作。
- 调头: 从指向东变为指向北,算法规划出平滑的转弯路径。
- 复杂机动: 对于某些起止点,算法甚至能规划出“先倒车再前进”的复合轨迹。
通过查看生成的控制输入序列(速度 v 和转向角 φ 随时间的变化),我们可以验证这些轨迹的合理性。例如,在倒车时,速度 v 为负值,同时转向角 φ 会相应变化以调整倒车方向。
这个例子表明,即使对于看似复杂的轨迹规划问题,拓展拉格朗日法这样的“笨”算法也能找到相当精巧的解决方案。它是自动驾驶、自动泊车等领域中轨迹规划算法的重要基础组件。
本节课总结 🎯


在本节课中,我们一起学习了拓展拉格朗日法。我们首先回顾了惩罚法需要无限增大惩罚参数的缺陷,然后引入了拓展拉格朗日函数,它通过增加一个拉格朗日乘子项和惩罚项来改进原拉格朗日函数。我们从最优性条件推导出了乘子的更新公式 z_{k+1} = z_k + 2 * mu_k * g(x_{k+1}),并阐述了完整的算法步骤。该算法的核心优势在于其惩罚参数 mu 仅在必要时才增大,使得子问题更容易求解,从而在实践中比纯惩罚法更高效、更稳定。最后,我们通过一个车辆轨迹规划的实例,直观展示了拓展拉格朗日法解决复杂约束优化问题的强大能力。

课程 P6:L1.6 - 复杂度计算 🧮


在本节课中,我们将要学习第一章的最后一个主题:复杂度。复杂度是衡量计算机执行特定操作所需时间的粗略指标。这个概念将在整个课程中被反复提及。

概述
复杂度计算的核心思想是估算算法执行所需的基本运算次数。计算机以浮点数格式存储实数。在本课程中,你无需了解其具体细节,只需知道它允许计算机以非常接近的精度表示数字。例如,计算机不会精确存储三分之一,而是存储为类似0.33333...的形式,这对于实际应用已经足够接近。
浮点运算与复杂度
当计算机对两个浮点数执行基本操作,如加法、乘法、除法或减法时,这被称为一次浮点运算。其缩写是 flop。一次 flop 就是在计算机上对两个数字进行一次加法运算。
算法的复杂度就是通过简单累加你需要执行的所有浮点运算次数来估算的。例如,你可以计算需要将两个数字相乘、相加、相减或相除的次数,并将这些数字加在一起,这就是你操作的 flop 计数。
复杂度估算的近似性
需要明确的是,这是一种非常粗略的近似。因为它隐含了一个假设:加法运算和除法运算的成本相同,而实际上除法运算耗时更长。然而,这种估算的目的在于给出一个大致概念,帮助我们判断一个操作是需要远少于一秒、一秒、一分钟、一小时还是一天才能完成。
计算时间估算
执行一组操作所需时间的粗略估算公式如下:
执行时间 ≈ 所需总 flop 数 / 计算机速度
其中,计算机速度以 每秒 flop 数 为单位。你可以看到,所需 flop 数除以每秒 flop 数,得到的结果单位是秒,这告诉你操作将花费多少时间。
这是一个非常粗略的近似,我们并不期望其精度在±20%以内。事实上,它甚至可能偏差10倍或更多,但它确实能有效区分秒级和小时级的耗时。
现代计算机的运算能力
当前一台普通计算机大约每秒能执行十亿次浮点运算。实际上,我的手机就能做到这一点。我的笔记本电脑可能能达到每秒百亿次。更强大的计算机,例如图形处理单元,其运算能力甚至远超于此。许多GPU现在每秒可以执行10^12次浮点运算,即一万亿次,这被称为每秒一太拉浮点运算的计算机。
让我们看一个简单的例子。假设你有一个操作需要执行1010次浮点运算,这很多,是100亿次。在一台典型的每秒能执行1010次浮点运算的计算机上,我们估计这个操作大约需要一秒钟。
向量运算的复杂度分析
上一节我们介绍了复杂度估算的基本概念,本节中我们来看看向量运算的具体复杂度。
以下是向量加法和内积运算的复杂度分析:
-
向量加法:将两个向量相加。这需要执行 n 次加法运算,因为你需要将每个 X_i 与对应的 Y_i 相加。因此,总复杂度是 n flops。
-
向量内积:计算 X_1 * Y_1 + ... + X_n * Y_n。首先,你需要将所有对应的元素对相乘,这需要 n 次乘法。然后,你需要将这些乘积相加。将两个数相加需要1次加法,将三个数相加需要2次加法,因此将 n 个数相加需要 n-1 次加法。所以总 flop 数为 n + (n-1) = 2n - 1。
由于复杂度估算本身非常粗略,人们通常会忽略常数项,直接说内积运算的复杂度是 2n flops。事实上,很多人甚至简化为 n flops,因为我们在此并不追求2倍以内的精度。
稀疏向量的影响
顺便提一下,这一点很有趣。如果其中一个向量是稀疏的,计算量会大大减少。例如,假设向量 x 是稀疏的,而 y 不是。稀疏意味着 x 的大部分元素是0。
在计算内积时,我不需要处理那些元素,因为无论 y 对应元素是什么,0乘以任何数都是0,我不必执行这个乘法。实际上,我只需要对 x 中的每一个非零元素,将其与 y 中对应的元素相乘,然后将这些乘积相加。因此,复杂度大约为 2 * (x 中非零元素的数量)。
这就是为什么我们可能对稀疏向量感兴趣或关注它的一个例子。


总结


本节课中我们一起学习了复杂度计算。我们了解到,复杂度是通过估算算法所需的基本浮点运算次数来衡量的,这是一种粗略但有效的评估计算耗时的方法。我们分析了向量加法和内积运算的复杂度,并看到了稀疏向量如何能显著降低计算成本。掌握复杂度估算有助于我们预计算法的执行效率,是算法设计与分析中的重要基础。


📘 课程 P7:L2.1 - 线性函数
在本节课中,我们将学习线性函数与仿射函数的基本概念。线性函数是许多数学、工程和科学领域的基础,而仿射函数则是线性函数的一个简单扩展,在实际应用中同样非常重要。
1️⃣ 函数与符号表示
首先,我们介绍函数的数学表示方法。符号 F: R^n → R 表示函数 F 接受一个 n 维向量作为输入,并输出一个实数。我们可以将 F 视为一个过程或计算机程序中的子程序,它接收 n 个数字,经过处理后返回一个数字。
例如,F(u) 表示函数 F 作用于向量 u,结果是一个数字。
2️⃣ 叠加性质与线性函数
上一节我们介绍了函数的符号表示,本节中我们来看看线性函数的核心特征:叠加性质。
一个从 R^n 到 R 的函数 F 满足叠加性质,如果对于任意向量 x 和 y,以及任意标量 α 和 β,以下等式恒成立:
F(αx + βy) = αF(x) + βF(y)
这个性质意味着,先对输入进行线性组合再应用函数,与先应用函数再对结果进行线性组合,得到的结果是相同的。数学家会说函数 F 与线性组合“可交换”。满足叠加性质的函数被称为线性函数。
3️⃣ 线性函数的例子:内积
理解了线性函数的定义后,我们来看一个具体的例子:内积函数。
假设我们有一个固定的 n 维向量 a。我们定义一个函数 F(x) = a^T x,即向量 a 与 x 的内积。这个函数计算的是 x 各分量的加权和,权重由 a 的分量决定。
我们可以验证它是线性的:
F(αx + βy) = a^T (αx + βy)- 根据内积的分配律和标量乘法性质,上式等于
α(a^T x) + β(a^T y) - 这正好等于
αF(x) + βF(y)
因此,内积函数是线性函数。
4️⃣ 线性函数的表示定理
一个重要的结论是:所有线性函数都可以表示为内积形式。
如果 F 是线性函数,那么存在一个向量 a,使得对于任意输入 x,都有:
F(x) = a^T x
其中,向量 a 的分量 a_i 可以通过将 F 作用于第 i 个单位向量 e_i 得到,即 a_i = F(e_i)。这个结论被称为线性函数的内积表示。
5️⃣ 从线性到仿射
线性函数有一个重要性质:F(0) = 0。但在许多实际场景中,我们需要一个更灵活的形式。这就是仿射函数。
一个仿射函数是线性函数加上一个常数项:
G(x) = a^T x + b
其中,b 是一个实数,通常称为偏移量或截距。注意,对于仿射函数,G(0) = b,因此除非 b=0,否则它不是线性函数。
6️⃣ 仿射函数的叠加性质
仿射函数也满足一种“受限”的叠加性质。对于任意向量 x 和 y,以及满足 α + β = 1 的任意标量 α 和 β,以下等式成立:
G(αx + βy) = αG(x) + βG(y)
这种系数和为1的线性组合被称为仿射组合或混合。当且仅当一个函数对所有仿射组合都满足此性质时,它才是仿射函数。
7️⃣ 几何直观:直线图像
最后,我们通过几何图像来直观理解。当输入 x 是一维时(即一个数字),函数图像可以画在平面上。
- 线性函数
F(x) = ax的图像是一条经过原点(0,0)的直线。 - 仿射函数
G(x) = ax + b的图像是一条不经过原点(除非b=0)的直线,它在纵轴上的截距是b。
这解释了为什么在中学数学中,形如 y = mx + b 的方程被称为“线性方程”,尽管严格来说它是仿射函数。在实际交流中,人们常常将“仿射”和“线性”混用,但在严谨的数学语境下,区分它们是有必要的。
本节课总结
在本节课中,我们一起学习了:
- 线性函数的定义:满足叠加性质
F(αx + βy) = αF(x) + βF(y)的函数。 - 线性函数的内积表示定理:任何线性函数都可写为
F(x) = a^T x。 - 仿射函数的定义:线性函数加一个常数,
G(x) = a^T x + b。 - 仿射函数满足受限的叠加性质,要求系数之和为1。
- 从几何上看,一维的线性函数图像是过原点的直线,而仿射函数图像是任意直线。


理解线性与仿射函数是学习更复杂数学模型和机器学习算法的重要基础。


📘 课程 P8:L2.2 - 泰勒近似与回归
在本节课中,我们将学习两种非常著名且广泛应用的仿射函数例子:一个是来自微分学的泰勒近似,另一个是来自统计学的回归模型。这两种方法都是通过简单的线性(仿射)形式来近似描述更复杂的函数关系。
🧮 泰勒近似
上一节我们介绍了仿射函数的基本概念。本节中,我们来看看如何利用泰勒近似,将一个复杂的非线性函数在某个点附近用一个仿射函数来近似。
假设我们有一个函数 f,它将一个 n 维向量映射为一个实数。用数学符号表示为:
[
f: \mathbb{R}^n \to \mathbb{R}
]
这意味着函数 f 接受一个 n 维向量作为输入,并输出一个实数。
一阶泰勒近似 在点 z 附近展开,其形式如下:
[
\hat{f}(x) = f(z) + \nabla f(z)^T (x - z)
]
这里,(\hat{f}) 表示 f 的近似,(\nabla f(z)) 是函数 f 在点 z 处的梯度向量,其分量是 f 对各个变量的偏导数。
为了更清楚地看出这是一个仿射函数,我们可以将其重写为:
[
\hat{f}(x) = \underbrace{\nabla f(z)T}_{aT} x + \underbrace{[f(z) - \nabla f(z)^T z]}_{b}
]
这正好符合仿射函数的标准形式 (a^T x + b)。
泰勒近似的核心性质是:当 x 非常接近 z 时,近似值 (\hat{f}(x)) 会非常接近真实值 (f(x))。在二维情况下,这相当于在曲线上某点作一条切线;在高维情况下,则是在该点作一个切平面。
📈 回归模型
理解了泰勒近似这种“自然产生”的仿射近似后,我们来看看一个“人为构建”的仿射模型——回归模型。它在统计学和机器学习中无处不在。
在回归模型中,我们有一个特征向量 x,其分量代表了某个对象(如病人、公司、房屋)的各种属性。我们想要预测一个与之相关的结果 y(如住院天数、股票收益、房屋售价)。
线性回归模型的预测公式如下:
[
\hat{y} = v + \beta^T x = v + \beta_1 x_1 + \beta_2 x_2 + ... + \beta_n x_n
]
其中:
- (\hat{y}) 是对真实值 y 的预测或近似。
- (v) 是一个常数,称为偏移量。
- (\beta) 是一个权重向量或系数向量,其分量 (\beta_i) 代表了对应特征 (x_i) 对预测结果的贡献程度。
这个模型显然是一个关于特征 x 的仿射函数。
以下是关于模型参数的解释:
- 偏移量 (v):可以理解为当所有特征值 (x_i) 都为 0 时,模型的预测基准值。
- 系数 (\beta_i):表示当特征 (x_i) 增加 1 个单位,而其他特征保持不变时,预测值 (\hat{y}) 的变化量。如果 (\beta_i) 为负,则意味着该特征增加会导致预测值下降。
🏠 回归模型实例:房屋价格预测
让我们通过一个简化的例子来具体理解回归模型。假设我们想预测房屋的售价(y,单位:千美元),并且只使用两个特征:
- (x_1):房屋面积(单位:千平方英尺)
- (x_2):卧室数量
一个可能的回归模型如下:
[
\hat{y} = 54.4 + 148.73 x_1 - 18.85 x_2
]
模型参数解读:
- 系数 148.73:意味着房屋面积每增加1000平方英尺(即 (x_1) 增加1),预测售价将增加约148.73(千美元),即约14.9万美元。
- 系数 -18.85:看起来有些反直觉,它意味着在房屋面积 保持不变 的前提下,卧室数量每增加一间,预测售价反而会下降约1.885万美元。这可能是因为在固定面积下,卧室增多会导致每个房间更拥挤。
- 偏移量 54.4:可以粗略解释为“土地成本”或基础价格,即当房屋面积和卧室数都为0(这并非实际房屋)时的预测价格。
模型应用与评估:
在实际使用中,我们将房屋的特征值代入公式即可得到预测价格。需要注意的是,这个极度简化的模型预测精度有限。在现实中,预测房价需要使用数十甚至数百个特征(如地段、学区、房龄等)。模型的优劣可以通过比较预测值 (\hat{y}) 和实际成交价 y 来评估;理想情况下,所有数据点都应落在 (y = \hat{y}) 的对角线附近。
📝 总结
本节课中我们一起学习了两种重要的仿射函数应用:
- 泰勒近似:提供了一种系统性的方法,用仿射函数(切线或切平面)在局部近似任意光滑的非线性函数。其核心公式为 (\hat{f}(x) = f(z) + \nabla f(z)^T (x - z))。
- 回归模型:一个强大且广泛应用的工具,它使用特征的仿射组合 (\hat{y} = v + \beta^T x) 来预测某个未知结果。模型中的系数具有直观的解释意义,揭示了每个特征如何影响预测值。


两者虽然来源不同,但都体现了仿射函数作为复杂关系的简单、可解释近似所发挥的巨大作用。


📏 课程 P9:L3.1 - 范数与距离
在本节课中,我们将学习向量范数的概念,它是衡量向量“长度”或“大小”的一种方式。从范数出发,我们还将探讨向量之间的距离。这些概念是线性代数乃至更广泛数学和工程领域的基础工具。
1️⃣ 什么是范数?
范数,特别是我们即将讨论的欧几里得范数,是向量长度的一种度量。它本质上是向量绝对值概念在多维空间中的推广。
对于一个 n 维向量 x,其范数记作 ||x||,计算公式如下:
||x|| = √(x₁² + x₂² + ... + xₙ²)
这个公式可以理解为向量各分量平方和的平方根。它也可以写作向量与自身内积的平方根:||x|| = √(xᵀx)。
当 n=1 时,向量退化为标量,其范数就是该标量的绝对值。因此,范数确实是绝对值在多维空间中的自然延伸。
示例:计算向量 x = [1, 0, 1]ᵀ 的范数。
||x|| = √(1² + 0² + 1²) = √2 ≈ 1.414
2️⃣ 范数的基本性质
范数具有几个非常重要的数学性质,这些性质使其成为一个良好定义的度量工具。
以下是范数的四个核心性质:
- 齐次性:对于任意标量 β 和向量 x,有 ||βx|| = |β| · ||x||。这意味着缩放向量会按比例缩放其范数。特别地,||-x|| = ||x||。
- 三角不等式:对于任意向量 x 和 y,有 ||x + y|| ≤ ||x|| + ||y||。这个性质名称的几何意义将在后面解释,它表明“两边之和大于第三边”。
- 非负性:对于任意向量 x,有 ||x|| ≥ 0。范数永远是非负的。
- 正定性:||x|| = 0 当且仅当 x 是零向量(所有分量均为 0)。这是由平方和的性质决定的:只有当所有平方项(即所有分量)都为 0 时,其和才可能为 0。
3️⃣ RMS值:另一种“大小”度量
除了范数,另一个广泛使用的度量是均方根值。RMS 值在工程领域尤为常见,它提供了向量分量“典型”大小的直观感觉。
对于一个 n 维向量 x:
- 其均方值为:(||x||²) / n
- 其均方根值为:RMS(x) = √(均方值) = ||x|| / √n
为什么使用 RMS 值?
考虑一个所有分量都为 1 的 n 维向量 1。其范数是 √n,这个值会随着向量维度 n 的增长而增长。然而,其 RMS 值始终是 1,这更直观地反映了每个分量的大小都是 1。因此,RMS 值在比较不同维度向量的大小时特别有用。
4️⃣ 分块向量的范数
当向量由多个子向量“堆叠”而成时,其范数的计算有简便方法。
假设有一个由三个子向量 a, b, c 堆叠而成的向量 x = [a; b; c]。那么,该向量的范数平方满足以下关系:
||x||² = ||a||² + ||b||² + ||c||²
这意味着,堆叠向量的范数平方等于其各组成部分范数的平方和。这个性质可以推广到任意数量的子向量,在后续课程中会非常有用。
5️⃣ 切比雪夫不等式
切比雪夫不等式是一个重要的概率论和统计学结论,在线性代数中,它为我们提供了向量分量分布的一个界限。
该不等式表述如下:对于向量 x 和任意正数 a,满足 |xᵢ| ≥ a 的分量数量 k 不会超过 ||x||² / a²。
用更直观的 RMS 值来表述:
满足 |xᵢ| ≥ a 的分量比例 ≤ (RMS(x) / a)²
这个不等式告诉我们什么?
它量化了向量中“异常大”的分量数量。例如,如果取 a = 5 * RMS(x),那么不等式表明,绝对值超过 5 倍 RMS 值的分量比例不会超过 (1/5)² = 4%。这从数学上支持了 RMS 值可以代表向量分量“典型”大小的观点——虽然可能存在比典型值大得多的分量,但它们的数量会受到严格限制。
总结
本节课我们一起学习了向量的核心度量工具:
- 范数:定义了向量的长度,是绝对值的高维推广,具有齐次性、三角不等式、非负性和正定性。
- RMS值:通过 ||x|| / √n 计算,提供了与向量维度无关的“典型”大小度量,便于比较不同长度的向量。
- 分块向量范数:堆叠向量的范数平方等于各子向量范数的平方和。
- 切比雪夫不等式:为向量中大幅偏离 RMS 值的分量数量设定了一个上限,强化了 RMS 值的“典型”意义。


理解范数是理解向量空间几何和后续距离、夹角等概念的基础。


浙公网安备 33010602011771号