ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

线性回归小组报告PPT:最小二乘、梯度下降与逻辑回归推导链

线性回归小组报告PPT:最小二乘、梯度下降与逻辑回归推导链

简介:这份线性回归算法小组报告PPT面向机器学习入门学习者与课程小组汇报场景,围绕线性回归的基本概念、数学推导与工程实现展开,也可用于梳理监督学习预测连续变量的知识框架。压缩包内仅含1个pptx文件,体积约860KB,结构紧凑,便于课堂展示或小组分工讲解。内容以工资、年龄预测贷款额度为例,串联特征与参数、拟合平面、误差高斯分布假设、似然函数与最小二乘法,并介绍目标函数评估、批量/随机/小批量梯度下降及学习率和批处理数量的选择。讲解还延伸到逻辑回归的Sigmoid函数、二分类似然与Softmax多分类,帮助读者把回归与分类算法放在同一脉络中理解。目前已有320人学习,适合需要一份可展示、可复习的线性回归小组报告课件的读者参考。

1. 一份线性回归算法小组报告PPT,先想清楚讲给谁听

拿线性回归算法做小组报告ppt,最容易翻车的不是公式写错,而是推导铺满每一页、台下没人跟得上。这份材料的思路反过来:用“工资和年龄预测银行批多少贷款”一组数据贯穿到底,先把两个特征、一个标签钉死,再往上叠拟合平面、误差假设、似然函数、最小二乘、梯度下降,最后用逻辑回归收一个分类的尾巴。它适合要在一两次汇报里把线性回归讲完整的人——课程小组、组内技术分享都行;也适合已经会用现成库调包、但被追问“凭什么用平方损失”时答不上来的从业者。整份资源的价值不在结论,而在那条从数据到参数的推导链能不能自洽地讲下来,以及配套的代码骨架能不能当场跑出数。

2. 把“找一条线”讲成推导链:拟合平面、误差假设与最小二乘

2.1 两个特征一个标签:先把业务问题翻译成矩阵

报告开头别急着写公式。先用一张小表把数据结构摆出来:工资和年龄是两个特征,贷款额度是标签,每一行是一个样本。

工资年龄额度
40002520000
80003070000
50002835000
75003350000
120004085000

这张表的作用是让听众先接受“两个特征共同影响一个连续值”这个设定。接着写出拟合平面:h(x) = θ0 + θ1x1 + θ2x2。为了把偏置项 θ0 也塞进矩阵乘法,常见做法是给每个样本补一个恒为 1 的特征 x0,于是式子整合成 θᵀx,其中 x = [1, x1, x2]ᵀ。这一步看着简单,却是后面所有推导的地基:特征矩阵 X 是 m×(n+1) 维,参数 θ 是 (n+1) 维列向量,预测值就是 Xθ。

讲的时候可以顺手点一句:θ1 和 θ2 的大小,回答的正是“工资和年龄各自对额度有多大影响”。但要注意,两个特征量纲差了两个数量级,系数的绝对值不能直接比大小,这个坑留到第 5 章展开。先让听众理解“参数就是影响权重”,后面的似然和梯度才有落点。

2.2 误差假设三件套:独立、同分布、高斯

真实值和预测值之间一定存在差异,记 ε = y − θᵀx。报告里最关键的一页,是把这三个假设讲成人话,而不是念名词。

独立:张三和李四同时来贷款,两人的结果互不影响。对应到数据上,样本之间的误差不相关。同分布:他们进的是同一家银行、同一套审批逻辑,误差来自同一个分布。高斯:银行可能多批一点,也可能少批一点,但绝大多数情况下浮动不大,极端值很少,这正好是均值为 0 的正态分布形状。

三条合起来,写成 ε ~ N(0, σ²)。为什么这条假设重要?因为它决定了后面损失函数长什么样。误差服从高斯分布,意味着给定参数后样本标签的条件概率也是高斯形式,取对数之后平方项自然出现,最小二乘不是拍脑袋选的,而是这条假设推出来的结果。台下如果有人问“为什么不是绝对值损失”,答案就在这里:绝对值损失对应的是拉普拉斯误差假设。

我一般会在这里插一句提醒:假设的是误差服从高斯,不是特征或标签服从高斯。这句话能挡掉答辩时一半的追问。

2.3 从似然到最小二乘:一条不能跳步的推导链

推导页建议按“概率密度 → 似然 → 对数似然 → 化简 → 目标函数”五步排,每步配一句口头解释。下面这张表可以直接改成 PPT 的讲稿备注。

