资讯详情

资讯详情

从几何到代码:用《线性代数导论》建立矩阵与子空间直觉

简介《线性代数导论》第5版中文版是著名数学家Gilbert Strang撰写的线性代数经典教材适合作为高校课程教材或自学参考面向数学基础较好的本科生、研究生及工程、计算机、数据科学从业者。书中以矩阵的四个基本子空间行空间、列空间、零空间、左零空间和整体矩阵乘法视角贯穿始终系统讲解向量、线性组合、子空间、线性变换、行列式、特征值、奇异值分解、最小二乘法、复数矩阵与快速傅里叶变换并在新版中加入概率论和数据理解内容每节开头的概要也便于快速回顾。资源包为PDF格式共1个文件压缩包大小46.25MB提供完整中文译本。读者还可结合MIT公开课视频与配套网站的习题解答、编程代码使用MATLAB、Python等工具动手实践深化几何直观与应用能力为机器学习、信号处理等领域夯实数学基础。目前已有3357人学习下载。1. 学了多年线性代数第一次觉得自己真正“看见”了矩阵是从翻开这本书开始的国内的教材习惯从行列式定义讲起强调的是“怎么算”克拉默法则、代数余子式、初等变换一套流程走完期末能考高分但问起“矩阵到底在做什么”大多数人会愣住。这本《线性代数导论 原书第五版 中文版》完全反着来——它把线性代数看成“四五个基本空间”的故事消元、行列式、特征值都是同一张矩阵图像的不同侧面。读这本书你不会先背公式而是先建立直观矩阵是一个映射把一组向量送到另一组向量。这种视角的转换对做机器学习、数据分析、图形学的人几乎是刚需。适合谁读学过线代但感觉“白学了”的工程师以及正在补数学基础、想直接应用到代码里的从业者。它不教你刷题教你建模时怎么思考。2. 四个子空间一本书只讲一张图却把整个线性代数串起来了2.1 行空间、列空间、零空间、左零空间到底分别装着什么入门者最容易犯的错是把四个子空间当成四个独立的“知识点”去背。书里的做法是画一张四宫格图把矩阵 Am 行 n 列看作一个从 Rⁿ 到 Rᵐ 的线性映射四个子空间两两配对。行空间 C(Aᵀ)Rⁿ 里的子空间由 A 的行向量张成维度是秩 r。零空间 N(A)Rⁿ 里的子空间所有满足 Ax 0 的 x维度是 n - r。列空间 C(A)Rᵐ 里的子空间由 A 的列向量张成维度是秩 r。左零空间 N(Aᵀ)Rᵐ 里的子空间所有满足 Aᵀy 0 的 y维度是 m - r。这张图最有价值的地方在于维度对应关系行空间和零空间都在 Rⁿ 里一个是 r 维一个是 n - r 维两者正交补列空间和左零空间同理。也就是说Ax b 有解的条件是 b 落在 C(A) 里而“解的自由度”完全由 N(A) 决定。这个框架在后面的最小二乘、SVD 里被反复使用整个第五版的主线就是在反复论证这四个子空间如何互相作用。我一般会建议读者在书的第一遍阅读时直接在书页空白处画一个 2×2 的矩阵结构图之后每学一章就把新概念填进去。等你学完特征值回头看这张图你会意识到特征向量不过是在这条映射链上找不变方向学完 SVD你会知道那是在这四个子空间里找一组特别好的正交基。整本书没有一个章节是孤立的。2.2 矩阵乘法的三种视角为什么列组合比行组合更本质传统的矩阵乘法教的是“行乘列”C_ij 等于 A 第 i 行点乘 B 第 j 列。这个定义没有错但它把矩阵当成“一堆数字”在处理完全丢掉了空间含义。书里引入了三个视角的矩阵乘法分别是行视角、列视角和“列×行”外积视角其中我认为列视角是理解全书的关键。所谓列视角是把 AB 看成一个列向量构成的矩阵AB 的每一列是 A 作用于 b_j 的结果。这意味着每一个输出列都是 A 的列的线性组合组合系数来自 B 的对应列。这个视角直接解释了为什么列空间 C(AB) 包含在 C(A) 里也解释了为什么我们求 Ax b 时是在列空间里找 b 的位置。第三个视角最容易被忽略把 AB 拆成若干外积之和。比如 A 的第 k 列乘以 B 的第 k 行得到的是一个秩一矩阵把所有 k 加起来就是 AB。这不仅是计算技巧更是后面推导 SVD 的直觉基础——一个矩阵可以拆成一堆秩一矩阵的叠加SVD 就是告诉你如何按“重要性”排序这些秩一成分。我刚开始读的时候不理解为什么书里要花几页讲这种“不实用”的拆法直到做图像压缩时才意识到这就是 PCA 和压缩感知的基本功。2.3 秩的定义演进从计算概念到空间概念的换血一般教材里秩的定义是“行阶梯形非零行数”松散一点说是“线性无关列数”两者都偏向计算流程。书里的定义更接近本质秩等于列空间的维度也等于行空间的维度。这个定义第一次把秩从“一个数字”升格为“一种几何测量”——它告诉你列向量张成的子空间是几维的。从空间视角出发很多初学者会困惑的问题就轻松化解。比如为什么秩最多是 min(m, n)因为列空间是 Rᵐ 的子空间靠 m 维空间里最多有 m 个独立向量又因为列向量的坐标来自 Rⁿ独立列数也超不过 n。再比如为什么一个 m×n 矩阵零空间的维度是 n-r这是秩-零化度定理的直接推论书里用“自由变量”和“主变量”的消元语言给出了一个非常直观的论证。这里有必要给一个实用表格式总结方便读者对照。空间所在空间维度判定条件工程直觉行空间 C(Aᵀ)Rⁿr全部行向量张成数据矩阵里的所有样本组合零空间 N(A)Rⁿn-r满足 Ax0方程组的解自由度列空间 C(A)Rᵐr全部列向量张成所有可能输出向量左零空间 N(Aᵀ)Rᵐm-r满足 Aᵀy0方程组的约束自由度这张表我打印出来贴在工位上一年多每次遇到矩阵问题先看这个问题是在哪个空间里问的。你很快会发现不少“玄学”问题其实是问错了空间。3. 从几何到矩阵Strang 的教学法和传统教材的本质差异3.1 行图像和列图像解方程组时你到底在看什么这本书最出名的教学法就是同时画两幅图行图像和列图像。一个二元一次方程组行图像是两条直线的交点列图像则是两个列向量的线性组合凑出右侧向量。两条直线的交点和两个列向量的组合本质是同一件事但第二个视角更有扩展性——到三元、四元甚至更多未知数时直线的交点想不动了而“向量组合是否落在某个空间里”依然清晰。第五版的练习题里大量设置了这种“画图后回答”的题。我做这些题最大的体会是当我说“解 Ax b”时脑子里出现的画面已经从“两条线相交”变成了“b 是否在 A 的列空间里”。别小看这个切换它直接影响你学后续的正交性、投影、最小二乘时是否吃力。数据科学里的线性回归本质上就是b 不在列空间里所以找一个列空间里离它最近的向量来替代。这种画图的习惯我建议不要只在纸面上做。真的去跑一遍脚本把二维、三维情形画出来印象完全不同。import numpy as np import matplotlib.pyplot as plt # 演示 2x2 矩阵的列空间视角 A np.array([[1, -1], [1, 2]]) # 三个不同的组合系数 coeffs [(-1, 2), (0.5, 1), (2, -0.5)] fig, axes plt.subplots(1, 2, figsize(10, 4)) ax axes[0] # 行图像两条直线 x_vals np.linspace(-2, 3, 50) ax.plot(x_vals, 1 - x_vals, labelx y 1) ax.plot(x_vals, (1 - x_vals) / 2, labelx 2y 1) ax.plot([1], [0], ro) ax.legend(); ax.grid() ax axes[1] # 列图像把 a1, a2 画成向量再画不同组合 a1 A[:, 0]; a2 A[:, 1] for c1, c2 in coeffs: v c1 * a1 c2 * a2 ax.scatter(v[0], v[1], s50) ax.quiver(0, 0, a1[0], a1[1], anglesxy, scale_unitsxy, scale1, colorr, labela1) ax.quiver(0, 0, a2[0], a2[1], anglesxy, scale_unitsxy, scale1, colorb, labela2) ax.legend(); ax.grid() plt.tight_layout() plt.show()这段代码里面左侧的行图画的是两条直线解是红线标出的交点右侧的列图画的是两个基向量的不同组合点。代码逻辑上系数从 coeffs 里循环取出每个点都是一个不同的“组合”结果。对于刚上手的人试着改变 A 到某个列线性相关的矩阵比如[[1, 2], [2, 4]]右侧列图像会所有点落成一条直线你立刻能看到为什么列空间维度掉了。3.2 消元法不只是一个解题步骤它是矩阵的因子分解很多教材把高斯消元当“求行列式和解方程组的手段”书里则完全不同消元是矩阵的减法运算核心操作是把 A 分解成 A LU。L 是下三角矩阵记录了消元过程中每一步乘数U 是上三角矩阵是消元的最终产物。这比单纯背“倍加变换”高级得多因为一旦有了 LU 分解求解 Ax b 就被拆成两次回代。这里有个新手容易忽略的细节消元过程中如果出现行交换怎么办书里会引入置换矩阵 P最终分解才是 PA LU。我在实际代码里用 numpy 或 scipy 的时候这个顺序经常搞反后面专门踩过坑这里提示下scipy.linalg.lu 返回的 P 是一个置换矩阵不是置换矩阵的逆用的时候注意顺序。书里还专门花了篇幅讲矩阵乘法为什么满足结合律这正是理解消元过程的钥匙。每次消元步骤对应一个初等矩阵 E把多个 E 乘起来就是 L。以前我只把消元法看作一个不错的“刷题算法”看完书才知道它其实是所有现代数值线性代数软件的基石。你调用的 np.linalg.solve 在做稠密矩阵求解时底层就是用部分主元的高斯消元。3.3 逆矩阵的真正含义不是“除以矩阵”而是“反向映射”传统教材只告诉你 A⁻¹A I然后给你一堆求逆运算方法。书里的视角把它放到映射链条里A 把 x 送到 bA⁻¹ 就是把 b 送回唯一的 x。所以逆存在的前提是 A 必须“无信息损失”——零空间里只有零向量满秩。从行图像和列图像理解这个条件就是x 到 Ax 的映射是单射。如果 A 的列线性相关那不同的输入会映射到同一个输出你拿到 b 时根本不知道原来 x 是哪个颜色。在实践中我们很少直接求逆因为数值稳定性差但理解逆的这层含义很重要。书里强调大多数情况下用消元法分解 LU 比求逆更稳这个观点对我后来写算法影响很大。反直觉的地方在于求逆的时间成本是 O(n³)和消元一样但常数更大。如果你遇到一个稀疏矩阵求逆会把它变成稠密矩阵存储开销爆炸。所以我现在的习惯是凡是能用矩阵分解解决的绝不去显式求逆。4. 让书里的原理变成可运行的代码三个必跑的经典实验4.1 亲手写一个不调用库的 LU 分解破坏“黑匣子”焦虑书里讲消元是分解那就自己手工实现一次。下面的 Python 代码实现一个不带行交换的朴素 LU 分解用来验证书里第 2 章的概念。import numpy as np def lu_naive(A): 朴素 LU 分解: A L U无行交换假设主元不为 0 A np.array(A, dtypefloat) n A.shape[0] L np.eye(n) U A.copy() for i in range(n): # i 是当前主元列 pivot U[i, i] if abs(pivot) 1e-12: raise ValueError(主元为 0需要行交换。请用 scipy.linalg.lu) for j in range(i 1, n): # j 是要消去的行 factor U[j, i] / pivot L[j, i] factor U[j, :] - factor * U[i, :] return L, U # 书里常见的 2x2 示例 A np.array([[2, 1], [4, 3]]) L, U lu_naive(A) print(L:\n, L) print(U:\n, U) print(误差:\n, L U - A)代码逻辑上外层循环逐列取主元内层循环把该列下方所有元素消成零。factor 就是 L 中记录的倍加系数。这个朴素实现对主元非零的矩阵有效但真实场景中主元可能很小需要部分选主元。我在工程里几乎永远用scipy.linalg.lu因为它默认做了行交换和缩放。但这个实现值得跑一遍因为你会亲眼看到 L 是如何从“单位阵”一点点长出非零下三角元素的。参数上唯一要注意的是dtypefloat避免整数除法带来的精度截断。4.2 从列空间看最小二乘用 6 行代码拟合一条直线书里第 4 章讲投影时有个核心命题当 Ax b 无解时最优近似解 x̂ 满足 AᵀAx̂ Aᵀb。这在数据科学里的另一个名字叫正规方程是最小二乘的闭式解。我们用一个小例子把几何语言和代数语言对上。import numpy as np # 数据点: x 为年份偏置, y 为观测值 x np.array([0, 1, 2, 3, 4], dtypefloat) y np.array([1.2, 2.8, 4.3, 5.1, 6.7]) # 设计矩阵: 第一列全 1 (截距), 第二列是 x A np.vstack([np.ones_like(x), x]).T # 正规方程: A^T A x_hat A^T b ATA A.T A ATb A.T y beta np.linalg.solve(ATA, ATb) print(斜率/截距:, beta) # 验证: 残差应垂直于列空间 residual y - A beta print(残差:, residual) print(A^T * residual:, A.T residual)代码里第一列全 1 是为了拟合截距第二列是自变量最终得到 beta 就是线性回归系数。np.linalg.solve解的是 ATA 这个对称正定矩阵如果你数据量大不要这样算应该用 SVD 或 QR。但这里跑一遍的意义在于看最后的A.T residual是否近似为零向量——它直观验证了“最优残差与列空间正交”这个书里的几何结论。当初我跑出这个结果时才真正把投影定理从几何定理落到了数字上。4.3 特征值解差分方程教科书抽象和现实预测的桥书里讲了用特征值求解差分方程 uₖ A uₖ₋₁最经典的例子是斐波那契数列。设定状态向量 [Fₖ₊₁, Fₖ]转移矩阵 [[1, 1], [1, 0]]其特征值一个是黄金比例 φ一个是负倒数。虽然这个例子是数学系经典但我用它验证自己对特征值本质的理解矩阵作用于特征向量时只是拉长/缩短不做旋转。import numpy as np F np.array([[1, 1], [1, 0]], dtypefloat) eigval, eigvec np.linalg.eig(F) print(特征值:, eigval) # 直接用矩阵幂推进斐波那契 u0 np.array([1, 0], dtypefloat) # (F11, F00) uk u0.copy() for _ in range(10): uk F uk F_simulated uk[0] print(第10步仿真值:, F_simulated)代码里 np.linalg.eig 求出的特征值应为 1.618 和 -0.618 附近。这里有个容易被忽略的细节特征向量是 numpy 按照列排列的如果你要看某个特征值对应的特征向量取eigvec[:, i]。对于工程应用如果你只想要最大的特征值应该用幂迭代法Power Iteration避免算出全谱。这正是搜索引擎 PageRank 的早期核心算法思路书里虽然没有写但有这个基础再去理解推荐系统里的矩阵分解会顺很多。5. 自学《线性代数导论》最容易踩的坑三条血泪经验加一条续命建议5.1 把“行图像”和“列图像”搞混导致四个子空间一直没建立起来现象学完前两章做题时会算但被问到“Axb 的解组成一个什么集合”时脑子里只有“一条直线”。原因行图像管的是行向量的线性组合列图像管的是列向量的线性组合两者作用在不同空间里。初学特别容易把“行空间”画成列空间的样子。解决每次画四宫格图把矩阵 A 和 Aᵀ 放在一起对照着画。A 的行是 Aᵀ 的列A 的零空间是 Aᵀ 的列空间的正交补。书里第 3 章那一堆图请务必自己重新画一遍。只看不画是这本书最大的浪费。5.2 跳过习题直接读概念以为“看懂”了实际上全忘了现象阅读正文很顺两周后发现前面讲了什么都回忆不起来更别提应用。原因概念阅读是惰性输入的习题强迫你输出而输出才是记忆的固化过程。解决每看完一章至少做 10 道奇数编号的基础题不追求做完但每道题都要落到“这题在描述哪个子空间”上。如果一道题你会做但不知道它属于哪个空间说明你还是用“算术”在做题。我的习惯是在书页边缘标一个符号行空间标 R列空间标 C零空间标 N做完题回头统计哪个符号出现最多那就是你还没建立直觉的部分。5.3 只记特征值的算法忽略特征值的几何含义现象会解特征多项式排得出谱但说不清楚“为什么 PCA 要用特征向量”。原因计算路径掩盖了几何路径。特征向量是矩阵作用下方向不发生改变的那些向量特征值是缩放倍率。解决做一个小实验——用一个随机矩阵反复作用于一组图片上的点跟踪每个点的轨迹。你在代码里模拟这个实验会发现几乎所有点都被拉向最大特征值对应的特征向量的方向。理解了这点SVD、主成分分析、马尔可夫链收敛性全都能串起来。否则你只是在背黑匣子的输入输出。5.4 中文版和英文术语对不上后续读论文吃力现象读中文版时“零空间”“行空间”都认识但一看英文文献里的 null space、row space 反应迟钝。原因中文版翻译质量整体不错但术语映射需要主动建立。解决看每一章标题时把英文原词抄在旁边。比如第 3 章 Vector Spaces and Subspaces、第 4 章 Orthogonality。我在第一遍读时准备了一张术语对照卡后来读论文、看讲义时省了大量时间。如果你打算后续用英文资源这一步不要偷懒。6. 比读完更重要的收尾习惯把“子空间眼光”迁移到机器学习里书读完不是终点关键在建立一个新的思维习惯。我现在做任何和矩阵相关的工程都会先问三个问题数据矩阵的列空间在哪里、目标是哪个空间的向量、残差在哪个空间里。这三个问题分别对应秩的判定、映射的目标、以及最小二乘的几何解释。比如推荐系统里的协同过滤矩阵用户-物品评分矩阵是稀疏的它的列空间维度远小于表格维度。矩阵分解的实质就是在一个低维子空间里逼近原矩阵这就是交给你了 SVD 和 PCA 的用途。图像压缩也一样一张图是一个矩阵SVD 给出按奇异值排序的秩一近似取前 k 个分量就是“压缩”。如果你读这本书时建立起过列空间和零空间的图像这些应用不过是一个思路在不同领域里的变体。第五章说的那个幂迭代法其实就是从“矩阵把向量拉向主特征向量”的几何直觉衍生出来的数值算法。工程上做 PageRank 时不可能去算整个矩阵的特征分解直接用幂迭代就够了代价是 50 行不到的代码收益是从图结构数据里提取最重要的方向。最后谈一个我自己的教训第一遍读这本书时我只看不画导致四宫格图过了三个月才真正长在脑子里。后来重读每章强迫自己输出三样东西一句大白话总结、一张图、一段 5 行代码。能写出一句大白话才算真的懂了。希望这个习惯能帮到你少走几步弯路。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →