《数据挖掘概念与技术(第三版)》第二章,可能是很多人打开这本书之后第一个真正头疼的章节。第一章好歹是概念性地介绍"数据挖掘是什么",读起来还算顺畅;到了第二章,突然冒出数据预处理、数据立方体、OLAP、相似性度量一堆东西,课后题又普遍没有标准答案,做完了也不知道自己对不对。我当年学的时候,也是卡在这章。后来自己带项目、帮别人答疑,发现很多人在第二章踩的坑其实高度相似——不是看不懂书,而是不知道课后题到底在考什么,以及用什么思路去答。
这篇文章就把第二章课后题里最常考的题型、解题框架和容易翻车的地方完整拆一遍。不管你是刚翻开这本书的新手,还是复习准备考试的,都可以直接照着这个思路去检查自己的答案。
1. 数据预处理课后题的核心:先分清"脏数据"到底脏在哪
第二章前半部分的课后题,基本都绕不开数据清洗、数据集成、数据变换这三块。很多同学做题的时候觉得题目很抽象,是因为没有把问题落到"数据表里的具体某一列"上去想。
1.1 缺失值、噪声数据、离群点:概念题别只背定义
有一类课后题长这样:"简述数据清洗的主要任务,并说明处理缺失值和噪声数据各有哪些常用方法。"这种题目看起来很基础,但很多人答不全。关键在于,答案里必须体现"先判断、再选择、后处理"的层次。
处理缺失值,常用的套路其实可以分成三类:
- 删除:直接删掉含缺失值的记录,或者删掉缺失比例过高的列。适合缺失量小、且删除后不影响样本代表性的场景。
- 填充:用该列均值、中位数、众数填充;或者用回归、贝叶斯推断等模型预测填充。适合缺失值有一定规律、列之间有关联的场景。
- 不处理:某些算法(比如决策树、C4.5)本身能容忍缺失值,建模时不填反而更好。
噪声数据则是另一回事。它是指数据中存在明显偏离正常取值范围、无意义的波动或错误值。平滑噪声的经典方法就三种:分箱(等深分箱、等宽分箱)、回归、聚类。课后题如果让你"举例说明分箱是如何平滑噪声的",你不能只写名字,要能画出一个小例子。
我举个自己在项目里用过的例子:某张订单表里有这样一组金额数据(单位:元):
1200, 1350, 1280, 14500, 1300, 1400, 1180, 9000
一眼扫过去,14500和9000就非常可疑——如果这是个社区便利店的日营业额,这两条八成是录入时多敲了位数的异常值。通过分箱(比如按金额排序后均分为两箱:1180~1400为一箱,9000~14500为一箱),再以各箱均值代替箱内值,原本的极端值就被拉回到正常范围附近。虽然这个例子比较简单,但考试时能写出这样的演算过程,分数一定比只写"用分箱平滑噪声"高一个档次。
1.2 数据集成里的"实体识别"和"冗余处理":最容易漏答的两个得分点
第二章课后题里关于数据集成的常见问法是:"数据集成时需要考虑哪些问题?"很多人的回答就三个字:"去冗余。"这只能得一小半分。
真正的完整框架应该包含四层内容。第一是模式集成,也就是让不同数据源的字段名、字段类型对齐,比如一个表叫 customer_id,另一个表叫 cust_no,得先确认它们是不是同一个东西。第二就是实体识别,这是我最想强调的——它指的是判断来自不同数据源的两条记录是否指向现实世界中的同一实体。比如两张表里都有人叫"张伟",但一个年龄30岁、一个年龄50岁,就不能简单地合并。第三是冗余处理,包括属性冗余和值冗余,通常用相关分析来发现。第四是数据值冲突的检测与处理,比如两个系统里同一个商品的单价不一致,到底以哪个为准。
课后题如果问"什么是冗余数据,如何检测",你最好能写明白:属性A和属性B之间存在推导关系(比如单价乘数量等于金额),或者两者相关系数很高,就算冗余。答题时用公式补充会显得更严谨:
correlation coefficient = covariance(A, B) / (stddev(A) * stddev(B))
相关系数接近1或-1时,两个属性高度相关,可以考虑去掉其中一个;接近0时,两者基本独立。注意,考试时还要补一句:高度相关只代表线性相关性,不代表因果性,这也是出题人爱挖的坑。
1.3 数据变换的三板斧:min-max、z-score、小数定标必须能手推
数据变换几乎是第二章课后题必考的计算点。出题方式通常是:"给定一组数据,分别用最小-最大规范化、z-score规范化、小数定标规范化对其进行变换。"这种题就是送分题,但有个前提——你不仅要背公式,还得知道每步在干嘛。
最小-最大规范化(min-max normalization)的公式:
v' = (v - min) / (max - min) * (new_max - new_min) + new_min
注意两个常见陷阱。第一,如果未来可能出现比训练数据更大或更小的取值,变换后可能会超出映射区间,这时候要预先留余量或者改用别的规范化方式。第二,min和max被极端值主导时,变换后的数据会被压得很扁;比如数据是1, 2, 3, 100,min=1, max=100,那1、2、3映射到0~1区间后几乎都挤在0.01附近,区分度很差。
z-score规范化公式:
v' = (v - mean) / stddev
这里我提醒一个特别容易被忽视的问题:一组数据里所有值都相同的时候,标准差为0,公式分母为零。考试时如果题目给了一组完全相同的数,你要能指出"z-score不适用,因为数据没有离散度,规范化无意义",这反而是个加分项。
小数定标规范化(decimal scaling)公式:
v' = v / 10^j
其中j是使得max(|v'|) < 1的最小整数。实际操作就是先找数据里绝对值最大的数,再看它有几位整数,整体除以10的相应次方。比如数据-886, 543, 1200,最大绝对值是1200,那j=4,除以10000后变成-0.0886, 0.0543, 0.12。
这类题目没有太多技巧,就是多练几组数据,把公式刻进脑子里。考试时遇到,别跳步,把每一步的中间值写出来,就算最后结果算错,过程分也能拿不少。
2. 数据立方体与OLAP操作:课后题的"概念重灾区"其实是纸老虎
第二章后半部分的核心是数据仓库和数据立方体。很多同学觉得抽象,是因为分不清"关系表"和"数据立方体"到底有什么区别。这里我用一个特别生活化的类比解释。
2.1 一张销售表怎么变成数据立方体:三维视图的由来
现在假设你手头有一张三列的表:城市、商品类别、销售额。传统数据库里,你查"北京的销售额"很简单,查"北京+家电的销售额"也简单,但如果想同时看"所有城市、所有商品类别、每个月"的汇总数,就得写一堆GROUP BY。
数据立方体的做法是,把维度作为坐标轴,把度量值放进格子。我们用三个维度:城市、商品类别、时间。想象一个三维的魔方:城市轴上有上海、北京、广州,商品类别轴上有家电、服装、食品,时间轴上有1月、2月、3月。魔方里每一个小格子的值,就是某个城市在某个时间段内某一类商品的销售额总和。这就是最基本的"数据立方体"。
课后题如果问"什么是维度、度量、单元",你的答案要能把这个逻辑说清楚,而不是只背定义。维度是看数据的角度,度量是你要聚合的数值(通常是销售额、数量、利润),单元是某个维度组合下对应的度量值。
更高一层的概念是"方体(cube)"和"格(lattice)"。比如把"城市、商品类别、时间"三个维度全部组合,得到的是3-D方体;只看"城市+时间",就是对商品类别维度做了汇总,得到2-D方体。不同汇总层次之间形成一个偏序关系,这就是方体格。答题时能说出"维度越多,方体格越复杂;基础方体(base cuboid)存最细粒度数据,最顶层的方体只存一个总数"这种话,说明你真的理解了这个结构。
2.2 OLAP操作怎么考:切片、切块、上卷、下钻、转轴,一个都不能混
OLAP的五种基本操作是第二章课后题另一个高频考点。出题形式经常是:"某公司有销售数据立方体,维度为时间、地区、产品,度量是销售额。请说明如何用OLAP操作回答'比较华东区和华北区第一季度家电类产品的销售额'。"
这种题的价值在于它用了"复合操作"而不是单一操作。正确思路应该分解成这四步:
第一步,按时间维度做切块操作,只保留第一季度的数据(time = Q1);第二步,按产品维度做切片,只保留家电类;第三步,按地区维度比较华东、华北两个成员;第四步,如果数据量还很大,上卷到省级汇总,再对比。
考试时最容易丢分的点是分不清切片和切块。切片其实是固定一个维度上的某一个值,比如只看"1月"的数据,就像把魔方的某一层单独拿出来;切块是固定一个维度上的一个区间,比如"1月到3月",这就相当于拿出三层层叠起来的一块。有的教材把切块定义为"对两个或两个以上维度的选择",但我建议你答题时用"一个维度上的属性值范围"这种更稳的说法,并且一定要举出具体例子。
转轴操作也很爱考。它的本质是旋转立方体,从不同角度观察数据,把原本横着展示的维度换成纵着展示。比如原来行是城市、列是商品类别,转轴后可能变成行是时间、列是城市。它不改变数据聚合的粒度,只改变展示视角。
上卷(roll-up)和下钻(drill-down)考的是层次概念。上卷是从细粒度到粗粒度,例如从"按月汇总"上卷成"按季度汇总",或者直接看全年总额;下钻反过来,从"年"下钻到"月"甚至到"日"。答题时建议画层级示意:季度 -> 月 -> 日,这样评分老师一眼就能看懂你的理解。
2.3 星型模型与雪花模型的区别:设计题的高频抓手
第二章课后题里如果出现"设计一个数据仓库的星型模型",很多人会卡住,因为没理解维度表和事实表的关系。这里我给一个可以直接套用的模板。
我们继续用销售场景:事实表(fact table)里放的是业务度量,也就是销售额、销量、利润这种数值,以及各个维度的外键,比如time_id、region_id、product_id。维度表(dimension table)里放的则是维度的描述信息,比如地区维度表有region_id、region_name、country、city;时间维度表有time_id、year、quarter、month。
星型模型的结构就是事实表在中间,维度表围在四周,连线呈放射状。雪花模型则是维度表再被规范化,把country、city拆到单独的表中,形成雪花分支。二维表好画,考试时用文字描述也能得分,关键是说清楚两点的区别:星型模型查询性能更高、理解更简单,但有冗余;雪花模型节省存储、更规范,但多表连接查询更慢。
如果题目让你"比较星型和雪花模型并选择一种",你最好有一个倾向,并且给出理由。大多数人会选择星型模型,因为数据仓库的核心诉求是查询性能,不是节省那点存储空间。你可以在答案里写:"该场景中销售额明细量级为千万行,维度表规模很小,冗余成本可忽略,因此优先选择星型模型。"这种有依据的选择比单纯背优缺点好用得多。
3. 相似性与相异性计算题:第二章最容易"一看就会、一算就错"的部分
这一节在教材里属于"数据挖掘基础",但课后题出的计算量比前面大不少。它也是后面聚类、离群点分析、推荐系统的基础。我见过太多人在欧氏距离和曼哈顿距离上栽跟头,原因不是不知道公式,而是没搞懂数据对象和属性维度之间到底怎么对应。
3.1 欧氏、曼哈顿、闵可夫斯基:一道题看清三种距离的适用逻辑
先给一个典型考题:"两个数据对象分别表示为(1, 2, 3)和(4, 6, 3),请计算它们之间的欧氏距离、曼哈顿距离和闵可夫斯基距离(设h=3)。"
欧氏距离就是平方和的平方根:
d = sqrt((1-4)^2 + (2-6)^2 + (3-3)^2) = sqrt(9 + 16 + 0) = 5
曼哈顿距离是绝对差之和:
d = |1-4| + |2-6| + |3-3| = 3 + 4 + 0 = 7
闵可夫斯基距离是通用公式,h=3时就是立方差绝对值的和的立方根:
d = (|1-4|^3 + |2-6|^3 + |3-3|^3)^(1/3) = (27 + 64 + 0)^(1/3) = 91^(1/3) ≈ 4.498
会算只是基础,更重要的是理解适用场景。欧氏距离对维度间的差异是平方加权的,所以个别维度差异很大时会被放大;曼哈顿距离对所有维度的差异是线性累加的,更抗个别大偏差;闵可夫斯基距离通过h参数调节权重,h越大,最大差异维度的影响越突出。这些"为什么"才是论述题真正想要的。
我自己的经验是,做这类题最容易出错的点是忘记开根号,尤其闵可夫斯基距离,很多人算出(|3|^3 + |4|^3)^(1/3)后直接写成27+64=91就交上去了,白白丢分。考试时一定要回头检查:单位上是不是"距离"而不是"偏差的幂和"。
3.2 混合类型数据:布尔、枚举、数值一起出现时怎么办
教材有个经典公式处理相异度,分 nominal、ordinal、ratio-scaled 三种情况分别计算。课后题经常出现"已知三个对象 A、B、C,属性包括性别、年龄、收入、婚姻状况,求 A 与 B 的相异度"。这类题没有统一答案,关键看你有没有掌握分类型的处理逻辑。
我总结一个通用的三步走:
- 第一步,把不同属性区分类型:nomial(性别、婚姻状况)、ordinal(比如学历等级)、numeric(年龄、收入)。
- 第二步,对每个类型分别计算差异,最后加权合并。公式不要求背下来,但你要知道本质是"每个属性单独算出一个0到1的相似度/差异度,再按权重合并"。
- 第三步,如果是具体计算,通常题目会给权重或者让你自行假设权重分配。
如果你想把答案写得比标准答案更亮眼,试一下"把数值型属性先规范化到0~1区间,nomial属性差异取1(不同)或0(相同),再按属性数量取平均"。这个操作不仅简单,而且非常符合教材里对混合类型数据的处理思想。我在实际做用户画像聚类时,就是这么处理年龄、城市、消费等级混合数据的,效果很稳定。
3.3 余弦相似度与Jaccard系数:文本和集合场景的拿分点
除了距离,第二章还会提到余弦相似度。它的应用场景是文本向量。比如两个用户购买偏好用向量表示:A用户[1, 0, 1, 1](表示是否购买过四类商品),B用户[0, 1, 1, 0]。余弦相似度计算公式:
cos(A,B) = (A·B) / (|A| * |B|)
A·B = 1*0 + 0*1 + 1*1 + 1*0 = 1
|A| = sqrt(1+0+1+1) = sqrt(3)
|B| = sqrt(0+1+1+0) = sqrt(2)
cos = 1 / (sqrt(3) * sqrt(2)) = 1 / sqrt(6) ≈ 0.408
但这里有个巨大的坑:步骤上,你必须先说明余弦相似度看的是"方向",不是"长度"。比如一个用户买了1件商品,另一个用户买了10件同款商品,余弦相似度会很高,因为方向一致;而欧氏距离可能很大,因为模长差异大。这个区别是论述题最爱考的。
Jaccard系数则适合离散集合:比如A收藏的标签集合是{科技, 数码, 运动},B是{科技, 运动, 美食},那么:
Jaccard = |A∩B| / |A∪B| = 2/4 = 0.5
它和余弦相似度的差别在于,Jaccard完全不考虑元素出现次数,只看集合成员是否重合。适合用于文本去重、推荐系统的物品相似度初筛。课后题如果让你选一个相似度计算方法并说明理由,用Jaccard回答"集合型标签数据"这类场景基本不会错。
4. 数据立方体与OLAP课后题的陷阱:从"看懂概念"到"答对题"
我在实际带新人、给学弟学妹答疑时,发现第二章得分率最低的其实是"概念+应用"结合的题目。很多人不是没背书,而是背完书不会用。这一节专门聊怎么应对这类题。
4.1 判断"是OLTP还是OLAP"的题型:两句话讲清本质差异
课后题偶有这种考法:"以下操作中哪个属于OLAP操作?A. 修改一条订单记录 B. 查询某日某门店的总销售额 C. 往商品表里插入100条新商品 D. 删除过期数据。"正确答案显然是B,但有人会纠结A和B。
我建议你用这个判断标准:OLTP(联机事务处理)围绕"增删改查"单条记录,关注事务吞吐量和数据一致性;OLAP(联机分析处理)围绕"多维度的汇总分析",关注查询响应速度和分析广度。凡是涉及SUM、COUNT、GROUP BY、ROLLUP、CUBE这类聚合操作的,都是OLAP;凡是涉及INSERT、UPDATE、DELETE单条记录的,都是OLTP。
把这个标准带进第二章所以概念题里,答题准确率会明显提高。出题人很少直接考"OLAP定义",但很喜欢把它包装成一个"销售总监想看各地区各季度销售趋势"的场景,让你判断应该用哪种系统。这时候你要能答出"该需求需要多维汇总,适合OLAP;但不适合把高频的事务插入也放到OLAP里,应该通过ETL定期从OLTP同步数据"这种有层次的答案。
4.2 案例分析题怎么答才不空:用"场景+操作+原因"三段式
第二章里有一类比较高级的题:"针对某连锁超市的销售数据,设计一套多维分析方案,说明你选择的维度、度量和可能的OLAP操作。"很多人拿到这种题就开始编,然后只写几个名词。
我个人建议答题按"场景+操作+原因"三段式来组织:
- 场景:连锁超市关心的是各门店、各品类、各时段的销售表现。
- 设计:维度选"门店、商品类别、时间(天/周/月)",度量选"销售额、销量、毛利"。
- 操作组合:想对比A店和B店本周饮料类的销售,先按时间切片(本周),再按品类切片(饮料),按门店比较;如果还要看趋势,就下钻到日;如果只看整体,就上卷到月。
有了这个框架,你作答时不会漏掉关键信息。注意,题目如果给了具体度量,你的方案必须围绕度量展开,而不是泛泛地"看数据"。这其实是在检验你有没有真正理解"度量是分析的目标,维度是分析的坐标"这句话。
4.3 关于概念题的复习策略:用画图代替死记硬背
第二章概念太多,死记硬背容易混。我的建议是所有"结构型概念"都用图形语言记忆。数据立方体画三维坐标;方体格画多层次的偏序图;星型模型中央画事实表、四周画维度表;数据预处理的流程画一条流水线:"原始数据 -> 清洗 -> 集成 -> 变换 -> 规约 -> 可用数据"。
一句话,第二章不是刷题刷出来的,是想清楚数据流之后水到渠成的。课后题不会做,往往不是题目难,而是概念之间的关系在脑子里是散的。你只要能随手画出上面这几张图,大部分题目都能找到对应考点。
5. 实操角度补一句:数据预处理才是真正决定项目成败的部分
最后再多说一点,虽然这是教材第二章,但它不是只为了应付考试的。我做数据挖掘项目多年,最深的体会是:预处理的工作量通常占整个项目的60%以上,模型算法反而是最不花时间的那一截。
很多新人在项目里拿到一份数据,第一反应是直接跑模型,结果效果差得没法看,然后开始调参数、换模型。真正的老手拿到数据第一件事是画分布图、查缺失率、看离群点、检查不同字段的量纲差异。第二章课后题里那些看似"概念化"的处理方法——缺失值填充、噪声平滑、数据规范化——每一个都是项目实战里会反复用到的真工具。
举个实际例子:我处理过一个用户行为日志,里面有个字段叫"页面停留时长",原始数据里有大量-1和99999这种值。前者是埋点异常,后者是页面切后台导致的计时错误。如果直接拿去做聚类,这两个异常值会直接把聚类中心拉偏。后来怎么做?把负数视为缺失值,用该用户的历史平均停留时长填充;把超过99分位数的值截断到99分位数的水平。就这么一个简单的处理,下游模型的稳定性提升非常明显。
所以你在做第二章课后题的时候,不要只想着"凑个答案交差"。每道题背后都对应真实项目里一个坑。把公式推导清楚,把操作思路想明白,后面的路会好走得多。
再分享一个我比较推荐的复习方法:把你手头数据的某一列抽出来,比如"订单金额",然后自己动手做一遍min-max规范化、z-score规范化和小数定标规范化;再给这一列人为地加入几个极端值,用分箱平滑一下,看看变换前后的分布差异。这套流程做完,第二章课后题里跟数据预处理相关的计算题和简答题,你基本不会再丢分。
至于理论题,特别是OLAP和立方体,我建议你找一个自己熟悉的业务场景,比如外卖平台或者校园超市,自己设计一个三维立方体,把所有维度组合的方体格画一遍,把五种OLAP操作用一遍。这个过程比反复看十遍教材都有用。做完之后你再回头看课后题,会觉得那些题其实都在问同一件事:你允不允许我从不同角度看同一份数据,并且把脏数据变成干净数据。