步骤写出来的式子口头怎么讲
条件概率p(yᵢ|xᵢ; θ) = (1/√(2π)σ)·exp(−(yᵢ−θᵀxᵢ)²/(2σ²))给定参数,标签出现的概率密度
似然函数L(θ) = ∏ᵢ p(yᵢ|xᵢ; θ)把所有样本的概率乘起来,衡量这组参数有多“像”能产生眼前这份数据
对数似然ℓ(θ) = log L(θ)乘法难处理,取对数变成加法,单调性不变
展开化简ℓ(θ) = 常数 − (1/(2σ²))·Σ(yᵢ−θᵀxᵢ)²与 θ 有关的只剩残差平方和那一项
目标函数J(θ) = (1/2)·Σ(yᵢ−θᵀxᵢ)²最大化似然等价于最小化残差平方和

这张表的信息密度足够撑起一页,讲的时候重点落在最后一行:似然越大越好,但带负号的那一项让“越大”变成“残差平方和越小”。系数 1/2 是为了求导时消掉 2,不影响极值点位置,这个细节可以在备注里写,不必占正文版面。

再往下就是对 J(θ) 求偏导、令偏导为零,得到 XᵀXθ = Xᵀy。这一步建议手写一遍,别直接贴结果,因为矩阵求导的维度对齐是听众最容易断片的地方:XᵀX 是 (n+1)×(n+1),θ 是 (n+1)×1,Xᵀy 是 (n+1)×1,两边维度必须对得上。

2.4 正规方程:先给一个能当场算出数的闭式解

推导讲完,立刻给代码,让听众看到“公式不是摆设”。下面这段是报告现场最稳的演示:数据量小,正规方程一步出结果。

import numpy as np # 每行 [工资, 年龄],与正文示例数据一一对应 X_raw = np.array([[4000, 25], [8000, 30], [5000, 28], [7500, 33], [12000, 40]], dtype=float) y = np.array([20000, 70000, 35000, 50000, 85000], dtype=float) # 补一列 1 对应偏置项 θ0,位置必须在最前面,和推导顺序保持一致 X = np.hstack([np.ones((X_raw.shape[0], 1)), X_raw]) # 正规方程 θ = (XᵀX)⁻¹Xᵀy;实际项目里更推荐 lstsq,数值更稳 theta_inv = np.linalg.inv(X.T @ X) @ X.T @ y theta_lstsq = np.linalg.lstsq(X, y, rcond=None)[0] print("inv 解:", theta_inv) print("lstsq 解:", theta_lstsq) # 预测新样本:工资 9000、年龄 35 x_new = np.array([1.0, 9000, 35]) print("预测额度:", x_new @ theta_lstsq)

逻辑说明:hstack 补 1 是为了让偏置项参与矩阵运算;先算 XᵀX 再求逆,是教科书标准写法;lstsq 用最小二乘数值解法,避免显式求逆。参数说明:rcond=None 表示使用机器精度的默认截断,小数据下两者结果几乎一致,但数据一多、特征一相关,inv 的误差会被放大。

这里必须提前打预防针:工资是几千量级、年龄是几十量级,XᵀX 的条件数很差,算出来的系数可能大得离谱但预测值仍然接近。报告里如果只展示系数、不展示标准化,很容易被问住。常见做法是先对特征做标准化再求解,或者干脆用第 3 章的梯度下降,让量纲问题在预处理阶段解决。

2.5 R² 的讲法:别只说“越接近 1 越好”

评估页只需要一个指标就够撑住:R² = 1 − SS_res/SS_tot,其中 SS_res 是残差平方和,SS_tot 是标签相对均值的总平方和。它的含义是“模型解释了多少波动”,不是“准确率”。取值接近 1 说明拟合好,接近 0 说明和直接拿均值预测差不多,出现负值说明模型在测试集上比均值基线还差。

报告里可以补一句边界:R² 会随着特征增多而虚高,特征多了要换调整后的 R²。这句话能体现你们不是只会调包。代码演示不必长,把预测值和 R² 打出来即可,重点是让听众看到指标和图形是对应的。

3. 手写梯度下降三件套:批量、随机、小批量的代码与调参

3.1 闭式解不够用的两个场景

正规方程好用,但报告里要讲清它的边界,否则梯度下降那几页就成了硬凑。第一个场景是特征维度高:求逆的复杂度大致是特征数的三次方,几千维就扛不住。第二个场景是目标函数不再有闭式解:加了正则项、换了模型结构之后,只能迭代逼近。线性回归在这个视角下只是一个特例——恰好可解,才轮得到正规方程出场。

