线性回归、拟合直线与最小二乘法:从几何视角看数据建模的本质

想象你面前有一张白纸,上面随意散布着几个墨点。作为观察者,你的直觉会试图寻找一条"最合适"的直线来描述这些点的整体趋势——这正是人类认知世界的基本方式之一。在数据科学中,这个过程被称为线性回归,而支撑这个直觉背后的数学原理,则是一个融合了统计学、线性代数和几何直观的精彩故事。

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 = 03k + 6b = 5
∂E/∂b = 06k + 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

性质说明:

  1. 对称性:P.T = P
  2. 幂等性:P² = P
  3. :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||²

实际工程中的应用案例:

  1. 金融领域:多因子资产定价模型
  2. 计算机视觉:相机标定与三维重建
  3. 自然语言处理:词向量空间建模

在Python生态中,这套理论被封装为简洁的API:

from sklearn.linear_model import LinearRegression
model = LinearRegression().fit(A, b)
print(model.coef_, model.intercept_)

理解这些工具背后的数学原理,能帮助我们在面对非常规问题时(如缺失数据、异常值处理)做出更明智的工程决策。我曾在一个传感器校准项目中,通过理解投影几何的本质,成功设计出对测量噪声鲁棒的温度补偿算法——这正体现了理论认知对实践创新的催化作用。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