首页 / 资讯中心 / 文章详情

《数据挖掘概念与技术》课后习题全解析:从手算推导到真实项目应用

《数据挖掘概念与技术》课后习题全解析:从手算推导到真实项目应用 ★ FEATURED ARTICLE
我从接触数据挖掘到现在一直觉得《数据挖掘概念与技术》第三版是绕不开的一本经典。这本书的中文版封面大家都熟作者是Jiawei Han、Micheline Kamber、Jian Pei机械工业出版社引进。很多人把它当工具书翻遇到哪个算法就翻哪一章但真正让我对数据挖掘建立起完整认知的反而是课后习题。说实话这几百道题刷完比看两遍正文都管用。这篇博文就是围绕这本书的课后习题来聊的。我会拆解习题体系的设计逻辑把每个核心知识点的典型题目和解题思路讲透再给你一套“手工推导代码验证”的实操方法顺便聊一下怎么把课后习题的方法迁移到真实数据项目比如最近很多人问的 GEO 数据挖掘从数据下载、处理、质控到差异分析的全流程。这篇内容适合正在啃这本书的学生、准备面试的工程师以及所有想把数据挖掘理论真正用起来的人。1. 内容整体设计与习题体系拆解1.1 章节地图与习题分布《数据挖掘概念与技术》第三版共有13章大致可以分成五个模块。第1、2章是绪论和数据预处理第3章讲数据仓库与OLAP第4到第9章是核心算法包括关联规则、分类、聚类、离群点检测第10到第13章是复杂数据类型的挖掘比如图数据、流数据、时空数据、序列数据等。习题并不是均匀分布的。根据我刷下来的体验第2章数据预处理和第6到第8章的算法章节是习题重灾区每章都有20题以上。尤其是第2章和第6章的习题几乎覆盖了所有需要动手计算的知识点相似度计算、信息增益、贝叶斯概率、K-means迭代、Apriori频繁项集生成。而第10章以后的习题明显偏向概念理解和场景设计计算量不大但是需要你对特定数据类型的特性有深入理解。具体数字记不全了但全书习题总量超过260道是肯定的。官方没有公开发布完整答案这也是很多人刷题时最头疼的地方。后面我会专门讲这个问题怎么解决。1.2 习题背后的三层设计逻辑这本书的习题不是随便凑数的仔细看一共三层。第一层是概念理解题集中在每章末尾的前5题左右。这类题直接考察你对术语、流程图、方法分类的掌握。比如“什么是数据规约为什么需要数据规约”这种题看着简单但如果你能准确写出来说明你真的理解了而不是只会说“减少数据量”。第二层是计算推导题这是含金量最高的部分。给你一个具体的数据集让你手工计算信息增益、Gini指标、欧氏距离、支持度、置信度、轮廓系数等等。这类题考察的是你对公式的微观把握每一步都在逼你理解算法到底在算什么。第三层是应用设计题通常会给你一个场景让你选择合适的方法并说明理由。比如“给定一个社交网络数据集如何检测异常用户”这类题没有标准答案考的是分析框架。我后来在面试和做项目时发现第三层习题训练出来的能力恰恰是实际工作中最需要的。1.3 课后习题如何衔接真实数据项目很多人会问刷课后习题和做真实项目的关系到底在哪我直接说结论真实项目就是课后习题的加长加难版。举个例子最近生物信息领域很火的 GEO 数据挖掘流程是“芯片数据下载 - 表达矩阵处理 - 质控 - 标准化 - 差异分析 - 聚类/富集分析”。你以为这是在学生信其实每一步都在用这本书里的知识。表达矩阵处理是数据清洗和集成质控是噪声数据识别标准化是数据变换差异分析本质上是特征选择聚类分析就是第7章的层次聚类或K-means。所以当你能把课后习题里的相似度度量、数据归一化、聚类算法理解透再去跑GEO流程你就不是在机械执行代码而是真的知道每个步骤在干什么。2. 核心知识点拆解与典型解题思路2.1 数据预处理与相似性度量先把底子打好第2章是整个数据挖掘的“地基”。这一章的习题看起来简单但特别能暴露问题。比如混合类型数据的相似度计算很多人只记得数值型的欧氏距离一遇到标称属性就不知道怎么办了。这一章的核心计算题有四种。第一种是数据清洗相关的空值处理让你比较“用全局常量填充、用属性均值填充、用同类样本均值填充”的优劣。第二种是数据变换比如最小-最大规范化、z-score规范化、小数定标规范化的手工计算。第三种是相似度和距离计算包括欧氏距离、曼哈顿距离、余弦相似度。第四种是数据规约比如直方图分析、聚类抽样、属性子集选择的概念理解。我建议重点刷第2章的相似度计算题因为这是后面聚类和分类习题的基础。做题时要注意欧氏距离适用于数值型但单位会影响结果余弦相似度更适合高维稀疏数据比如文本向量混合类型数据需要把每个属性的相似度分开算再加权合并。这些细节在正文里可能只是一句话但做题做错一次就记住了。2.2 分类算法从信息增益到模型评估分类是数据挖掘习题的绝对核心。第6章“分类基本概念、决策树与模型评估”和第7章“分类高级方法”加起来习题量超过40道。决策树的典型习题是给定训练数据集计算每个属性的信息增益构建决策树。做题时必须掌握熵、条件熵、信息增益三个公式。我踩过的坑是熵的计算经常忘记负号或者忘记乘以每个子集的样本占比。Gini指标的计算类似但不用对数手算更快。朴素贝叶斯的习题也比较多核心是条件概率的乘积和分母归一化。这里有个关键细节如果某个属性值的条件概率为0整个乘积就变0了。书上讲了拉普拉斯估计但很多同学做题时才想起来用。分类模型的评估同样重要混淆矩阵、准确率、召回率、F1、ROC曲线、AUC都是高频考点。做题时建议把混淆矩阵画出来再计算不要心算。我自己总结了一个小技巧任何一个分类习题只要涉及模型比较就先列出混淆矩阵再算指标逻辑不会乱。第7章的高级分类方法比如集成学习、Bagging、Boosting、随机森林习题以概念为主偶尔会考一下“为什么随机森林对噪声更鲁棒”这类简答题。这类题考察的是你对算法机制的整体把握不是局部公式。2.3 聚类与关联规则无监督学习的两个重头戏聚类那一章的典型习题是K-means手算。给你6个点k2让你迭代直到质心不变。做这个题最重要的是选初始质心和记录每次迭代的簇分配结果。我自己第一次做的时候第三轮质心就不动了但前面两步写得不规范导致后面检查半天。所以建议做题时用表格记录每一轮的质心坐标和每个点的归属簇清晰又可复查。层次聚类也是常考的特别是单链接、全链接、均值链接三种距离计算。题目会给你一个距离矩阵让你画出合并的树状图。这个题不难但容易混淆单链接取的是簇间样本最近距离全链接取的是最远距离。关联规则那章Apriori算法是绝对重点。典型习题是给定事务数据库最小支持度阈值生成所有频繁项集再计算置信度。做这题时一定要按层迭代从1项集开始连接步和剪枝步分开写。我见过很多同学栽在连接步生成候选项集时忘了排序导致产生重复项。置信度和提升度的计算题目会问“这条规则是否有效”提升度大于1才说明是正相关。2.4 离群点与高级主题别只盯着主流程离群点检测在书里占了一章习题相对少但极具实践价值。基于统计的方法比如z-score、基于距离的方法、基于密度的方法比如LOF都是高频概念题。做这一章的题重点不是计算而是理解每种方法在不同分布下的适用性。比如数据分布不均匀时基于距离的方法可能误判密度低的正常点为离群点这时候基于密度的方法更靠谱。第10章以后是复杂数据类型挖掘。图数据的PageRank、流数据的哈希和抽样方法、时空数据的轨迹相似度这些习题通常以设计题为主。比如“如何在大规模图数据中快速查找相似用户”答案往往是多步组合先做特征提取再用LSH做近似近邻最后精确验证。这种组合型思路在真实项目里非常常用GEO差异分析后的基因富集分析本质上也是组合方法。3. 实操过程与核心环节实现3.1 手工推导决策树信息增益再让代码验证我挑一个最经典的课后习题类型来完整跑一遍决策树信息增益计算。假设有一个小数据集四个样本两个特征Outlook和Humidity标签是PlayTennis实际书中的例子更大这里我精简成能说明过程的用数据。目标是计算“Humidity”这个特征对PlayTennis的信息增益。手工推导过程计算总数据集熵设正例和负例各占一半熵为 -0.5 * log2(0.5) - 0.5 * log2(0.5) 1。按Humidity划分假设取值High和Normal。High子集中有1个正例2个负例熵为 -1/3log2(1/3) - 2/3log2(2/3) ≈ 0.918。Normal子集中有2个正例1个负例熵也是约0.918。条件熵 3/4 * 0.918 1/4 * 0.918 0.918。信息增益 1 - 0.918 0.082。这个结果很小说明Humidity单独对分类的增益有限。实际书中的ID3每次选增益最大的属性分裂。手工推完后用Python验证一把我用sklearn的DecisionTreeClassifiercriterionentropy看看根节点选的是哪个特征。import pandas as pd import numpy as np from sklearn.tree import DecisionTreeClassifier from sklearn import tree import matplotlib.pyplot as plt data pd.DataFrame({ Outlook: [Sunny, Sunny, Overcast, Rain], Humidity: [High, High, Normal, Normal], PlayTennis: [No, No, Yes, Yes] }) data pd.get_dummies(data, columns[Outlook, Humidity]) X data[[Outlook_Overcast, Outlook_Rain, Outlook_Sunny, Humidity_Normal]] y data[PlayTennis].map({Yes: 1, No: 0}) clf DecisionTreeClassifier(criterionentropy, max_depth1) clf.fit(X, y) plt.figure(figsize(8, 4)) tree.plot_tree(clf, filledTrue, feature_namesX.columns, class_names[No, Yes]) plt.show()注意我这里用了max_depth1强制它只分裂一次方便观察根节点的选择。运行后你会发现根节点选的是Outlook_Overcast这个条件而不是Humidity因为Outlook的信息增益在完整数据里更大。这就是理论和代码互相验证的过程。3.2 把课后习题方法延伸到真实项目GEO数据挖掘全流程课后习题里的数据预处理和聚类分析放到真实项目里到底怎么用我用GEO数据挖掘来举例因为这个流程最近问的人特别多而且每一步都能对应上书里的知识点。GEO数据挖掘的标准流程是数据下载 - 表达矩阵处理 - 质控 - 标准化 - 差异分析 - 结果可视化。整个流程在R里完成核心包是GEOquery和limma。第一步用GEOquery下载表达矩阵。代码很简单library(GEOquery) gse - getGEO(GSE1009, GSEMatrix TRUE, AnnotGPL TRUE) expr - exprs(gse[[1]])这一步对应第2章的数据集成。从公共数据库拿到的数据是分散的你要把它整合成一个统一的矩阵探针ID对应基因名样本注释对应分组信息。第二步质控。这里要用到箱线图、PCA图、样本相关性热图。箱线图看各样本的表达值分布是否一致PCA图看样本是否按分组分开相关性热图看有没有离群样本。这一步对应第2章的噪声数据和离群点检测只不过你不再算手工距离而是让代码做PCA、算欧氏距离。boxplot(log2(expr 1), main Sample QC)第三步标准化。GEO里有些数据是RMA标准化过的有些是MAS5还有的是原始值。标准化方法的选择对应第2章的数据变换。limma包的voom函数会做log2转换和均值方差关系建模更适用于测序数据。第四步差异分析。这一步对应书里的特征选择。limma做的本质上是线性模型加贝叶斯检验为每个基因计算logFC和调整后p值。然后你根据logFC的绝对值大于1、调整后p值小于0.05来筛选差异基因。library(limma) design - model.matrix(~ 0 factor(c(rep(group1, 3), rep(group2, 3)))) colnames(design) - c(group1, group2) fit - lmFit(expr, design) contrasts - makeContrasts(group1 - group2, levels design) fit2 - contrasts.fit(fit, contrasts) fit3 - eBayes(fit2) res - topTable(fit3, coef 1, number Inf)第五步聚类。拿到差异基因之后很多人会做样本聚类或基因聚类确认差异基因能把两个组分开。这就是第7章层次聚类的直接应用。heatmap(as.matrix(diff_expr), scale row)整个GEO流程做下来你会发现核心方法论就是书里的那些东西数据清洗、规范化、特征筛选、聚类。差别只是数据量更大、代码更多而已。刷课后习题时建立的“先理解数据、再选方法”的思维在这个流程里特别有用。3.3 一鱼多吃如何把一道题改造成一套分析方案我经常给刚入行的朋友一个建议拿到一道课后习题不要只满足于算出答案要试着把它改造成一套可复用的分析方案。比如第2章有一道题是“比较z-score规范化和最小-最大规范化的适用场景”。大部分人背答案就过去了。但如果你反过来想就会发现这其实是一道方案选择题当你的下游算法对数值范围敏感比如K-means距离计算、SVM你必须做规范化当你的数据存在极端离群点时z-score比最小-最大更稳因为最小-最大会被最大值和最小值牵着走。再比如聚类章的习题“给定一组样本手动执行K-means迭代”。你在做这个题的时候可以顺手思考初始质心选不好会怎么样如果其中一个簇是空的怎么办K怎么定用肘部法则还是轮廓系数一步追问下去你就能写出一套完整的K-means调优流程。课后习题的价值就在于此它是一个“最小可复现的案例”。你不需要海量数据不需要昂贵算力只需要纸笔和30分钟就能把算法的核心机制搞清楚。真实项目的每一个分析环节本质都是这些最小案例的组合。4. 常见问题与排查技巧实录4.1 自学刷题高频问题速查表我在刷题和带人过程中总结了一些高频问题列个表直接给你参考。问题可能原因解决办法熵和信息增益算出来是负的条件熵大于总熵通常因为划分后子集混乱度更大检查是否用了错误的概率值确认各子集占比是否按样本数加权决策树剪枝时不知道该预剪枝还是后剪枝对过拟合的理解不够重点看验证集误差书上的习题会刻意造成过拟合场景K-means迭代几轮后质心不收敛初始质心选择不当或数据本身不适合K-means换K尝试K-means初始化和标准化数据Apriori产生的候选项集太多最小支持度阈值设置太低按题目要求调整阈值检查连接步是否遗漏排序朴素贝叶斯概率乘积为0某个属性值的条件概率为0使用拉普拉斯估计分子加1分母加类别数不知道课后习题答案是否正确官方没有完整答案用代码验证计算类题目用Python/R手算对比GEO流程中PCA图样本不按分组分开数据未标准化或批次效应严重先做标准化再考虑ComBat等批次校正方法4.2 三个月学习路线与时间分配建议如果你打算系统地刷完这本书的课后习题我给你一个亲测有效的路线按三个月来安排。第一个月打基础主攻第1到3章。每天2小时先看正文再刷课后题。第2章的相似度计算题务必每题都手算一遍。这一个月目标不是快而是把每个公式都推到能自己写出来的程度。第二个月攻核心算法主攻第4到9章。每周一个主题关联规则、决策树、贝叶斯、SVM、集成学习、聚类。每一章刷题时计算题和概念题的比例控制在7比3。这个阶段至少要写代码验证5道计算题你把决策树、K-means、Apriori的代码跑通理解会深很多。第三个月做整合和延伸主攻第10到13章以及前面的综合题。这时候可以开始做真实项目比如走一遍GEO数据挖掘流程或者用Kaggle上的公开数据做一次完整的分类或聚类实验。刷题刷到这里你已经不是在学知识而是用知识解决问题了。4.3 独家避坑技巧与学习心得最后分享一些我自己的独家心得都是踩坑踩出来的。第一不要对着中文版背术语。这本书的英文术语非常标准刷题时建议把英文术语也标注出来。比如“entropy”和“information gain”你后面看论文、看英文文档、看sklearn官方文档时用的都是英文术语。书页空白处随手记英中对照比单独背单词效率高得多。第二计算题一定要保留中间步骤。K-means迭代、Apriori生成的候选项集这些过程在考试和面试中都会考察中间步骤就是你拿分的依据。更重要的是保留过程方便你回查错误。我自己刷题时习惯用表格记录每一步后来带人时也这么要求发现错误率大幅下降。第三第2章和第6章值得刷两遍。第一遍在初学的时候刷第二遍在学完后面所有章节后再刷。你会发现同样的题第一次和第二次的思路完全不一样第二遍你能看到很多深层联系。比如数据规范化这题你会联想到SVM为什么需要特征缩放聚类为什么要用欧氏距离。第四不会的题先跳过但一定要标记。我有一本专门的错题本按章节标记错题编号每周末回头做一遍。这个方法听起来老土但对这本书特别管用因为书里的习题前后关联极强前面不懂的公式会在后面反复出现回头解决能形成知识闭环。第五做GEO这类真实项目时倒回来查书。我第一次跑GEO差异分析时对limma的voom标准化一知半解后来翻开书重新看了数据变换那一节才真正明白voom在做什么。真实项目是最好的复习工具它能把你刷过的题重新激活让你看到那些公式在真实数据上的生命力。我个人刷完这套题最大的收获不是记住了多少公式而是形成了一套数据思维。现在给我任何一个数据集我脑子里会自动浮现出这个问题的分类是分类还是聚类数据里有没有噪声特征怎么选要不要做规范化模型怎么评估这些框架几乎都能追溯到这本书的章节和习题。如果你正在刷这本书或者准备刷我建议你不要追求速度而是追求每一道题都能讲清楚“为什么这样做”。这套题就像一个压缩过的项目集你把它吃透了后面遇到真实项目就相当于在解一道更大号的习题心里不会慌。
阅读完成 · 觉得有帮助?
咨询建站