



在2.12节中,我们探讨了线性系统及其在机器学习中的重要性,并且指出,从机器学习的角度来看,通过矩阵求逆来求解线性系统的标准数学过程并非理想的解决方案。在本节中,我们将引入一种无需矩阵求逆就能求解线性系统的方法。此外,本节内容还有助于我们深入理解二次型,为掌握主成分分析(PCA)打下基础,而主成分分析是数据科学领域中最重要的工具之一。
考虑一个具有 n 个线性无关特征向量的 n × n 矩阵 A 。设 S 是一个以这些特征向量为列的矩阵。即,
Ae 1 =λ 1 e 1
Ae 2 =λ 2 e 2
︙
Ae n =λ n e n
并且
S =[ e 1 e 2 … e n ]
因此,我们有
AS = A [ e 1 e 2 … e n ]=[ Ae 1 Ae 2 … Ae n ]=[λ 1 e 1 λ 2 e 2 …λ n e n ]
其中,
Λ 是一个对角矩阵,对角线上的元素是 A 的特征值,其余位置为0。
因此,我们得到
AS = SΛ
由此可推导出
A = SΛS -1
并且
Λ = S -1 AS
如果 A 是对称的,那么它的特征向量就是正交的,即 S T S = SS T = I ⇔ S -1 = S T ,因此,可推导出 A 的对角化表示:
A = SΛS T
注意,对角化的结果并不唯一:对于一个给定的矩阵,存在多种可能的对角化方式。
现在,我们将2.15节中学到的数学知识以PyTorch实现。与之前一样,代码清单2.18只展示直接相关的代码段。
注 :本小节的完整代码可以从http://mng.bz/RXJn获取,并且可以使用Jupyter Notebook执行。
代码清单2.18 矩阵对角化
对角化有许多实际应用。现在我们来探讨其中的一个案例。通常,矩阵求逆(计算 A -1 )是一个数值不稳定的复杂过程。因此,应尽可能地避免通过 Ax = b 来求解 x = A -1 b 。然而,对于具有 n 个不同特征值的对称方阵,可以通过对角化来帮助求解。我们将该过程分解为多个步骤,首先对 A 进行对角化:
A = SΛS T
则 Ax = b 可以被写为
SΛS T x = b
其中 S 是以 A 的特征向量为列的矩阵:
S =[ e 1 e 2 … e n ]
由于 A 是对称的,所以这些特征向量是正交的,即 S T S = S S T = I 。可以通过一系列非常简单的步骤来求解以下线性系统:
首先求解
Sy 1 = b
得到
y 1 = S T b
需要注意的是,不同于矩阵求逆,转置和矩阵-向量乘法都是简单且数值稳定的操作。然后,我们可以得到
Λ ( S T x )= y 1
现在求解
Λy 2 = y 1
得到
y 2 = Λ -1 y 1
需要注意的是,由于 Λ 是对角矩阵,因此对其求逆非常简单:
最后一步,求解
S T x = y 2
得到
x = Sy 2
因此,无须使用任何复杂或不稳定的步骤,就能够计算出 x 。
让我们尝试对以下方程组进行求解:
x+y+z= 8
2 x+ 2 y+ 3 z= 15
x+ 3 y+ 3 z= 16
该方程组可以表示为矩阵和向量的形式:
Ax = b
其中,
注意, A 是一个对称矩阵,它的特征向量是正交的。因此,将 A 的特征向量作为列的矩阵是正交的,该矩阵的转置和逆相同。具体实现如代码清单2.19所示。
代码清单2.19使用对角化求解线性方程组
如果矩阵 A 可以被对角化,那么
A = SΛS -1
A 2 = SΛS -1 SΛS -1 = SΛIΛS -1 = SΛ 2 S -1
︙
A n =…=…= SΛ n S -1
对于一个对角矩阵
它的 n 次幂可以简单地表示为
如果我们需要分次计算一个 m × m 矩阵 A 的各种幂次,我们应该先计算矩阵 S ,之后,只需要 O ( m )次运算即可计算 A 的任何幂次,相比之下,直接计算则需要执行( n m 3 )次运算。