☰
西瓜书课后习题通关指南:从公式推导到代码实践
2026/10/1 6:56:46 网站建设 项目流程

1. 内容整体设计与思路拆解

1.1 先搞懂课后习题到底在考什么

周志华老师的《机器学习》(俗称“西瓜书”)被很多人当成机器学习入门的第一本教材,但说实话,真正能从头到尾把课后习题啃下来的人并不多。这本书的习题不像普通的文科类教材,背一背就能过,它的题目大致可以分成四种类型:概念辨析、数学推导、算法设计、实验任务。

概念辨析题,比如第一章的“归纳偏好”讨论、“没有免费的午餐定理”的证明,考的是你有没有真正理解机器学习的基本假设和哲学层面的前提。数学推导题,比如第三章的线性判别分析推导、第六章的SVM对偶问题推导,考的是你对矩阵运算、概率分布、凸优化这些数学工具的掌握程度。算法设计题,比如第五章的BP算法推导、第八章的AdaBoost权重更新推导,考的是你能不能把公式本身推导出来,而不是仅仅会用sklearn调包。实验任务题,比如第二章问“如何划分训练集和测试集才能更好评估模型”,这种题需要你亲自动手跑数据才能回答透彻。

我见过太多人拿着西瓜书,看到课后题不会做,就去CSDN找答案,抄一份交差。这样做其实浪费了这本书最大的价值。西瓜书的课后习题,本质上是给你提供了一条自学的训练路径:每一章的习题都在逼你重新审视这一章的核心公式和结论,用“推导一遍+实现一遍+实验验证一遍”的方式把知识内化。如果你能独立完成大部分习题,而不是只会调库,那你对机器学习的理解会比大多数人深一个层次。

1.2 思路拆解:怎么把习题从“负担”变成“捷径”

先说一个容易忽视的事实:西瓜书课后题并没有官方标准答案,目前网上流传的答案大多来自前辈学者的个人整理,质量参差不齐。这意味着你如果直接抄答案,抄到的可能是错的,或者虽然对但过程省略了很多关键推导。所以我的建议是,做习题的核心思路不是“做题交差”,而是“推导结合实践”。

具体来说,我推荐一个“三步法”。第一步,拿到一道题,先不看答案,自己把题目涉及的数学模型搬出来,在白纸上推一遍公式。推不动就回去翻对应章节,不要急着看题解。第二步,推完之后,把公式用Python实现一遍,尽量用NumPy这类底层库手写核心算法,而不是直接调sklearn。第三步,在一份小型数据集上跑实验,观察结果的规律,和教材里的结论做对比。

这套思路有一个很大的好处:它能帮你把每道题变成一次独立的项目实践,而不是一道孤立的题目。比如第二章的题目问你“为什么留出法需要分层采样”,你如果不去手动把一个数据集按类别比例切分,并对比分层和不分层的差异,你对这个概念的理解就永远是浮在表面上的。

2. 核心细节解析与实操要点

2.1 前三章:从理念到模型,必须打牢的几个关键题

第一章的题量不大,但每一道都很要命。尤其是“没有免费的午餐定理”的推导,很多初学者看到期望误差的公式推导就发懵。我给你的建议是,不要试图跳过这一步。这个定理告诉你的是“没有哪个算法天生比另一个算法好”,它取决于先验假设和数据分布。你要做的不是死记结论,而是把推导过程一遍一遍写,写到能从期望风险的定义出发,一步步展开求和、交换积分次序,最终推完为止。这个过程能帮你建立对“假设空间”、“先验分布”这些概念的直觉。

第二章的习题核心是“模型评估与选择”。这里必做的题目包括:留出法为什么要分层采样、交叉验证法为什么要用k折而不是直接随机划分、偏差方差分解公式的推导。我在做这一章的习题时,有一个深刻的体会:偏差方差分解公式看着简单,但你真的推起来会发现里面有不少中间步骤依赖“噪声”、“期望”的定义。如果不把随机变量、期望的线性性这些基础概念搞熟,很容易卡壳。我的建议是,在做第二章习题时,准备一本概率论教材放旁边,随时查定义。

