机器学习数学推导(二)线性代数与矩阵论
Chen Kai BOSS

在 Google 的 PageRank 算法中,网页排名问题被转化为一个巨大的特征值问题:找到转移矩阵的主特征向量。这个简洁的数学表述背后,隐藏着线性代数的深刻结构。线性代数不仅是机器学习的语言,更是理解数据几何结构的钥匙。

机器学习本质上是在高维空间中寻找最优的线性或非线性变换。从最简单的线性回归(求解),到复杂的深度神经网络(链式矩阵乘法),再到主成分分析(特征值分解),线性代数无处不在。本章从第一性原理出发,严格推导机器学习所需的所有线性代数工具。

向量空间与线性变换

向量空间的公理化定义

什么是"空间"?停车场的类比

想象一个停车场: - 里面可以停各种车:轿车、SUV、卡车 - 但必须遵守规则:比如不能停飞机、不能停船 - 满足规则的车,都可以进这个"停车空间"

向量空间也一样: - 是一个"向量的集合" - 必须遵守某些规则(8条公理) - 满足规则的向量,都属于这个"空间"

严格的数学定义

定义 1(向量空间):设是一个非空集合(向量的集合),是一个数域(通常是实数或复数)。如果在上定义了两种运算:

  1. 向量加法(两个向量能相加,结果还在空间里)
  2. 标量乘法(向量乘以数字,结果还在空间里)

满足以下 8 条公理(规则),则称上的向量空间:

加法公理

  1. 交换律
  2. 结合律
  3. 零元素,使得
  4. 逆元素,使得

标量乘法公理

  1. 分配律 1
  2. 分配律 2
  3. 结合律
  4. 单位元

常见的向量空间例子:

空间 元素 维数 应用
维实向量 机器学习特征向量
维复向量 量子计算,信号处理
实矩阵 数据矩阵,权重矩阵
上连续函数 函数逼近
次数的多项式 多项式回归

线性无关与基

定义 2(线性组合):向量可以表示为向量组的线性组合,如果存在标量使得:

定义 3(线性无关):向量组线性无关,如果:

否则称为线性相关。

定理 1(线性相关的等价条件):向量组线性相关,当且仅当其中某个向量可以表示为其他向量的线性组合。

证明设线性相关,则存在不全为零的使得。不失一般性,设,则:

,则,且系数不全为零,故线性相关。证毕。

定义 4(基与维数):向量空间的一组基是一个线性无关的向量组,使得中的任意向量都可以唯一表示为这些基向量的线性组合。基向量的个数称为向量空间的维数,记作

标准基例子的标准基:

任意可唯一表示为

线性变换与矩阵

定义 5(线性变换):设是两个向量空间。映射称为线性变换(或线性映射),如果:

  1. 加法性
  2. 齐次性

定理 2(线性变换的矩阵表示):设分别是维和维向量空间,选定基。对于线性变换,存在唯一的矩阵,使得对任意

其中是向量在对应基下的坐标表示。

证明

,则:

由线性性。现在,,可以表示为的基的线性组合:

因此:

这恰好是矩阵-向量乘法的第个分量,其中。证毕。

矩阵的第列就是的基下的坐标。这是矩阵表示的几何意义。

四个基本子空间

对于矩阵,有四个基本子空间刻画其结构:

定义 6(四个基本子空间)

  1. 列空间(Column Space):
    • 维数:
    • 几何意义:可以到达的所有向量
  2. 零空间(Null Space):
    • 维数:(由秩-零化度定理)
    • 几何意义:被映射到零的所有向量
  3. 行空间(Row Space):
    • 维数:
    • 几何意义:可以到达的所有向量
  4. 左零空间(Left Null Space):
    • 维数:
    • 几何意义:与行空间正交的向量

定理 3(基本子空间的正交性)

  1. (零空间与行空间正交)
  2. (左零空间与列空间正交)

证明第 1 条

,即。对于任意,存在使得。计算内积:

因此,即。证毕。

基本子空间的维数关系

这两个等式表明分别被分解为两个正交的子空间。

内积空间与范数

内积的定义与性质

定义 7(内积):设是实向量空间。内积是一个映射,满足:

  1. 对称性
  2. 线性性
  3. 正定性,且

常见内积

  1. 标准内积(欧几里得内积):对于

  1. 加权内积:给定正定对角矩阵

  1. 函数空间的内积:对于

  1. 矩阵的 Frobenius 内积:对于

范数的定义与性质

定义 8(范数):向量空间上的范数是一个映射,满足:

  1. 正定性,且
  2. 齐次性
  3. 三角不等式

常见向量范数

  1. 范数:对于

特例: - 范数(曼哈顿距离): - 范数(欧几里得范数): - 范数(最大范数):

  1. 内积诱导的范数:对于内积空间,

定理 4(Cauchy-Schwarz 不等式):对于内积空间中的任意

等号成立当且仅当线性相关。

证明

对于任意,考虑:

这是关于的二次函数,且恒非负。因此判别式

。等号成立当且仅当存在使得,即(线性相关)。证毕。

