从最小二乘到梯度下降:线性回归与逻辑回归核心推导笔记
简介:这份线性回归算法小组报告PPT面向机器学习入门学习者与课程小组汇报场景,围绕回归预测的基本流程梳理线性回归、误差建模与逻辑回归的核心知识,适合用于课堂展示、复习串讲和公式推导参考。压缩包内仅含1个PPTX文件,约860KB,以幻灯片形式组织理论讲解、示例数据与公式推导,便于直接演示或按页摘录。内容从工资与年龄预测贷款额度的案例切入,涵盖拟合平面、误差高斯分布假设、似然函数与最小二乘法、目标函数求偏导、R²评估,以及批量、随机、小批量梯度下降和学习率选择;随后延伸到逻辑回归的Sigmoid函数、决策边界、参数更新与Softmax多分类。已有320人学习,可用于快速建立从线性回归到逻辑回归的知识框架,并对照示例理解模型假设、优化与评估要点。
1. 从一张贷款额度表出发:这份线性回归笔记的地图长什么样
一张只有三列的表——年龄、工资、银行批下来的额度——就能把线性回归整套东西串起来。年龄和工资是两个特征,额度是标签,报告要回答的是「这两个特征各自对额度有多大影响」,也就是参数。围绕这张表,一份完整的小组报告其实要回答四件事:模型长什么样、误差凭什么假设成高斯、参数怎么从似然函数推到最小二乘、闭式解推不动时梯度下降怎么接手。再往后一步,逻辑回归借着 Sigmoid 把回归值翻译成概率,分类任务也接上了。这份线性回归算法笔记按「骨架 → 推导 → 求解 → 分类 → 易漏点 → 复习清单」铺开,适合正在系统学机器学习、或者手里正攥着一份小组报告 PPT 要复习的人,对着目录就能定位自己哪一段是虚的。
2. 建模骨架:两个特征、一个偏置项和那条拟合平面
2.1 特征、标签、参数:三个角色别混
这张表最容易被讲糊的地方,是把「谁是给定的、谁是学出来的」混成一锅。年龄和工资是特征,是你在建模前就决定要喂进去的东西;额度是标签,是数据里已经带着的答案;而「年龄每大一岁,额度大概涨多少」这个系数,才是模型要学出来的参数。三者身份不同,复习时各问一句就能自检:特征问「我为什么选它」,标签问「它是不是连续值」,参数问「它是怎么被解出来的」。
| 角色 | 在这张表里是谁 | 公式里的符号 | 自检问题 |
|---|---|---|---|
| 特征 | 年龄、工资 | X1、X2 | 它和标签真的有关系吗 |
| 标签 | 银行批的额度 | Y | 它是连续值还是类别 |
| 参数 | 每个特征的影响力度 | θ1、θ2 | 它是解出来的还是拍出来的 |
| 偏置 | 与特征无关的基准量 | θ0 | 去掉它模型会怎样 |
把这三者的关系写成式子,就是拟合平面:h(x) = θ0 + θ1·X1 + θ2·X2。特征只有两个时它是一张平面,特征变成 n 个时它就是 n 维空间里的超平面,但「线性」这两个字始终指的是对参数线性,不是对特征线性——这一点在后面讲逻辑回归的决策边界时还会再撞上。
2.2 偏置项:为什么模型里必须留一个 θ0
很多报告写到 h(x) = θ1·X1 + θ2·X2 就停了,把 θ0 当成可有可无的装饰,这是典型的概念漏项。偏置项代表的是「所有特征都取零时,模型的基准输出」。放到贷款场景里想:一个人年龄为零、工资为零,额度显然不该是零,模型得有一个自己能学的基准线,这个基准线就是 θ0。硬把它去掉,等于强行要求拟合平面必须穿过原点,在绝大多数真实数据上都会带来系统性偏差。
工程上的处理办法很统一:给设计矩阵补一列全 1,把 θ0 当成「特征恒为 1 的那个权重」,这样所有参数就能用一个向量一次写完,梯度也好、正规方程也好,写法都统一了。
import numpy as np # 三列原始数据:年龄、工资、额度 age = np.array([25, 30, 28, 33, 40]) salary = np.array([4000, 8000, 5000, 7500, 12000]) amount = np.array([20000, 70000, 35000, 50000, 85000]) # 设计矩阵补一列全 1,对应偏置项 theta0 X = np.column_stack([np.ones(len(age)), age, salary]) y = amount print(X.shape) # (5, 3):5 个样本,3 个待求参数column_stack把全 1 列放在最前面,顺序要和后面 θ 的顺序一致,否则解出来的系数会张冠李戴。X.shape的第二维就是参数个数,样本数少于这一维时,后面的正规方程会直接失效,这一点在第 3 章会展开。
2.3 误差的三条假设:独立、同分布、高斯
真实值和预测值之间一定存在差距,写成 y = θᵀx + ε,这个 ε 就是误差。整份报告最关键的转折点在于:误差不是随便一个随机数,它被假设成独立、同分布、且服从均值为 0 的高斯分布。这三条不是从数据里推出来的结论,而是建模前就摆上桌面的前提,后面的似然函数、最小二乘全都建立在它上面。
独立性说的是样本之间互不干扰:两个客户一起来贷款,批多少互不影响,不能因为一个人批得多另一个人就被压缩。同分布说的是所有样本来自同一套规则、同一个数据生成过程,如果数据里混了不同渠道、不同时期的记录,这条就不成立。高斯分布说的是浮动范围:银行可能多给也可能少给,但绝大多数情况下浮动不大,极端值很少,这正好对上正态分布中间高、两边低的形状。
提示:这三条假设在报告里最好单独列一页,因为它们是后面所有推导的地基,评审最常追问的也是「你凭什么假设高斯」。
把假设写成式子就是 ε ~ N(0, σ²),代入模型得到 y 在给定 x 和 θ 时也服从均值 θᵀx、方差 σ² 的高斯分布。这一步没什么花哨技巧,但它是从「建模」跨到「概率」的那道门,跨过去之后,参数估计就变成了概率论问题。
2.4 似然函数:把「哪组参数最像真的」写成连乘
有了误差的概率密度,就可以问一个反过来的问题:手上这组已经发生的数据,在哪组参数下出现的可能性最大?这就是似然。单个样本在参数 θ 下出现的概率密度是 1/(√(2π)σ)·exp(-(y-θᵀx)²/(2σ²)),把所有样本乘起来就得到似然函数 L(θ) = ∏ P(yᵢ|xᵢ;θ)。独立假设在这里派上用场——正因为样本独立,联合概率才能写成连乘。
似然不是「参数的概率」,参数没有分布,它是一个待定的数。似然描述的是「参数取某个值时,观测到这组数据的相对可能性」,理解错这一句,后面取对数、求极值全都会变成背公式。报告里把这句解释清楚,比多写一页推导更能体现理解了模型。
到这里,第 2 章给出的其实是一张骨架图:特征和标签是原料,参数是待求量,偏置负责平移,误差三假设负责把问题翻译成概率语言,似然函数负责给出「好」的判定标准。剩下的问题只有一个:怎么把似然最大化的那个 θ 解出来。
3. 求解与评估:从对数似然到最小二乘,再到梯度下降
3.1 取对数:连乘变连加的那一步
似然函数是连乘,直接求导几乎没法做,所以第一步一定是取对数。对数函数单调递增,最大化 L(θ) 和最大化 ln L(θ) 得到的是同一组参数,这个等价性是整条推导链的通行证。取完对数,连乘变成连加:
ln L(θ) = Σ [ ln(1/(√(2π)σ)) - (yᵢ - θᵀxᵢ)²/(2σ²) ]
拆开看,第一项里没有 θ,是常数,对「哪组参数最好」没有任何影响,可以直接扔掉;第二项里 σ² 也是常数,同样不影响极值点的位置。剩下的就只有 -Σ(yᵢ - θᵀxᵢ)² 这一块。最大化它,等价于最小化 Σ(yᵢ - θᵀxᵢ)²——这就是最小二乘的来历。
梳理下来会发现一个很容易被忽略的点:最小二乘不是谁拍脑袋规定的损失函数,它是「误差服从高斯」这条假设 + 「最大似然」这个准则推导出来的必然结果。如果误差换一种分布,推出来的目标函数就不再是平方和。报告里如果只写「我们用平方误差」,等于把推导链里最有价值的一环剪掉了。
3.2 偏导置零:正规方程与它的适用边界
把目标函数写成 J(θ) = ½Σ(h(xᵢ) - yᵢ)²,前面乘 ½ 只是为了求导时把平方的 2 消掉,不影响极值点。对每个 θⱼ 求偏导,得到 Σ(h(xᵢ) - yᵢ)·xⱼ⁽ⁱ⁾,令其等于 0,整理成矩阵形式就是 XᵀXθ = Xᵀy,解出 θ = (XᵀX)⁻¹Xᵀy,这就是正规方程,也叫最小二乘的闭式解。
# 正规方程:theta = (X^T X)^(-1) X^T y theta = np.linalg.inv(X.T @ X) @ X.T @ y print(theta) # [theta0, theta1, theta2]X.T是转置,@是矩阵乘法,np.linalg.inv求逆。这段代码在样本少、特征少时一步到位,但它有两个硬边界必须写进报告:一是求逆的复杂度大约是特征数的三次方,特征上千时基本不可用;二是当特征之间存在强共线性(比如工资和「月收入」几乎同一条信息)时,XᵀX 接近奇异,求逆会给出数值上极不稳定的结果,甚至直接报错。闭式解好用,但不是万能钥匙。
3.3 R²:拟合好坏的一把尺子
模型解出来了,得有个刻度判断它到底好不好。最常用的评估项是 R²,写法是 1 减去残差平方和与总平方和的比值:R² = 1 - SS_res / SS_tot。直观理解是「模型解释掉了多少波动」——SS_tot 是全部用均值预测时的误差,SS_res 是模型预测后的误差,两者一比,就知道模型比「无脑猜均值」强了多少。
R² 越接近 1 说明拟合越好,等于 1 表示残差为零,这在实际数据里几乎不可能出现。要注意它可以是负数:模型差到比直接用均值预测还离谱时,R² 就会掉到 0 以下,这不是算错了,而是模型真的不行。另外 R² 会随特征增多而单调不降,哪怕加进去的是纯噪声,所以拿它比较不同特征数的模型时,得换成调整后的 R²,这一点是很多报告翻车的地方。
3.4 梯度下降:下山三步与三种更新方式
闭式解有边界,就有了梯度下降。它的比喻很直白:你站在山谷的某个位置,目标是走到最低点。下山分三步——先找到当前最陡的下坡方向(梯度),再决定迈多大一步(学习率),最后按方向和步长更新参数。写成式子就是 θⱼ := θⱼ - α·∂J/∂θⱼ,负号是因为要往梯度的反方向走。
alpha = 0.01 # 学习率,相当于每步迈多大 epochs = 1000 # 迭代轮数 theta = np.zeros(X.shape[1]) for _ in range(epochs): pred = X @ theta # 当前参数下的预测值 grad = X.T @ (pred - y) / len(y) # 均方误差对 theta 的梯度 theta -= alpha * grad # 沿负梯度方向更新grad里除以样本数,是为了让梯度的量级不随数据量膨胀,否则样本一多,同样的学习率就会直接迈过头。alpha决定收敛快慢,epochs决定最多走多少步,两者要配合着调。这段代码跑完得到的 θ 和正规方程解出来的应当非常接近,如果差很多,先怀疑学习率而不是数据。
按每次更新用多少样本,梯度下降分成三种,这是报告里必须讲清的一块:
| 方式 | 每次用的样本 | 优点 | 代价 |
|---|---|---|---|
| 批量梯度下降 | 全部样本 | 方向稳,容易收敛到最优解 | 每步都要遍历全量,速度慢 |
| 随机梯度下降 | 1 个样本 | 单步极快,能跳出局部坑 | 方向抖,不一定朝收敛方向走 |
| 小批量梯度下降 | 一小批(如 32/64) | 兼顾速度与稳定,工程上最常用 | 多了一个批大小要调 |
3.5 学习率与批大小:两个最常被随手填的超参数
学习率是这套方法里最玄学的一个数。设大了,每一步都迈过山谷,损失曲线来回震荡甚至越来越大,最后发散;设小了,收敛慢到你以为代码卡死。稳妥的路子是从小往大试:先取一个很小的值确认损失在稳定下降,再逐步放大,直到出现震荡就退回来一档。学习率对最终结果的影响远超很多人的预期,它不是随便填个 0.01 就完事的参数。
批大小常见取 32、64、128,取值背后是内存和效率的账。批太小,梯度噪声大,训练过程抖;批太大,单步计算量上去了,内存也吃紧,而且迭代轮数内更新的次数变少。实际选择时先看显存或内存能放下多少,再在一个量级内试几个值,别迷信某个「标准数字」。这一节写进报告时,最好附一张不同学习率下的损失曲线对比,比干巴巴写「我们取了 0.01」有说服力得多。
4. 逻辑回归:Sigmoid 把回归值翻译成概率
4.1 名字骗人:它做的是分类
逻辑回归名字里带着「回归」,干的却是分类的活,而且是经典的二分类算法。之所以还叫回归,是因为它的内部结构仍然是先算一个线性组合 θᵀx,只不过最后多加了一层映射,把任意实数压到 0 到 1 之间,当作「属于正类的概率」。算法选择的经验是先上逻辑回归再考虑复杂模型,能简单就不往复杂里堆,这一条在报告里值得单独强调。
把线性回归的输出直接当概率用是不行的:它可能算出 -3,也可能算出 200,都不在概率的取值范围内。所以问题的核心不是「怎么拟合一条线」,而是「怎么把一个无界的分数变成有界的概率」,Sigmoid 就是干这个的。
4.2 Sigmoid 与预测函数的整合写法
Sigmoid 的形式是 g(z) = 1/(1 + e⁻ᶻ),自变量取任意实数,值域落在 (0,1) 开区间。它有几个性质值得记住:z=0 时输出正好 0.5,这是天然的分类阈值;z 越大越贴近 1,z 越小越贴近 0;它的导数有个漂亮的形式 g'(z) = g(z)(1 - g(z)),后面推梯度时全靠这一条把式子化简开。
def sigmoid(z): # z 极负时 exp(-z) 会溢出,工程上通常对 z 做截断 return 1.0 / (1.0 + np.exp(-z)) z = np.array([-2.0, 0.0, 2.0]) print(sigmoid(z)) # [0.119 0.5 0.881]把线性组合塞进去,预测函数就是 h(x) = g(θᵀx) = 1/(1 + e^(-θᵀx))。得到的是一个概率,通常以 0.5 为界切成两类。二分类的标签是 0 和 1,正好可以把两种情况写成一个式子:P(y|x;θ) = h(x)^y · (1-h(x))^(1-y)。y 取 0 时前半部分变成 1,只留下后半部分;y 取 1 时后半部分变成 1,只留下前半部分。这个整合写法不是炫技,它是下一步写似然函数的前提。
4.3 决策边界:直线只是最朴素的一种
当 h(x) 大于 0.5 时判为正类,而 Sigmoid 在 z>0 时输出大于 0.5,所以分类的边界就落在 θᵀx = 0 这条线上。特征只有两个时它是一条直线,特征更多时是一个超平面。但这只是最朴素的情形——如果对特征做变换,比如引入 x₁²、x₁x₂ 这样的高次项,边界在原始特征空间里就可以是曲线甚至闭合区域。
这里有个常见误解:逻辑回归的决策边界可以是非线性的,但模型对参数仍然是线性的。区分「对特征线性」和「对参数线性」,是理解这一族模型的关键,也是后面讲易错点时绕不开的一句。
4.4 对数似然与参数更新:梯度上升怎么改写成下降
有了整合后的概率表达式,似然函数就是把所有样本的概率乘起来,取对数后变成 l(θ) = Σ[y·ln h(x) + (1-y)·ln(1-h(x))]。目标是让它越大越好,所以原本用的是梯度上升。但工程上大家习惯统一成「最小化损失」,于是给它加个负号,定义 J(θ) = -(1/m)·l(θ),任务就从上升转成了下降。
求导之后会得到一个非常眼熟的结果:梯度正比于 Σ(h(xᵢ) - yᵢ)·xⱼ⁽ⁱ⁾,参数更新式是 θⱼ := θⱼ - α·(1/m)·Σ(h(xᵢ) - yᵢ)·xⱼ⁽ⁱ⁾。把它和线性回归的更新式并排放,形式几乎一模一样,唯一的区别是 h(x) 一个是线性函数、一个是 Sigmoid 之后的概率。这个「长得像」不是巧合,而是广义线性模型框架下的必然,报告里点出这一句,能把两个算法从「两套知识」缝成「一套框架」。
| 对比项 | 线性回归 | 逻辑回归 |
|---|---|---|
| 任务 | 回归,预测连续值 | 二分类,输出概率 |
| 预测函数 | θᵀx | g(θᵀx) |
| 输出范围 | 全体实数 | (0,1) |
| 损失来源 | 高斯假设下的最大似然 | 伯努利分布下的最大似然 |
| 优化方向 | 最小化平方和 | 最小化负对数似然 |
4.5 Softmax:多分类接口
二分类解决了,多分类怎么办?Softmax 是逻辑回归的自然推广。它对每个类别给一个线性得分 θₖᵀx,然后做指数归一化:P(y=k|x) = e^(θₖᵀx) / Σⱼ e^(θⱼᵀx)。所有类别的概率加起来等于 1,取概率最大的那一类作为预测结果。类别数退化成 2 时,Softmax 和 Sigmoid 是等价的,所以它常被称作多分类版的逻辑回归。
写报告时容易漏掉的一点是数值稳定:指数运算容易上溢,实际实现里要先减去每行的最大值再取指数,结果不变但数值安全得多。这个细节不写不影响理解,写了会显得你真的动过手。
5. 易漏点:五处最容易在报告里被一笔带过的地方
5.1 易漏点一:把「误差服从高斯」当成结论
为什么漏:推导链条太长,写到最后只记得「最小二乘」,忘了它是被高斯假设推出来的,于是把假设当成了定理。
怎么补:在报告里明确写一句「误差服从高斯是建模假设,不是数据验证的结论」,再补一句「若误差换成拉普拉斯分布,对应的就是最小绝对偏差而不是平方和」。能说出假设变了、目标函数跟着变,才算真懂这条链。
5.2 易漏点二:偏置项当成可有可无的装饰
为什么漏:写公式时习惯从 θ1x1 开始,代码里也常忘了补那一列全 1,模型照样能跑出数,于是没人回头检查。
怎么补:把「设计矩阵第一列全 1」当成固定动作,跑完看一眼参数向量的长度是不是等于特征数加一。再加一句解释:去掉偏置等于强制拟合平面过原点,在目标值均值明显不为零的数据上会引入系统偏差。
5.3 易漏点三:学习率只写一个数字,不写怎么试出来的
为什么漏:跑通了就完事,损失曲线没存,调参过程没记,最后报告上只剩一个孤零零的 0.01。
怎么补:至少保留三组不同学习率的损失曲线做对比,写清哪一组震荡、哪一组收敛太慢、最终为什么选中间那档。这一步做扎实,比多写两页公式更能说明你理解了优化过程。
5.4 易漏点四:把 R² 越高当成模型越好
为什么漏:R² 是个很顺手的单一数字,看着涨了就觉得改进有效,没注意特征数也在涨。
怎么补:凡是增加特征后比较模型,一律换成调整后的 R²;同时补一个均方误差,说明两者一个看解释比例、一个看绝对误差量级,别只拿一个指标下结论。R² 为负的情况也要能解释,那不是代码错了,是模型真不如均值基线。
5.5 易漏点五:逻辑回归的损失函数写成平方误差
为什么漏:线性回归刚讲完平方误差,顺手就搬过来了,形式上看更新式又长得像,更容易糊弄过去。
怎么补:回到概率来源——逻辑回归的标签服从伯努利分布,最大似然推出来的是交叉熵形式的负对数似然,不是平方和。把两个损失函数的来源并排写一次,再指出「更新式长得像,是因为它们同属广义线性模型」,这个坑就填上了。
6. 复习清单:把这份报告压缩成一张可自测的表
复习到这个阶段,最有效的动作不是再读一遍推导,而是拿一张空表自测:能不能在不看笔记的情况下,把每一格的「是什么」和「为什么」都说出来。下面这张表可以直接当自测卡用,说不上来的格子就是你要回头补的章节。
| 知识点 | 要能说清的核心 | 对应位置 |
|---|---|---|
| 特征、标签、参数 | 谁是给定的,谁是学出来的 | 2.1 |
| 偏置项 | 去掉它等于强制过原点 | 2.2 |
| 误差三假设 | 独立、同分布、高斯分别对应什么现实含义 | 2.3 |
| 似然函数 | 它描述的是数据的可能性,不是参数的概率 | 2.4 |
| 取对数 | 单调性保证极值点不变,连乘变连加 | 3.1 |
| 最小二乘 | 高斯假设加最大似然推出来的,不是拍脑袋定的 | 3.1 |
| 正规方程 | 闭式解的形式与两个失效边界 | 3.2 |
| R² | 可以为负,特征变多会虚高 | 3.3 |
| 三种梯度下降 | 批量稳、随机快、小批量实用 | 3.4 |
| 学习率与批大小 | 大震荡小慢,批大小看内存和效率 | 3.5 |
| Sigmoid | 值域 (0,1),导数 g(1-g) | 4.2 |
| 整合写法 | h^y·(1-h)^(1-y) 怎么合并两种情况 | 4.2 |
| 决策边界 | 对参数线性,对特征可以非线性 | 4.3 |
| 参数更新 | 和线性回归同形不同 h | 4.4 |
| Softmax | 多分类归一化,二分类退化为 Sigmoid | 4.5 |
自测时建议按「公式 → 一句话解释 → 一个反例」三层走。比如正规方程,公式是 (XᵀX)⁻¹Xᵀy,一句话是「让残差平方和最小的闭式解」,反例是「特征强共线时求逆不稳定」。三层都能过,才算真掌握;只能背出公式的,考场上换个问法就会卡住。
还有一个具体的查漏技巧:把整份报告的公式全部遮住,只留文字描述,看能不能反过来把公式默写出来。默不出来的地方,往往不是记性问题,而是那一步的逻辑你没真的走通。反过来也可以,只看公式,用大白话讲给一个没学过的人听,讲不清的地方就是理解断层。
我当时整理这份笔记,最大的教训是太早开始背梯度下降的更新式,结果被问「为什么负号」时愣了半天。从那以后我每次复习这类算法,都强制走一遍「假设 → 似然 → 取对数 → 求导 → 更新式」的完整链条,哪怕慢一点,也不再单独背结论。希望帮到你。
本文还有配套的精品资源,点击获取