机器学习数学基础专题【左扬精讲】—— 最小二乘法:线性回归的闭式解与矩阵推导
机器学习数学基础专题【左扬精讲】— 最小二乘法:线性回归的闭式解与矩阵推导
在机器学习和数据分析领域,最小二乘法(Least Squares Method)是最基础、最重要的参数估计方法之一。它贯穿于线性回归、多项式拟合、曲线拟合等各种场景。本篇文章将系统讲解最小二乘法的数学原理、几何意义、推导过程,以及在实际问题中的应用。
最小二乘法 线性回归 参数估计 误差平方和 矩阵求解
学习重点
必须掌握:
- 最小二乘法的核心思想:最小化误差平方和
- 一元线性回归的正规方程推导
- 矩阵形式下的最小二乘解
- 最小二乘法的局限性(病态矩阵、过拟合)
需要了解:
- 最小二乘法的历史背景(高斯-马尔可夫定理)
- 加权最小二乘法
- 正则化对最小二乘法的改进
目录导航
一、最小二乘法的起源与核心思想
What — 最小二乘法是什么?
最小二乘法(Least Squares Method)是一种数学优化技术,通过最小化误差的平方和来寻找数据的最佳函数匹配。给定一组观测数据点 (x₁, y₁), (x₂, y₂), ..., (xₙ, yₙ),最小二乘法试图找到一条曲线(或直线),使得所有数据点到这条曲线的垂直距离的平方和最小。
Why — 为什么需要最小二乘法?
在科学实验、工程测量、金融分析等场景中,我们经常需要从带有噪声的观测数据中推断出潜在的规律。例如:
- 天文学家通过观测数据拟合行星轨道
- 工程师通过实验数据确定材料参数
- 经济学家通过历史数据预测趋势
最小二乘法提供了一种系统化、可计算的方法,从噪声数据中提取真实信号。
没有最小二乘法会发生什么?
- 只能依靠主观判断拟合曲线,无法量化"最佳"的含义
- 无法处理观测数量多于未知参数的情况(超定系统)
- 无法给出唯一的最优解,不同方法可能得到完全不同的结果
最小二乘法最早由勒让德(Legendre)于 1805 年发表,但高斯(Gauss)在 1809 年的著作中给出了更完整的理论推导。高斯声称自己从 1795 年起就使用这种方法,但未及时发表。这场"发明权"之争持续至今,但两位数学家的贡献都已载入史册。
值得一提的是,高斯使用最小二乘法成功预测了谷神星(Ceres)的轨道。1801 年,天文学家发现了一颗新小行星,但在跟踪几周后它消失在了太阳的光芒中。正是高斯应用最小二乘法,仅凭 3 次观测数据就计算出了谷神星的轨道,使天文学家在预言的位置重新发现了它。
二、一元线性回归的最小二乘法
What — 一元线性回归模型
一元线性回归是最简单的最小二乘应用。假设我们有以下数据:
yᵢ = β₀ + β₁ xᵢ + εᵢ (i = 1, 2, ..., n)
其中 β₀ 是截距,β₁ 是斜率,εᵢ 是误差项。我们的目标是找到 β̂₀ 和 β̂₁,使得残差平方和最小:
S(β₀, β₁) = Σ(yᵢ - β₀ - β₁ xᵢ)² (i = 1, 2, ..., n)
How — 正规方程的推导
为了找到 S 的最小值,我们对 β₀ 和 β₁ 分别求偏导,并令其为零:
∂S/∂β₀ = -2 Σ(yᵢ - β₀ - β₁ xᵢ) = 0
∂S/∂β₁ = -2 Σ xᵢ (yᵢ - β₀ - β₁ xᵢ) = 0
从第一个方程可以解出:
β₀ = ȳ - β₁ x̄
其中 x̄ = (1/n) Σ xᵢ,ȳ = (1/n) Σ yᵢ。
代入第二个方程,最终得到斜率的解:
β̂₁ = Σ(xᵢ - x̄)(yᵢ - ȳ) / Σ(xᵢ - x̄)² = Cov(x, y) / Var(x)
β̂₀ = ȳ - β̂₁ x̄
一元线性回归最小二乘解速记口诀
1 个公式:斜率 = 协方差 / 方差
2 个参数:β̂₁ = Σ(xᵢ-x̄)(yᵢ-ȳ) / Σ(xᵢ-x̄)²,β̂₀ = ȳ - β̂₁ x̄
3 步走:计算均值 → 计算斜率 → 计算截距
三、最小二乘法的矩阵推导
What — 多元线性回归的矩阵形式
对于多元线性回归,模型可以写成矩阵形式:
𝐲 = 𝐗 β + ε
其中:
- 𝐲 是 n × 1 的观测向量
- 𝐗 是 n × (p+1) 的设计矩阵(包含截距列)
- β 是 (p+1) × 1 的参数向量
- ε 是 n × 1 的误差向量
How — 正规方程的矩阵推导
残差平方和写成矩阵形式:
S(β) = (𝐲 - 𝐗 β)ᵀ (𝐲 - 𝐗 β)
对 β 求导并令其为零:
∂S/∂β = -2 𝐗ᵀ (𝐲 - 𝐗 β) = 0
整理得到正规方程(Normal Equation):
𝐗ᵀ 𝐗 β = 𝐗ᵀ 𝐲
如果 𝐗ᵀ 𝐗 可逆,解为:
β̂ = (𝐗ᵀ 𝐗)⁻¹ 𝐗ᵀ 𝐲
关于矩阵求逆的注意事项
计算 (𝐗ᵀ 𝐗)⁻¹ 在实际应用中有几个问题:
- 计算复杂度:矩阵求逆是 O(n³) 级别,当维度很高时计算量巨大
- 数值稳定性:如果 𝐗ᵀ 𝐗 接近奇异矩阵(病态矩阵),求逆会放大数值误差
- 解决方案:使用 QR 分解、奇异值分解(SVD)或加入正则化项
四、最小二乘法的几何意义
What — 最小二乘法的空间解释
从几何角度理解,最小二乘法是在高维空间中寻找最优投影。设 𝐲 是观测向量,𝐗 的列空间是 C(𝐗)。最小二乘解 𝐲̂ = 𝐗 β̂ 是 𝐲 在 C(𝐗) 上的正交投影。
Why — 为什么是正交投影?
最小二乘法的目标是使残差 𝐫 = 𝐲 - 𝐗 β̂ 最小。几何上,这意味着:
- 残差向量 𝐫 必须与列空间 C(𝐗) 正交
- 即 𝐗ᵀ 𝐫 = 0
- 这正是正规方程 𝐗ᵀ 𝐗 β̂ = 𝐗ᵀ 𝐲 的来源
用 ASCII 图示说明:
y (观测向量)
\
\ ← 残差 r (正交于列空间)
\
C(X) \ .___________
(列空间) \ / ↑ \
平面 \ / | 投影 ŷ \
↖____\ /_____β̂(X)_______↗
↑ 正交投影
投影矩阵 𝐏 = 𝐗 (𝐗ᵀ 𝐗)⁻¹ 𝐗ᵀ 具有以下性质:
- 幂等性:𝐏² = 𝐏(投影两次等于投影一次)
- 对称性:𝐏ᵀ = 𝐏
- 值域:C(𝐏) = C(𝐗)
这些性质在理论推导和实际计算中都非常有用。
五、最小二乘法的 Python 实现
方式一:手写实现
首先,让我们从零开始实现最小二乘法,理解每一步的计算过程。
import numpy as np
def least_squares_manual(X, y):
"""
手动实现最小二乘法
参数:
X: 特征矩阵 (n_samples, n_features)
y: 目标向量 (n_samples,)
返回:
beta: 回归系数 (n_features,)
"""
# 计算正规方程的解
XtX = X.T @ X # X^T * X
Xty = X.T @ y # X^T * y
# 检查矩阵是否奇异
if np.linalg.matrix_rank(XtX) < XtX.shape[0]:
print("警告: X^T X 是奇异矩阵,使用伪逆求解")
# 求解正规方程: X^T X beta = X^T y
beta = np.linalg.solve(XtX, Xty)
return beta
# 示例用法
X = np.array([[1, 1], [1, 2], [1, 3], [1, 4], [1, 5]])
y = np.array([2.1, 4.0, 5.8, 8.2, 9.9])
beta = least_squares_manual(X, y)
print(f"截距: {beta[0]:.4f}")
print(f"斜率: {beta[1]:.4f}")
方式二:使用 NumPy 广播实现
NumPy 的广播机制让我们可以写出更直观的代码:
import numpy as np
def least_squares_numpy(X, y):
"""
使用 NumPy 广播实现最小二乘法
仅适用于一元线性回归(单特征)
"""
x_mean = np.mean(X[:, 1]) # 跳过截距列
y_mean = np.mean(y)
# 计算斜率: sum((x - x_mean)(y - y_mean)) / sum((x - x_mean)^2)
numerator = np.sum((X[:, 1] - x_mean) * (y - y_mean))
denominator = np.sum((X[:, 1] - x_mean) ** 2)
slope = numerator / denominator
# 计算截距: y_mean - slope * x_mean
intercept = y_mean - slope * x_mean
return np.array([intercept, slope])
# 一元线性回归示例
X = np.array([[1, 1], [1, 2], [1, 3], [1, 4], [1, 5]])
y = np.array([2.1, 4.0, 5.8, 8.2, 9.9])
beta = least_squares_numpy(X, y)
print(f"结果: 截距={beta[0]:.4f}, 斜率={beta[1]:.4f}")
技巧:使用 NumPy 内置函数
在实际应用中,直接使用 NumPy 的 np.linalg.lstsq() 是最推荐的做法,它使用了数值稳定性更好的 SVD 分解:
import numpy as np
def least_squares_lstsq(X, y):
"""
使用 NumPy lstsq 实现最小二乘法(推荐方式)
优势:
- 数值稳定(使用 SVD 分解)
- 处理奇异矩阵(返回最小范数解)
- 可处理超定和欠定系统
"""
beta, residuals, rank, s = np.linalg.lstsq(X, y, rcond=None)
return beta
# 对比测试
X = np.array([[1, 1], [1, 2], [1, 3], [1, 4], [1, 5]])
y = np.array([2.1, 4.0, 5.8, 8.2, 9.9])
beta = least_squares_lstsq(X, y)
print(f"系数: {beta}")
print(f"残差平方和: {np.sum((y - X @ beta) ** 2):.6f}")
六、最小二乘法的局限性与改进
局限性一:病态矩阵问题
当 𝐗ᵀ 𝐗 的特征值差异很大时,矩阵是病态的(ill-conditioned)。即使 𝐗 中的数据有微小的测量误差,求解出的 β̂ 也可能产生巨大偏差。
局限性二:过拟合风险
当特征数量接近或超过样本数量时,最小二乘法容易过拟合,模型在训练数据上表现很好,但在新数据上泛化能力差。
局限性三:异方差问题
当误差项的方差不是常数(即异方差)时,最小二乘估计虽然无偏,但不再是方差最小的最优估计。
改进一:岭回归(Ridge Regression)
在正规方程中加入 L2 正则化项:
(𝐗ᵀ 𝐗 + λ 𝐈) β = 𝐗ᵀ 𝐲
正则化项 λ 𝐈 改善了矩阵的条件数,使求逆更加稳定。
import numpy as np
def ridge_regression(X, y, lambda_reg):
"""
岭回归实现
解决病态矩阵和过拟合问题
"""
n_features = X.shape[1]
# 正规方程 + L2 正则化
XtX = X.T @ X + lambda_reg * np.eye(n_features)
Xty = X.T @ y
beta = np.linalg.solve(XtX, Xty)
return beta
# 示例:高相关特征
X = np.array([[1, 1.01], [1, 1.99], [1, 3.02], [1, 4.01], [1, 5.0]])
y = np.array([2.1, 4.0, 5.8, 8.2, 9.9])
# 普通最小二乘(病态)
beta_ls = np.linalg.solve(X.T @ X, X.T @ y)
# 岭回归(正则化)
beta_ridge = ridge_regression(X, y, lambda_reg=0.1)
print(f"普通最小二乘: {beta_ls}")
print(f"岭回归: {beta_ridge}")
改进二:加权最小二乘法(WLS)
对于异方差问题,给每个观测赋予不同的权重:
β̂ = (𝐗ᵀ 𝐖 𝐗)⁻¹ 𝐗ᵀ 𝐖 𝐲
其中 𝐖 是对角权重矩阵。
七、高斯-马尔可夫定理
What — 高斯-马尔可夫定理的内容
高斯-马尔可夫定理(Gauss-Markov Theorem)是最小二乘法的理论基础。它指出:在满足以下假设的情况下,最小二乘估计是线性无偏估计中方差最小的(Best Linear Unbiased Estimator, BLUE):
高斯-马尔可夫假设
- 线性于参数:𝐲 = 𝐗 β + ε
- 随机抽样:观测值相互独立
- 条件均值为零:E(ε | 𝐗) = 0
- 同方差:Var(ε | 𝐗) = σ² 𝐈
- 无完全多重共线性:𝐗 列满秩
高斯-马尔可夫定理总结
在上述假设成立时,最小二乘估计 β̂ = (𝐗ᵀ 𝐗)⁻¹ 𝐗ᵀ 𝐲 具有以下性质:
- 线性(Linear):β̂ 是 𝐲 的线性函数
- 无偏(Unbiased):E(β̂) = β
- 方差最小(Best):在所有线性无偏估计中方差最小
这就是 BLUE(Best Linear Unbiased Estimator)的含义。
FAQ 常见问题解答
Q1. 最小二乘法只能用于线性回归吗?
不是。最小二乘法可以应用于任何形式的模型,只要模型对参数是线性的。对于非线性模型(如多项式回归、对数回归),仍然可以使用最小二乘法,只是需要通过迭代优化来求解。
Q2. 最小二乘法和最大似然估计有什么区别?
本质相同。当误差服从正态分布时,最小二乘估计和最大似然估计(MLE)是等价的。最大似然估计从概率角度出发,最小二乘估计从几何角度出发。
Q3. 什么时候应该用最小二乘法而不是梯度下降?
数据量较小且矩阵可逆时。对于小规模问题(样本数 < 10,000),直接求解正规方程通常比迭代方法更快。当数据量很大或矩阵病态时,梯度下降更合适。
Q4. 如何判断最小二乘模型是否合适?
看残差分析。检查残差是否符合假设:均值接近零、同方差、无自相关。如果违反假设,需要考虑加权最小二乘法或使用其他回归方法。
Q5. 最小二乘法对异常值敏感吗?
非常敏感。因为平方项会放大大误差的影响。一个极端异常值可能导致整个拟合结果偏离。可以使用鲁棒回归(如 Huber 回归)来降低异常值的影响。
Q6. 正规方程和梯度下降哪个更常用?
取决于场景。在教学中,正规方程更常见,因为可以给出解析解。在工业界,梯度下降(尤其是随机梯度下降)更常用,因为它可以处理大规模数据并且内存效率更高。
Q7. 为什么要对特征做标准化?
防止数值问题和加速收敛。特征尺度差异大时,𝐗ᵀ 𝐗 的条件数会很差,求解不稳定。使用标准化可以改善条件数,使数值计算更稳定。
Q8. 最小二乘法的计算复杂度是多少?
O(n · p² + p³)。其中 n 是样本数,p 是特征数。计算 𝐗ᵀ 𝐗 需要 O(n · p²),求逆需要 O(p³)。
Q9. 什么是伪逆?什么时候使用?
Moore-Penrose 伪逆。当 𝐗 不是列满秩时,(𝐗ᵀ 𝐗)⁻¹ 不存在,此时使用伪逆 𝐗⁺ = (𝐗ᵀ 𝐗)⁻¹ 𝐗ᵀ 可以得到最小范数解。
Q10. 最小二乘法和 Lasso 回归有什么区别?
正则化方式不同。最小二乘法没有正则化,Lasso 使用 L1 正则化会产生稀疏解(部分系数为零),适合特征选择。岭回归使用 L2 正则化,系数收缩但不为零。
Q11. 如何处理多重共线性问题?
三种常用方法。① 使用岭回归添加 L2 正则化;② 使用主成分回归(PCR)降维;③ 使用偏最小二乘(PLS)回归。
Q12. 最小二乘法要求误差正态分布吗?
不是必要条件。误差正态分布是使得最小二乘估计也是最大似然估计的必要条件,但高斯-马尔可夫定理只要求误差同方差、无自相关、不相关于特征即可。
Q13. 过拟合和欠拟合的区别是什么?
过拟合是模型在训练数据上表现太好,在新数据上表现差;欠拟合是模型在训练数据和新数据上都表现不好。可以通过增加正则化或减少特征来解决过拟合。
Q14. 残差和误差项有什么区别?
残差是观测值与拟合值的差(可观测),误差项是真实值与期望值的差(不可观测)。残差是误差项的估计。
Q15. 什么是 R² 决定系数?
R² = 1 - SS_res / SS_tot。表示模型解释的方差占总方差的比例。SS_res 是残差平方和,SS_tot 是总平方和。R² 越接近 1,模型拟合越好。
Q16. 调整 R² 和普通 R² 有什么区别?
调整 R² 考虑了特征数量的惩罚。普通 R² 会随着特征增加而增加(即使特征无用),调整 R² 在特征无用时会降低,更适合模型选择。
Q17. 最小二乘法可以用于分类问题吗?
可以但不推荐。可以用最小二乘法拟合分类标签(如 Fisher 线性判别),但 logistic 回归在分类问题上更常用,因为它输出概率且对异常值更鲁棒。
Q18. 什么是奇异值分解(SVD)?为什么用它解最小二乘?
SVD 是矩阵分解方法。任何矩阵都可以分解为 𝐗 = 𝐔 Σ 𝐕ᵀ,最小二乘解为 β̂ = 𝐕 Σ⁻¹ 𝐔ᵀ 𝐲。SVD 的优势是数值稳定且能处理奇异矩阵。
Q19. 如何选择正则化参数 λ?
常用交叉验证。通过 K 折交叉验证,尝试不同的 λ 值,选择使验证集误差最小的 λ。λ 太大导致欠拟合,太小则正则化效果不明显。
Q20. 最小二乘法的最新发展是什么?
分布式和在线学习。对于超大规模数据,分布式最小二乘法(如 ADMM 算法)和在线最小二乘法(递归最小二乘法)成为研究热点。
本文核心知识点回顾
- 1 个目标:最小化残差平方和 RSS
- 2 种形式:一元线性回归的解析解 + 多元线性回归的正规方程
- 3 个假设:线性、同方差、无自相关
- 4 种改进:岭回归、Lasso、弹性网、加权最小二乘
- 5 个性质:线性、无偏、方差最小(BLUE)
Roadmap 后续预告
在理解了最小二乘法之后,下一篇我们将学习梯度下降算法。梯度下降是优化领域最基础也是最重要的算法,它不仅是训练神经网络的核心方法,也是求解大规模最小二乘问题的利器。我们将深入探讨:
- 梯度下降的数学原理与几何直觉
- 批量梯度下降、随机梯度下降、小批量梯度下降的区别
- 学习率衰减与自适应学习率方法
- 梯度下降与最小二乘法的联系与区别

浙公网安备 33010602011771号