很多人学线性代数,学到“二次型与合同变换”这一章时,总觉得它是纯粹的考试内容:配方法、惯性指数、正定判断,考完就忘。但如果你做过优化、调过模型、处理过数据,回头再看这一章,会发现它其实是整门课里离应用最近的地方之一。二次型的等值面长什么样,直接决定梯度下降跑得顺不顺;Hessian矩阵是正定还是不定,决定一个驻点是极小值还是鞍点;哪怕是最小二乘、主成分分析、二次规划这些听起来很现代的东西,骨子里都是同一套几何:椭圆、双曲抛物面,外加一个把坐标轴掰正的过程。
这篇文章从“几何到优化”这条主线入手,把这一章重新拆了一遍:先讲清楚二次型和合同变换两个基础概念,再从几何和优化两个角度把它们串起来,最后用一个完整算例把配方法、惯性指数、极值判定一步不落走一遍。适合正在复习线性代数的学生,也适合想补一补数学直觉的算法工程师和数据从业者。
1. 二次型:从多项式到矩阵的“入场券”
1.1 二次函数家族:为什么偏偏是“二次”
所谓二次型,就是一个n元齐二次多项式,形状是
f(x₁, x₂, …, xₙ) = a₁₁x₁² + a₂₂x₂² + … + 2a₁₂x₁x₂ + 2a₁₃x₁x₃ + …
每一项的次数都是2,没有一次项,也没有常数项。比如f(x, y) = 5x² + 4xy + 2y²,或者f(x₁, x₂, x₃) = x₁² + 2x₂² + 3x₃² + 2x₁x₂ − 2x₁x₃ + 2x₂x₃。
为什么世界处处都是二次型?因为任意一个足够光滑的函数,在某个点附近做泰勒展开,二阶项一定落回二次型的形式:
f(x₀ + h) = f(x₀) + ∇f(x₀)·h + (1/2) hᵀ H(x₀) h + 高阶小量
其中H是Hessian矩阵,也就是二阶偏导数排成的对称矩阵。在稳定点∇f = 0处,函数长什么样子,基本上由 hᵀ H h 这一个二次型说了算。所以“局部形状”这个概念,数学上就是二次型。
1.2 从多项式到矩阵:交叉项系数为什么要除以2
任何一个二次型都可以写成 xᵀ A x 的形式,这里A是对称矩阵。以二元为例:
f(x, y) = a x² + 2b xy + c y²,对应的矩阵是 A = [[a, b], [b, c]]
注意,交叉项 2bxy 进矩阵时,一半放在(1,2)位置,一半放在(2,1)位置。换句话说,如果题目直接给你 f = 5x² + 4xy + 2y²,那么A的(1,2)位置是2,不是4。这是新手最容易踩的第一个坑。
这里有个很容易被忽略但很重要的点:如果不强制A对称,矩阵写法其实不是唯一的。比如 [[5, 3], [1, 2]] 和 [[5, 2], [2, 2]] 代入 xᵀ A x 会得到同一个二次型。所以教材里约定一律取对称代表,这样A的特征值、正定性、惯性指数等性质才被唯一确定。
对称矩阵在这个框架里价值极大:特征值一定是实数,一定能被正交对角化,能定义“正定”这种偏序概念,这些性质在后面的几何和优化里全部派得上用场。
2. 合同变换:和相似变换一字之差,差在哪
2.1 坐标变换视角:x = Py 到底在干什么
二次型的矩阵写法 xᵀ A x,依赖于坐标系。如果你做一次可逆线性变换 x = P y,那么
xᵀ A x = (P y)ᵀ A (P y) = yᵀ (Pᵀ A P) y
新的矩阵是 B = Pᵀ A P。这种变换在代数上有一个专门的名字:合同变换。两个矩阵A和B,如果存在可逆矩阵P使得 B = Pᵀ A P,就称它们合同。
这个名字的意思是:同一个二次型,在不同坐标系下的矩阵表示。坐标轴可以拉伸、旋转、倾斜,但二次型的“几何身份”不应该变,所以合同变换一定是保身份的变换。后面的惯性定理,回答的正是什么身份被保住了。
2.2 相似和合同:别再用一套逻辑套两个概念
很多同学把合同变换和相似变换搞混。相似变换是 B = P⁻¹ A P,合同变换是 B = Pᵀ A P。只差一点点,性质差很远。
| 对比项 | 相似变换 B = P⁻¹AP | 合同变换 B = PᵀAP |
|---|---|---|
| 核心目的 | 找相同线性映射在不同基下的表示 | 求同一个二次型在不同坐标系下的表示 |
| 特征值 | 保持不变 | 一般不保持 |
| 秩 | 保持 | 保持 |
| 对称性 | 不一定保持(A对称时B不一定对称) | 一定保持(A对称时B必对称) |
| 不变量 | 特征值、特征多项式、迹 | 对称性、秩、正负惯性指数 |
当P是正交矩阵时,P⁻¹ = Pᵀ,两个概念重合。这就是为什么特征值分解既能算相似对角化,也能用来处理二次型——正交矩阵这块重叠区域迷惑了不少人。
经典的惯性定理说的是:对实对称矩阵做任意合同变换,矩阵特征值中正数、负数、零的个数都不变。记作 (p, q, r),其中p叫正惯性指数,q叫负惯性指数,r是零特征值个数(也就是核的维数)。于是任何实对称矩阵都能合同到一种最干净的形式:
diag(1, …, 1, −1, …, −1, 0, …, 0)
前面p个1,中间q个−1,最后r个0。这个叫规范形。判定两个对称矩阵是否合同,不需要真的找P,只要比较(p, q, r)是否一致。
用生活类比来理解:惯性指数有点像“电荷数”。坐标变换可以改变向量的分量,但改变不了系统里正电荷、负电荷、中性粒子的数量。你换了坐标系,椭圆的形状类型不会变,变的只是它被如何描述。
2.3 配方法实操:手算合同变换的最快路径
把二次型化成标准形,最可靠的笨办法就是配方法。步骤一句话:按变量顺序,一个一个凑完全平方。以 f(x, y) = 5x² + 4xy + 2y² 为例:
先对付x²和xy:
f = 5(x + (2/5)y)² + (2 − 4/5)y² = 5(x + (2/5)y)² + (6/5)y²
令 u = x + (2/5)y,v = y,就得到 f = 5u² + (6/5)v²。这个二次型没有交叉项了,几何上就是一个椭圆,细节后面再说。
配方法最容易被忽略的价值是:你在配方过程中,其实已经完成了合同变换。每一步引入的新变量,都是一次可逆线性替换,把最后得到的这些替换拼起来,就是P。后面第5节我会完整演示一遍,包括怎么把P显式写出来。
配方法的顺序不是唯一的。先配方谁,后配方谁,得到的标准形里的系数可能不一样,但惯性指数(p, q)永远一致。所以如果你配完发现某一步出现了负系数,别慌,先数一数正负个数对不对。
3. 几何:从等值面一眼看穿二次曲面的类型
3.1 二维:椭圆、双曲线与退化情形
在二维平面上,等式 xᵀ A x = 1 画出来的是一条圆锥曲线。把二次型化成标准形之后,事情就非常清楚。
- 两个系数都为正,比如 5u² + (6/5)v² = 1,是椭圆。长轴短轴方向由特征向量决定,轴长分别是 1/√λ₁ 和 1/√λ₂。
- 两个系数一正一负,比如 u² − v² = 1,是双曲线。
- 某系数为零,比如 u² = 1,是两条平行直线,这是退化情形,对应矩阵不可逆。
举个例子。A = [[5, 2], [2, 2]] 的特征值是1和6,所以曲线 5x² + 4xy + 2y² = 1 是一个椭圆。特征值1对应长轴方向,半轴长1;特征值6对应短轴方向,半轴长 1/√6。几何信息和矩阵信息一一对应。
反过来也很有用。如果你看到一条倾斜的椭圆,想把它“摆正”,本质就是找一个正交矩阵Q,让 Qᵀ A Q 变成对角矩阵。这个过程在坐标几何里叫主轴变换。
3.2 三维:符号组合决定曲面长相
把维度推到三,故事变得更丰富。对 xᵀ A x = 1,假设已经对角化为 λ₁u₁² + λ₂u₂² + λ₃u₃² = 1,看符号组合:
| 正惯性指数p | 负惯性指数q | 零特征值个数r | 曲面类型 |
|---|---|---|---|
| 3 | 0 | 0 | 椭球面 |
| 2 | 1 | 0 | 单叶双曲面 |
| 1 | 2 | 0 | 双叶双曲面 |
| 2 | 0 | 1 | 椭圆柱面 |
| 1 | 1 | 1 | 双曲柱面 |
| 1 | 0 | 2 | 两平行平面 |
| 0 | 3 | 0 | 无实点(全负定,右侧=1无解) |
这个表不需要死记,只需要抓住一条:正惯性指数p是“弯曲向上的方向数”,负惯性指数q是“弯曲向下的方向数”。只有p个正方向和q个负方向的上半部分信息,就足以确定曲面大类。零特征值对应“平的方向”,曲面在那个方向上不弯曲,所以退化成柱面或平面。
这正是几何视角最爽的地方:你不用画出复杂的曲面,只要算出惯性指数,就能在脑子里形成图像的骨架。
3.3 主轴定理:特征分解也是一种合同变换
正交对角化之所以能用于二次型,是因为对于正交矩阵Q,Qᵀ = Q⁻¹,所以 Qᵀ A Q 既是相似变换也是合同变换。这里有个微妙的层次关系:
- 合同变换可以任意拉伸和倾斜坐标轴,它只保几何类型(惯性指数),不保具体形状参数;
- 正交合同变换只做旋转和镜像,它同时保类型和形状的度量信息,把主轴方向找出来。
所以配方法适合快速判断“这是什么类型”,特征值法适合进一步回答“主轴朝哪、轴长多少”。两者不冲突,是同一枚硬币的两面。现实中做数据分析时,PCA(主成分分析)的那个步骤,本质上就是对协方差矩阵做一次正交合同变换,把它对角化,然后按特征值大小排序找主方向。几何和统计在这里完全打通。
4. 优化:二次型是优化问题的发动机
4.1 Hessian矩阵与极值判定:二阶条件说了算
回到多元函数求极值的问题。一个光滑函数在驻点∇f = 0处,能不能成为极小值,要看二阶项。如果Hessian矩阵正定(所有特征值 > 0),那么任意方向走一步,函数都上升,该点是严格局部极小;负定则是极大;如果特征值符号既有正又有负,那就是鞍点,一个方向上是谷底,另一个方向上是山脊。
最简单的例子:h(x, y) = x² − y²。原点处梯度为零,Hessian是diag(2, −2),惯性指数(1, 1, 0),不定阵。沿着x方向看,原点是极小;沿着y方向看,原点是极大。所以它既不是极小也不是极大,是个鞍点。
这就是二次型与优化最直接的一层关系:判断一个临界点到底“是山还是谷”,就是判断一个二次型的符号。
4.2 正定二次型:椭圆等高线与唯一最小值
一类特别常见的优化问题是
min (1/2) xᵀ A x − bᵀ x
这里A正定。这就像一个弹簧系统:A描述刚度,b描述外力,平衡点就是系统的最小能量点。求梯度等于零:
A x = b
这是一个线性方程组!也就是说,一个二次凸优化问题的最优解,就是解一个线性系统。当年我第一次意识到这件事时,觉得线性代数里的“解方程”和“求最小值”原来是同一件事。
几何上,目标函数的等高线是一族同心椭圆,中心就是最优解 x* = A⁻¹b。把目标函数重新配方:
(1/2) xᵀ A x − bᵀ x = (1/2)(x − x*)ᵀ A (x − x*) − (1/2)(x*)ᵀ A x*
这是理解共轭梯度法、牛顿法等一系列算法的钥匙。算法的本质,无非是沿着一个比原始坐标更好用的方向逼近椭圆中心。
举个具体数字例子。A = [[3, 1], [1, 2]],b = (1, 2)ᵀ。解方程组 3x₁ + x₂ = 1,x₁ + 2x₂ = 2,得到 x* = (0, 1)ᵀ。目标函数在x*处取值 −1,而且因为A的两个特征值都是正的,这个点是唯一的全局最小值。
4.3 最小二乘与误差曲面:半正定无处不在
最小二乘问题 min||Ax − b||² 展开之后是一个二次函数:
||Ax − b||² = xᵀ(AᵀA)x − 2bᵀAx + bᵀb
矩阵 AᵀA 一定是半正定的,因为对任何x都有 xᵀ(AᵀA)x = ||Ax||² ≥ 0。如果A列满秩,AᵀA严格正定,问题有唯一解;如果A秩亏,误差曲面在某些方向上是平的,解不唯一。
这就是为什么岭回归(加 λ||x||² 正则项)能救秩亏问题:它给半正定矩阵加上 λI,硬生生把平的谷底变成有唯一最低点的椭圆坑。二次型的正定半正定概念,在这里直接决定一个算法有没有唯一答案。
4.4 从商表达式到条件数:为什么收敛慢,怎么救
还有一个绕不开的量:对非零向量x,考虑比值 xᵀ A x / xᵀ x。这个比值在所有方向上取值,最大值恰好是最大特征值λmax,最小值是最小特征值λmin,而且取到极值的向量就是对应特征向量。
这个性质可以直接用来解释优化算法为什么有时候慢。假设目标函数的二次型矩阵是 diag(100, 1),即 f = 50x₁² + 0.5x₂²。等高线是被压得很扁的椭圆,梯度下降在最扁的椭圆上会走出之字形,收敛极慢。条件数 κ = λmax/λmin = 100 越大,椭圆越扁,算法越磨蹭。
解决办法是改变坐标度量:做一次对角合同变换,令新变量 y₁ = 10x₁,y₂ = x₂。在新的坐标系里,二次型矩阵变成单位矩阵,等高线变成圆,一步就收敛。这个操作在数值优化里叫预处理(preconditioning),许多二阶方法本质上也是在做这件事:把当前Hessian当成度量,重新定义“距离”。
所以,合同变换不是代数玩具,它就是那个把歪着的椭圆掰成圆的操作。
5. 一个完整算例:从标准形到极值判定
5.1 题目设定
设
f(x₁, x₂, x₃) = x₁² + 2x₂² + 3x₃² + 2x₁x₂ − 2x₁x₃ + 2x₂x₃
完成四个任务:写出对称矩阵A;用配方法化为标准形并给出可逆线性变换P;给出惯性指数并判定曲面 xᵀA x = 1 的类型;若 F(x) = (1/2)xᵀAx 表示某优化问题的目标函数,判断原点是什么类型的临界点。
5.2 配方法到手,P也就到手
第一步,矩阵A。对角线系数直接放,交叉项系数取半,得到
A = [[1, 1, −1], [1, 2, 1], [−1, 1, 3]]
第二步,配方。先处理x₁相关所有项(包括x₁x₂和x₁x₃):
x₁² + 2x₁x₂ − 2x₁x₃ = (x₁ + x₂ − x₃)² − x₂² − x₃² + 2x₂x₃
所以
f = (x₁ + x₂ − x₃)² + x₂² + 2x₃² + 4x₂x₃
再对x₂配方:
x₂² + 4x₂x₃ + 2x₃² = (x₂ + 2x₃)² − 2x₃²
最终
f = (x₁ + x₂ − x₃)² + (x₂ + 2x₃)² − 2x₃²
令 u₁ = x₁ + x₂ − x₃,u₂ = x₂ + 2x₃,u₃ = x₃,则 f = u₁² + u₂² − 2u₃²。把替换写成x关于u的形式:
x₁ = u₁ − u₂ + 3u₃,x₂ = u₂ − 2u₃,x₃ = u₃
也就是 x = P u,其中
P = [[1, −1, 3], [0, 1, −2], [0, 0, 1]]
顺手验证一下:Pᵀ A P = diag(1, 1, −2)。这个验证不该靠感觉,建议用程序跑一下。下面这段很短,值得养成习惯。
import numpy as np A = np.array([[1, 1, -1], [1, 2, 1], [-1, 1, 3]], dtype=float) P = np.array([[1, -1, 3], [0, 1, -2], [0, 0, 1]], dtype=float) D = P.T @ A @ P print(D) # 期望:[[1,0,0],[0,1,0],[0,0,-2]] print(np.linalg.cholesky)输出前三行对角线是 1, 1, −2,说明合同变换没算错。
5.3 惯性指数、曲面类型与优化判定
标准形是 u₁² + u₂² − 2u₃²,所以正惯性指数 p = 2,负惯性指数 q = 1,零特征值 r = 0。秩等于 p + q = 3,满秩。
对曲面 u₁² + u₂² − 2u₃² = 1,符号组合是(2, 1, 0),对应第3节表格里的单叶双曲面。这意味着在原始坐标里,这个被“拧歪”的曲面经过合同变换后,本质上就是一张单叶双曲面。
再看优化部分。F(x) = (1/2)xᵀAx,梯度是Ax,原点处梯度为零,是临界点。Hessian就是A,惯性指数(2, 1, 0),是不定矩阵,所以原点既不是局部极小也不是局部极大,是鞍点。
可以实际验算:沿方向 e₃ = (0, 0, 1),F = (1/2)·3s² > 0,谷底方向;沿方向 (3, −2, 1)(对应规范形最后一个坐标轴的原始方向),算得 f(3, −2, 1) = −2,因此 F = −s² < 0,山脊方向。同一张曲面,两个方向一正一负,典型鞍点。
这个算例的意义在于:一个人为设置、看似复杂的二次型,通过配方法化为标准形之后,所有的几何和优化信息全部一目了然。不需要画图,不需要求特征值,手算就能完成分类。
6. 常见错误排查与学习路径建议
6.1 最容易踩的五个坑
| 错误类型 | 错误示例 | 正确做法 |
|---|---|---|
| 交叉项系数直接填入矩阵 | f = x² + 2xy + y² 写成 A = [[1,2],[2,1]] | 交叉项2→矩阵位置放1,A = [[1,1],[1,1]] |
| 混淆相似与合同 | 用 P⁻¹AP 算等价标准形 | 区别在于是否保留特征值;正交时两者重合 |
| 配方顺序不同就以为自己算错 | 两个标准形系数不同 | 惯性指数一致就对,系数只是坐标选择问题 |
| 用顺序主子式判半正定 | A = [[0,1],[1,0]] 用顺序主子式判断 | 半正定要求所有主子式 ≥ 0,不只看左上角的 |
| 忽略零特征值 | 看到秩为2就以为一定退化不可用 | r > 0确实退化,但它在优化里意味着平谷底、解可能不唯一 |
第六个几乎每个人都会遇到的小问题:惯性指数里“正”指的是正特征值个数,“负”指的是负特征值个数,“零”单独算。别把秩当成“非零数”混进去。
6.2 给自学者的一条路径
如果有人问我,这一章到底要不要把题刷穿,我的建议是:别刷那么多,但几个动作一定要做。
第一,用手算明白至少三道配方法题目,最好含一个三维不定型例子,像我第5节那种。手算能把“配方过程即合同变换过程”这句话变成肌肉记忆。
第二,写几行代码验证自己的手算结果。numpy里一个 @ 运算符就能做 Pᵀ A P,再配合 np.linalg.eigvalsh 查看特征值符号,理论和计算互相印证,比单纯刷题牢固得多。
第三,把二次型连接到最常碰到的应用:拿到任意一个光滑函数的Hessian,判断驻点的类型;在最小二乘里看 AᵀA 的秩;在PCA里看协方差矩阵的特征值排序。每连上一个场景,你对“二次型”这三个字的理解就多一层。
第四,遇到优化算法收敛慢,学着先算条件数。只要这个数大,第一反应不是改学习率,而是想想能不能用合同变换做预处理。
我在实际工作中的体会是:二次型和合同变换最核心的思维,不是背出来的一套计算规则,而是“换一个坐标系看问题”的能力。很多看起来别扭的椭圆,换成特征方向之后就是标准圆;很多损失函数的鞍点,用惯性指数一测就知道它逃不掉。
最后再分享一个实用的小技巧:如果你在做实验时发现某个优化问题怎么调都不收敛,先别急着调整步长,把目标函数在当前点附近的二阶项单独拿出来算一次惯性指数。只要出现负惯性指数大于零的情况,那个点附近大概率有鞍点或极大方向,调度策略要按鞍点来设计,而不是按凸优化来设计。这一章的结论,真的是能救项目的。
把这些内容消化掉之后,再回头看“第9章 二次型与合同变换”,它不再是一个孤立的代数章节,而是一条从几何到优化的完整通道。