线性回归、拟合直线与最小二乘法:一个几何视角的完整故事
线性回归、拟合直线与最小二乘法:从几何视角看数据建模的本质
想象你面前有一张白纸,上面随意散布着几个墨点。作为观察者,你的直觉会试图寻找一条"最合适"的直线来描述这些点的整体趋势——这正是人类认知世界的基本方式之一。在数据科学中,这个过程被称为线性回归,而支撑这个直觉背后的数学原理,则是一个融合了统计学、线性代数和几何直观的精彩故事。
1. 从散点图到数学方程:问题的诞生
当我们面对一组二维数据点时,最自然的建模方式就是用直线方程y=kx+b来描述它们的关系。假设有三个数据点(1,1)、(2,2)、(3,2),我们希望找到一条直线同时穿过它们:
点(1,1) → k*1 + b = 1
点(2,2) → k*2 + b = 2
点(3,2) → k*3 + b = 2
这可以表示为矩阵方程Ax=b:
import numpy as np
A = np.array([[1,1], [2,1], [3,1]])
b = np.array([1,2,2])
这个方程组的特点是方程数量多于未知数(超定系统),在几何上意味着我们无法找到一条直线同时穿过三个不共线的点。此时传统解法失效,需要引入新的思路——最小二乘法。
2. 最小二乘法的双重理解:代数与几何视角
2.1 代数视角:误差最小化
既然无法完全消除误差,我们转而追求误差平方和最小。定义误差函数:
E(k,b) = (k*1+b-1)² + (k*2+b-2)² + (k*3+b-2)²
通过求偏导并令其为零,可以得到正规方程组:
| 方程 | 表达式 |
|---|---|
| ∂E/∂k = 0 | 3k + 6b = 5 |
| ∂E/∂b = 0 | 6k + 14b = 11 |
解这个方程组得到最优参数:
k_hat = 0.5
b_hat = 2/3
2.2 几何视角:正交投影
更深刻的见解来自线性代数。将矩阵A的列空间视为一个平面,向量b不在这个平面上。我们寻找b在A列空间上的正交投影p,使得误差向量e=b-p与列空间垂直:
A.T @ (b - A @ x_hat) = 0
这导出了著名的正规方程:
A.T @ A @ x_hat = A.T @ b
计算过程演示:
ATA = A.T @ A # [[14, 6], [6, 3]]
ATb = A.T @ b # [11, 5]
x_hat = np.linalg.inv(ATA) @ ATb # [0.5, 0.666...]
3. 投影矩阵:代数运算的几何化身
投影操作可以通过投影矩阵P实现:
P = A @ (A.T @ A)^-1 @ A.T
性质说明:
- 对称性:P.T = P
- 幂等性:P² = P
- 秩:rank(P) = rank(A)
应用示例:
P = A @ np.linalg.inv(ATA) @ A.T
"""
[[ 0.833 0.333 -0.166]
[ 0.333 0.333 0.333]
[-0.166 0.333 0.833]]
"""
p = P @ b # [1.166, 1.666, 2.166]
4. 实践中的考量与应用技巧
4.1 数值稳定性优化
当ATA接近奇异时,可采用以下方法:
-
QR分解法:
Q, R = np.linalg.qr(A) x_hat = np.linalg.inv(R) @ Q.T @ b -
奇异值分解(SVD):
U, S, Vt = np.linalg.svd(A) x_hat = Vt.T @ np.linalg.inv(np.diag(S)) @ U.T @ b
4.2 统计学视角的解读
最小二乘估计量具有重要统计性质:
| 性质 | 说明 | 条件 |
|---|---|---|
| 无偏性 | E[x_hat] = x_true | 误差零均值 |
| 有效性 | 方差最小的线性无偏估计 | 高斯噪声 |
4.3 模型诊断指标
评估拟合质量的常用指标:
residuals = b - A @ x_hat
RSS = np.sum(residuals**2) # 残差平方和
TSS = np.sum((b - np.mean(b))**2) # 总平方和
R_squared = 1 - RSS/TSS # 决定系数
5. 从二维到高维:统一框架的威力
这套方法的美妙之处在于其维度无关性。无论是:
- 二维的直线拟合 (y=kx+b)
- 三维的平面拟合 (z=ax+by+c)
- 更高维的超平面拟合
其核心数学结构保持不变:
x_hat = argmin ||Ax - b||²
实际工程中的应用案例:
- 金融领域:多因子资产定价模型
- 计算机视觉:相机标定与三维重建
- 自然语言处理:词向量空间建模
在Python生态中,这套理论被封装为简洁的API:
from sklearn.linear_model import LinearRegression
model = LinearRegression().fit(A, b)
print(model.coef_, model.intercept_)
理解这些工具背后的数学原理,能帮助我们在面对非常规问题时(如缺失数据、异常值处理)做出更明智的工程决策。我曾在一个传感器校准项目中,通过理解投影几何的本质,成功设计出对测量噪声鲁棒的温度补偿算法——这正体现了理论认知对实践创新的催化作用。
更多推荐



所有评论(0)