第三章讲线性模型,课后最重要的一道题是线性判别分析(LDA)的推导,从类内散度矩阵、类间散度矩阵的构建,到目标函数的广义瑞利商形式,再到拉格朗日乘子法求解。很多人在这一步被矩阵求导卡住。我的经验是,先把标量形式的瑞利商理解透,再推广到矩阵形式,这样梯度方向不容易搞错。同时,建议用Python的NumPy手写一遍二分类LDA,在iris数据集上做实验,画出投影后的分布,你才能真正明白“最大化类间距离、最小化类内距离”是什么意思。

2.2 中间几章:模型变复杂了,推导难度也上来了

第四章决策树,核心题主要集中在剪枝策略和属性划分。你需要搞清楚预剪枝、后剪枝的差异,以及信息增益、增益率、基尼指数三种划分准则的适用场景。这一章的课后题非常适合用代码去验证,比如自己实现一个简单的决策树,在UCI的西瓜数据集(甚至直接用鸢尾花数据)上比较预剪枝和后剪枝的效果。

第五章神经网络是很多人的“噩梦”,尤其是BP算法的推导。课后习题让你推导两层前馈神经网络的权重更新公式,你如果真想搞懂,建议从单个样本的损失函数出发,用链式法则,一步步写出每一层权重的偏导。这个过程很费纸,但非常有价值。还有一个容易被忽略的点是:书中经常讨论不同的激活函数、学习率设置对收敛的影响,这些内容课后的题目不一定直接问,但你在做实验的环节如果不调参就会发现,结果差得远。所以这一章的题目最需要配合动手实验。

第六章支持向量机,习题里最经典的就是“推导对偶问题”和“分析核函数的作用”。这一章的推导量非常大,需要你熟悉拉格朗日乘子法、KKT条件、对偶转换。我在学习时最大的体会是:SVM这个模型,光看课本很难抓住要害,必须亲手把软间隔的原始问题和对偶问题各推一遍,再用一个二次规划求解器(比如cvxopt)去解一个小规模数据集的SVM,这样你对“支持向量到底从哪来”这个问题才会真正有感觉。

第七章贝叶斯分类器,最常见的题目是计算朴素贝叶斯分类器的后验概率,以及拉普拉斯平滑的修正效果。这章题目相对好做,但做的时候要思考一个问题:在样本量小的情况下,先验概率和后验概率哪个更容易出现偏差?拉普拉斯平滑为什么能缓解这个问题?我建议你用一个小数据集(比如西瓜数据集)自己算一遍,不借助任何库,纯手写概率计算,再和代码结果对照。

第八章集成学习,重中之重是AdaBoost的推导。你需要明白,AdaBoost的权重更新公式是怎么从指数损失函数推出来的。我当初在这一章反复看了很多遍,最终发现,只有自己把训练误差的指数损失上界推导一遍,你才会明白为什么错误分类的样本每次都会被“加强关注”。

第九章聚类,重点题是高斯混合模型的EM算法推导,以及聚类性能指标的度量。大多数人在EM推导上卡住,主要原因是没想清楚“隐变量”是怎么引入的。我的建议是,找一个简单的一维混合高斯分布例子,手动初始化参数,迭代两步E步和M步,把每一轮的参数变化记下来,然后再用代码跑一遍,两者对比。这样做,EM算法的收敛意义一下子就形象起来了。

2.3 后半部分:进阶主题,精读比全做更重要

第十章降维,核心题是主成分分析的推导。很多人只知道PCA是“找最大方差方向”,但要真正推导起来,需要从协方差矩阵的特征值分解入手。我建议自己用NumPy实现PCA,再用它去压缩一张图片或者一个人脸数据集,观察不同主成分数量下重构效果的差异。这个过程比单纯做题有意思得多,也更能加深理解。

第十一章稀疏表示,核心题围绕L1范数为什么能带来稀疏解展开。这个问题光靠看课本是不够的,你需要理解L1正则化对应的约束区域,以及为什么在几何上更容易和凸函数的等值线相交在坐标轴上。建议在二维平面上自己画一下L1和L2约束下的最优点,体会一下两者的区别。这一章对数学功底的要求比较高,如果你当前只是入门阶段,可以先精读,暂时跳过部分超纲题。

