简介:这份《机器学习期末复习题.pdf》面向高校学生与备考机器学习课程的读者,用于系统梳理期末考点、检验知识掌握程度。内容覆盖监督学习与无监督学习、概率分布与共轭先验、朴素贝叶斯分类器、决策函数、线性分类方法、支持向量机、集成学习、决策树、过拟合与正则化等核心章节,题型以单选为主,并配有解析思路,便于对照复习。资源包共1个文件,为PDF格式,大小约4.83MB,结构紧凑,适合打印或平板阅读。目前已有13523人学习下载,热度较高。读者可借助题库快速定位薄弱知识点,理解SVM核函数与软间隔参数、Bagging与Boosting差异、决策树划分指标、KL散度与密度聚类等易错内容,适合期末冲刺与查漏补缺。
1. 从一份 85 题单选加 40 题多选的题库说起:这份机器学习期末复习题到底怎么用
期末前一周,实验室里最常见的场景是:几个人围着一份 PDF 题库,从第一题开始往下刷,刷到 SVM 那几题开始卡壳,翻回教材又找不到对应章节,最后干脆背答案。这份《机器学习期末复习题.pdf》就是典型的这种材料——85 道单选题、40 道多选题、12 道简答题,覆盖监督与无监督学习、贝叶斯决策、线性分类、SVM、集成学习、聚类、降维、神经网络、概率图模型这些机器学习课程的核心考点。它不教你从零推导公式,但能帮你快速定位「哪个知识点我其实没搞懂」。适合两类人:一是期末冲刺想查漏补缺的,二是面试前想快速过一遍基础概念的。关键在于别把它当背诵材料,而是当诊断工具用。
2. 把题库拆成知识模块:从监督/无监督到概率图模型的映射方法
2.1 先做一次模块归类,别按题号顺序刷
拿到题库直接从头做到尾,效率其实很低。原因是题目顺序并不完全按知识模块排列,中间会穿插不同章节的内容。我一般会先按考点把题目归到几个大类里,再逐类攻克。这份题库大致可以分成下面这些模块:
| 模块 | 涉及题号(单选) | 核心考点 |
|---|---|---|
| 学习范式分类 | 1, 2, 67, 84 | 监督 vs 无监督 vs 分类 vs 聚类 |
| 概率分布与贝叶斯 | 3, 4, 5, 6, 7, 69 | 共轭分布、朴素贝叶斯、决策函数 |
| 线性分类与回归 | 8, 9, 10, 11, 12, 29, 30, 31 | 感知机、Logistic、LDA、正则化 |
| SVM | 13, 14, 15, 16, 17, 18, 26, 27, 65 | 最大间隔、对偶、核函数、软间隔 |
| 决策树与集成学习 | 19, 20, 21, 22, 23, 24, 25, 53, 70, 72 | 信息增益、Bagging、Boosting、随机森林 |
| 聚类 | 34, 35, 58, 82 | K-Means、密度聚类、GMM、EM |
| 降维与特征选择 | 36, 37, 63, 74 | PCA、LDA、SVD、特征选择 |
| 神经网络与深度学习 | 41, 47, 51, 52, 54, 55, 57, 60, 61, 62, 64, 79, 80, 81 | 激活函数、梯度下降、CNN、RNN、GRU/LSTM |
| 概率图模型 | 39, 40, 44, 45, 75, 77 | 马尔可夫毯、HMM、维特比算法 |
| 模型评估与过拟合 | 38, 48, 49, 50, 59, 66, 73 | 偏差方差、正则化、Precision/Recall |
归类之后你会发现,SVM 和神经网络这两块题目最多,也最容易出错。先集中火力把这两块吃透,再去处理其他模块,整体效率会高很多。
2.2 用错题反查知识盲区,而不是直接看答案
归类完之后,我的做法是先做一遍,但做的时候不翻答案,把不确定的题目标记出来。做完之后统计每个模块的错误率,错误率高的模块就是需要重点复习的。比如你在 SVM 那块错了 5 题以上,说明对偶问题和核函数的理解还不到位,这时候应该回去翻教材对应的推导,而不是把答案背下来。
具体操作上,可以用一个简单的表格来跟踪:
# 错题追踪表:按模块统计错误率 modules = { "SVM": {"total": 9, "wrong": 0}, "神经网络": {"total": 14, "wrong": 0}, "集成学习": {"total": 10, "wrong": 0}, "聚类": {"total": 4, "wrong": 0}, "概率图模型": {"total": 6, "wrong": 0}, } # 做完一遍后填入错误数,计算错误率 for name, info in modules.items(): rate = info["wrong"] / info["total"] * 100 print(f"{name}: 错误率 {rate:.1f}%")这段代码没什么技术含量,但它的作用是让你把注意力放在「哪个模块弱」而不是「哪道题对了」。错误率超过 30% 的模块,建议先看教材对应章节,再回来重做。
2.3 多选题是区分度最高的部分,别跳过
很多人刷题只做单选,多选题直接跳过。但从这份题库来看,多选题覆盖的知识点更综合,比如第 32 题考各算法的损失函数对应关系,第 33 题考正则化的多种形式,第 40 题考 Bagging 和 Boosting 在偏差方差上的区别。这些题目如果只靠单选的知识点去应付,很容易漏选。
我的建议是多选题至少做两遍。第一遍按直觉选,第二遍对照教材确认每个选项为什么对、为什么错。比如第 22 题问 SVM 欠拟合时怎么改进,答案是增大 C 和增大 gamma,这两个参数的方向如果记反了,考试时就会丢分。
3. 高频考点逐个拆:SVM 对偶、K-Means 迭代与 CNN 参数计算的手算流程
3.1 SVM 对偶问题与支持向量的判定
题库里第 13 到 18 题、第 26、27、65 题都是 SVM 相关。核心考点有三个:最大间隔分类的几何意义、对偶问题的形式、支持向量的定义。
以第 65 题为例:两个样本点,正样本 (0, -1),负样本 (2, 3),求线性 SVM 的分类面方程。这道题需要手算。步骤是这样的:
import numpy as np # 正样本 x1 = (0, -1), 标签 y1 = +1 # 负样本 x2 = (2, 3), 标签 y2 = -1 x1 = np.array([0, -1]) x2 = np.array([2, 3]) y1, y2 = 1, -1 # 对于线性 SVM,决策面 w^T x + b = 0 # 支持向量满足 y_i (w^T x_i + b) = 1 # 两点的中点在分类面上:w^T (x1+x2)/2 + b = 0 # 且 w 方向与 (x1 - x2) 平行 # 计算 w 的方向 w = x1 - x2 # 或者 x2 - x1,方向相反但分类面相同 print("w 方向:", w) # [-2, -4] # 归一化后 w = (-1, -2) 或 (1, 2) # 代入支持向量条件求 b # 取 w = (-1, -2),则 w^T x1 + b = 1 => 0 + 2 + b = 1 => b = -1 # 验证:w^T x2 + b = -2 - 6 - 1 = -9,不满足 -1 的条件 # 需要重新缩放 # 正确做法:设 w = (a, b),满足 # w^T x1 + b = 1 => -b + b = 1 (这里变量名冲突,换符号) # 设 w = (w1, w2) # w1*0 + w2*(-1) + b0 = 1 => -w2 + b0 = 1 # w1*2 + w2*3 + b0 = -1 => 2*w1 + 3*w2 + b0 = -1 # 且 w1/w2 = (0-2)/(-1-3) = -2/-4 = 1/2 => w2 = 2*w1 # 代入:-2*w1 + b0 = 1 # 2*w1 + 6*w1 + b0 = -1 => 8*w1 + b0 = -1 # 两式相减:10*w1 = -2 => w1 = -0.2, w2 = -0.4, b0 = 1 + 2*(-0.2) = 0.6 # 乘以 -5 化简:w = (1, 2), b = -3 # 分类面:x + 2y - 3 = 0 print("分类面方程: x + 2y = 3")这段推导的关键在于:两个样本点恰好都是支持向量,所以它们都满足 ( y_i(w^T x_i + b) = 1 )。再加上 ( w ) 的方向与两点连线平行,三个方程解三个未知数。最终答案是 ( x + 2y = 3 ),对应选项 C。
参数说明:这里的 ( w ) 是法向量,决定分类面的方向;( b ) 是偏置,决定分类面的位置。支持向量就是恰好落在间隔边界上的点,它们决定了最终的分类面。
3.2 K-Means 手算迭代过程
第 82 题是一道典型的 K-Means 手算题。给定两个初始种子点 A(-1, 1) 和 B(2, 1),其余点有 (0,0)、(0,2)、(1,1)、(3,2)、(6,0)、(6,2),问最终种子点移动次数和各类点数。
手算流程如下:
import numpy as np # 初始种子点 centers = np.array([[-1, 1], [2, 1]]) points = np.array([[0, 0], [0, 2], [1, 1], [3, 2], [6, 0], [6, 2]]) def assign_points(centers, points): """将每个点分配给最近的聚类中心""" labels = [] for p in points: dists = [np.linalg.norm(p - c) for c in centers] labels.append(np.argmin(dists)) return np.array(labels) def update_centers(centers, points, labels): """按坐标平均更新聚类中心""" new_centers = [] for i in range(len(centers)): cluster_points = points[labels == i] if len(cluster_points) > 0: new_centers.append(cluster_points.mean(axis=0)) else: new_centers.append(centers[i]) return np.array(new_centers) # 第一轮迭代 labels = assign_points(centers, points) print("第一轮分配:", labels) new_centers = update_centers(centers, points, labels) print("第一轮新中心:", new_centers) # 继续迭代直到收敛 for iteration in range(10): labels = assign_points(new_centers, points) updated = update_centers(new_centers, points, labels) if np.allclose(updated, new_centers): print(f"第 {iteration+2} 轮收敛") break new_centers = updated print(f"第 {iteration+2} 轮中心:", new_centers) print("最终中心:", new_centers) print("最终分配:", labels)运行这段代码可以验证:种子点 A 移动 2 次,种子点 B 移动 2 次,属于 A 的点有 3 个(不含 A 本身),属于 B 的点有 3 个(不含 B 本身)。答案是 A。
参数说明:K-Means 的核心参数是聚类数 K 和初始中心的选择。初始中心不同,最终结果可能不同,这也是第 58 题强调的「初始值不同,最终结果可能不同」。距离度量默认用欧氏距离,如果换成余弦距离或曼哈顿距离,聚类结果也会变化。
3.3 CNN 卷积层输出尺度与参数量计算
第 11 题(简答题)要求计算卷积层的输出尺度和参数量。输入是 3 个 32×32 的特征图,10 个 5×5 的卷积核,Stride=1,Padding=2。
计算公式:
# 输出尺度公式:H_out = (H_in + 2*pad - kernel_size) / stride + 1 H_in = 32 pad = 2 kernel = 5 stride = 1 H_out = (H_in + 2 * pad - kernel) / stride + 1 print(f"输出尺度: {int(H_out)}x{int(H_out)}") # 32x32 # 参数量公式:(kernel_h * kernel_w * in_channels + 1) * out_channels in_channels = 3 out_channels = 10 params = (kernel * kernel * in_channels + 1) * out_channels print(f"卷积层参数: {params}") # (5*5*3+1)*10 = 760输出尺度是 32×32,因为 padding=2 恰好补偿了 5×5 卷积核带来的尺寸缩减。参数量是 760,其中 5×5×3 是每个卷积核的权重数,加 1 是偏置项,乘以 10 是 10 个卷积核。
这里容易踩的坑是:偏置项不要漏掉。很多人算参数量时只算权重,忘了每个卷积核还有一个偏置参数。另外,如果输入是多通道的,卷积核的深度必须等于输入通道数,这一点在计算时不能搞错。
4. 避坑与排查:题库里那些容易记反、算错、理解偏的考点
4.1 现象:把 L1 和 L2 正则化的效果记反
原因:L1 产生稀疏解、L2 防止过拟合但不会产生稀疏解,这两个结论在选择题里经常互换选项来迷惑人。第 56 题问「哪些正则项会让不少 coefficient 为 0」,答案是 L0-norm 和 L1-norm,不包括 L2-norm。
解决:记住一个直观理解——L1 的约束区域是菱形,顶点在坐标轴上,所以最优解容易落在顶点处,产生稀疏;L2 的约束区域是圆形,没有尖角,所以解不会恰好落在坐标轴上。第 78 题也考了 L1+L2 同时使用的效果:可以做特征选择并一定程度上防止过拟合。
4.2 现象:混淆 Bagging 和 Boosting 的偏差方差特性
原因:第 40 题(多选)问集成学习中哪些说法正确,答案是 Bagging 降低方差、Boosting 降低偏差。很多人记成反过来。
解决:Bagging 是并行训练多个基分类器然后投票,通过平均来降低方差;Boosting 是串行训练,每一步关注前一步分错的样本,通过逐步减小偏差来提升整体性能。第 23 题考 Bagging 的特点(Bootstrap 采样),第 24 题考 Boosting 的特点(分类器按顺序训练、预测时比重不同),这两题的选项设计就是用来区分这两个概念的。
4.3 现象:K-Means 和 K-NN 搞混
原因:名字里都有 K,但一个是聚类(无监督),一个是分类(监督)。第 84 题问「哪个不是分类模型」,答案是 K 均值;第 28 题问 K-NN 在什么情况下效果好,答案是样本较少但典型性较好。
解决:K-Means 是聚类算法,没有标签,目标是找到 K 个簇;K-NN 是分类算法,有标签,根据最近的 K 个邻居来投票决定类别。第 67 题也考了「哪个是无监督学习算法」,答案是 K-Means 聚类。
4.4 现象:SVM 软间隔参数 C 的方向搞反
原因:第 26 题问 C 很小时会怎样,答案是会发生误分类;第 27 题问 C 趋于无穷时会怎样,答案是只要最佳分类超平面存在就能全部正确分类。C 越大,对误分类的惩罚越大,间隔越窄;C 越小,允许更多误分类,间隔越宽。
解决:把 C 理解为「对错误的容忍度」——C 大 = 不容忍错误 = 硬间隔倾向;C 小 = 容忍错误 = 软间隔倾向。第 22 题问 SVM 欠拟合时怎么改进,答案是增大 C 和增大 gamma,因为欠拟合说明模型太简单,需要增大复杂度。
4.5 现象:神经网络激活函数与梯度消失的关系记不清
原因:第 52 题问哪个激活函数会导致梯度消失,答案是 Tanh;第 55 题问哪个引入了非线性,答案是 ReLU;第 64 题问哪个不能做激活函数,答案是 y=2x(线性函数)。
解决:Sigmoid 和 Tanh 在输入较大或较小时梯度趋近于 0,会导致梯度消失;ReLU 在正区间梯度恒为 1,不会消失,但在负区间梯度为 0,可能导致神经元死亡。第 10 题(简答题)也考了梯度消失的原因和解决方案:用 ReLU 替换 Sigmoid。
5. 从刷题到真懂:用简答题反推知识框架的进阶用法
简答题是这份题库里最容易被低估的部分。很多人觉得简答题就是背答案,但其实简答题的答案里包含了完整的推导逻辑,用好了可以帮你把零散的选择题知识点串成体系。
我的做法是:先不看答案,自己写一遍,然后对照答案找差距。比如第 3 题要求手算 K-Means 的迭代过程,如果你能独立算出来,说明对 K-Means 的理解已经到位了;如果算不出来,说明只是记住了「K-Means 是聚类算法」这个结论,但没掌握具体流程。
再比如第 11 题的卷积层计算,如果你能独立写出公式并算出结果,那 CNN 参数计算这块就没问题了。第 12 题问随机森林为什么比决策树 Bagging 快,答案的关键在于「随机森林只需随机考察一个属性子集」,这个点在选择题第 53 题里也有对应——增加决策树深度可能导致过拟合,但增加树的数量不会。
下面这张表是我整理的简答题与选择题的对应关系,可以用来交叉验证:
| 简答题 | 对应选择题 | 核心知识点 |
|---|---|---|
| 第 1 题 LDA 分类思想 | 第 12 题 | 类内距离最小、类间距离最大 |
| 第 2 题 SVM 对噪声敏感 | 第 16 题 | 支持向量决定决策边界 |
| 第 3 题 K-Means 手算 | 第 82 题 | 迭代过程与收敛条件 |
| 第 5 题 标准化处理 | 第 9 题、第 71 题 | 树模型不需要归一化 |
| 第 9 题 学习率影响 | 第 47 题 | 梯度下降步骤 |
| 第 10 题 梯度消失 | 第 52 题 | Tanh 导致梯度消失 |
| 第 11 题 CNN 参数计算 | 第 57 题、第 60 题 | 卷积核与特征图 |
| 第 12 题 随机森林速度 | 第 25 题、第 53 题 | Bagging 与随机森林 |
最后说一个我自己的习惯:每次复习完一个模块,我会合上题库,拿一张白纸,把这个模块的核心概念、公式、典型算法流程默写一遍。写不出来的地方就是没真正掌握的地方。这份题库的价值不在于题目本身,而在于它能帮你快速定位到那些「以为自己会了但其实不会」的知识点。从那以后我每次复习任何一门课,都强制走一遍「归类 → 做题 → 反查 → 默写」这个流程,比单纯刷题效率高得多。希望帮到你。
本文还有配套的精品资源,点击获取