资讯动态

数据挖掘高频计算题详解:归一化、相似度、信息增益与K-means

发布时间:2026/9/6 20:13:49 来源:尧图企业网站定制
简介《数据挖掘概念与技术》部分课后习题答案步骤详细是一份面向数据挖掘学习者的PDF资料由作者自行思考并手写整理适合正在研读Jiawei Han教材、需要结合习题巩固理论和应对考试的学生与自学者使用。答案内容覆盖2.2至10.2共19道精选习题包含2.2、2.3、2.4、2.5、2.6、2.8、3.3、3.5、3.7、3.9、4.4、4.5、4.9、5.4、6.6、6.14、8.7、8.6、10.2等题号与网上常见简略答案不同大题步骤完整呈现每道题均给出分步推导和必要说明。涉及数据预处理、分类与预测、聚类、关联规则学习、序列挖掘、文本挖掘以及模型评估与选择等关键模块例如数据清洗与规约、决策树分裂准则、K-means与DBSCAN比较、Apriori关联规则等都有较细致的展开便于对照教材逐段理解算法原理和实际运用。压缩包内含1个PDF文件包体大小14.89MB下载后即可阅读或打印适合考前快速回顾和查漏补缺。已有935人学习适合高校数据挖掘课程备考及后续进阶学习者。 《数据挖掘概念与技术》这本书只要是学数据挖掘的同学基本都绕不开。韩家炜写的那本内容确实经典但配套课后题也让不少人头疼。我当年备考时最大的感受是书看一遍以为自己懂了合上书做题尤其是计算题第一步该写什么都不知道。后来靠着一道题一道题手算把步骤完整写出来才慢慢找到感觉。这篇文章就针对这门课里最常考的四类计算题做一次完整拆解数据归一化、相似度计算、决策树信息增益、K-means聚类。每一道题从题干到公式、再到代入数值一步步写清楚同时用Python把答案复算一遍保证手算和程序结果对得上。适合正在准备期末考试、考研复试的人也适合刚转行做数据分析、想补数据挖掘底子的朋友。看完之后你会发现这些题一旦步骤顺了思路也就通了。1. 刷课后题的正确姿势先理思路再动手算1.1 这本书的课后题到底在考什么很多同学拿到数据挖掘的课后题第一反应是背概念什么数据清洗、数据集成、数据归约背得滚瓜烂熟结果做到计算题就卡住。我个人的经验是这门课的课后题虽然题型杂但真正拉开分数差距的永远是那几类计算推导题。具体来说高频考点集中在这几个方向数据预处理min-max归一化、z-score归一化、分箱处理。相似性与距离度量欧氏距离、曼哈顿距离、余弦相似度、Jaccard系数。分类模型决策树信息增益计算、朴素贝叶斯概率估计。聚类分析K-means手工迭代、簇中心更新。关联规则支持度、置信度、提升度的计算与解释。这些题有个共同特点公式本身不难但步骤冗长一步算错后面全错。所以平时的训练重点应该放在“把每一步的中间结果写清楚”上而不是直接背答案。1.2 动手前必须先建立的三个意识先说一个最常见的坑很多同学算相似度的时候数据不归一化就直接丢进公式结果距离被数值大的特征主导。这不是公式问题是使用场景问题。动手做题之前我建议你先建立这三个意识第一单位意识。年龄从20到80和收入从5000到50000量纲完全不同。不归一化欧氏距离算出来基本被收入这个维度占满年龄的差异几乎可以忽略。第二符号意识。信息增益里的对数教材默认底数是2有的参考书却用自然对数。底数不同熵的具体数值就不同但信息增益的排序结果一致。考试时一定要看题目要求别默认用ln。第三验证意识。手算出来的答案一定想办法用Python快速复算一遍。两道题对不上往往不是程序错了而是你对某个概念理解有偏差。这一点后面我会专门讲对照方法。2. 四道高频计算题的完整推导2.1 数据预处理min-max归一化和z-score归一化先看一道最典型的题现有10个样本的年龄数据分别是27, 35, 42, 45, 50, 56, 60, 65, 70, 78请分别用min-max归一化和z-score归一化进行处理。min-max归一化的公式是x (x - min) / (max - min)这组数据里 min27max78max-min51。计算过程很直接每个值减去27再除以51原始值x (x-27)/51计算过程270(27-27)/51350.157(35-27)/518/51420.294(42-27)/5115/51450.353(45-27)/5118/51500.451(50-27)/5123/51560.569(56-27)/5129/51600.647(60-27)/5133/51650.745(65-27)/5138/51700.843(70-27)/5143/51781(78-27)/51这个方法的优点是简单直观结果落在[0,1]区间内。缺点是只要新来的样本比27小或比78大最值变了所有归一化结果都会被推翻。实际建模时要注意这个问题。z-score归一化的公式是x (x - mean) / std先算均值(27354245505660657078)/10 52.8再算标准差。教科书默认用总体标准差也就是除以样本数N我按这个口径算方差 [(27-52.8)^2 (35-52.8)^2 ... (78-52.8)^2] / 10 230.96标准差 sqrt(230.96) ≈ 15.2所以每个值的z-score就是(x-52.8)/15.2结果如下原始值z-score原始值z-score27-1.697560.21135-1.171600.47442-0.711650.80345-0.513701.13250-0.184781.658这个数据处理好之后均值为0标准差为1一眼就能看出哪些样本低于平均水平、哪些偏高。注意标准差的除数到底是N还是N-1教材之间不统一做题前先确认避免答案差出一截。2.2 相似度计算欧氏距离、曼哈顿距离、余弦相似度第二道经典题来自推荐系统场景两个用户对5部电影的评分如下分别计算欧氏距离、曼哈顿距离和余弦相似度。用户AA (5, 3, 0, 1, 4) 用户BB (4, 0, 0, 1, 5)先把欧氏距离写出来公式是d sqrt((5-4)^2 (3-0)^2 (0-0)^2 (1-1)^2 (4-5)^2) sqrt(1 9 0 0 1) sqrt(11) ≈ 3.317曼哈顿距离则是各维度绝对值之和d |5-4| |3-0| |0-0| |1-1| |4-5| 1 3 0 0 1 5余弦相似度公式cos(A,B) A·B / (|A| * |B|)分子A·B 5*4 3*0 0*0 1*1 4*5 20 0 0 1 20 41分母|A| sqrt(2590116) sqrt(51) ≈ 7.141 |B| sqrt(1600125) sqrt(42) ≈ 6.481最终余弦相似度cos(A,B) 41 / (7.141 * 6.481) ≈ 41 / 46.28 ≈ 0.886这里要注意评分中的0表示用户未看过该电影不是“打了0分”。而像K-means这类基于距离的算法0会被当作真实数值参与计算这会让“未观看”和“非常讨厌”混为一谈。这就是为什么推荐系统里做用户相似度时余弦相似度比欧氏距离更常用。2.3 决策树选根节点信息增益的手算过程接下来是决策树章节的高频题。给定经典的数据集目标属性是是否打球需要计算每个属性的信息增益确定根节点。总样本数14条其中打球9条不打球5条。总熵为H(总) -(9/14)*log2(9/14) - (5/14)*log2(5/14) ≈ 0.940以Outlook属性为例它有三个取值sunny、overcast、rain。sunny出现5次其中打球2次、不打球3次熵为H(sunny) -(2/5)*log2(2/5) - (3/5)*log2(3/5) ≈ 0.971overcast出现4次全部打球熵为0。rain出现5次其中打球3次、不打球2次熵也是0.971。条件熵为H(打球|Outlook) (5/14)*0.971 (4/14)*0 (5/14)*0.971 ≈ 0.694信息增益Gain(Outlook) H(总) - H(打球|Outlook) 0.940 - 0.694 0.246用同样方法计算另外三个属性结果整理成表属性信息增益Outlook0.246Temperature0.029Humidity0.151Wind0.048信息增益越大说明这个属性带来的纯度提升越高所以根节点选择Outlook。这个计算过程在考试中一定要写完整只写最终答案不给分。2.4 K-means聚类从初始质心迭代到收敛K-means的手算题几乎所有数据挖掘课都会考。给定6个二维样本(1,1), (1,2), (2,1), (5,4), (6,5), (6,6)设K2初始质心选C1(1,1)C2(2,1)要求一步步迭代到收敛。第一轮逐个样本算到两个质心的欧氏距离离谁近就归到哪个簇样本(1,1)到C1距离为0到C2距离为1归簇1 样本(1,2)到C1距离为1到C2距离为1.414归簇1 样本(2,1)到C1距离为1到C2距离为0归簇2 样本(5,4)到C1距离为5到C2距离为4.24归簇2 样本(6,5)到C1距离为6.4到C2距离为5.66归簇2 样本(6,6)到C1距离为7.07到C2距离为6.4归簇2。第一轮结束时簇1包含{(1,1),(1,2)}新质心为(1, 1.5)簇2包含{(2,1),(5,4),(6,5),(6,6)}新质心为(4.75, 4)。第二轮重新计算所有样本到新质心的距离簇1变为{(1,1),(1,2),(2,1)}簇2变为{(5,4),(6,5),(6,6)}。于是质心更新为C1(1.333, 1.333)C2(5.667, 5)。第三轮继续计算每个样本的归属不再变化质心也不再变化算法收敛。迭代轮次簇1成员簇2成员C1质心C2质心初始--(1,1)(2,1)第1轮(1,1),(1,2)(2,1),(5,4),(6,5),(6,6)(1,1.5)(4.75,4)第2轮(1,1),(1,2),(2,1)(5,4),(6,5),(6,6)(1.333,1.333)(5.667,5)第3轮同第2轮同第2轮不变不变做这种题关键是不要跳步。我见过不少同学直接写出最终簇中间过程全空这在考试里拿不到分。初始质心不同迭代路径就不同所以步骤比结果更能体现你懂不懂算法。3. 用Python复算一遍让答案可验证3.1 用pandas和sklearn完成归一化与相似度计算如果你翻过刘顺祥那本《Python数据挖掘》会发现他在讲建模前处理时非常强调一件事能用成熟库的不要自己手写。这个思路我很认同因为像归一化、距离计算这些基础功能PyData生态已经封装得很稳定手写反而容易出边界错误。刚才的归一化用sklearn实现代码非常简单import numpy as np from sklearn.preprocessing import MinMaxScaler, StandardScaler ages np.array([27, 35, 42, 45, 50, 56, 60, 65, 70, 78]).reshape(-1, 1) mm MinMaxScaler() zscore StandardScaler() print(min-max:, mm.fit_transform(ages).ravel()) print(z-score:, zscore.fit_transform(ages).ravel())输出结果和我们手算的完全一致。有一点值得留意sklearn的StandardScaler默认计算的也是总体标准差用的分母是N和多数教材一致。这点后面避坑部分还会细说。距离和相似度可以用sklearn的metrics模块from sklearn.metrics.pairwise import euclidean_distances, manhattan_distances, cosine_similarity A np.array([[5, 3, 0, 1, 4]]) B np.array([[4, 0, 0, 1, 5]]) print(欧氏距离:, euclidean_distances(A, B)) # 输出 [[3.31662479]] print(曼哈顿距离:, manhattan_distances(A, B)) # 输出 [[5.]] print(余弦相似度:, cosine_similarity(A, B)) # 输出 [[0.88640526]]这里cosine_similarity返回的是相似度不是距离。1表示完全同向0表示完全正交-1表示完全反向。有人会把1减余弦值得到余弦距离但在sklearn里直接看这个值就行。3.2 用sklearn复现决策树和K-means决策树的部分我给你一个手写信息增益函数的版本方便对照from collections import Counter import numpy as np def entropy(y): c Counter(y) total len(y) return -sum((v / total) * np.log2(v / total) for v in c.values()) labels [yes] * 9 [no] * 5 print(entropy(labels)) # 0.9402859586706311这个0.940就和手算总熵对上了。如果想把整棵决策树跑出来直接用sklearn但要小心参数默认的DecisionTreeClassifier用的是gini系数不是信息增益。要把criterion设成entropy才能和ID3的信息增益逻辑对齐from sklearn.tree import DecisionTreeClassifier # criterionentropy 才对应信息增益 clf DecisionTreeClassifier(criterionentropy, random_state0)K-means的复现关键是初始质心。sklearn默认的初始化方式是k-means它为了加速收敛会让初始质心尽量分散所以直接跑得到的结果很可能和我们手算的迭代路径不一样。想完整复现手算过程可以手动指定initfrom sklearn.cluster import KMeans X np.array([[1,1], [1,2], [2,1], [5,4], [6,5], [6,6]]) km KMeans(n_clusters2, initnp.array([[1,1], [2,1]]), n_init1, random_state0) km.fit(X) print(标签:, km.labels_) print(质心:, km.cluster_centers_)标签可能会输出[0 0 0 1 1 1]或者反过来的[1 1 1 0 0 0]这取决于sklearn内部怎么编号簇不影响聚类结果。3.3 手算结果与程序结果对照时注意什么用代码复算最大的价值就是能快速暴露理解漏洞。但有几个“对不上”不一定是你算错了而是程序默认行为和教材假设不一样。第一个决策树。sklearn的默认分裂标准是gini只有把criterion设成entropy它才会按信息增益来分裂。即便如此sklearn的CART算法和教材里的ID3在细节上仍有差异比如它处理连续特征时是二分切分不像教材那样按枚举值多路分裂。第二个K-means。默认的k-means初始化会改变迭代起点导致中间过程和你手算的完全不一样。最后聚类结果可能相同也可能不同但只要把init和n_init固定下来结果就是可复现的。第三个归一化。StandardScaler计算用的均值、标准差和我们手算的总体口径一致。但如果你用pandas的std()方法默认会除以N-1也就是样本标准差这就是常见的“为什么我手算的z-score和代码差一点”的原因。4. 做题踩坑记录这些细节决定能不能拿满分4.1 归一化里的总体方差和样本方差前面我特意对比了总体方差和样本方差因为这里真的很容易丢分。教材课后题一般不特别说明的话用的都是总体方差也就是除以样本数N。但很多练习题来源不一样有的参考书会要求按样本方差算除以N-1。实际体验下来这两者算出来的标准差差别在小样本上非常明显。比如刚才那组年龄数据总体标准差约15.2如果按样本标准差则是约16.02z-score的结果会差0.04到0.08不等。考试时如果题目给了明确的公式就按公式算没给公式优先采用教材正文的口径。4.2 相似度不是距离余弦和欧氏的适用场景再强调一遍相似度那题里埋的坑。欧氏距离度量的是绝对差异适合像身高、体重这种本身具有实际意义的连续数值余弦相似度度量的是方向差异适合像文本词频、用户评分这种关心相对偏好而非绝对数值的场景。举例来说用户A评分(5,3)用户B评分(4,2)用户C评分(5,1)。从欧氏距离看A和B更近从余弦相似度看A和C的方向一致程度更高因为两维的比值一样都是5比3左右。我用到推荐项目里时一般先用余弦相似度找偏好相似的用户再用欧氏距离做细粒度去重。此外评分为0的含义也要提前约定好。把缺省值当0算距离会被严重拉大更好的做法是先做缺失值处理再计算相似度。4.3 支持度、置信度、提升度别搞混关联规则这块是概念题的重灾区。我用一个小例子说明假设6条交易记录里同时买“牛奶”和“面包”的有3条买牛奶的有4条买面包的有5条全部交易6条。支持度支持度(牛奶→面包) 同时购买/总交易 3/6 0.5置信度置信度(牛奶→面包) 同时购买/买牛奶 3/4 0.75提升度提升度(牛奶→面包) 置信度 / 支持度(面包) 0.75 / (5/6) 0.9提升度小于1说明“买了牛奶反而会降低买面包的概率”。这三个指标经常放在一道题里考支持度是全局热度置信度是在条件下成立的概率提升度才是真正衡量相关性强弱的指标。4.4 K-means手算与sklearn结果不一致的真相最后再补一个我实际调试时遇到的场景。以前我用K-means对用户特征聚类手算了一道小样本习题和sklearn默认输出对不上差点怀疑自己哪里算错了。后来看了文档才明白k-means初始化会让初始质心偏离你指定的点迭代路径自然不同。还有一点K-means本身可能收敛到局部最优不同的初始质心会得到不同的结果。sklearn通过n_init参数控制多次初始化并选择最优结果的次数默认是10。如果你想严格复现手算除了指定init还要把n_init设成1。这个细节在面试里问出来能明显拉开你和其他候选人的差距。我个人做题的习惯是手算求理解代码求验证。两道计算题一旦能对上我基本就可以确定自己掌握得比较扎实。如果你现在也在刷这本书的课后题建议不要只盯着答案对不对而是把中间每一步都写清楚再用代码复算一遍。对不上的地方往往就是你理解还有漏洞的地方那才是真正进步的空间。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价