第十二章计算学习理论,这一章比较“硬核”,主要是PAC学习理论、泛化误差界等内容。对大多数做工程的同学来说,这一章重在理解“样本复杂度”和“误差上界”的概念,不一定要求把每一道证明题都啃完。我个人的想法是:先把书中关于有限假设空间的泛化误差界定理看懂,尽量把证明思路理清楚,但如果时间有限,局部细节可以暂时跳过,以后回头再看。

第十三章半监督学习和第十四章概率图模型,这两章的习题已经带有明显的研究导向。特别是概率图模型,涉及马尔可夫随机场、条件随机场、变分推断等内容,如果你想深入这个方向,建议配合作者在南京大学LAMDA发布的公开资料一起啃。如果只是普通本科生或者工程师想了解机器学习,这两章做核心概念的梳理即可,别死磕。

3. 实操过程与核心环节实现

3.1 从零手写一个模型,并把它写成实验报告

很多同学做课后习题的时候,只停留在“看懂答案”的程度。我强烈建议你选几道核心题,把模型用Python从零实现一遍。这里我用“k近邻”举一个最简单的例子,展示从公式到代码的完整流程。

k近邻这个模型虽然简单,但它非常适合用来理解“距离度量”、“数据归一化”、“交叉验证”这些概念。伪代码思路如下:给定训练集,计算测试样本和所有训练样本的距离,取前k个邻居,投票决定类别。用Python写的话,核心代码结构很清晰。

import numpy as np def knn_predict(X_train, y_train, x_test, k): # 计算所有训练样本与测试样本的欧氏距离 distances = np.sqrt(((X_train - x_test) ** 2).sum(axis=1)) # 取距离最近的k个样本的索引 nearest_indices = np.argsort(distances)[:k] # 对这k个样本的标签进行投票 nearest_labels = y_train[nearest_indices] # 返回出现次数最多的标签 unique_labels, counts = np.unique(nearest_labels, return_counts=True) return unique_labels[np.argmax(counts)]

代码很简单,但你把这段代码放到真实数据上去跑,问题就会一个接一个冒出来。比如,距离要按哪个公式算?如果特征之间量纲差异很大,比如一个特征的取值范围是0到1,另一个是0到10000,距离计算就会被数值大的特征主导,这时候就要做归一化。又比如,k值取多少才合适?我用鸢尾花数据集试过,k=1的时候训练准确率可能很高,但测试集上波动很大,这就是过拟合;k值太大,比如k=50,模型又会变“笨”,把很远距离的样本也拉进来参与投票。所以你需要跑一组交叉验证,画出k值的曲线,找到一个权衡点。

这个过程本身就对应着第二章“模型选择”和第三章“距离度量”的多道课后题。如果能像这样把课本里的公式落实到代码上,再落实到一张图上,你的理解会比刷十遍课本都牢靠。这也是我建议所有入门者学习机器学习时,养成“公式+代码+实验”三件套习惯的原因。

3.2 建立自己的“习题推导笔记库”

这是我做西瓜书习题时最大的收获之一。建议你在开始刷题前,先建一个笔记库,可以是博客、Notion、GitHub仓库、本地Markdown文件,形式不限,关键是要有结构。

我把笔记库按章节划分,每一章又分成几个板块:核心公式整理、典型题推导过程、实验记录与数据分析、易错易忘点记录。比如在第三章,我记录了LDA推导过程中矩阵求导需要注意的方向问题;在第五章,我记录了BP推导过程中,为什么输出层和隐藏层的偏导公式不一样;在第八章,我记录了AdaBoost为什么可以用加法模型加指数损失来理解。

为什么要强调这个笔记库?因为我发现绝大多数人在学习机器学习时,读完一遍课本脑子里什么都没剩下。如果做题时顺手记下自己的推导思路、卡壳点、灵感,这些内容会变成你以后复习的第一手资料。很多人到了期末考试前焦虑地翻书,其实还不如翻自己平时整理的习题笔记来得高效。

我在笔记里还专门改造了书中的表格记录法,比如每一章的题,我都会记录三件事:这道题考的是什么概念?我推导时卡在哪一步?如果面试有人问这个问题,我能不能用自己的话讲清楚。这个方法让我在准备面试和期末复习时都受益很多。

3.3 实战一个“机器学习应用流程”型习题

