正交性与最小二乘法
学习目标
完成本节后,你将能够: - 理解投影的几何意义和矩阵形式 - 推导法方程 \(A^T A \hat{\mathbf{x}} = A^T \mathbf{b}\) - 应用最小二乘法进行数据拟合 - 理解 Gram-Schmidt 正交化
1. 投影——将向量分解为两个正交分量
### 1.1 投影到直线上
向量 \(\mathbf{b}\) 在方向 \(\mathbf{a}\) 上的投影:
\[\mathbf{p} = \frac{\mathbf{a} \cdot \mathbf{b}}{\mathbf{a} \cdot \mathbf{a}} \mathbf{a} = \frac{a a^T}{a^T a} \mathbf{b}\]
投影矩阵:\(P = \frac{a a^T}{a^T a}\)
性质:\(P = P^T\)(对称),\(P^2 = P\)(幂等)
> **直觉 (3Blue1Brown)**:投影 \(P\mathbf{b}\) 就是 \(\mathbf{b}\) 在 \(\mathbf{a}\) 方向上的"影子"。你从 \(\mathbf{b}\) 的顶端向 \(\mathbf{a}\) 作垂线,垂足就是投影点。
### 1.2 投影到子空间
更一般地,将 \(\mathbf{b}\) 投影到矩阵 \(A\) 的列空间上:
\[P = A(A^T A)^{-1} A^T\]
这个公式看似复杂,其实只是"一维投影公式"的高维版本(用 \(A\) 替换 \(a\),用 \(A^T\) 替换点积)。
2. 最小二乘法
### 2.1 问题
当 \(\mathbf{b}\) 不在 \(C(A)\) 中时,\(A\mathbf{x} = \mathbf{b}\) 无精确解。我们求**最佳近似解**:
\[\min_\mathbf{x} \|A\mathbf{x} - \mathbf{b}\|^2\]
### 2.2 法方程
求解这个最小化问题的标准方程是:
\[A^T A \hat{\mathbf{x}} = A^T \mathbf{b}\]
为什么?因为误差 \(\mathbf{e} = \mathbf{b} - A\hat{\mathbf{x}}\) 垂直于 \(C(A)\),所以 \(A^T \mathbf{e} = \mathbf{0}\)。
### 2.3 几何理解
> **直觉 (3Blue1Brown)**:最小二乘就是"把 \(\mathbf{b}\) 垂直地投影到 \(C(A)\) 上"。误差 \(\mathbf{e}\) 尽可能短——它是从 \(\mathbf{b}\) 到列空间的垂线段。
3. 线性回归
# 数据:广告花费 vs 销售额 x = np.array([1, 2, 3, 4, 5]) # 广告费(万元) y = np.array([2.1, 3.8, 5.2, 7.1, 8.9]) # 销售额
# 模型:y = c + dx(直线拟合) A = np.column_stack([np.ones_like(x), x]) coeffs = np.linalg.solve(A.T @ A, A.T @ y) c, d = coeffs
print(f"最佳拟合直线: y = {c:.3f} + {d:.3f}x") print(f"预测 x=6 时的销售额: {c + d*6:.2f}")
# 计算 R²(拟合优度) y_pred = A @ coeffs ss_res = np.sum((y - y_pred)**2) ss_tot = np.sum((y - np.mean(y))**2) r2 = 1 - ss_res/ss_tot print(f"R² = {r2:.4f}") # 越接近1拟合越好 ```
4. Gram-Schmidt 正交化
### 4.1 算法
从一组线性无关的向量构造一组标准正交基:
- \(\mathbf{q}_1 = \mathbf{a}_1 / \|\mathbf{a}_1\|\)
- \(\mathbf{v}_k = \mathbf{a}_k - (\mathbf{q}_1^T\mathbf{a}_k)\mathbf{q}_1 - \cdots - (\mathbf{q}_{k-1}^T\mathbf{a}_k)\mathbf{q}_{k-1}\)
- \(\mathbf{q}_k = \mathbf{v}_k / \|\mathbf{v}_k\|\)
> **直觉 (3Blue1Brown)**:每一步,你抓住下一个向量,减去它在所有已有正交方向上的投影。剩下的部分就是新的正交方向。就像剥洋葱——一层层去掉已有的分量。
### 4.2 Python 实现
def gram_schmidt(A):
"""Gram-Schmidt 正交化"""
m, n = A.shape
Q = np.zeros((m, n))for j in range(n): v = A[:, j].copy() for i in range(j): R[i, j] = Q[:, i] @ A[:, j] v -= R[i, j] * Q[:, i] R[j, j] = np.linalg.norm(v) Q[:, j] = v / R[j, j] return Q, R
A = np.array([[1, 1, 0], [1, 0, 1], [0, 1, 1]]) Q, R = gram_schmidt(A) print("Q(正交矩阵):") print(np.round(Q, 3)) print("Q^T Q:") print(np.round(Q.T @ Q, 3)) # 单位矩阵! ```
5. 本节习题
- 将 \(\mathbf{b} = [3,4,0]\) 投影到 \(\mathbf{a} = [1,1,1]\) 上
- 证明:\(P^2 = P\) 意味着 \((I-P)^2 = I-P\)
- 拟合三点 \((1,2), (2,4), (3,5)\) 的最佳直线
- 对 \(\mathbf{a}_1 = [1,2,2], \mathbf{a}_2 = [1,0,1]\) 做 Gram-Schmidt
- 解释:为什么 \(A^T A\) 可逆当且仅当 \(A\) 的列线性无关
总结
- 投影将向量分解为"列空间分量"和"垂直分量" - 最小二乘 = 求投影到列空间的最优解 - 法方程 \(A^T A \hat{\mathbf{x}} = A^T \mathbf{b}\) 是核心 - Gram-Schmidt 构造正交基,转化为 QR 分解