梯度下降的讲法建议用下山比喻,但别停在比喻上。要落到三件事:当前往哪个方向走(梯度)、走多大一步(学习率)、走多少步(迭代轮数)。目标函数 J(θ) 对 θ 求偏导得到 ∇J(θ) = Xᵀ(Xθ − y)/m,更新式就是 θ := θ − α∇J(θ)。这里的 1/m 是均方误差的写法,和 2.3 节的 1/2 只是常数差异,报告里前后统一即可,别一处带 1/2 一处不带,听众会以为推错了。

3.2 批量梯度下降:一次用全量样本

批量梯度下降每次更新都扫全部样本,方向稳,但样本量大时一轮就够慢。下面这段可以直接在报告现场跑,重点是让它输出损失曲线,证明“确实在收敛”。

import numpy as np # 构造数据并标准化:梯度下降对量纲极其敏感,这一步不能省 X_raw = np.array([[4000, 25], [8000, 30], [5000, 28], [7500, 33], [12000, 40]], dtype=float) y = np.array([20000, 70000, 35000, 50000, 85000], dtype=float) mu, sigma = X_raw.mean(axis=0), X_raw.std(axis=0) X_std = (X_raw - mu) / sigma X = np.hstack([np.ones((X_std.shape[0], 1)), X_std]) # 补 x0 = 1 theta = np.zeros(X.shape[1]) lr = 0.05 # 学习率,先小后大,0.05 在这组数据上能稳定下降 epochs = 2000 # 迭代轮数,看损失曲线是否走平 m = X.shape[0] loss_history = [] for epoch in range(epochs): pred = X @ theta # 当前参数下的预测 error = pred - y # 残差 grad = (2.0 / m) * (X.T @ error) # 均方误差对 θ 的梯度 theta -= lr * grad # 沿负梯度方向更新 loss_history.append((error ** 2).mean()) print("theta:", theta) print("first/last loss:", loss_history[0], loss_history[-1])

逻辑说明:先标准化再补 1,保证偏置项不被缩放;梯度里的 2/m 来自均方误差求导,常数不影响方向;损失每轮记录一次,方便画曲线。参数说明:lr 从 0.05 起步是这组小样本的经验值,换数据要重试;epochs 不要拍脑袋写 10000,先跑 500 看曲线是否走平,再决定加不加。预测时记得用同一组 mu、sigma 对新样本做变换,否则预测值会偏得离谱,这是报告演示环节最常见的翻车点。

3.3 随机梯度下降与小批量:更新频率换收敛稳定性

随机梯度下降每次只拿一个样本更新,速度快但方向抖;小批量取两者折中,也是实际项目里最常用的形态。下面这段用小批量演示,样本只有 5 条时 batch_size=2,一轮更新 3 次。

rng = np.random.default_rng(42) theta_mb = np.zeros(X.shape[1]) lr = 0.05 batch_size = 2 # 样本量小时按比例取;真实数据常用 32/64/128 epochs = 500 m = X.shape[0] for epoch in range(epochs): idx = rng.permutation(m) # 每轮打乱,避免样本顺序带来偏置 for start in range(0, m, batch_size): batch = idx[start:start + batch_size] Xb, yb = X[batch], y[batch] grad = (2.0 / len(batch)) * (Xb.T @ (Xb @ theta_mb - yb)) theta_mb -= lr * grad # 用当前小批量的梯度近似整体梯度 print("mini-batch theta:", theta_mb)

逻辑说明:permutation 打乱顺序是小批量的标准动作,否则模型会学到“数据排列”这种无关信息;梯度用当前批次样本估计,是有偏但方差可控的近似。参数说明:batch_size 不是越大越好,样本少时它决定了每轮更新几次;lr 在小批量下通常要比批量模式略小,因为梯度噪声本身就会带来额外步长。

报告里可以把三种方法的对比做成一页表:批量方向准、每轮慢;随机每步快、曲线抖;小批量兼顾吞吐和稳定性。别写成“小批量最好”这种结论,听众会追问依据,正确说法是“在内存允许的前提下,小批量通常是工程默认选项”。

3.4 学习率和批大小的取值表

这一页建议直接给表,配合一句“这些是起点,不是标准答案”。

参数常见起点调大后的现象调小后的现象判断依据
学习率0.001~0.1损失震荡、发散、出现 NaN收敛极慢、迭代结束还没走平损失曲线是否单调下降
批大小32 / 64 / 128内存吃紧、单步更稳但更新变少梯度噪声大、曲线抖动吞吐和损失抖动幅度
迭代轮数先 500 再定过拟合、浪费时间欠拟合、损失还在降验证集损失的拐点

表后面补一句血泪经验:学习率不要一上来就 1.0,先小后大是稳妥顺序;损失出现 NaN 时第一反应是调小学习率并检查标准化,而不是怀疑数据。报告里把这句讲出来,比多贴十行代码更能说明你们真跑过。

