简介:机器学习期末复习题及答案合集,涵盖单选、多选、名词解释、简答和编程五大题型,面向高校机器学习课程学生的期末备考需求,可快速定位核心知识点,适合考前冲刺和日常自测。文档为Word格式,压缩包共1个文件,约20KB,内容紧凑,便于打印或线上对照复习。资料覆盖监督学习、无监督学习及主流算法原理,涉及K近邻、朴素贝叶斯、线性回归、支持向量机、决策树、聚类分析、神经网络等核心考点,同时配有数据清洗、欠拟合与过拟合、模型性能评估等基础概念解析。编程题给出了基于Sklearn的线性回归与K近邻算法实现步骤,帮助读者理解从导库、建模、训练到预测评价的完整流程,适合备考相关考试或面试前快速回顾与查漏补缺,也可用于教师备课参考或学生知识自测。目前已有13128人学习下载,实用性经过较多用户检验,是一份性价比较高的复习材料。
1. 机器学习期末复习题:为什么刷完答案你还是不敢上考场
期末前两周,很多同学抱着一套机器学习期末复习题,从第一题看到最后一题,边看答案边点头,合上书却一片空白。真正坐到考场上,题目只是把训练集换了一组数字,把"分类"换成"回归",立刻就不知道该写哪一步。这不是努力不够,而是把复习题用反了:它本来是校准推理链的工具,却被当成了背诵材料。
下面这套复习方法讲的是怎么围绕复习题和答案做有效备考:先按题型拆考点,再把答案当步骤回放,然后用手写代码验证推导,最后用一套模拟卷检验自己。你会发现,刷题数量根本不重要,能把一道题从题干到结论完整推三遍,比背二十道答案都管用。
适合三类人:期末考前想系统过一遍的在校生,准备转行笔试的从业者,以及平时把机器学习当调包工具、一到推导题就发怵的同学。
2. 先画题型地图再刷题:期末复习题的三类出题套路与应答框架
我拿到一套复习题,第一件事不是做题,而是先做一次"题型标注":用不同颜色的下划线把题目分成概念辨析、公式推导、计算题三类,然后数一数各自占比。这个动作看似有点玄学,实际直接决定复习时间分配:如果推导题占了四成,只背结论肯定不够;如果概念题是大头,你花三天刷复杂推导也会翻车。
复习题本质上是给知识骨架做校验的题目集合,不是按章节排列的教材。所以做之前先建一张"题型-考点"映射表,把每一类题对应到具体考点和应答材料,后续所有复习动作都围绕这张表展开。
| 题型 | 常考考点 | 应答核心材料 | 优先级 |
|---|---|---|---|
| 概念辨析 | 正则化、生成/判别模型、Bagging/Boosting、偏差/方差 | 一句话定义 + 2~3个比较维度 | 高 |
| 公式推导 | 最小二乘/正规方程、梯度下降、朴素贝叶斯后验 | 目标函数 → 求导 → 更新式 → 条件说明 | 高 |
| 计算题 | 后验概率、熵、KNN距离、回归数值 | 分步代数 + 结论句 | 高 |
| 简答题 | 过拟合、正则化、评估指标 | 定义 + 因果 + 场景 + 结论 | 中 |
| 编程题 | 数据划分、训练、评估 | 最小骨架代码 + 能解释参数 | 中 |
先说说三种最常见的核心题型,简答和编程题放在后面两章单独处理。
2.1 概念辨析题:先定位"比较维度"再下笔
概念辨析是期末卷里最便宜也最冤枉的题型。出题模式一般是:给两个容易混淆的模型或术语,要求说明区别,并判断各自适用场景。常见配对有 L1 正则与 L2 正则、生成模型与判别模型、Bagging 与 Boosting、偏差与方差、欠拟合与过拟合。
这类题最忌讳想到哪写到哪。我给学生定死一个答题套路:先各写一句话定义,把目标函数或核心思想写出来;再按四个固定维度做对比——目标函数/损失、求解方式、典型应用场景、超参数敏感性;最后落一句"因此在XX情境下更适合用XX"。以 L1 正则和 L2 正则为例,答题时至少要覆盖下面这张表的全部内容:
| 比较维度 | L1正则 | L2正则 | 答题落脚点 |
|---|---|---|---|
| 惩罚项形式 | λ∑|w_i| | λ∑w_i² | 先写公式再谈效果 |
| 解的形态 | 稀疏,含0分量 | 整体收缩,一般不为0 | 由罚函数在0处有不可导角点导致 |
| 主要用途 | 特征选择、高维稀疏场景 | 缓解共线性、防止过拟合 | 要结合题目给的数据规模与特征数量 |
| 超参数敏感性 | λ增大时稀疏性增强 | λ增大时权重整体变小 | 必须说明"惩罚强度越大"的后果 |
答题时还要注意:判断题里的常见误导选项,基本就是把 A 模型的应用场景安到 B 模型头上。比如问"为什么 L1 能产生稀疏解",如果你只写"因为 L1 更稀疏",那是循环论证,拿不到过程分;正确的因果链是:L1 正则项在零处存在不可导的角点,优化时参数更容易被压到精确的零,所以解是稀疏的。这个概念辨析题的答案,背下来的永远不如推出来的稳。
2.2 公式推导题:把推导过程拆成四步拿满步骤分
推导题是最能拉开差距的题型,也是复习题里"答案篇幅最长"的部分。高频推导目标就那么几个:最小二乘/正规方程、梯度下降更新式的来源、朴素贝叶斯后验推导、逻辑回归的对数似然求梯度。这类题阅卷看过程不看答案,我建议不管题目怎么问,都按四步写:
第一步,明确求解目标。先写一句"求解使损失函数 L(w) 最小的 w",而不是上来就贴公式。这句话帮你自己锚定方向,也告诉阅卷人你知道自己在干什么。
第二步,写出目标函数与记号。把损失函数展开到最具体的形式,例如线性回归的 L(w) = (1/2)∑(y_i - x_iᵀw)²。这里记号必须和题干一致:n 是样本数,d 是特征数,y_i 是第 i 个样本的观测值。很多同学在推导题上丢分,不是不会求导,而是符号定义写混了。
第三步,对参数求导并令其为零。求导过程至少要保留一行中间式子,比如 ∇L = -∑x_i(y_i - x_iᵀw),然后令梯度为零。这一步正是正规方程的来源,也是参考答案里最常被"化简得"三个字带过的部分。
第四步,解算与条件说明。推出 w* = (XᵀX)⁻¹Xᵀy 之后,一定要补边界条件:要求 XᵀX 可逆;如果数据是 n<d 的稀疏高维情形,需要加正则项或使用伪逆。这句话在卷面上往往是隐藏得分点。
我的习惯是:每个变形步骤前面都写上自己用了什么操作。比如"对上式关于 w 求导,并令偏导数为零"——这句话本身就值两分。参考答案里出现"化简得"三个字时,它可能夹带了三步运算,你把缺掉的中间式子在自己的草稿纸补出来,这道题才算真正过了一遍。
2.3 计算题:同一道朴素贝叶斯题,这样写才有过程分
计算题是复习题里最接近"可抄作业"的部分,但大家常犯的错误是跳步。拿一个我常用来练手的极小例子说明,假设二分类问题:类别 C ∈ {买, 不买},特征只有两个——X1 = 天气 ∈ {晴, 雨},X2 = 交通 ∈ {好, 堵}。训练集统计结果如下:P(买)=0.4,P(不买)=0.6;P(晴|买)=0.75,P(好|买)=0.5;P(晴|不买)=1/6,P(好|不买)=4/6。现在来了一条新样本 (晴, 好),问它应该被分到哪一类。
标准答题过程应该这样写:先写"由朴素贝叶斯假设,特征在给定类别下条件独立,所以后验可写成 P(C|晴,好) ∝ P(C)·P(晴|C)·P(好|C)";再逐项代入——类别为"买"时,0.4×0.75×0.5 = 0.15;类别为"不买"时,0.6×(1/6)×(4/6) ≈ 0.0667;最后比较大小,0.15 大于 0.0667,所以判为"买"。
关键在第四步的措辞:因为比较时两边分母 P(晴,好) 相同,可以直接比较未归一化的数值,所以用 ∝ 而不是等号。这句话解释了为什么可以不写分母,正是过程分的来源。下面这张得分点表,基本就是阅卷视角:
| 步骤 | 采分点 | 常见扣分原因 |
|---|---|---|
| 条件独立假设 | 写出"由朴素贝叶斯假设" | 直接写连乘,不交代由来 |
| 先验与条件概率 | 每个数值都有出处 | 用 P(晴) 代替 P(晴|C) |
| 逐项代入计算 | 保留乘法中间式 | 只写结果不写式子 |
| 比较与结论 | 明确写出"故判为买" | 只给数字不给结论 |
| 分母说明 | 解释 ∝ 与省略分母的原因 | 不知道分子分母谁是谁 |
再补一个边界坑:真实数据里经常出现某个条件概率为 0 的情况,比如样本中"堵"只出现在"不买"类别里,那么 P(堵|买)=0,连乘直接归零。考试题如果明确说"使用拉普拉斯平滑",就按分子加 1、分母加类别取值数重算;如果题目没提,不要自作主张平滑,先按原始概率算,再在结论末尾补一句"若加入拉普拉斯平滑,结果会变,但分类结论不受影响"。这种补充句往往是阅卷人眼中"你确实懂,而不是背答案"的信号。
3. 把答案当步骤回放:读懂一道机器学习复习题的三个关键动作
复习题的答案不是用来"对"的,是用来"回放"的。一道好答案本身就是一次完整的推理:从题干假设出发,经过目标函数、求导、化简,最后得到结论。读答案时要做的不是点头,而是按三个动作把它拆开——找隐含假设、追公式来路、用代码验算结果。这三个动作做完,你记住的不再是一个孤立答案,而是一条可迁移的推理链。
3.1 找隐含假设:题目没说但你默认的东西
机器学习题的答案里藏着大量隐含假设,最常见的有几类:线性回归的推导默认误差独立同分布、特征已经做过预处理;朴素贝叶斯默认特征条件独立;正规方程的推导默认设计矩阵满秩;逻辑回归默认使用最大似然估计。这些假设决定了答案中每一步公式的成立范围。
读答案时,把"由题意""不失一般性""令""设"这些词全部圈出来,每圈一处就追问一句:如果这个假设不成立,答案的哪一步会崩。举个例子,答案写出 w* = (XᵀX)⁻¹Xᵀy,它就默认了 X 是列满秩的;如果题目给的是 n<d 的高维数据,这个结论就不能直接用,而要考虑岭回归或伪逆。想通这一层,这道题的边界条件就不再是死记硬背。
我习惯让备考的同学做一个"题干措辞-依赖假设"的对照表:左边写题目原文,右边写答案依赖的假设。题干说"样本独立同分布",右边对应"损失函数可写成各样本损失之和";题干说"特征已经标准化",右边对应"梯度下降收敛速度不会被大尺度特征拖累"。这张表直接写在笔记本页边,考前翻一遍,比重新看一遍答案效率高得多。
3.2 追公式来路:把"化简得"中间的步骤补出来
参考答案最常见的写法是跳步。两行公式之间夹着一个"化简得",这一步可能含了转置、乘开、令梯度为零三个操作。顺着读答案,你只看到结论;逆着追公式,才能看到思路。我的复盘方法分四步:在答案的每个"化简得""代入得""因此"处画一条竖线,把相邻两式隔开;尝试自己补完竖线中间的变形;补不出来的在旁边标注"待复习点",写进错题清单;第二天不看答案,把竖线两侧的式子摆出来再补一遍。
这个动作比多刷三道题更值钱,因为它逼迫你把求导、转置、矩阵乘这些基本操作放到真实场景里反复练。另一个建议是"符号对齐":答案里出现 X、w、y 时,先确认它们在题目里的形状,X 是 (n,d) 还是 (d,n),w 是列向量还是行向量。很多推导题明明会,一到线性代数变形就错,原因就是符号方向没有对齐。复习时把每个题目的第一个式子写成"维度标注版",比如 X:(100,5)、w:(5,1),能省掉大量低级错误。
3.3 用代码验算一道计算题:把参考答案变成可复现的数值
计算题光用笔算,容易在约分和正负号上翻车。我一般建议把典型计算题写成一个小脚本,让结果自己说话。下面是用 numpy 验算上一章朴素贝叶斯例题的代码:
import numpy as np # 先验概率:P(买) = 0.4, P(不买) = 0.6 prior = np.array([0.4, 0.6]) # 条件概率矩阵,每一行对应一个类别: # 第0行“买”:P(晴|买)=0.75, P(好|买)=0.5 # 第1行“不买”:P(晴|不买)=1/6, P(好|不买)=4/6 cond = np.array([ [3/4, 1/2], [1/6, 4/6] ]) # 未归一化的后验:P(C) * P(x1|C) * P(x2|C) unnorm = prior * cond[:, 0] * cond[:, 1] # 归一化得到真正的后验概率 posterior = unnorm / unnorm.sum() print(posterior) # 输出约 [0.69, 0.31]这段代码的输入只有两个变量:prior 是每个类别的先验概率,cond 是一个二维数组,行对应类别、列对应特征的条件概率。第 12 行把先验和两个特征条件概率逐项相乘,得到未归一化的后验;第 15 行除以总和完成归一化。运行结果里"买"的后验约 0.69,"不买"约 0.31,分类结论是"买"。
注意:如果你手算得到 0.15 与 0.0667,并不矛盾。0.15 是"正比于"的数值,标准的后验概率必须归一化。比较类别大小可以直接用 0.15 对 0.0667,但如果题目问"后验概率是多少",就必须归一化之后再回答。参数方面,改题目数据时只需修改 prior 和 cond 两个变量;如果用了拉普拉斯平滑,要在条件概率上先做分子加 1、分母加类别取值数,然后再放进 cond,而不是在最后的连乘结果上加平滑——这是最容易踩的隐藏坑。
代码结果和参考答案不一致时,先别怀疑模型,按顺序查四项:先查 prior 有没有写反;再查 cond 的每一行是不是对应了正确的类别;然后查是不是在条件概率层面加了平滑而答案预设的是原始频率;最后查归一化有没有漏分母。九成不一致都出在这四个地方,剩下那一成是参考答案本身跳了步或采用了不同定义,这时候以推导过程为纲,不要为数字大小吵架。
4. 编程题复习策略:用最小代码把每个模型走一遍
期末卷的最后一题经常是编程题,或者给一段训练结果让你判断哪里写错了。编程题复习最忌讳背代码——代码背得再熟,改一行超参数就懵。我的做法是把核心模型的骨架代码亲手打一遍,让手、眼睛和推导公式三者对上。这一章用线性回归做例子,讲手写核心逻辑、改参数看变化、搭最小验算环境三个习惯。
4.1 手写梯度下降:调包看不见的损失、梯度与更新式
import numpy as np def linreg_gd(X, y, lr=0.01, epochs=200): # X 已包含偏置列,形状 (n, d);y 形状 (n,) # lr 是学习率,epochs 是最大迭代轮数 w = np.zeros(X.shape[1]) # 权重初始化为全零 for epoch in range(epochs): pred = X @ w # 当前预测值 grad = X.T @ (pred - y) / X.shape[0] # 均方损失对 w 的梯度 w = w - lr * grad # 沿负梯度方向更新 # loss = np.mean((pred - y) ** 2) # print(epoch, loss) # 需要观察收敛时打开 return w第 4 行把权重初始化为全零向量。第 6 行是当前预测值,X @ w 是矩阵乘,得到每个样本的预测标量。第 7 行是梯度计算:pred - y 是残差向量,左乘 X.T 相当于对每个特征求"残差与该特征值的乘积和",再除以样本数 n,目的是让梯度尺度不随数据量膨胀。第 8 行按负梯度方向更新权重。第 9 行计算均方损失,用来观察收敛是否正常。
参数方面,lr 太大,损失会振荡甚至发散;lr 太小,收敛极慢。epochs 只要够大到损失不再下降即可,不必追求固定值。还有个容易被期末题盯上的点:如果 X 的某些特征数值特别大,grad 会被大尺度特征主导,更新方向偏向那个特征,这就是"训练前要标准化"的由来。手写一遍梯度下降,你才能把公式里的符号和代码里的行一一对上;调包时看不到这些量,期末只要问梯度推导或归一化原因,就没有东西可写。
4.2 改参数看变化:把复习题从"判断题"变成"实验题"
有一类高频期末题:同一个模型、同样数据,把学习率从 0.1 改成 0.5,损失会怎么变?没跑过实验,只能靠猜。把上一节的代码拿去跑三组参数,打印每次迭代的 loss,你会看到大致三种现象:lr=0.1 时损失平滑下降并收敛;lr=0.5 时前几轮下降很快,但中后段可能出现震荡;lr=1.5 时某轮开始损失跳变,数值异常增大,说明更新步长越过了最优点附近,实际上是发散。
不用记我的描述,亲手跑一遍最重要。期末考想看到的也不是"发散"两个字,而是你能不能说出"更新步长超过损失曲面曲率允许的范围,导致参数越过谷底,损失不降反升"这类因果解释。这个实验做一次,比背十道概念题都管用。我建议再做一个"超参数-现象"对照表,把自己运行的结果填进去:
| 改动内容 | 损失曲线现象 | 对应的答题解释 |
|---|---|---|
| 学习率从0.1调大 | 先快后震荡 | 步长超过局部曲率允许范围 |
| 学习率过大 | 发散,loss爆增 | 参数在负梯度方向上走过头 |
| 某一列特征放大100倍 | 收敛明显变慢 | 梯度被大尺度特征主导 |
| 训练轮数翻倍 | 测试误差回升 | 模型开始记忆噪声,即过拟合 |
这张表在考前 15 分钟翻一遍,比临时翻书有用得多。做实验时记得固定随机种子,否则每次运行的数据不同,观察到的现象会掺入噪声,干扰判断。
4.3 搭一个最小验算环境:临考前的半小时回顾
考前半小时不适合再看推导细节,适合跑一个最小流程,把"加载数据、划分、训练、评估"的调用链过一遍。我平时复习用下面这段骨架代码:
from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score X, y = make_regression(n_samples=200, n_features=4, noise=10, random_state=42) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42) model = LinearRegression().fit(X_train, y_train) y_pred = model.predict(X_test) print(r2_score(y_test, y_pred))make_regression 生成一个线性回归模拟数据集,n_samples=200 表示 200 个样本,n_features=4 表示 4 个特征,noise=10 给目标值叠加噪声。train_test_split 按 8:2 划分数据,test_size=0.2 就是留 20% 做验证。模型在训练集上拟合,再对测试集预测,最后输出 R2 分数。
random_state=42 固定随机种子,保证每次运行拿到同一份数据,这是结果可复现的关键;如果去掉它,每次 R2 都会略有波动。你可以把 noise 从 10 改成 50,R2 会明显下降,这个观察正好对应复习题里"噪声越大模型性能越差"的概念题。这段代码的价值是让你熟悉评估流程,不是让你用调包替代推导。真正上考场时,推导是得分主体,编程部分只负责验证思路,两者缺一不可。
5. 避坑:刷机器学习复习题常踩的5个陷阱
刷复习题最典型的翻车不是题太难,而是方法一开始就错了。下面五个坑,来问我的备考者几乎每年都会踩进去几个。每个坑我都按"现象→原因→解决"写,对着看看你有没有中招。
5.1 背答案不背推理链
现象:对着答案能把每一步顺利复述,考试时题干的已知条件换个顺序,就不知道该从哪个公式切入。原因:人脑对"看过很多遍的完整链条"会产生熟悉感,但这种熟悉感属于再认,不是提取。考试要求你从空白状态出发,把推理链一步步写出来,再认能力强不等于提取能力强。解决:把每道复习题至少做三遍。第一遍闭卷推,卡住就看答案;第二遍合上答案,从题干重新写到结论,允许慢但不允许照抄;第三遍只写关键跳步的依据,比如"为什么这里能用 ∝"或"为什么求导后要令其为零"。三遍之后,这道题才算真正属于你。
5.2 只刷客观题,跳过推导和简答
现象:选择题判断题刷了一大堆,正确率很高,一碰到推导题和简答题就大面积空题。原因:客观题只训练识别和排除,不需要你组织因果链,它给出的正反馈会让人误以为"我全会了",实际只是"我全都能认出"。解决:给自己定一个硬规定——每天至少手写 2 道计算或推导题、1 道简答题,写在纸上,不要只在脑子里过。手写不是为了字迹好看,而是强迫你决定先写哪一步、后写哪一步,这是考场上最稀缺的能力。
5.3 只看答案数字,不看答案措辞结构
现象:简答题对答案时只盯结论字眼,比如"因此应采用 L2 正则",觉得懂了;考试把背景换成逻辑回归,就不会组织答案。原因:没意识到参考答案实际上是"四段结构"——先定义术语,再讲原因,再给适用场景,最后落到结论。你只记住了最后一段,而前三段才是得分大头。解决:每道简答题的标准答案,用四种标记拆开:定义下划线、因果链括号、场景句画框、结论句圈出来。复习时先背结构再背内容,答题时也按这个顺序写。结构对了,即使个别措辞不精确,阅卷人也更容易给过程分。
5.4 忽略题目里的符号定义和默认条件
现象:把公式里的 λ 当成正则系数,结果这道题里 λ 是拉格朗日乘子;把 C 当成类别数,实际 C 是逻辑回归的正则项系数。一整道推导全错在符号上。原因:做题时默认答案使用的符号和你记忆一致,但不同教材对同一概念的表达习惯不一样,有的写 λ∑‖w‖²,有的写 (1/2λ)∑w²,含义完全不同。解决:每道题动笔前先写"符号表":把题干里出现的每个数学符号、形状、取值范围列出来,符号含糊就在旁边标注"此处按……理解"。写完符号表再碰题目本身,推导题的正确率会立刻上一个台阶。
5.5 用刷题数量掩盖知识骨架缺失
现象:同一个知识点换个包装就不会,只能不停刷同类题找安全感,考卷一出新题就崩。原因:题目是给知识骨架做校验的,不是让人从零拼骨架的。刷题是"以点带点",覆盖面永远追不上出题人换包装的速度。解决:考前一周先花一小时画一张考点骨架图——中心写"机器学习",分出监督/无监督、回归/分类、生成/判别、参数/非参数、优化/评估五个分支,再往分支下挂具体模型和核心公式。每做完一道复习题,就在对应节点上打个勾;到考前,骨架图上空白的节点就是你的复习优先级,比盲目刷题高效得多。
6. 把复习题变成一次限时自测:组卷比例、时间分配与错题分诊
复习题刷到最后,一定要组一套模拟卷自测一次。我习惯从手头题库里抽题,按概念辨析 30%、计算与推导 40%、简答与综合 30% 的比例组成一套 100 分卷。比例不是死规则,先看你课程期末真卷的题型分布;没有真卷就按这个默认比例来。抽题时要打乱顺序混着抽,不要分类连着做,否则等于开卷。
时间分配用"分值等于分钟"的粗估法:100 分钟满分 100 分,那概念题 20 分钟、计算与推导 40 分钟、简答 30 分钟、检查 10 分钟。自测开始后不看答案、不翻书,模拟真实考场状态;单道题卡壳超过 3 分钟就先跳过,全部做完再回头处理。
交卷后对答案,把错题分成三诊处理。A诊是计算错误,比如符号抄错、约分错、数值算错,重算一遍就好,不需要投入更多时间。B诊是概念断点,某个术语或因果链没有真正理解,回到第 2 章的题型地图,把对应节点标红再复习。C诊是过程缺失,结果对了但步骤跳步、缺依据,这类题要按推导四步框架重新完整写一遍,不要只看一眼答案就翻篇。
我自己早年备考时也犯过同样的错:把复习题答案背得滚瓜烂熟,结果模拟卷只换了一个特征列,我在考场前十分钟完全不知道该从哪下笔。后来把方法改成"先自己写完过程,再对照答案",从结果导向换成过程导向,分数才稳下来。如果你现在正抱着复习题焦虑,与其多刷十道新题,不如把一道错题完整地推三遍。希望帮到你。
本文还有配套的精品资源,点击获取