简介:这份电子科技大学机器学习期末考试资料面向正在备考机器学习课程的高校学生,尤其适合需要系统梳理考点、查漏补缺的复习者。内容覆盖梯度下降、模型评估与交叉验证、过拟合、线性回归、决策树、朴素贝叶斯、MP模型、K-means、PCA、SVM、CNN等核心知识点,并整理了简答题与计算题等典型考题方向,可帮助读者快速定位重点概念与推导思路。资源包共1个PDF文件,约1008KB,以文档形式集中呈现课程笔记与考点归纳,便于打印或电子端反复查阅。目前已有6458人学习下载,说明其在校内备考群体中具有较高参考价值。读者可借助该资料对照课堂内容复盘决策树互信息、SVM优化目标与约束、PCA信号重构推导、K-means流程及目标函数等高频考点,提升期末复习效率。
1. 从一份期末复习资料说起:机器学习到底怎么考、怎么用
如果你正在搜“机器学习 期末考试”相关的复习资料,大概率你手里已经有一份知识点清单,但不确定它到底覆盖了什么、能不能直接拿来用。我拿到这份资料时第一反应是:它不是那种只列名词的提纲,而是把梯度下降、交叉验证、过拟合、线性回归、决策树、朴素贝叶斯、MP模型、K-means、PCA、SVM、CNN这些核心考点串成了一条线,每个点都带了定义、步骤、优缺点和典型考题。换句话说,它更像一份“考点+考法”的对照表,而不是教科书目录。
这份资料适合两类人:一类是正在准备期末、需要快速定位重点和计算题套路的同学;另一类是已经工作、想回头把机器学习基础概念重新捋一遍的从业者。它的价值不在于教你调参,而在于把每个算法的“输入是什么、输出是什么、目标函数长什么样、边界在哪”讲清楚。下面我按“先立住理论、再落到复现、最后说坑”的顺序,把这份资料拆开讲一遍。
2. 梯度下降与模型评估:从下山思想到k折交叉验证的落地细节
2.1 梯度下降的迭代逻辑与学习率边界
梯度下降在这份资料里被描述为“下山思想”:以当前位置为基准,找最陡峭的方向走一步,再以新位置为基准继续找。这个比喻很准,但落到计算题里,关键就三件事:目标函数、梯度、学习率。目标函数是你想最小化的东西,比如线性回归里的均方误差;梯度是函数对参数的偏导,决定往哪走;学习率决定每步走多大。
我一般会先写一个最小可运行的梯度下降,把参数更新过程打印出来,确认每一步损失确实在降。下面这段代码用一维线性回归演示,数据是虚构的,重点看更新逻辑:
import numpy as np # 虚构数据:y = 3x + 2 附近加噪声 np.random.seed(0) X = np.linspace(0, 10, 50) y = 3 * X + 2 + np.random.normal(0, 1, 50) # 初始化参数 w, b = 0.0, 0.0 lr = 0.01 # 学习率,太大震荡,太小收敛慢 epochs = 1000 for i in range(epochs): y_pred = w * X + b # 均方误差对 w 和 b 的偏导 dw = -2 * np.mean(X * (y - y_pred)) db = -2 * np.mean(y - y_pred) w -= lr * dw b -= lr * db if i % 200 == 0: loss = np.mean((y - y_pred) ** 2) print(f"epoch {i}, loss {loss:.4f}, w {w:.4f}, b {b:.4f}") print(f"最终 w={w:.4f}, b={b:.4f}")逻辑说明:dw和db是损失函数对两个参数的偏导,前面乘-2是因为均方误差求导后系数保留。参数更新用w -= lr * dw,方向是梯度的反方向。参数说明:lr一般从 0.01 或 0.001 试起,如果损失曲线出现震荡或发散,先降学习率;如果收敛太慢,再考虑增大或换自适应方法。资料里强调“梯度的方向就是函数变化最快的方向”,这句话在计算题里常考:给你一个函数和初始点,让你手算一步梯度下降后的参数值。
2.2 k折交叉验证的流程与过拟合判断
资料里把交叉验证的作用说得很直白:衡量算法表现是否稳定。过程是把数据分成多个训练集和测试集,训练多个模型。k折交叉验证是最常用的形式:把数据分成k个子集,每次用k-1个训练、剩下1个测试,重复k次,最后取平均。这里有个容易翻车的点:如果数据本身有时间顺序,不能随机打乱,否则会引入未来信息,导致评估结果虚高。
过拟合在这份资料里的定义是:训练时把训练误差弄到最小,某种程度上把训练样本自身的特点也融入了进来,导致泛化能力降低。原因最常见的是学习能力过于强大,把训练样本特有的属性也学进来了。资料里有一句很关键的话:“无法彻底避免,只能缓解。”这句话在简答题里经常出现,标准答法就是先承认过拟合不可完全消除,再列缓解手段:增加数据、正则化、剪枝、早停、交叉验证。
我一般会用一个具体场景来判断过拟合:训练集准确率100%,验证集准确率70%,这就是典型的过拟合信号。资料里也提到了这个例子。对应的排查步骤是:先看训练集和验证集的差距,差距大就是过拟合,差距小但都低就是欠拟合。欠拟合的定义是模型简单、数据复杂,无法学到一般规律。这两种情况在计算题里可能让你判断并给出改进方向。
3. 线性回归、决策树与朴素贝叶斯:三个经典模型的复现与参数说明
3.1 线性回归的最小二乘与非线性转线性
线性回归在这份资料里的定义是:利用回归方程对一个或多个自变量和因变量之间关系进行建模。模型就是选择一条线性函数来很好拟合已知数据并预测未知数据。最小二乘法是通过最小化误差的平方和寻找最佳函数匹配。这部分在计算题里通常要求你写出损失函数、求导、令导数为零解出参数。
资料里还提到一个实验题:非线性回归怎么变成线性回归。常见做法是对变量做变换,比如把 (y = a e^{bx}) 两边取对数变成 (\ln y = \ln a + bx),然后用线性回归去拟合。这个思路在考试里经常以“给出非线性形式,问如何转化为线性”出现。我一般会先画散点图,看形状像哪种函数,再决定用对数、倒数还是多项式变换。
下面这段代码演示最小二乘的矩阵解法和变换思路:
import numpy as np # 虚构数据:y = 2 * exp(0.5x) X = np.linspace(0, 5, 30) y = 2 * np.exp(0.5 * X) + np.random.normal(0, 0.1, 30) # 非线性转线性:ln(y) = ln(2) + 0.5x Y_log = np.log(y) A = np.vstack([X, np.ones(len(X))]).T coef, intercept = np.linalg.lstsq(A, Y_log, rcond=None)[0] print(f"拟合斜率 {coef:.4f}, 截距 {intercept:.4f}") print(f"还原参数 a={np.exp(intercept):.4f}, b={coef:.4f}")逻辑说明:np.vstack构造设计矩阵,第一列是x,第二列是全1用于截距。np.linalg.lstsq直接解最小二乘。参数说明:rcond=None是让NumPy自动处理数值精度。还原时a是截距的指数,b是斜率。这个套路在考试里就是“先变换、再线性拟合、最后还原”。
3.2 决策树的信息增益与剪枝策略
决策树在这份资料里的步骤很清晰:特征选择、决策树的生成、决策树的修剪。目标是将数据集正确分类,本质是从训练集中归纳出一组分类规则。损失函数是正则化的极大似然函数。优点计算复杂度不高、输出结果易于理解、对中间值缺失不敏感、可以处理不相关特征;缺点是可能产生过度匹配。
资料里有一个简答题:什么是互信息,用互信息选择的目的是什么。互信息是衡量随机变量之间相互依赖程度的度量。用信息增益选择特征的目的,是让决策树生成过程更高效;效果是信息增益越大,该特征越具有决策能力。剪枝分预剪枝和后剪枝:预剪枝在训练开始前规定条件,比如树达到某一深度就停止;后剪枝先找到树,再依据一定条件限制叶子结点个数,去掉一部分分支。
我一般会用一个表格来对比剪枝策略:
| 策略 | 时机 | 优点 | 缺点 |
|---|---|---|---|
| 预剪枝 | 训练前 | 计算开销小,避免过拟合 | 可能欠拟合,错过有用分支 |
| 后剪枝 | 训练后 | 保留更多分支,泛化通常更好 | 计算开销大,需要额外验证集 |
参数说明:预剪枝常见参数是最大深度、最小样本分裂数、最小叶子样本数;后剪枝常见做法是代价复杂度剪枝,用验证集评估剪枝前后误差。考试里如果问“怎么防止过拟合”,决策树部分就答预剪枝和后剪枝,再补一句“两者可以结合使用”。
3.3 朴素贝叶斯的独立假设与分类流程
朴素贝叶斯在这份资料里的前提假设是每个输入变量是独立的。形式特点是算法逻辑简单、易于实现、分类过程中时空开销小。缺点是属性之间相互独立这个假设在实际应用中往往不成立。这部分在计算题里通常给你一批数据,让你算先验概率、条件概率,再判断类别。
我一般会按三步走:先统计每个类别的先验概率,再统计每个特征在每个类别下的条件概率,最后用贝叶斯公式算后验概率取最大。这里有个坑:如果某个特征值在训练集里没出现过,条件概率会变成0,导致整个后验为0。常见做法是加平滑,比如拉普拉斯平滑,分子加1、分母加类别数。资料里没提平滑,但考试里如果出现零概率,你要知道这是独立假设和稀疏数据共同导致的。
4. K-means、PCA与SVM:无监督与最大间隔的实操要点
4.1 K-means的质心迭代与停止条件
K-means在这份资料里的中心思想是:事先确定常数K,随机选定初始点为质心,计算每个样本与质心的相似度(欧式距离),将样本归到最相似的类,重新计算每个类的质心,重复直到质心不再改变。资料里也提到,由于每次都要计算所有样本与每一个质心之间的相似度,大规模数据集上收敛速度比较慢。
我一般会关注四个参数:K值、初始质心、距离度量、停止条件。K值怎么确定,资料里没给标准答案,常见做法是肘部法或轮廓系数。初始质心敏感,常见做法是K-means++。停止条件可以是质心变化小于阈值,或者达到最大迭代次数。空聚类的处理是:如果某个类没有样本,重新随机选一个质心,或者把最远的点分给它。
下面这段代码用虚构数据演示K-means的核心迭代:
import numpy as np # 虚构二维数据 np.random.seed(1) data = np.vstack([ np.random.normal([2, 2], 0.5, (30, 2)), np.random.normal([8, 8], 0.5, (30, 2)), np.random.normal([2, 8], 0.5, (30, 2)) ]) K = 3 centroids = data[np.random.choice(len(data), K, replace=False)] for step in range(20): # 分配样本到最近质心 distances = np.linalg.norm(data[:, None] - centroids[None, :], axis=2) labels = np.argmin(distances, axis=1) # 更新质心 new_centroids = np.array([data[labels == k].mean(axis=0) for k in range(K)]) if np.allclose(new_centroids, centroids): print(f"第 {step} 步收敛") break centroids = new_centroids print("最终质心:") print(centroids)逻辑说明:data[:, None] - centroids[None, :]利用广播计算每个样本到每个质心的差值,再求范数得到距离。argmin取最近质心。更新质心时对每个簇取均值。参数说明:K是类别数,step是迭代上限,np.allclose判断质心是否不再变化。考试里如果问K-means和EM算法的不同,可以答:K-means是硬分配,每个样本只属于一个簇;EM是软分配,用概率表示属于每个簇的可能性。
4.2 PCA的降维推导与信号压缩
PCA在这份资料里的定义是:一种常见的数据分析方式,常用于高维数据的降维,可用于提取数据的主要特征分量。目的有两个:简化统计数据即降维,揭示变量间的关系。资料里有一个考题:从信号重构角度推导PCA怎么实现信号压缩。这个推导的核心是:找到一组正交基,使得数据投影后的方差最大,同时重构误差最小。
我一般会按协方差矩阵、特征值分解、取前k个特征向量、投影这几步走。下面用虚构数据演示:
import numpy as np # 虚构三维数据 np.random.seed(2) X = np.random.normal(0, 1, (100, 3)) X[:, 2] = X[:, 0] * 0.8 + X[:, 1] * 0.2 + np.random.normal(0, 0.1, 100) # 中心化 X_centered = X - X.mean(axis=0) # 协方差矩阵 cov = np.cov(X_centered, rowvar=False) # 特征值分解 eigvals, eigvecs = np.linalg.eigh(cov) # 按特征值降序排列 idx = np.argsort(eigvals)[::-1] eigvals = eigvals[idx] eigvecs = eigvecs[:, idx] # 取前两个主成分 W = eigvecs[:, :2] X_pca = X_centered @ W print("主成分方差:", eigvals[:2]) print("降维后形状:", X_pca.shape)逻辑说明:中心化是PCA的前提,否则第一主成分会指向均值。协方差矩阵描述各维度之间的相关性。eigh用于对称矩阵,返回的特征值升序,所以用argsort降序排列。W是投影矩阵,取前两列。参数说明:取几个主成分通常看累计方差贡献率,比如达到85%或90%。资料里也提到PCA的缺点:主成分各个特征维度的含义具有一定模糊性,不如原始样本特征解释性强;方差小的非主成分也可能含有对样本差异的重要信息,丢弃可能影响后续处理。
4.3 SVM的硬间隔、软间隔与核函数
SVM在这份资料里的定义是:一种二分类模型,将实例的特征向量映射为空间中的一些点,目的是画出一条线,以“最好地”区分两类点。线性可分时的优化目标是最大化间隔,约束条件是所有样本正确分类。支持向量是离决策表面最近的数据点。线性不可分时用核函数,把原始样本映射到高维空间,让样本在高维特征空间中线性可分,再用线性分类器。
软间隔是允许一些样本不满足约束。性能相关有三个点:核函数的选择、核函数的参数、软间隔参数C。C越大,对误分类的惩罚越大,间隔越窄,容易过拟合;C越小,间隔越宽,容易欠拟合。我一般会先用线性核试,如果效果不好再换RBF核,然后调gamma和C。考试里如果问“支持向量的意义”,就答:支持向量是决定分类边界的关键样本,去掉非支持向量不影响边界。
5. 避坑与排查:这份资料里最容易翻车的五个点
5.1 现象:训练集准确率100%,验证集只有70%
原因:过拟合。模型复杂、数据简单,模型学到了训练样本特有的噪声和属性。解决:先增加数据或做数据增强,再加正则化,决策树用剪枝,神经网络用早停,同时用交叉验证评估稳定性。资料里明确说过拟合无法彻底避免,只能缓解,所以答题时不要写“彻底消除”。
5.2 现象:梯度下降损失震荡或发散
原因:学习率太大,或者特征没有归一化。解决:先把学习率降一个数量级,比如从0.1降到0.01;再检查特征尺度,做标准化或归一化。如果还不行,换自适应优化方法。资料里强调梯度方向是变化最快的方向,但没说步长怎么选,这个坑在计算题里可能以“学习率过大导致什么后果”出现。
5.3 现象:K-means每次跑出来的聚类结果不一样
原因:初始质心随机,K-means对初始点敏感。解决:用K-means++初始化,或者多跑几次取最优。另外,K值选得不对也会导致结果不稳定。资料里提到初始质心和C值如何确定是注意点,但没展开,实际做题时如果问“K-means的缺点”,就答对初始质心敏感、需要预先指定K、大规模数据收敛慢。
5.4 现象:朴素贝叶斯某个类别概率为0
原因:某个特征值在训练集中没有出现,条件概率为0,连乘后整个后验为0。解决:拉普拉斯平滑,分子加1,分母加类别数。资料里没提平滑,但这是朴素贝叶斯实际使用中必须处理的点。考试里如果给的数据有零概率,你要主动写平滑。
5.5 现象:PCA降维后分类效果反而变差
原因:丢弃了方差小但判别性强的成分,或者没有做中心化。解决:先检查是否中心化,再看累计方差贡献率是否设得太低,必要时保留更多主成分。资料里也提醒,方差小的非主成分也可能含有重要信息,因降维丢弃可能对后续处理有影响。
6. 从考点到复现:把这份资料变成可运行的复习脚本
这份资料最大的价值是它把定义、步骤、优缺点和考题放在了一起,但如果你只是读一遍,考试时还是容易卡在计算题上。我的习惯是:每复习一个算法,就写一个最小可运行的脚本,把资料里的步骤对应到代码行。比如梯度下降对应参数更新,交叉验证对应数据划分,决策树对应信息增益计算,K-means对应质心迭代,PCA对应特征值分解,SVM对应间隔最大化。
下面这个表格是我整理的“考点-代码-参数”对照,你可以直接照着补全:
| 考点 | 核心代码 | 关键参数 | 常见考题 |
|---|---|---|---|
| 梯度下降 | 参数更新循环 | 学习率、迭代次数 | 手算一步更新 |
| 交叉验证 | 数据分折 | k值 | 过拟合判断 |
| 线性回归 | 最小二乘 | 正则化系数 | 非线性转线性 |
| 决策树 | 信息增益 | 深度、叶子数 | 剪枝策略 |
| 朴素贝叶斯 | 后验概率 | 平滑系数 | 独立假设 |
| K-means | 质心迭代 | K值、初始点 | 流程与目标函数 |
| PCA | 特征值分解 | 主成分数 | 信号压缩推导 |
| SVM | 间隔最大化 | C、核参数 | 支持向量意义 |
我一般会先跑一遍代码,确认输出和资料里的定义对得上,再回头做简答题。比如资料里问“SVM线性可分时的优化目标和约束条件”,你就把代码里的间隔表达式和约束写出来;问“PCA从信号重构角度推导”,你就把投影和重构误差写出来。这样复习一遍,计算题和简答题都能覆盖。
从那以后我每次拿到这种知识点清单,都会先挑三个算法写成可运行脚本,再对照资料里的考题自测一遍。希望帮到你。
本文还有配套的精品资源,点击获取