4. 逻辑回归那一页别跳过:Sigmoid、决策边界与Softmax的讲法

4.1 Sigmoid 把任意实数压进 [0,1]

线性回归输出的是连续值,逻辑回归要解决的是二分类,中间缺的那一步就是把实数映射成概率。Sigmoid 函数 σ(z) = 1/(1+e⁻ᶻ) 干的就是这件事:z 取任意实数,输出落在 (0,1),z=0 时输出 0.5,正好当分类阈值。报告里可以顺手画一条 S 形曲线,标出 z 很大时输出趋近 1、z 很小时趋近 0,中间一段近似线性。

预测函数写成 p(y=1|x) = σ(θᵀx)。分类时按 0.5 截断,但这只是默认阈值,实际场景里阈值要按业务调。这句话建议放在页脚备注,显得你们知道概率输出和硬分类是两回事。常见误区是把逻辑回归当回归算法,名字里的“回归”来自它用的是线性组合加对数几率,不是输出连续值,这一句在开场点一下,后面就不会有人问“为什么不直接用线性回归做分类”。

4.2 决策边界:线性分类器也能有非线性边界

决策边界是 p=0.5 的那条线,也就是 θᵀx=0。在原始特征空间里它是一条直线(高维是超平面),但这不代表逻辑回归只能处理线性可分的数据。把特征做映射,比如加入 x1²、x2²、x1x2 这些项,边界在原始空间里就弯了,模型本身仍然是线性的。

报告里可以给一个对照:原始两个特征时边界是一条直线,加入二次项后边界变成曲线。讲清这一点,能挡掉“逻辑回归太简单”的质疑。参数的含义也从“权重”变成“对数几率里的系数”,解释时要小心措辞:θ 增大表示该特征把样本推向正类的倾向更强,不是概率线性增加。

4.3 对数似然与梯度上升:负号别丢

二分类的似然可以写成 ∏ pᵢ^yᵢ·(1−pᵢ)^(1−yᵢ),y 取 0 时只剩后一项,取 1 时只剩前一项。取对数后得到 ℓ(θ) = Σ[yᵢlog pᵢ + (1−yᵢ)log(1−pᵢ)],要最大化它。求导后得到的形式非常干净:∇ℓ(θ) = Xᵀ(y − p)。于是更新式是 θ := θ + αXᵀ(y − p),方向是梯度上升。

很多报告在这里翻车:一会儿写上升、一会儿写下降,符号一乱整页都不可信。稳妥的写法是统一下降视角,把损失写成负对数似然,更新式变成 θ := θ − αXᵀ(p − y),和线性回归的写法对齐。下面这段代码用的就是下降视角。

import numpy as np def sigmoid(z): # 分正负两支计算,避免 exp 溢出 return np.where(z >= 0, 1 / (1 + np.exp(-z)), np.exp(z) / (1 + np.exp(z))) def logistic_gd(X, y, lr=0.1, epochs=1000): theta = np.zeros(X.shape[1]) m = X.shape[0] for _ in range(epochs): p = sigmoid(X @ theta) # 预测为正类的概率 grad = (1.0 / m) * (X.T @ (p - y)) # 负对数似然对 θ 的梯度 theta -= lr * grad # 梯度下降更新 return theta # 玩具数据:两个特征,标签取 0/1 X = np.array([[1, 1.2, 0.8], [1, 0.3, 1.5], [1, 2.0, 1.8], [1, 1.8, 0.2], [1, 0.5, 0.4]], dtype=float) y = np.array([1, 0, 1, 1, 0], dtype=float) theta = logistic_gd(X, y) print("theta:", theta) print("概率:", sigmoid(X @ theta)) # 大于 0.5 判为正类

逻辑说明:sigmoid 用 np.where 分支是为了数值稳定,z 很负时直接算 exp(-z) 会溢出;梯度 (p−y) 的形式来自负对数似然求导,和线性回归的残差形式长得像但不是一回事。参数说明:lr 在这组小数据上 0.1 够用,特征量纲差异大时要先标准化;epochs 看概率是否稳定,不要固定写死。

4.4 Softmax 多分类:把二分类的式子推广

多分类时把 sigmoid 换成 softmax:p(y=k|x) = exp(θₖᵀx) / Σⱼexp(θⱼᵀx),每个类一个参数向量,输出是各类的概率分布,和为 1。损失换成交叉熵,梯度形式仍然是“预测概率减标签”的推广。报告里不必推完整矩阵形式,把“二分类是 K=2 的特例”这句话讲清就够,听众能顺着 sigmoid 理解 softmax 的归一化思路。

