
最小二乘问题详解目录1. 引言什么是最小二乘问题最小二乘问题是数学与工程领域中一种经典的优化方法其核心思想是通过最小化误差的平方和来寻找数据的最佳函数匹配。从高斯1809年首次用于天体轨道计算到今天机器学习中无处不在的损失函数最小二乘已成为数据拟合、参数估计和信号处理的基础工具。最小二乘问题的通用形式为[\min_{\mathbf{x}} | \mathbf{Ax} - \mathbf{b} |2^2]其中(\mathbf{A} \in \mathbb{R}^{m \times n}) 为数据矩阵(\mathbf{x} \in \mathbb{R}^n) 为待求参数(\mathbf{b} \in \mathbb{R}^m) 为观测值。当 (m n) 时超定系统不存在精确解因此我们寻找使残差平方和最小的解。## 2. 最小二乘的数学原理### 2.1 从几何角度理解最小二乘的几何意义是将向量 (\mathbf{b}) 投影到矩阵 (\mathbf{A}) 的列空间上。最优解 (\mathbf{x}^) 满足[\mathbf{A}^T \mathbf{A} \mathbf{x}^ \mathbf{A}^T \mathbf{b}]这就是著名的正规方程。当 (\mathbf{A}^T \mathbf{A}) 可逆时解为[\mathbf{x}^* (\mathbf{A}^T \mathbf{A})^{-1} \mathbf{A}^T \mathbf{b}]### 2.2 条件数与数值稳定性直接求解正规方程在条件数大时数值不稳定。(\mathbf{A}^T \mathbf{A}) 的条件数是原矩阵 (\mathbf{A}) 条件数的平方因此当 (\mathbf{A}) 病态时正规方程法会放大误差。更稳定的方法包括QR分解和奇异值分解SVD。## 3. 最小二乘的数值解法### 3.1 正规方程法直接法适用于小规模、良态问题。计算简单但数值稳定性差。### 3.2 QR分解法将 (\mathbf{A}) 分解为 (\mathbf{A} \mathbf{QR})其中 (\mathbf{Q}) 为正交矩阵(\mathbf{R}) 为上三角矩阵。则正规方程变为[\mathbf{Rx} \mathbf{Q}^T \mathbf{b}]通过回代即可求解。QR分解比正规方程更稳定复杂度为 (O(mn^2))。### 3.3 SVD分解法将 (\mathbf{A}) 分解为 (\mathbf{A} \mathbf{U} \mathbf{\Sigma} \mathbf{V}T)则解为[\mathbf{x}* \mathbf{V} \mathbf{\Sigma}^ \mathbf{U}^T \mathbf{b}]其中 (\mathbf{\Sigma}^) 是伪逆。SVD适用于严重病态或秩亏问题但计算开销最大。## 4. 代码示例多项式拟合与数值稳定性### 4.1 基础线性最小二乘拟合pythonimport numpy as npimport matplotlib.pyplot as plt# 生成带噪声的二次函数数据np.random.seed(42)x np.linspace(0, 10, 20)true_coeffs [2.5, -1.3, 0.8] # 真实参数: 2.5x^2 - 1.3x 0.8y_true np.polyval(true_coeffs, x)y_noisy y_true np.random.normal(0, 2, sizex.shape) # 添加高斯噪声# 构建设计矩阵 (多项式拟合最高次n2)A np.vstack([x**2, x, np.ones_like(x)]).T # 每一列对应一个基函数# 方法1: 正规方程求解ATA A.T AATb A.T y_noisyx_normal np.linalg.solve(ATA, ATb) # 解线性方程组# 方法2: 使用numpy内置的lstsq (基于SVD)x_lstsq, residuals, rank, s np.linalg.lstsq(A, y_noisy, rcondNone)# 打印结果对比print(真实参数: , true_coeffs)print(正规方程解: , x_normal)print(lstsq解 (SVD): , x_lstsq)# 绘制拟合曲线x_plot np.linspace(0, 10, 100)y_fit_normal np.polyval(x_normal, x_plot)y_fit_lstsq np.polyval(x_lstsq, x_plot)plt.scatter(x, y_noisy, labelNoisy data, colorgray)plt.plot(x_plot, np.polyval(true_coeffs, x_plot), k--, labelTrue curve)plt.plot(x_plot, y_fit_normal, r-, labelNormal eq fit)plt.plot(x_plot, y_fit_lstsq, g:, labelSVD fit)plt.legend()plt.xlabel(x)plt.ylabel(y)plt.title(Polynomial Fit Comparison)plt.show()输出说明该代码展示了两种方法对二次多项式的拟合结果。通常两者在良态时结果一致但在病态条件下例如高次多项式或数据点密集会显示出差异。### 4.2 病态问题的数值稳定性对比pythonimport numpy as npimport matplotlib.pyplot as plt# 构造病态问题接近重复的列np.random.seed(0)m, n 10, 5A np.random.randn(m, n)# 让第4列近似等于第2列造成病态A[:, 3] A[:, 1] 1e-8 * np.random.randn(m)b np.random.randn(m)# 方法1: 正规方程法try: x_normal np.linalg.solve(A.T A, A.T b) residual_normal np.linalg.norm(A x_normal - b) print(正规方程法残差:, residual_normal)except np.linalg.LinAlgError: print(正规方程法失败矩阵奇异)# 方法2: QR分解法Q, R np.linalg.qr(A)x_qr np.linalg.solve(R, Q.T b) # 注意R是上三角residual_qr np.linalg.norm(A x_qr - b)print(QR分解法残差:, residual_qr)# 方法3: SVD法U, s, Vt np.linalg.svd(A, full_matricesFalse)# 计算伪逆解s_inv np.diag(1.0 / s)x_svd Vt.T s_inv U.T bresidual_svd np.linalg.norm(A x_svd - b)print(SVD法残差:, residual_svd)# 比较解的稳定性print(\n解的范数:)print(正规方程解范数:, np.linalg.norm(x_normal) if x_normal in dir() else N/A)print(QR分解解范数:, np.linalg.norm(x_qr))print(SVD解范数:, np.linalg.norm(x_svd))输出分析当矩阵病态时正规方程的解可能严重偏离真实解解范数很大而QR和SVD方法能提供更稳定的结果。SVD通过截断小奇异值可以进一步提升稳定性。## 5. 最小二乘的扩展与应用### 5.1 加权最小二乘当观测值的噪声方差不同时引入权重矩阵 (\mathbf{W})[\min{\mathbf{x}} (\mathbf{Ax} - \mathbf{b})^T \mathbf{W} (\mathbf{Ax} - \mathbf{b})]解为(\mathbf{x}^* (\mathbf{A}^T \mathbf{W} \mathbf{A})^{-1} \mathbf{A}^T \mathbf{W} \mathbf{b})。这在异方差回归中非常有用。### 5.2 正则化最小二乘为解决过拟合添加L2正则项岭回归[\min_{\mathbf{x}} | \mathbf{Ax} - \mathbf{b} |_2^2 \lambda | \mathbf{x} |_22]解为(\mathbf{x}* (\mathbf{A}^T \mathbf{A} \lambda \mathbf{I})^{-1} \mathbf{A}^T \mathbf{b})。L1正则化则对应LASSO可产生稀疏解。### 5.3 非线性最小二乘对于非线性模型 (y f(x, \theta))使用高斯-牛顿法或Levenberg-Marquardt算法迭代求解。每次迭代将非线性函数线性化求解线性最小二乘子问题。## 6. 实战线性回归中的最小二乘在机器学习中线性回归的损失函数正是最小二乘形式pythonfrom sklearn.linear_model import LinearRegressionimport numpy as np# 生成数据X np.random.rand(100, 3) # 100个样本3个特征true_theta np.array([1.5, -2.0, 0.8])y X true_theta np.random.normal(0, 0.5, 100)# 使用sklearn的线性回归内部使用最小二乘model LinearRegression()model.fit(X, y)print(真实参数:, true_theta)print(估计参数:, model.coef_)print(截距项:, model.intercept_)## 7. 总结最小二乘问题不仅是数值线性代数的核心更是连接理论数学与工程应用的桥梁。从正规方程到QR分解再到SVD每一步都体现了对数值稳定性和计算效率的权衡。在实际应用中选择合适的方法取决于问题的规模、矩阵条件数以及对精度的要求。对于病态问题优先考虑QR或SVD对于大规模稀疏问题则可能需要迭代法如共轭梯度法。掌握最小二乘的原理与实现是深入理解现代数据科学和优化理论的关键一步。