西瓜书课后很多题不是单独问一个概念,而是让你完成一个完整的应用流程。举个例子,教材里有讨论过“如何用机器学习识别一个物体”,热搜词里也有“机器学习 认识猫 标签”,这其实是一道很有代表性的开放式题目。

我建议你做一道这样的综合题:用机器学习实现一个图像分类模型去识别“猫”和“狗”。虽然这个问题看上去偏应用,但它能串联起西瓜书里几乎所有核心概念。首先,你要收集数据集,思考数据是否平衡、是否需要做数据增强,这对应的是第二章的“数据预处理”和“偏差方差分析”。然后,你要设计特征,如果不用深度网络,你可能需要提取颜色直方图、HOG特征等,这对应的是第十章的“特征选择和降维”。接着,你要训练一个分类器,比如SVM、逻辑回归或一个小型神经网络,对应的是第三、五、六章的内容。最后,你要评估模型,画出混淆矩阵、ROC曲线,分析哪些样本被错分、为什么会错分,对应的是第二章的“性能度量”。

这个过程像打通了任督二脉一样,把你学的所有知识点串成了一条线。我在做类似项目时发现,最难的不是模型训练本身,而是中间那些看似简单的问题:数据集怎么划分才合理?样本不均衡怎么处理?模型的置信度怎么校准?这些问题在书里都有涉及,你不动手做,根本不知道它们有多重要。

4. 常见问题与排查技巧实录

4.1 概念题一卡壳,就说明阅读有了断层

先回答一个高频问题:有些同学问“第一章习题里有一道关于‘假设空间’和‘版本空间’的题,我怎么也看不懂,是不是我太笨了?”不是,是你没有意识到概念理解需要“从具体例子出发”这个原则。我当初是先看了书里用“西瓜”举的例子,然后自己构造了一个“好坏瓜”的简单数据集,把假设空间里所有可能的假设都列出来,再一步步删掉与训练样本不一致的假设,最后得到版本空间。这样画一遍,概念自然就通了。

所以在刷题过程中,如果遇到概念题卡壳,我的建议不是反复背定义,而是自己动手构造一个小例子,去模拟定义中的过程。你在纸上画一遍,比看书看十遍都管用。

4.2 推导题推不动,多半是数学基础临时掉链子

很多推导题卡住,其实不是机器学习的问题,而是数学工具不熟练。矩阵求导、概率分布、期望计算、拉格朗日对偶,这些技能需要单独训练。我建议你做两类补充练习:一类是矩阵微积分的基础题,多求几组形如∂(w^T X^T X w)/∂w这样的式子;另一类是凸优化基础,理清拉格朗日乘子法、KKT条件。补完基础再回来做题,会有一种“原来这里用的是这一招”的感觉。

顺带一提,网上常见的“西瓜书习题答案”有一些推导错误,如果你发现自己的推导结果和网上的答案不一样,先别急着怀疑自己,去翻原书、翻参考教材(比如PRML、Bishop的《模式识别与机器学习》),以严肃教材和逻辑推导为准。我踩过好几次这样的坑,最后发现有些网上答案本身就是错的。

4.3 代码验证的结果和理论对不上,先查这几个方向

实验和理论不一致,是机器学习新手最常遇到的问题。我总结过一套排查顺序。

第一,检查“随机性”。机器学习模型往往涉及随机初始化、随机采样,如果你的训练测试集划分没有固定随机种子,那每次跑出来的结果可能差很多。做习题实验的时候,建议固定随机种子,或者多跑几次取平均。第二,检查“数据泄露”。有时候你在预处理阶段用了全部数据的统计量(比如均值、方差),再去切分训练测试集,这会导致评估结果虚高。正确的做法是先切分,再在训练集上单独做标准化。第三,检查“超参”。学习率太大,模型可能发散;正则化系数太大,模型可能欠拟合。做习题的时候,要把自己的参数设置记录下来,方便回溯。第四,也是最重要的,检查“公式实现有没有写错”。我曾经在实现LDA时,把某个矩阵转置漏掉了,结果得到的投影方向严重偏斜,但代码没有报错。如果没有对照理论结果,光看运行结果根本发现不了。