Cauchy-Schwarz 不等式的推论

  1. 三角不等式

    证明

两边开方即得三角不等式。

  1. 余弦定理

其中的夹角。由 Cauchy-Schwarz 不等式,

下图直观展示了空间中不同范数的单位球:范数的单位球是菱形,范数的单位球是圆形,范数的单位球是正方形。这些几何形状直接决定了对应正则化方法(Lasso、Ridge)的行为特征:

Matrix Norms

常见矩阵范数

定义 9(矩阵范数):矩阵范数是定义在矩阵空间上的范数。

常见矩阵范数

  1. Frobenius 范数

  1. 诱导范数(算子范数):由向量范数诱导,

特例: - 谱范数(2-范数):(最大奇异值) - 1-范数(列和的最大值) - -范数(行和的最大值)

  1. 核范数(迹范数):

其中的奇异值。

定理 5(矩阵范数的性质)

  1. 次乘性(Frobenius 范数不满足,但满足
  2. 诱导范数的次乘性
  3. 与向量范数的相容性

特征值与特征向量

特征值问题的定义

定义 10(特征值与特征向量):设。如果存在非零向量和标量使得:

则称特征值为对应的特征向量

特征值的计算

特征值满足特征方程

这是关于次多项式方程,称为特征多项式

定理 6(特征值的性质)

1.(特征值之和等于迹) 2.(特征值之积等于行列式) 3.可逆所有特征值非零 4.的特征值是 5. 相似矩阵有相同的特征值

证明第 1,2 条

特征多项式的首项系数是,次高项系数是,常数项是

根据 Vieta 定理,多项式展开后:

-的系数: - 常数项:

对比系数即得。证毕。

对称矩阵的谱定理

定理 7(对称矩阵的谱定理):设是对称矩阵,则:

1.的所有特征值都是实数 2. 对应不同特征值的特征向量正交 3.可以正交对角化,即存在正交矩阵和对角矩阵使得:

其中的列是的标准正交特征向量。

证明

第 1 步:特征值是实数

。计算:

因此,即

第 2 步:不同特征值的特征向量正交

,其中。计算:

因此。由于,得

第 3 步:正交对角化

由于实对称矩阵,在复数域上必有个特征值(计重数)。由第 1 步,这些特征值都是实数。对于重特征值,其特征空间内可以选取正交基(Gram-Schmidt 正交化)。

因此可以找到个标准正交的特征向量,构成正交矩阵。则:

两边右乘(利用),得。证毕。

谱分解的几何意义

这表明可以分解为个秩 1 矩阵的加权和,每个矩阵是沿特征向量方向的投影,权重是特征值

正定矩阵

定义 11(正定矩阵):对称矩阵称为正定矩阵,如果对所有非零向量

类似地,定义半正定()、负定()、半负定()矩阵。

定理 8(正定矩阵的等价条件):以下条件等价:

1.是正定矩阵 2.的所有特征值都是正数 3.的所有顺序主子式都是正数 4. 存在可逆矩阵使得 5.的 Cholesky 分解存在:,其中是下三角矩阵

证明。则:

因此由谱定理,,其中。对于任意,令(因为可逆):

因为至少有一个且所有。证毕。

正定矩阵的性质:

  1. 正定矩阵一定可逆
  2. 正定矩阵的逆也是正定的
  3. 两个正定矩阵的和是正定的
  4. 正定矩阵的主对角元都是正数

下图展示了特征值分解的几何意义:矩阵将单位圆变换为椭圆,椭圆的主轴方向即为特征向量,主轴长度即为特征值。右图则展示了特征向量即为数据的主方向(PCA 的核心思想):

Eigenvalue Visualization

奇异值分解(SVD)

SVD 的定理与几何意义

定理 9(奇异值分解):设,秩为。则存在正交矩阵,以及对角矩阵,使得:

其中的对角元称为奇异值

完整形式

简化形式(经济型 SVD):

其中

证明思路

第 1 步:特征值分解的启发

考虑

-是对称半正定矩阵 -是对称半正定矩阵

由谱定理,它们可以正交对角化。

第 2 步:右奇异向量(来自)的特征值分解:

其中的列的标准正交特征向量,

定义为奇异值(按降序排列)。

第 3 步:左奇异向量的构造

对于(其中),定义:

验证的正交性:

对于,用 Gram-Schmidt 正交化扩展的标准正交基。

第 4 步:验证

对于

对于

(因为,即意味着

因此:

两边右乘。证毕。

SVD 的几何意义

任意线性变换可以分解为三步:

  1. 旋转(或反射):的标准正交基旋转到的特征向量基
  2. 缩放沿个方向缩放,缩放因子是奇异值
  3. 旋转(或反射):将结果旋转到的标准正交基

下图展示了线性代数的核心几何概念:左图展示矩阵变换如何将单位圆变换为椭圆,特征向量指示主方向;中图展示 SVD 分解后的奇异值大小;右图展示二次型在不同方向上的函数值变化:

Linear Algebra Core Concepts

SVD 的应用

1. 低秩逼近

定理 10(Eckart-Young 定理):设的 SVD,是秩逼近。则在所有秩的矩阵中,Frobenius 范数和谱范数意义下的最佳逼近:

证明思路(谱范数)

是任意秩的矩阵。则。考虑

但它们都是的子空间,所以必有非零交点。存在

由于。则:

但这只能证明。更精细的论证(利用极小极大原理)可以证明,且达到此下界。

应用:主成分分析(PCA)

给定数据矩阵(中心化后),对做 SVD:

取前个主成分:

这是的最佳秩逼近,即在保留最多方差的意义下,将数据从维降到维。

下图展示了 SVD 分解的几何意义:任意矩阵将单位圆通过旋转和缩放变换为椭圆,奇异值决定了椭圆各轴的长度:

SVD Visualization

下面的动画直观展示了 SVD 低秩逼近的过程——随着保留的奇异值个数逐渐增加,图像的近似质量不断提升,这正是低秩逼近理论(Eckart-Young 定理)的实际体现:

SVD Truncation Animation

2. 伪逆矩阵

定义 12(Moore-Penrose 伪逆):矩阵的伪逆是唯一满足以下四个性质的矩阵:

1. 2. 3. 4.

定理 11(SVD 计算伪逆):设的 SVD,则:

其中定义为:

验证

验证满足四个性质。以第 1 条为例:

因为(前个对角元是 1)。其余性质类似验证。

最小二乘问题的解

对于不相容方程组,最小二乘解是:

这是所有使最小的解中,范数最小的一个(最小范数最小二乘解)。

3. 条件数

定义 13(条件数):矩阵的条件数定义为:

条件数度量了矩阵的"病态程度"。越大,线性方程组的扰动越敏感。

定理 12(扰动界):设,则:

这表明相对误差被条件数放大。

矩阵求导

矩阵求导在机器学习的优化问题中无处不在。本节从第一性原理推导常用的矩阵求导公式。

矩阵求导的记号

标量对向量求导

,则对向量的导数定义为:

这称为梯度向量,记作

标量对矩阵求导

,则对矩阵的导数定义为:

向量对向量求导

,则Jacobi 矩阵定义为:

注意:矩阵求导的记号约定在不同文献中可能不同(分子布局 vs 分母布局)。本文采用分子布局,即导数的形状与分子(被求导函数)的形状一致。

基本求导公式

1. 线性函数

公式 1,则:

证明

因此:

2. 二次型

公式 2(其中),则:

特别地,如果是对称矩阵,则:

证明

求偏导:

因此。当时,得。证毕。

3. 矩阵乘法

公式 3(其中),则:

证明

求偏导:

因此。证毕。

4. 矩阵的迹

公式 4(其中),则:

特别地,如果对称,则:

证明

利用迹的循环性质

利用公式 3:

(这里用到的推广)

实际上,直接计算:

因此。证毕。

5. 行列式与逆矩阵

公式 5(其中可逆),则:

证明

利用矩阵求导的链式法则和

对于行列式的微分,有公式(Jacobi 公式):

因此:

根据微分与导数的关系,得:

证毕。

公式 6,则:

其中是第元素为 1,其余为 0 的矩阵。

链式法则与反向传播

定理 13(标量函数的链式法则):设,则复合函数的导数为:

其中是 Jacobi 矩阵。

证明

由多元函数的链式法则:

写成矩阵形式:

证毕。

反向传播的例子

考虑神经网络的一层:

其中是激活函数(逐元素作用)。

设损失函数是。要计算

,则:

但这里涉及矩阵对矩阵求导,需要更仔细的处理。实际上:

注意到, 所以(Kronecker delta)。

因此:

其中是第个神经元的"误差信号"。

写成矩阵形式:

其中

矩阵分解的数值计算

QR 分解

定理 14(QR 分解):设()列满秩,则存在正交矩阵和上三角矩阵使得:

Gram-Schmidt 正交化算法:

给定线性无关的向量组, 构造标准正交向量组:

则:

写成矩阵形式:

其中,()。

QR 分解的应用:

  1. 求解最小二乘问题:的解为(利用)。

  2. 计算特征值: QR 迭代算法

    重复以下步骤:

    在一定条件下,收敛到上三角矩阵,对角元是特征值。

Cholesky 分解

定理 15(Cholesky 分解):设是正定矩阵,则存在唯一的下三角矩阵$L 使$

算法:

递推计算的元素:

计算复杂度:(比 LU 分解快一倍)

应用:

  1. 求解线性方程组:
    • 分解
    • 求解(前向替换)
    • 求解(后向替换)
  2. 判断矩阵正定性:如果 Cholesky 分解成功(所有都是正数),则正定。

代码实现:矩阵分解与应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import svd, qr, cholesky
import time

# 设置随机种子
np.random.seed(42)

def demonstrate_svd():
"""
演示 SVD 分解及其应用:低秩逼近
"""
print("="*60)
print("1. 奇异值分解(SVD)与低秩逼近")
print("="*60)

# 创建一个低秩矩阵 + 噪声
m, n = 100, 80
rank_true = 10

# 真实的低秩矩阵: A = U @ S @ V^T
U_true = np.random.randn(m, rank_true)
S_true = np.diag(np.linspace(10, 1, rank_true)) # 递减的奇异值
V_true = np.random.randn(n, rank_true)
A_true = U_true @ S_true @ V_true.T

# 添加噪声
noise_level = 0.5
A_noisy = A_true + noise_level * np.random.randn(m, n)

# SVD 分解
U, s, Vt = svd(A_noisy, full_matrices=False)

print(f"原始矩阵形状: {A_noisy.shape}")
print(f"奇异值前 10 个: {s[:10]}")
print(f"奇异值后 10 个: {s[-10:]}")

# 低秩逼近
ranks = [1, 5, 10, 20, 40]
errors_fro = []
errors_spec = []

for k in ranks:
# 秩 k 逼近: A_k = U[:, :k] @ diag(s[:k]) @ Vt[:k, :]
A_k = U[:, :k] @ np.diag(s[:k]) @ Vt[:k, :]

error_fro = np.linalg.norm(A_noisy - A_k, 'fro')
error_spec = np.linalg.norm(A_noisy - A_k, 2)

errors_fro.append(error_fro)
errors_spec.append(error_spec)

print(f"秩{k}逼近: Frobenius 误差={error_fro:.2f}, 谱误差={error_spec:.2f}")

# 理论预测
print("\n 理论预测(Eckart-Young 定理):")
for i, k in enumerate(ranks):
theory_fro = np.sqrt(np.sum(s[k:]**2))
theory_spec = s[k] if k < len(s) else 0
print(f"秩{k}: 理论 Fro 误差={theory_fro:.2f}, 理论谱误差={theory_spec:.2f}")

# 绘图
plt.figure(figsize=(12, 4))

plt.subplot(1, 2, 1)
plt.semilogy(np.arange(1, len(s)+1), s, 'o-')
plt.xlabel('奇异值索引')
plt.ylabel('奇异值 (对数尺度)')
plt.title('SVD 奇异值谱')
plt.grid(True, alpha=0.3)

plt.subplot(1, 2, 2)
plt.plot(ranks, errors_fro, 'o-', label='Frobenius 误差')
plt.plot(ranks, errors_spec, 's-', label='谱误差')
plt.xlabel('逼近秩')
plt.ylabel('逼近误差')
plt.title('低秩逼近误差')
plt.legend()
plt.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('svd_demo.png', dpi=150)
plt.close()

print("\n 图像已保存为 svd_demo.png\n")

def demonstrate_qr():
"""
演示 QR 分解及其在最小二乘中的应用
"""
print("="*60)
print("2. QR 分解与最小二乘问题")
print("="*60)

# 生成过定方程组 Ax = b (m > n)
m, n = 100, 10
A = np.random.randn(m, n)
x_true = np.random.randn(n)
b = A @ x_true + 0.1 * np.random.randn(m) # 加噪声

# 方法 1: 正规方程 x = (A^T A)^(-1) A^T b
start = time.time()
x_normal = np.linalg.solve(A.T @ A, A.T @ b)
time_normal = time.time() - start

# 方法 2: QR 分解 A = QR, 解 Rx = Q^T b
start = time.time()
Q, R = qr(A, mode='economic')
x_qr = np.linalg.solve(R, Q.T @ b)
time_qr = time.time() - start

# 方法 3: SVD 伪逆 x = A^+ b
start = time.time()
x_svd = np.linalg.lstsq(A, b, rcond=None)[0]
time_svd = time.time() - start

print(f"真实解 x_true: {x_true[:5]}...")
print(f"正规方程解: {x_normal[:5]}... (用时{time_normal*1000:.2f}ms)")
print(f"QR 分解解: {x_qr[:5]}... (用时{time_qr*1000:.2f}ms)")
print(f"SVD 伪逆解: {x_svd[:5]}... (用时{time_svd*1000:.2f}ms)")

# 残差对比
print(f"\n 残差范数:")
print(f"正规方程: {np.linalg.norm(A @ x_normal - b):.6f}")
print(f"QR 分解: {np.linalg.norm(A @ x_qr - b):.6f}")
print(f"SVD 伪逆: {np.linalg.norm(A @ x_svd - b):.6f}")

# 条件数分析
kappa = np.linalg.cond(A)
kappa_ata = np.linalg.cond(A.T @ A)
print(f"\n 条件数 κ(A) = {kappa:.2f}")
print(f"条件数 κ(A^T A) = {kappa_ata:.2f} ≈ κ(A)^2")
print("结论: QR 分解数值稳定性更好(不涉及 A^T A)\n")

def demonstrate_cholesky():
"""
演示 Cholesky 分解
"""
print("="*60)
print("3. Cholesky 分解(正定矩阵)")
print("="*60)

# 生成正定矩阵 A = B^T B
n = 50
B = np.random.randn(n, n)
A = B.T @ B + np.eye(n) # 加单位阵保证正定

# Cholesky 分解 A = L L^T
start = time.time()
L = cholesky(A, lower=True)
time_chol = time.time() - start

# 验证
error = np.linalg.norm(A - L @ L.T, 'fro')
print(f"Cholesky 分解用时: {time_chol*1000:.2f}ms")
print(f"重构误差 ||A - LL^T||_F = {error:.2e}")

# 应用: 求解线性方程组 Ax = b
b = np.random.randn(n)

# 方法 1: 直接求逆
start = time.time()
x_inv = np.linalg.solve(A, b)
time_inv = time.time() - start

# 方法 2: Cholesky 分解 + 前向/后向替换
start = time.time()
y = np.linalg.solve(L, b) # 前向替换 Ly = b
x_chol = np.linalg.solve(L.T, y) # 后向替换 L^T x = y
time_chol_solve = time.time() - start

print(f"\n 求解 Ax = b:")
print(f"直接求解用时: {time_inv*1000:.2f}ms")
print(f"Cholesky 求解用时: {time_chol_solve*1000:.2f}ms")
print(f"解的误差: {np.linalg.norm(x_inv - x_chol):.2e}")
print("结论: Cholesky 分解更快(复杂度 O(n^3/3) vs O(n^3))\n")

def demonstrate_matrix_calculus():
"""
演示矩阵求导在机器学习中的应用
"""
print("="*60)
print("4. 矩阵求导:线性回归的梯度计算")
print("="*60)

# 生成线性回归数据
n, d = 100, 5
X = np.random.randn(n, d)
w_true = np.random.randn(d)
y = X @ w_true + 0.1 * np.random.randn(n)

# 损失函数: L(w) = (1/2n) ||Xw - y||^2
def loss(w):
return 0.5 / n * np.sum((X @ w - y)**2)

# 解析梯度: ∂ L/∂ w = (1/n) X^T (Xw - y)
def gradient_analytic(w):
return 1/n * X.T @ (X @ w - y)

# 数值梯度(用于验证)
def gradient_numeric(w, eps=1e-7):
grad = np.zeros_like(w)
for i in range(len(w)):
w_plus = w.copy()
w_plus[i] += eps
w_minus = w.copy()
w_minus[i] -= eps
grad[i] = (loss(w_plus) - loss(w_minus)) / (2 * eps)
return grad

# 测试点
w_test = np.random.randn(d)

grad_ana = gradient_analytic(w_test)
grad_num = gradient_numeric(w_test)

print(f"解析梯度: {grad_ana}")
print(f"数值梯度: {grad_num}")
print(f"误差: {np.linalg.norm(grad_ana - grad_num):.2e}")
print("结论: 解析梯度与数值梯度一致\n")

# 梯度下降
w = np.zeros(d)
lr = 0.1
losses = []

for epoch in range(100):
grad = gradient_analytic(w)
w = w - lr * grad
losses.append(loss(w))

print(f"真实权重: {w_true}")
print(f"学习的权重: {w}")
print(f"初始损失: {losses[0]:.4f}")
print(f"最终损失: {losses[-1]:.4f}")

# 解析解: w* = (X^T X)^(-1) X^T y
w_analytic = np.linalg.solve(X.T @ X, X.T @ y)
print(f"解析解: {w_analytic}")
print(f"梯度下降解与解析解误差: {np.linalg.norm(w - w_analytic):.2e}\n")

if __name__ == "__main__":
print("╔" + "="*58 + "╗")
print("║" + " "*10 + "线性代数与矩阵论实验" + " "*26 + "║")
print("╚" + "="*58 + "╝")
print()

demonstrate_svd()
demonstrate_qr()
demonstrate_cholesky()
demonstrate_matrix_calculus()

print("="*60)
print("所有实验完成!")
print("="*60)

代码解读:

  1. SVD 演示:
    • 验证 Eckart-Young 定理:秩逼近的误差等于第个奇异值起的平方和
    • 显示奇异值谱:真实信号的奇异值快速衰减,噪声的奇异值平坦
  2. QR 分解演示:
    • 对比三种求解最小二乘的方法:正规方程、 QR 分解、 SVD 伪逆
    • 展示 QR 分解的数值稳定性优势(不需要计算, 条件数不会平方)
  3. Cholesky 分解演示:
    • 验证的准确性
    • 展示 Cholesky 分解在求解正定线性方程组中的速度优势
  4. 矩阵求导演示:
    • 验证线性回归梯度的解析公式与数值梯度一致
    • 实现梯度下降并与解析解对比

❓ Q&A:线性代数常见疑问

Q1:为什么 SVD 总是存在,而特征值分解不一定存在?

核心区别

性质 特征值分解 奇异值分解
适用矩阵 方阵 任意矩阵
分解形式
左右向量 相同( 不同(
存在性 仅对可对角化矩阵 总是存在
值的性质 特征值可能是复数 奇异值总是非负实数

为什么 SVD 总是存在?

SVD 的构造不依赖于的结构,而是基于

-是对称半正定矩阵 -是对称半正定矩阵

对称矩阵的谱定理保证它们可以正交对角化,因此 SVD 总是存在。

特征值分解何时不存在?

非对称方阵可能不可对角化。例如:

特征值:(重特征值)

特征向量:只有 1 个线性无关的特征向量,无法构成的基。

因此不可对角化,特征值分解不存在(只存在 Jordan 标准形)。

实际应用

  • SVD 适用于任意数据矩阵,因此在 PCA、推荐系统、图像压缩中广泛使用
  • 特征值分解用于对称矩阵(协方差矩阵、图拉普拉斯矩阵)或需要迭代求解的问题

下图对比了不同矩阵分解方法:原始矩阵、特征值分解重构、 SVD 低秩逼近以及奇异值能量分布曲线,直观展示了 SVD 如何通过保留主要奇异值实现数据压缩:

Matrix Decomposition Comparison

Q2:什么时候应该使用 QR 分解而不是正规方程求解最小二乘?

正规方程的数值稳定性问题

正规方程需要计算,这会导致条件数平方:

数值例子

的条件数(中等病态)。则:

-的相对误差可能被放大倍 -的相对误差可能被放大

在有限精度算术(如双精度浮点数,相对精度)下:

  • 使用正规方程:有效数字损失约 6 位,结果可能只有 10 位有效数字
  • 使用 QR 分解:有效数字损失约 3 位,结果有 13 位有效数字

实际例子

考虑矩阵:

在双精度下,项会被舍入,导致几乎奇异,无法准确求解。

但 QR 分解直接作用于,不涉及,数值稳定。

建议

  • ✅ 对于的病态问题,使用 QR 分解或 SVD
  • ✅ 对于的瘦高矩阵,QR 分解更高效
  • ⚠️ 仅当条件数很小()且不太大时,使用正规方程

Q3:如何理解矩阵的秩?为什么秩很重要?

秩的多个等价定义

  1. 列空间维数

  2. 行空间维数

  3. 线性无关列数: 最大线性无关列向量组的大小

  4. 非零奇异值个数:

几何意义:

秩是矩阵作为线性变换的"有效维数":

-意味着维空间映射到维空间的一个维子空间 - 维数"损失" =(零空间维数)

为什么秩重要?

  1. 可逆性: -可逆

  2. 方程可解性: -有解

    • 解唯一
  3. 自由度:

    • 齐次方程的通解有个自由参数
  4. 数据降维:

    • PCA 将数据投影到秩子空间,保留最多方差

实际应用:

领域 秩的含义
机器学习 特征的有效维数
推荐系统 用户-物品交互矩阵的潜在因子数
图像压缩 图像矩阵的低秩逼近
控制理论 系统的可控性/可观性

数值计算中的秩:

由于浮点误差,数值秩定义为:

其中是阈值(如)。


Q4:内积和范数有什么关系?为什么需要不同的范数?

内积诱导范数:

对于内积空间,内积自然诱导一个范数:

例如,标准内积 u, v = u^T vL _2

范数不一定来自内积:范数 |v|1 = |v_i|L 不能由任何内积诱导。

判断范数是否来自内积:平行四边形法则

范数由内积诱导满足平行四边形法则:

范数满足此法则,不满足。

不同范数的应用:

范数 几何意义 应用
曼哈顿距离,菱形等值线 稀疏正则化(Lasso)
欧几里得距离,圆形等值线 岭回归,支持向量机
切比雪夫距离,方形等值线 鲁棒优化,极小极大问题
非零元个数(非范数) 特征选择,压缩感知

为什么能产生稀疏解?

范数的等值线在坐标轴上有尖角。当优化问题的约束集(如)与目标函数的等值线相交时,交点倾向于在坐标轴上(某些分量为 0),从而产生稀疏解。

图示:

1
2
3
4
5
6
7
8
9
10
L1 约束(菱形)         L2 约束(圆形)
w2 w2
| |
/|\ / \
/ | \ / \
/ | \ | |
----+----w1 -------w1
\ | / | |
\ | / \ /
\|/ \ /

L1 约束的尖角更容易触碰坐标轴(稀疏解)。


Q5:正定矩阵在机器学习中为什么如此重要?

正定矩阵的核心性质:

对称正定矩阵满足:

  1. 所有特征值
  2. 对所有
  3. 可以写成(如 Cholesky 分解

在优化中的作用:

定理:函数是凸函数 半正定

证明:Hessian 矩阵。函数凸 Hessian 半正定。

严格凸函数(唯一最优解)正定 严格凸唯一全局最小值。

实际应用:

  1. 线性回归的正规方程

是半正定的。如果列满秩,正定,方程有唯一解。

  1. 核矩阵: 核函数对应的 Gram 矩阵必须正定(Mercer 定理)。

  2. 协方差矩阵

    数据的协方差矩阵总是半正定的。

  3. 二阶优化: 牛顿法、共轭梯度法依赖 Hessian 矩阵正定性。

负定矩阵的意义:

函数(正定)是凹函数,用于最大化问题。

判定正定性

  1. 特征值:所有特征值
  2. Sylvester 准则:所有顺序主子式
  3. Cholesky 分解:尝试分解,成功则正定
  4. 数值方法:计算最小特征值

Q6:矩阵求导中的"分子布局"和"分母布局"有什么区别?

两种布局约定:

布局 规则 形状 常用领域
分子布局 导数形状与分子一致 形状相同 统计学,机器学习
分母布局 导数形状与分母一致 形状相同(转置) 物理学,工程学

例子:

,, Jacobi 矩阵:

  • 分子布局:

  • 分母布局:

标量对向量求导:

  • 分子布局(列向量)
  • 分母布局(行向量)

重要公式的对比:

公式 分子布局 分母布局

本文的约定:

本章采用分子布局,理由:

  1. 与向量/矩阵的自然形状一致
  2. 在机器学习文献中更常见
  3. 梯度是列向量,便于梯度下降

实践建议:

  • ✅ 阅读论文时,先确认作者的布局约定
  • ✅ 自己的代码/推导中保持一致
  • ✅ 使用自动微分库(如 PyTorch, JAX)避免手工推导

Q7:如何快速判断一个矩阵是否可逆?

理论判据:

矩阵可逆以下任一条件成立:

  1. (零空间只有零向量)
  2. 所有特征值非零
  3. 行向量(或列向量)线性无关
  4. 可以通过行变换化为单位矩阵

数值判据(实际计算):

由于浮点误差,使用:

  1. 条件数
    • :数值可逆
    • :数值奇异
  2. 最小奇异值
    • (其中):可逆
  3. LU 分解: 尝试 LU 分解,如果遇到零主元(或极小主元),矩阵奇异

快速检查(无需全部计算):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def is_invertible_quick(A, tol=1e-10):
"""
快速判断矩阵是否数值可逆
"""
# 方法 1: 检查行列式(仅对小矩阵)
if A.shape[0] <= 10:
return abs(np.linalg.det(A)) > tol

# 方法 2: 检查条件数
kappa = np.linalg.cond(A)
return kappa < 1 / tol

# 方法 3: 尝试求解 Ax=b
try:
x = np.linalg.solve(A, np.ones(A.shape[0]))
residual = np.linalg.norm(A @ x - np.ones(A.shape[0]))
return residual < tol
except np.linalg.LinAlgError:
return False

特殊矩阵的可逆性:

矩阵类型 可逆条件
对角矩阵 所有对角元非零
三角矩阵 所有对角元非零
正交矩阵 总是可逆()
对称正定 总是可逆
幂等矩阵() 仅当时可逆

Q8:SVD 和 PCA 有什么关系?为什么 PCA 用协方差矩阵的特征值分解?

PCA 的两种等价推导:

方法 1:最大方差(协方差矩阵特征值分解)

给定中心化数据矩阵(每列均值为 0)。

目标:找到方向,使得数据在此方向上的方差最大。

方差:

其中是协方差矩阵。

优化问题:

由 Lagrange 乘数法,最优解满足:

的特征向量,是特征值。最大方差对应最大特征值。

方法 2:最小重构误差(数据矩阵 SVD)

目标:找到秩矩阵使得最小。

由 Eckart-Young 定理,最优解是的秩 SVD 逼近:

其中是前个右奇异向量,恰好是(协方差矩阵的倍)的前个特征向量。

两种方法的等价性

即:

  • 的右奇异向量的特征向量(PCA 的主成分方向)
  • 的奇异值的平方的特征值(解释方差)

实际计算的选择:

方法 公式 适用场景
协方差矩阵特征值分解 (样本多,特征少)
数据矩阵 SVD (高维数据,如图像)

为什么高维时 SVD 更好?

  • 协方差矩阵:,需要时间
  • 数据矩阵 SVD:,经济型 SVD 只需时间

(如图像像素数,样本数),SVD 快得多。


Q9:为什么说"秩 1 矩阵是矩阵的原子"?

秩 1 矩阵的定义:

矩阵是秩 1 矩阵,如果

等价条件:可以写成两个向量的外积:

为什么称为"原子"?

任意矩阵都可以分解为秩 1 矩阵的和。这类似于:

  • 向量可以分解为基向量的线性组合
  • 函数可以分解为傅里叶级数(正弦/余弦函数的和)

SVD 的秩 1 分解

每一项是秩 1 矩阵,个秩 1 矩阵的加权和。

秩 1 矩阵的性质:

  1. 简单结构完全由两个向量决定
  2. 低存储:存储矩阵需要个数,秩 1 矩阵只需个数
  3. 快速乘法,先算内积),再缩放(),总共,远小于

应用:

  1. 低秩矩阵补全(推荐系统):

    用户-物品评分矩阵可以近似为秩矩阵(很小):

  2. 神经网络压缩

    权重矩阵用秩逼近,参数从减少到

  3. 快速矩阵乘法

    如果,则,计算量从降到


Q10:Gram 矩阵()和 Gram-Schmidt 正交化有什么关系?

Gram 矩阵的定义:

给定矩阵, Gram 矩阵定义为:

元素为:

即列向量之间的内积。

Gram 矩阵的性质:

  1. 对称
  2. 半正定
  3. 可逆性可逆 列满秩

Gram-Schmidt 正交化:

目标:将转化为标准正交基

过程:

关系

Gram-Schmidt 正交化本质上是在"去掉在前个向量张成的子空间上的投影",这等价于:

  1. 计算投影:
  2. 计算正交分量:
  3. 归一化

Gram 矩阵的 Cholesky 分解:

如果列满秩,则正定,可以 Cholesky 分解:

其中是下三角矩阵。实际上,的列正比于 Gram-Schmidt 过程的中间向量(未归一化)。

数值稳定性:

经典 Gram-Schmidt(CGS)数值不稳定:后续向量可能不正交。

修改的 Gram-Schmidt(MGS)更稳定:每次只对一个向量正交化。

QR 分解与 Gram-Schmidt 的关系:

QR 分解可以通过 Gram-Schmidt 得到:

-$Q R r_{ij} = q_i^T x_j$

这正是 Gram 矩阵的 Cholesky 分解!

🎓 总结:线性代数核心要点

记忆公式:

  1. 四个基本子空间:

  2. SVD 分解:

  3. 谱定理(对称矩阵):

  4. 矩阵求导:

记忆口诀:

SVD 分解万能钥匙(任意矩阵可分解)

对称矩阵特征值实(谱定理保证正交)

正定矩阵优化好(凸函数唯一解)

QR 分解数值稳(最小二乘首选)

实战 Checklist:

✏️ 练习题与解答

练习 1:特征值与特征向量

题目:设矩阵,求的所有特征值和特征向量,并验证可以对角化。

解答

特征方程

解得

,即,得

,即,得

验证对角化:,则

可以验证,因此可通过正交对角化分解。这正是谱定理在对称矩阵上的体现。

练习 2:SVD 与低秩逼近

题目:设矩阵,求的 SVD 分解,并给出秩 1 的最佳逼近矩阵。

解答

首先计算

的特征值:,解得

奇异值:

右奇异向量的特征向量构成(单位化),左奇异向量

秩 1 最佳逼近:。由 Eckart-Young 定理,逼近误差为

练习 3:矩阵求导

题目:设,其中对称矩阵。求,并说明当正定时的最小值。

解答

梯度:

(因为对称,

Hessian 矩阵:

正定时,正定,因此是严格凸函数。令

最小值为:

练习 4:正定矩阵与 Cholesky 分解

题目:证明对称正定矩阵一定存在唯一的 Cholesky 分解,其中是对角元为正的下三角矩阵。对验证之。

解答

存在性证明(归纳法,对矩阵阶数):

(正定),取

阶时成立。将阶正定矩阵分块:

,其中因为正定矩阵主对角元为正),

由正定性,仍然正定(Schur 补),由归纳假设,存在。

唯一性:若,则,左边是下三角,右边是上三角,因此(对角矩阵)。由于的对角元都为正,,即

验证

练习 5:条件数与数值稳定性

题目:矩阵,计算其 2-范数条件数,并说明为什么用求解线性方程组时会面临数值稳定性问题。

解答

的特征值:

由于对称正定,奇异值等于特征值,所以:

条件数约为,属于病态矩阵。这意味着:

  • 右端向量的微小扰动会导致解产生倍放大的变化:
  • 在浮点运算中,即使本身没有误差,舍入误差也可能被放大约倍,导致解的有效数字损失约 4 位
  • 实际应用中应考虑使用正则化(如 Tikhonov 正则化:)来改善数值稳定性

📚 参考文献

  1. Strang, G. (2006). Linear Algebra and Its Applications (4th ed.). Cengage Learning.

  2. Golub, G. H., & Van Loan, C. F. (2013). Matrix Computations (4th ed.). Johns Hopkins University Press.

  3. Horn, R. A., & Johnson, C. R. (2012). Matrix Analysis (2nd ed.). Cambridge University Press.

  4. Trefethen, L. N., & Bau III, D. (1997). Numerical Linear Algebra. SIAM.

  5. Axler, S. (2015). Linear Algebra Done Right (3rd ed.). Springer.

  6. Petersen, K. B., & Pedersen, M. S. (2012). The Matrix Cookbook. Technical University of Denmark.

  7. Eckart, C., & Young, G. (1936). The approximation of one matrix by another of lower rank. Psychometrika, 1(3), 211-218.

  8. Meyer, C. D. (2000). Matrix Analysis and Applied Linear Algebra. SIAM.

  9. Boyd, S., & Vandenberghe, L. (2004). Convex Optimization. Cambridge University Press.

  10. Magnus, J. R., & Neudecker, H. (2019). Matrix Differential Calculus with Applications in Statistics and Econometrics (3rd ed.). Wiley.


下一章预告:第 3 章将深入探讨概率论与统计推断,包括常见分布、最大似然估计、贝叶斯估计等,为概率模型打下基础。

  • 本文标题:机器学习数学推导(二)线性代数与矩阵论
  • 本文作者:Chen Kai
  • 创建时间:2021-08-31 14:00:00
  • 本文链接:https://www.chenk.top/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E6%95%B0%E5%AD%A6%E6%8E%A8%E5%AF%BC%EF%BC%88%E4%BA%8C%EF%BC%89%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0%E4%B8%8E%E7%9F%A9%E9%98%B5%E8%AE%BA/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论