参数更新时注意 softmax 的参数冗余:所有 θₖ 同时加一个常数,概率不变,所以实际实现里常固定一个类的参数为 0,或者加正则项。这个细节放在备注里,答辩问到能答上来即可,不用占正页。

5. 报告里最容易翻车的五个地方:逐一排查

这一章是按“现象 → 原因 → 解决”整理的排查清单,都是演示现场真会遇到的。

5.1 数据与推导层面的三个坑

现象一:正规方程算出的系数是几万、几十万,但预测值看着还行。原因是特征量纲差太多,工资几千、年龄几十,XᵀX 条件数极差,求逆放大了误差。解决办法是求解前做标准化,报告里同时给标准化前后的系数对照,并说明系数不能跨特征比大小。如果坚持用原始量纲,就改用 lstsq,别用 inv。

现象二:把“误差服从高斯”讲成“数据服从高斯”。原因是推导页只写了 ε ~ N(0,σ²),没有解释这三条假设对应的现实含义,听众自然串了。解决办法是在假设页加一句“假设的是预测偏差的分布,不是特征或标签的分布”,再补一句“如果误差是拉普拉斯分布,推出来的就是绝对值损失”,用反例把边界划清。

现象三:似然函数那页乘法符号和求和符号混用,推导中途断链。原因是 PPT 排版时把 ∏ 和 Σ 贴反,或者取对数那一步没写“单调性不变”。解决办法是每一步只写一个式子,旁边用一句话说明“这一步做了什么”,取对数那页明确写“对数函数单调递增,最大化 ℓ 等价于最大化 L”。推导页宁可多一页,也别一页塞五步。

5.2 训练与评估层面的两个坑

现象四:梯度下降的损失曲线先降后炸,最后出现 NaN。原因九成是学习率太大,或者忘了标准化,特征尺度大导致梯度爆炸。解决办法是先按 3.4 节的表把学习率降到 0.001 量级试跑,确认曲线单调下降后再逐步放大;同时检查标准化是否只对训练集拟合、对验证集复用同一组均值和方差。报告里可以把“炸掉的曲线”和“正常曲线”并排放,比只放正常曲线更有说服力。

现象五:R² 在训练集上 0.99,测试集上是负数,台上还在说“拟合很好”。原因是用训练集指标当最终结论,样本又少,模型把噪声也记住了。解决办法是划分训练/验证集,报告里同时给两个数;样本极少时至少做留一交叉验证,并说明“小样本下指标波动大,结论只作参考”。如果 R² 为负,别藏着,直接解释“比均值基线还差,说明特征或划分有问题”,这比硬圆更可信。

6. 让推导页经得起追问:三个验证动作与一个演示脚本

推导讲完、代码跑通,还差最后一步:证明你写的公式和调包的结果对得上。我一般会做三个验证动作。第一,用闭式解和梯度下降对拍,两者参数接近才算实现正确;第二,用现成库的线性回归对拍手写正规方程,系数和截距都要对;第三,把损失曲线和 R² 一起看,曲线收敛但 R² 很低,说明特征本身解释力不够,不是优化没做好。

import numpy as np from sklearn.linear_model import LinearRegression X_raw = np.array([[4000, 25], [8000, 30], [5000, 28], [7500, 33], [12000, 40]], dtype=float) y = np.array([20000, 70000, 35000, 50000, 85000], dtype=float) # 手写正规方程:补 1 后求解 X = np.hstack([np.ones((X_raw.shape[0], 1)), X_raw]) theta_manual = np.linalg.lstsq(X, y, rcond=None)[0] # 现成库:自动处理截距,系数顺序与 X_raw 的列一致 model = LinearRegression().fit(X_raw, y) print("手写:", theta_manual) print("库 :", model.intercept_, model.coef_)

这段脚本放在报告附录或演示末尾,作用是自证。参数说明:lstsq 的 rcond=None 用默认截断;LinearRegression 默认 fit_intercept=True,所以对比时要把手写的 θ0 和库的 intercept_ 对上,θ1、θ2 和 coef_ 对上,顺序别弄反。

还有一个演示技巧:把标准化后的系数换算回原始量纲再讲影响大小。标准化系数可以直接比大小,原始系数不行,这个区别在答辩时经常被问。换算公式不复杂,但报告里给一句“系数比较请在标准化后进行”就够,细节留备注。

从那以后我每次带人做这类报告,都强制先跑一遍闭式解和梯度下降的对拍,再上讲台,因为台下问的第一个问题往往不是推导,而是“你这个数是真的吗”。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表