谢岗镇仿做网站,新丝路网站建设,境外网站服务器,网站建设梦幻创意引言在之前的文章《最小二乘问题详解4#xff1a;非线性最小二乘》、《最小二乘问题详解5#xff1a;非线性最小二乘求解实例》和《最小二乘问题详解6#xff1a;梯度下降法》中分别介绍了使用Gauss-Newton方法#xff08;简称GN方法#xff09;和梯度下降法求解最小二乘问…引言在之前的文章《最小二乘问题详解4非线性最小二乘》、《最小二乘问题详解5非线性最小二乘求解实例》和《最小二乘问题详解6梯度下降法》中分别介绍了使用Gauss-Newton方法简称GN方法和梯度下降法求解最小二乘问题之后让我们插入另一个基础知识正则化最小二乘Regularized Least Squares也就是大家常说的岭估计Ridge Estimator因为接下来要介绍的 Levenberg-Marquardt方法会用到这个思想。本文讨论的岭估计在机器学习中也常称为岭回归Ridge Regression2. 问题复习《最小二乘问题详解2线性最小二乘求解》中讨论的标准线性最小二乘问题minθ∥Aθ−b∥2其解为正规方程ATAθATb的解。当A列满秩时解唯一且为θ∗(ATA)−1ATb然而在实际应用中直接使用这个解可能会遇到一些问题。矩阵病态Ill-conditioning矩阵ATA的条件数可能非常大。这意味着即使数据b中有微小的扰动也会导致解θ∗发生剧烈变化数值不稳定。条件数大的一个常见原因是特征之间高度相关多重共线性此时ATA接近奇异逆矩阵难以精确计算。过拟合Overfitting当模型参数过多或特征维度很高时标准最小二乘倾向于拟合训练数据中的噪声导致泛化能力差。解θ∗的模长范数可能非常大表示模型对某些特征赋予了不合理的高权重。秩亏Rank Deficiency若A不是列满秩即rank(A)n则ATA是奇异的无法求逆正规方程有无穷多解。矩阵的病态问题详见6.1节。为了解决这些问题我们引入正则化Regularization——通过在目标函数中加入一个额外的惩罚项来“约束”解的行为使其更稳定、更平滑并避免过拟合。其实正则化是一个通用的数学和机器学习思想在优化问题中通过向目标函数添加一个额外的“惩罚项”penalty term来引导解具有某种期望的性质比如平滑性、稀疏性、小范数、结构简单等从而提高模型的稳定性、泛化能力或可解释性。3. 定义最常用的正则化方法之一是Tikhonov 正则化其核心思想是在原始的残差平方和基础上加上一个关于参数θ的L2范数平方的惩罚项minθ(∥Aθ−b∥2λ∥θ∥2)其中∥Aθ−b∥2是数据拟合项data fidelity term衡量模型对数据的拟合程度。∥θ∥2θTθ是正则化项regularization term也叫 Tikhonov 项它惩罚较大的参数值。λ0是正则化参数regularization parameter控制正则化的强度λ→0正则化作用消失退化为标准最小二乘。λ→∞正则化主导迫使θ→0模型趋于常数零。直观理解就是通过加入正则项不仅要保证预测误差小还要保证模型参数不要太大。这相当于在“拟合数据”和“保持模型简单”之间做权衡。4. 求解将目标函数展开f(θ)(Aθ−b)T(Aθ−b)λθTθθTATAθ−2bTAθbTbλθTθ对θ求梯度并令其为零∇θf(θ)2ATAθ−2ATb2λθ0整理得(ATAλI)θATb这就是岭估计的正规方程。由于λ0矩阵ATA是半正定的而λI是正定的因此ATAλI是严格正定的从而总是可逆的无论A是否列满秩于是岭估计的闭式解为θ∗ridge(ATAλI)−1ATb可见岭估计只是在ATA的对角线上加了一个小量λ这相当于“抬升”了所有特征值使得原本接近零的特征值变得远离零从而显著改善了矩阵的条件数提高了数值稳定性。关于正定矩阵的问题详见6.2节。从几何角度看标准最小二乘是寻找使Aθ投影最接近b的点而岭估计则在此基础上“收缩”参数空间使θ向零靠近。这可以理解为给θ的空间加上一个“弹簧”防止参数跑得太远。5. 分解虽然有了闭式解但在实际数值计算中仍然不推荐直接计算(ATAλI)−1因为ATA可能病态显式构造ATA会损失精度。5.1 QR分解将正则化最小二乘问题转化为一个更大的最小二乘问题minθ∥∥∥[A√λI]θ−[b0]∥∥∥2∥Aθ−b∥2λ∥θ∥2这是一个标准的最小二乘问题可以用 QR 分解高效求解。令~A[A√λI],~b[b0]对~A做QR分解~A~Q~R则解为θ∗ridge~R−1~QT1b其中~Q1是~Q的前m行对应A部分。5.2 SVD分解设AUΣVT是A的 SVD。代入岭估计的闭式解θ∗ridge(VΣTUTUΣVTλI)−1VΣTUTb(V(ΣTΣλI)VT)−1VΣTUTb利用VTVI得θ∗ridgeV(ΣTΣλI)−1VTVΣTUTbV(ΣTΣλI)−1ΣTUTb记ΣTΣdiag(σ21,…,σ2n)则θ∗ridgeV⎡⎢⎢⎢⎢⎣σ1σ21λ⋱σnσ2nλ⎤⎥⎥⎥⎥⎦UTb即θ∗ridger∑i1σiσ2iλ(uTib)vi对比标准最小二乘解SVD 形式θ∗r∑i11σi(uTib)vi可见岭估计通过因子σiσ2iλ对小奇异值方向进行了压制。当σi→0时标准解会爆炸1/σi→∞但岭估计中该项趋于 0从而避免了对噪声方向的过度放大。6. 补充有一些《线性代数》、《矩阵论》相关的知识笔者也忘记了这里就总结一下。如果有的读者很熟悉可以直接略过。6.1 病态矩阵病态矩阵指的是矩阵条件数Condition Number很大的矩阵。矩阵病态会导致输入数据的微小扰动如b或A的舍入误差线性方程组Aθb解就会剧烈变化。换句话说系统对噪声极度敏感数值计算中结果不可靠。对于一个可逆矩阵A∈Rn×n其谱条件数Spectral Condition Number定义为κ(A)σmax(A)σmin(A)其中σmax(A)是A的最大奇异值σmin(A)是A的最小奇异值。注意这个定义也适用于非方阵A∈Rm×nm≥n只要A列满秩。条件数κ(A)的含义如下κ(A)≈1良态解非常稳定κ(A)102良态102≤κ(A)106中等病态κ(A)≥106严重病态浮点计算可能完全失效κ(A)1014双精度浮点数约16位有效数字完全失效任何实矩阵A∈Rm×n都可以进行奇异值分解SVDAUΣVT其中U∈Rm×m是左奇异向量矩阵正交V∈Rn×n是右奇异向量矩阵正交Σ∈Rm×n是对角矩阵对角线元素为奇异值(Singular Value)σ1≥σ2≥⋯≥σr≥0rmin(m,n)。奇异值表示矩阵A在各个正交方向上的“拉伸”程度。如果σmin→0说明A把某个方向“压扁”了接近奇异也就是矩阵病态。6.2 正定矩阵设A∈Rn×n是一个实对称矩阵即AAT我们有如下定义如果对所有非零向量x∈Rn,x≠0都有xTAx0则称A是正定矩阵。如果对所有非零向量x∈Rn,x≠0都有xTAx≥0则称A是半正定矩阵。对于实对称矩阵A我们可以进行谱分解特征值分解AQΛQT其中Q是正交矩阵列是特征向量Λdiag(λ1,…,λn)是对角矩阵对角元素是特征值。那么A正定⟺所有特征值λi0A半正定⟺所有特征值λi≥0既然正定矩阵的所有特征值都 大于零那么意味着正定矩阵是满秩也就是正定矩阵一定可逆。回到岭估计中的ATAλIATA是半正定的因为对任意x有xTATAx∥Ax∥2≥0所以它的所有特征值≥0加上λI其中λ0后新矩阵是ATAλI它的特征值变为原来的每个特征值λi变成λiλ原来最小可能是 0现在最小是λ0所以所有特征值0⇒ 正定 ⇒ 可逆因此(ATAλI)−1总是存在的无论A是否列满秩。这正是岭估计的精髓所在通过加一个小的正数λ到对角线上把原本可能奇异不可逆的ATA“修复”成一个严格正定、可逆的矩阵从而保证了解的唯一性和数值稳定性。7. 实例如果线性最小二乘问题的设计矩阵A接近线性相关那么普通方法求得的解不稳定可以使用岭估计来给出稳定解。代码实现如下#include Eigen/Dense#include iostream#include random#include vectorusing namespace Eigen;using namespace std;int main() {// 设置随机数生成器default_random_engine gen;normal_distributiondouble noise(0.0, 0.5); // 噪声 ~ N(0, 0.5)// 数据生成y x1 x2 0.1*x3 noise// 但 x3 ≈ x1 x2 高度相关造成病态int n_samples 20;int n_features 3;MatrixXd A(n_samples, n_features);VectorXd b(n_samples);for (int i 0; i n_samples; i) {double x1 (double)rand() / RAND_MAX * 10;double x2 (double)rand() / RAND_MAX * 10;double x3 x1 x2 (double)rand() / RAND_MAX * 0.1; // x3 ≈ x1 x2A(i, 0) x1;A(i, 1) x2;A(i, 2) x3;double true_y 1.0 * x1 1.0 * x2 0.1 * x3;b(i) true_y noise(gen); // 加噪声}//使用 SVD 计算条件数BDCSVDMatrixXd svd(A, ComputeThinU | ComputeThinV);cout Condition number of A: svd.singularValues()(0) / svd.singularValues()(2) endl; // 假设 3 个奇异值// 普通最小二乘解theta (A^T A)^{-1} A^T bVectorXd theta_ols A.bdcSvd(ComputeThinU | ComputeThinV).solve(b);// 岭回归解theta (A^T A λI)^{-1} A^T bMatrixXd AtA A.transpose() * A;VectorXd Atb A.transpose() * b;double lambda 0.01;MatrixXd ridge_matrix AtA lambda * MatrixXd::Identity(n_features, n_features);VectorXd theta_ridge ridge_matrix.ldlt().solve(Atb);// 输出结果cout True weights: [1.0, 1.0, 0.1] endl;cout OLS weights: theta_ols.transpose() endl;cout Ridge weights: theta_ridge.transpose() endl;return 0;}这里可以看到我们使第三个已知参数向量可以用第一个已知参数向量和第二个已知参数向量接近线性表示x3≈x1x2那么设计矩阵就接近线性相关这个设计矩阵就是病态的。分别用普通最小二乘求解和岭估计来求解最后结果如下Condition number of A: 715.286True weights: [1.0, 1.0, 0.1]OLS weights: 2.00569 2.03977 -0.938346Ridge weights: 1.02399 1.05935 0.038262理论上来说使用QR/SVD方法可以一定程度上解决矩阵的病态问题。但是从这个实例结果可以看到即使使用最稳健的 SVD 方法求解普通最小二乘参数估计仍严重偏离真实值。这是因为问题本身的结构特征高度相关导致参数不可识别。相比之下岭估计通过引入正则化项λI显著改善了矩阵的条件数给出了稳定且接近真实的参数估计。岭估计通过牺牲一定的精度提升模型的泛化能力保证在噪声存在下仍能稳定预测。岭估计的另外一个问题是正则化参数λ不太好进行给定往往需要一些先验经验的辅助才能确定有机会再进一步进行讨论了。