1. 问题背景:正规方程法的数学困境
在机器学习线性回归问题中,正规方程法(Normal Equation)是一种经典的解析解法。其核心公式为:
θ = (XᵀX)⁻¹Xᵀy
理论上,这个解法需要计算特征矩阵X的转置与自身乘积的逆矩阵。但实际使用scikit-learn时,我们会发现即使(XᵀX)不可逆(即奇异矩阵),程序依然能够输出计算结果,这似乎违背了线性代数基本原理。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 不可逆矩阵的成因分析
2.1 线性代数视角的不可逆条件
矩阵不可逆的常见情况包括:
- 特征之间存在严格线性关系(完全共线性)
- 特征数量超过样本数量(n > m)
- 存在全零特征列
例如以下特征矩阵:
python复制X = [[1, 2, 3],
[1, 2, 3],
[1, 2, 3]] # 第二列和第三列完全线性相关
2.2 实际数据中的常见场景
在真实数据集中,严格不可逆的情况较少,但接近奇异的矩阵很常见:
- 测量不同单位的同一物理量(如"温度(℃)"和"温度(℉)")
- 衍生特征与原特征高度相关(如"年龄"和"工龄")
- 稀疏特征中的零值列
3. sklearn的解决方案解析
3.1 伪逆矩阵(Moore-Penrose Pseudoinverse)
当(XᵀX)不可逆时,sklearn默认使用np.linalg.pinv计算伪逆矩阵。伪逆的性质:
- 对于可逆矩阵:pinv(A) = A⁻¹
- 对于不可逆矩阵:返回具有最小范数的最小二乘解
数学表达式:
θ = X⁺y (其中X⁺表示X的伪逆)
3.2 数值稳定性处理
即使矩阵理论可逆,计算机浮点运算也可能导致数值不稳定。sklearn采用以下策略:
- 自动添加微小扰动(λ≈1e-10)实现正则化:
(XᵀX + λI)⁻¹ - 使用SVD分解代替直接求逆:
X = UΣVᵀ ⇒ X⁺ = VΣ⁺Uᵀ
4. 代码实现验证
4.1 不可逆矩阵的模拟实验
python复制import numpy as np
from sklearn.linear_model import LinearRegression
# 构造不可逆矩阵
X = np.array([[1,