这里再分享一个经验:写代码前,先在纸上把公式完整推导一遍,然后用注释把公式的每一部分对应到代码的每一行。这样能减少很多低级错误。我在记录笔记时,就有意识地养成了“公式注释法”的习惯,后来做实验的出错率下降了很多。

4.4 心态建设和时间分配:做题刷到崩溃怎么办

西瓜书确实不简单,尤其是前几章的数学推导,可能一道题卡一个下午都是正常的。我的亲身体会是,第一遍做不出来很正常,千万不要灰心。我给的策略是:第一遍自己尝试半小时,推不出来就跳过;等把这一章所有题过一遍、把书再读一遍后,回头再做第一遍没做出来的题,你会发现很多当时想不通的地方突然就通了。这个过程很玄学,但它其实是“间隔复习”的规律在起作用。

另外,对于考研、期末考试、面试准备等不同目标,刷题策略也要调整。如果是期末复习,可以重点刷前几章和老师画的重点题;如果是面试准备,重点放在“模型推导”“优缺点分析”“为什么这样设计”这类题上;如果是为了科研打基础,那就尽量每一道推导题都吃透,尤其是SVM、EM、PCA这几章。要根据自己的目标合理分配时间和精力,不用盲目追求“全部刷完”,但刷过的每一道题,都尽量做到真正弄懂。

5. 实操心得与扩展建议

5.1 结合课程和开源资料,让刷题事半功倍

我强烈建议你把这本书的课后习题和公开课程配合使用。比如配合吴恩达老师在Coursera上的《Machine Learning》课程,你会发现很多西瓜书里的概念,在吴恩达老师的视频里有另一种表达方式,两种方式对照着看,理解会立体很多。又比如李宏毅老师的机器学习课程,它的作业设计非常偏实践,你做完西瓜书的理论推导后,再去完成李老师的作业,会有一种“理论终于落地”的踏实感。

还有两本重要参考书值得提一下。一本是Bishop的《Pattern Recognition and Machine Learning》,也就是大家常说的PRML。如果你在西瓜书第七章、第九章遇到贝叶斯和EM的问题,去PRML里找对应章节看,通常能得到更完备的数学细节。另一本是周志华老师组里开放的LAMDA相关资料,里面有很多关于机器学习的进阶内容,适合学有余力时进一步拓展。把外部资源当成“外挂”,不丢人,学习本来就是站在巨人肩膀上。

5.2 从习题出发,做一个小型项目来收尾

如果你把西瓜书的习题刷了大半,我建议不要急着一本一本找新书去啃,而是挑一个综合性项目来收尾,比如前面提到的猫狗图像分类,或者热门话题“基于机器学习的音乐风格分类算法设计与实现”。这种题目最大的好处是覆盖了“特征提取—数据预处理—模型训练—模型评估—结果分析”全流程,正好是西瓜书内容的综合应用。

我做这类收尾项目的体会是,不要太早调深度学习的库。先把流程用传统机器学习方法走通,比如拿到音乐数据后,提取MFCC特征,用SVM做分类,画混淆矩阵,分析哪些风格容易被混淆,再尝试优化特征或换用集成学习方法。等你把整套流程跑通了,就算遇到工程级别的坑,也知道问题出在哪一环,再上手深度学习模型时也能更快地定位问题。

5.3 我自己的体会:刷题不是终点,推导才是

最后说一点主观的体会。我见过很多人学习机器学习的方式是“看视频—调包—跑通—完事”,这样学完确实能做点小项目,但一旦面试被问到“逻辑回归的损失函数为什么长这样”或者“SVM的对偶问题为什么要引入拉格朗日乘子”,就容易答不上来。西瓜书的课后习题,就是专门用来补上这块短板的。

我自己在刷题过程中,最大的收获不是记住了多少个公式,而是慢慢习惯了“遇到模型先推导一遍”的思维方式。拿到一个新模型,如果只知道它能用,但不知道它为什么能用,我就会有一种不踏实感。西瓜书习题逼着我把这种不踏实感一点一点消解掉,虽然过程很慢、很痛苦,但回头看,这一遍功夫非常值得。如果你也在刷这本书,遇到卡壳的时候别急,多给自己一点时间,这道题推不动就换一道,过两天再回头看,很多难题自然就变得平易近人了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询