线性回归数学推导:从最小二乘到梯度下降与正规方程

发布时间:2026/7/21 3:30:18
线性回归数学推导:从最小二乘到梯度下降与正规方程 1. 项目概述从零推导线性回归的数学内核你打开任何一本机器学习入门书第一页几乎必然出现线性回归。它看起来简单得近乎朴素一条直线几个点一个“最小二乘”的说法。但正是这条看似平直的线撑起了整个现代统计建模与深度学习的底层逻辑骨架。我带过十几届数据科学训练营每次讲到线性回归总有人在课后追着问“老师为什么非得用平方误差为什么梯度下降要除以样本数那个正规方程里的转置乘积到底在几何上代表什么”——这些问题的答案不在调包文档里而在一行行手写的推导中。这篇内容就是为你把教科书里被省略的“中间步骤”全部补全。它不讲如何用sklearn.LinearRegression().fit()而是带你亲手拿起纸笔从最原始的误差定义出发一步步推导出预测函数、损失函数、梯度表达式最终抵达两种参数求解路径迭代优化的梯度下降法以及一步到位的解析解正规方程。无论你是刚学完微积分的本科生还是想夯实基础的转行工程师只要你愿意跟着算一遍就能真正理解为什么线性回归是“可解释性”的黄金标准为什么它的解在数学上是唯一且稳定的以及为什么所有更复杂的模型本质上都在努力模仿这条直线所揭示的“关系本质”。这不是对公式的复述而是一次对建模思维的溯源。2. 核心思路拆解为什么选择最小二乘与梯度下降2.1 建模目标的本质寻找最优映射关系线性回归要解决的根本问题不是画一条“看起来差不多”的线而是找到一个确定的数学规则让这个规则对新数据的预测结果尽可能接近真实值。这个“尽可能接近”必须量化。我们不能说“差不多”而要说“平均误差小到多少”。这就引出了**损失函数Loss Function**的概念——它是衡量模型当前表现好坏的标尺。没有这个标尺优化就无从谈起。在众多可能的标尺中均方误差Mean Squared Error, MSE成为线性回归的默认选择这绝非偶然。它的核心优势在于三点第一可微性。MSE是一个关于模型参数的二次函数其导数梯度存在且连续这为后续使用微积分工具进行优化铺平了道路。第二惩罚力度合理。对误差取平方意味着大误差会被显著放大例如误差为2和误差为4其平方分别为4和16这迫使模型必须同时关注所有样本而非只拟合大部分小误差点而忽略少数离群点。第三统计学根基坚实。当模型的预测误差服从独立同分布的高斯正态分布时最小化MSE等价于最大化数据的似然函数Maximum Likelihood Estimation, MLE。这意味着我们找到的那条“最优直线”恰恰是让观测到当前这批数据的可能性最大的那条线。这是一种深刻的、基于概率的合理性保证远超“看起来顺眼”的直观感受。2.2 优化策略的双轨制迭代逼近 vs. 解析求解有了MSE这个标尺下一步就是“怎么调参数才能让标尺读数变小”。这里出现了两条截然不同但殊途同归的路径。第一条是梯度下降Gradient Descent它模拟了一个人在浓雾中下山的过程你看不见整座山的形状即无法直接写出全局最小值的表达式但你能感觉到脚下坡度最陡的方向即计算梯度然后朝着这个方向迈出一小步即更新参数再重新感觉坡度如此反复最终抵达谷底。它的优点是通用性强可以套用在几乎所有可微的损失函数上是神经网络等复杂模型的基石。缺点是需要手动设置学习率步长步子太大容易 overshoot步子太小收敛又太慢且需要多次迭代。第二条是正规方程Normal Equation它是一次性求解的“解析法”。它不依赖于迭代而是利用微积分的基本原理函数在极值点处其一阶导数梯度必然为零。因此我们直接令MSE对参数的梯度等于零解这个方程组就能得到参数的精确解。它的优点是精准、快速对于中小规模数据、无需调参。缺点是当特征维度D非常高时计算矩阵的逆(X^T X)^{-1}会变得极其耗时甚至数值不稳定。这两种方法并非对立而是互补。理解梯度下降让你掌握现代AI的通用引擎理解正规方程则让你看清线性模型内在的几何与代数结构。接下来的推导我们将并行展开这两条路径让你看到同一目标下的两种智慧。2.3 符号体系的统一与物理意义在开始推导前必须建立一套清晰、无歧义的符号系统。这不仅是数学严谨性的要求更是避免后续推导中张量维度混乱的防火墙。我们约定数据集记为一个n × (d1)的矩阵X。其中n是样本数量行数d是原始特征的数量。为了将截距项bias/intercept也纳入统一的向量运算中我们在每个样本的特征向量前添加一个恒为1的元素。因此X的第一列全为1后面d列才是原始特征x_1, x_2, ..., x_d。标签向量记为一个n × 1的列向量y其第i个元素y_i就是第i个样本的真实输出值。参数向量记为一个(d1) × 1的列向量w有时也写作θ其第一个元素w_0就是截距项b后面d个元素w_1, w_2, ..., w_d对应各个特征的权重。预测向量记为ŷ Xw这是一个n × 1的列向量其第i个元素ŷ_i就是模型对第i个样本的预测值。这个符号体系的关键在于它将整个数据集的预测过程压缩成一个简洁的矩阵乘法Xw。这不仅极大地简化了公式书写更重要的是它揭示了线性回归的本质预测就是将输入数据X在参数向量w所定义的方向上进行投影。w就像一个“滤镜”Xw就是数据通过这个滤镜后得到的“影子”。我们的任务就是旋转、拉伸这个滤镜让它的影子ŷ尽可能地贴合真实的轮廓y。这种几何视角是贯穿所有后续推导的灵魂。3. 核心细节解析与实操要点从单点误差到全局损失3.1 单样本误差的定义与平方化动机一切推导的起点必然是对“误差”最朴素的定义。对于第i个样本其真实值为y_i模型预测值为ŷ_i。那么最直接的误差定义就是它们的差值e_i y_i - ŷ_i这个定义本身没有任何问题但它有一个致命的缺陷符号不确定性。如果y_i ŷ_i误差为正如果y_i ŷ_i误差为负。当我们把所有n个样本的误差e_1, e_2, ..., e_n加起来求平均时正负误差会相互抵消。例如一个样本预测高了10另一个样本预测低了10它们的误差和为0但这显然不能说明模型完美。因此我们必须设计一种能“放大”误差、并使其始终为正的度量方式。最常用、也最自然的方法就是取绝对值或平方。取绝对值MAE, Mean Absolute Error虽然直观但其在零点不可导这给后续的微分优化带来了巨大障碍。而取平方则完美规避了这个问题。于是我们定义**单样本的平方误差Squared Error**为SE_i (y_i - ŷ_i)^2这个表达式有两个核心作用第一它确保了所有误差贡献都是非负的消除了正负抵消第二它赋予了大误差以更高的“话语权”促使模型优先修正那些预测偏差巨大的点。你可以把它想象成一个“严厉的监工”对小错误睁一只眼闭一只眼但对大错误绝不姑息。3.2 全局损失函数的构建从求和到均值有了单样本的平方误差我们就可以定义整个数据集的“总误差”。最直接的想法就是把所有n个样本的SE_i加起来SSE Σ_{i1 to n} (y_i - ŷ_i)^2其中SSE代表 Sum of Squared Errors平方误差和。然而SSE有一个明显的缺点它的数值大小强烈依赖于样本数量n。一个包含1000个样本的数据集其SSE天然就比一个只有10个样本的数据集大得多这使得我们无法用SSE来公平地比较不同规模数据集上模型的好坏。为了解决这个问题我们引入均值的概念将总误差“摊薄”到每一个样本上从而得到一个与数据集规模无关的、更具可比性的指标——均方误差MSEMSE (1/n) * Σ_{i1 to n} (y_i - ŷ_i)^2这个1/n的系数就是所谓的“归一化因子”。它就像一个标准化的刻度让我们能客观地说“在这个模型下每个样本的平均预测误差的平方是多大。” 这是评估模型泛化能力的一个基本单位。值得注意的是在实际的代码实现如PyTorch或TensorFlow中为了求导方便常常会省略这个1/n直接优化SSE。因为SSE和MSE只相差一个常数倍数它们的最小值点即最优参数是完全一致的。但在数学推导中我们保留1/n因为它更符合“平均”的本意也使得后续梯度的量级更易于理解。3.3 矩阵形式的优雅转换从标量求和到向量内积现在我们将前面的标量形式MSE转换为紧凑、高效的矩阵形式。这是线性代数赋予我们的强大武器它不仅能极大简化公式更能揭示其背后的几何意义。首先回顾我们的符号约定y是n×1的真实标签向量ŷ Xw是n×1的预测向量。那么它们的差值就是一个新的n×1向量e y - ŷ y - Xw这个向量e的每个元素e_i正是我们之前定义的单样本误差y_i - ŷ_i。那么MSE的求和部分Σ (y_i - ŷ_i)^2在向量运算中就是向量e与自身的点积内积e^T e [e_1, e_2, ..., e_n] * [e_1; e_2; ...; e_n] e_1^2 e_2^2 ... e_n^2因此MSE的完整矩阵形式为MSE(w) (1/n) * (y - Xw)^T (y - Xw)这个公式是整个推导的核心枢纽。它将一个涉及n个变量的复杂求和压缩成了一个简洁的、关于向量w的二次型表达式。它的美在于它清晰地表明MSE是w的一个凸函数Convex Function。你可以把它想象成一个光滑的、没有“坑洼”的碗状曲面。这个性质至关重要因为它保证了无论我们从碗中的哪个位置出发只要沿着梯度下降就一定能到达唯一的、全局的最低点。这正是线性回归拥有稳定、唯一解的数学保证。如果你在推导中看到MSE(w)的表达式一定要在心里默念一遍e^T e这就是连接微观单点误差与宏观全局损失的桥梁。4. 实操过程与核心环节实现手推梯度与解析解4.1 梯度下降法的完整推导从损失函数到参数更新梯度下降的目标是找到使MSE(w)最小的参数w。根据微积分原理函数在极小值点处其梯度一阶偏导数构成的向量为零。因此我们的第一步就是计算MSE(w)关于w的梯度∇_w MSE(w)。我们从矩阵形式出发MSE(w) (1/n) * (y - Xw)^T (y - Xw)为了求导我们需要展开这个二次型。利用矩阵乘法的分配律和转置性质(AB)^T B^T A^T我们有(y - Xw)^T (y - Xw) y^T y - y^T Xw - w^T X^T y w^T X^T X w注意到y^T Xw是一个标量而标量的转置等于自身所以y^T Xw (y^T Xw)^T w^T X^T y。因此中间两项-y^T Xw - w^T X^T y可以合并为-2 w^T X^T y。于是损失函数变为MSE(w) (1/n) * (y^T y - 2 w^T X^T y w^T X^T X w)现在我们对w求梯度。这里需要用到几个关键的矩阵微分法则∇_w (a^T w) a其中a是与w同维的常向量∇_w (w^T A w) (A A^T) w其中A是常矩阵在我们的表达式中y^T y是常数其梯度为0-2 w^T X^T y的梯度为-2 X^T yw^T X^T X w的梯度为(X^T X (X^T X)^T) w 2 X^T X w因为X^T X是对称矩阵。将这些结果代入并乘以前面的1/n系数我们最终得到∇_w MSE(w) (1/n) * (-2 X^T y 2 X^T X w) (2/n) * (X^T X w - X^T y)这个结果就是梯度下降的“燃料”。它告诉我们在参数空间的任意一点w函数MSE下降最快的方向就是-∇_w MSE(w)的方向。因此梯度下降的更新规则为w_{t1} w_t - η * ∇_w MSE(w_t)其中ηeta是学习率它控制着我们每一步迈多大。将我们刚刚推导出的梯度代入得到最终的线性回归梯度下降更新公式w_{t1} w_t - η * (2/n) * (X^T X w_t - X^T y)提示在实际编程中2/n这个常数因子常常被吸收到学习率η中简写为η η * (2/n)从而得到更简洁的形式w_{t1} w_t - η * (X^T X w_t - X^T y)。但理解其原始来源能让你在调试模型时对学习率的量级有更准确的直觉。4.2 正规方程的诞生令梯度为零求解线性方程组正规方程的思路更为直接既然梯度为零的点就是极小值点那我们干脆直接解方程∇_w MSE(w) 0。将我们上一节推导出的梯度表达式设为零(2/n) * (X^T X w - X^T y) 0两边同时乘以n/2得到X^T X w - X^T y 0移项得到X^T X w X^T y这个方程被称为正规方程Normal Equation。它是一个关于w的线性方程组。只要矩阵X^T X是可逆的这在大多数实际场景中成立即特征之间不存在完全的线性相关我们就可以在方程两边同时左乘(X^T X)^{-1}从而得到w的解析解w (X^T X)^{-1} X^T y这个公式就是线性回归的“圣杯”。它不需要任何迭代不需要设置学习率只需要一次矩阵运算就能给出最优参数。X^T y可以理解为数据X与标签y的“协方差”一种关联强度的度量而(X^T X)^{-1}则是对特征之间相关性的“校正”。整个公式可以解读为最优参数w是数据与标签的关联强度经过特征间相关性校正后的结果。这比任何文字描述都更深刻地揭示了线性模型的内在逻辑。4.3 两种方法的实操对比与选型指南特性梯度下降 (GD)正规方程 (NE)计算复杂度每次迭代O(n*d)总时间取决于收敛速度一次性O(d^3 n*d^2)主要开销在矩阵求逆内存占用低只需存储X,y,w高需存储X^T Xd×d矩阵及其逆适用数据规模极佳可轻松处理百万级样本、万级特征较差当d 10^4时d^3计算量和内存消耗成为瓶颈是否需要调参是学习率η至关重要需仔细调整否无超参数收敛性保证收敛到全局最小值因MSE是凸函数直接给出全局最小值在线学习支持新数据到来时可增量更新不支持需重新计算整个(X^T X)^{-1} X^T y我在一个电商销量预测项目中曾亲历过两者的抉择。初期我们只有几千个SKU的历史数据n≈5000,d≈50我毫不犹豫地用了正规方程几行代码搞定模型上线当天就跑通了。但随着业务扩张数据量激增至每天百万条用户行为日志n≈10^6,d≈1000X^T X矩阵的维度是1000×1000求逆操作耗时超过10分钟完全无法满足实时更新的需求。这时我们果断切换到随机梯度下降SGD将学习率设为0.01仅用不到1秒就能完成一轮参数更新模型可以每小时自动重训一次。所以我的经验是小数据、快验证用正规方程大数据、求效率用梯度下降。没有银弹只有最适合当下场景的工具。5. 常见问题与排查技巧实录从理论到落地的鸿沟5.1 问题一梯度下降不收敛损失值震荡甚至发散现象训练过程中MSE曲线不是平稳下降而是在某个值附近大幅上下跳动或者干脆一路飙升。根本原因学习率η设置过大。这是梯度下降中最常见、也最容易被忽视的陷阱。想象一下你在下山但你的步子迈得比山还高结果一脚踏空从山顶直接蹦到了对面的山坡上离谷底反而更远了。数学上过大的η会让更新公式w_{t1} w_t - η * ∇_w MSE(w_t)中的-η * ∇项过大导致参数在最优解两侧剧烈摆动。排查与解决可视化诊断首先绘制MSE随训练轮数epoch变化的曲线。如果曲线呈锯齿状剧烈震荡基本可以锁定是学习率问题。指数衰减试探不要凭空猜测采用系统性的方法。将当前学习率η除以10重新训练。如果震荡消失说明原学习率确实过大如果下降过慢再尝试将新学习率乘以2或3。我通常的起始试探序列是[0.1, 0.01, 0.001, 0.0001]。特征缩放Feature Scaling这是很多人忽略的前置步骤。如果X中的特征尺度差异巨大例如一个特征是房屋面积单位平方米范围0-1000另一个是房间数量单位个范围1-10那么它们的梯度量级也会天差地别导致w的更新在不同维度上严重失衡。务必在应用梯度下降前对所有特征进行标准化Standardizationx_scaled (x - μ) / σ。这能让所有特征的均值为0标准差为1从而使梯度下降的路径更加平滑、高效。我见过太多人因为跳过这一步白白浪费了几天的调试时间。5.2 问题二正规方程求解失败报错“矩阵奇异”或“无法求逆”现象在执行np.linalg.inv(X.T X)或np.linalg.solve(X.T X, X.T y)时Python 抛出LinAlgError: Singular matrix。根本原因矩阵X^T X是奇异矩阵Singular Matrix即其行列式为零不可逆。这在现实中通常由两种情况引起特征冗余Feature Redundancy和样本不足Insufficient Samples。前者指你的特征中存在完全线性相关的列例如你同时包含了“年龄”和“出生年份”两个特征它们之间存在严格的线性关系出生年份 当前年份 - 年龄后者指你的样本数n小于特征数dn d此时X^T X必然秩亏。排查与解决检查条件数Condition Number在求逆前先计算np.linalg.cond(X.T X)。条件数越大矩阵越接近奇异。一般认为条件数大于1e12就非常危险。删除冗余特征使用pandas.DataFrame.corr()查看特征间的相关系数矩阵找出相关性极高如|r| 0.95的特征对果断删除其中一个。使用伪逆Pseudo-inverse当无法删除特征时改用np.linalg.pinv(X)直接计算X的Moore-Penrose伪逆然后w np.linalg.pinv(X) y。伪逆能在矩阵奇异时给出一个“最合理”的解最小二乘解中范数最小的那个。加入L2正则化Ridge Regression这是最优雅、也最常用的解决方案。在正规方程中给X^T X加上一个微小的正则项λII是单位矩阵即w (X^T X λI)^{-1} X^T y。这个λI就像给矩阵加了一层“刚性”彻底消除了奇异的可能性。λ是一个很小的正数如1e-8它对结果的影响微乎其微却能换来数值稳定性。这正是sklearn.linear_model.Ridge的核心思想。5.3 问题三模型在训练集上MSE很低但在测试集上很高过拟合现象训练误差MSE_train ≈ 0但测试误差MSE_test却高得离谱。根本原因虽然线性回归本身是一个简单的线性模型但过拟合依然可能发生尤其是在你手动构造了大量高阶特征Polynomial Features的时候。例如你将原始的x特征扩展成了[1, x, x^2, x^3, x^4, x^5]这实际上创造了一个5次多项式模型。它在训练点上可以完美插值MSE_train0但其在训练点之外的行为会变得极其疯狂振荡导致泛化能力崩溃。排查与解决审视特征工程立刻检查你的特征矩阵X的维度d。如果d远大于n或者你明确使用了PolynomialFeatures那么这就是罪魁祸首。绘制学习曲线Learning Curve这是诊断过拟合的黄金工具。横轴是训练样本数n_train纵轴是MSE_train和MSE_test。如果MSE_train很低且随n_train增加变化不大而MSE_test很高且随n_train增加缓慢下降这就是典型的高方差过拟合信号。引入正则化回到上一个问题提到的Ridge回归。L2正则化不仅能解决数值问题更是对抗过拟合的利器。它通过在损失函数中加入λ||w||^2项来惩罚过大的权重w从而迫使模型选择更“平滑”、更泛化的解。λ越大惩罚越重模型越简单。你可以使用sklearn.model_selection.GridSearchCV来自动搜索最优的λ。注意以上所有问题其根源都深植于我们推导出的数学公式之中。梯度震荡源于梯度公式的量级失控矩阵奇异源于X^T X的秩亏过拟合则源于高维特征空间下MSE函数的复杂性。因此当你在实践中遇到问题时最好的办法永远是回到那张写满公式的草稿纸逐行检查看看是哪个环节的数学假设在现实世界中被打破了。这才是一个资深从业者最核心的竞争力。