正交性与最小二乘法

正交性与最小二乘法

学习目标

完成本节后,你将能够: - 理解投影的几何意义和矩阵形式 - 推导法方程 \(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 算法

从一组线性无关的向量构造一组标准正交基:

  1. \(\mathbf{q}_1 = \mathbf{a}_1 / \|\mathbf{a}_1\|\)
  2. \(\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}\)
  3. \(\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. 本节习题

  1. 将 \(\mathbf{b} = [3,4,0]\) 投影到 \(\mathbf{a} = [1,1,1]\) 上
  2. 证明:\(P^2 = P\) 意味着 \((I-P)^2 = I-P\)
  3. 拟合三点 \((1,2), (2,4), (3,5)\) 的最佳直线
  4. 对 \(\mathbf{a}_1 = [1,2,2], \mathbf{a}_2 = [1,0,1]\) 做 Gram-Schmidt
  5. 解释:为什么 \(A^T A\) 可逆当且仅当 \(A\) 的列线性无关

总结

- 投影将向量分解为"列空间分量"和"垂直分量" - 最小二乘 = 求投影到列空间的最优解 - 法方程 \(A^T A \hat{\mathbf{x}} = A^T \mathbf{b}\) 是核心 - Gram-Schmidt 构造正交基,转化为 QR 分解