层次聚类邻近度精解:从MIN/MAX到树状图实战

发布时间:2026/9/18 19:25:10
层次聚类邻近度精解:从MIN/MAX到树状图实战 简介一份数据挖掘考试题PDF面向高校计算机、数据科学等专业学生复习备考也适合教师命题或自学自测。共1个PDF文件大小仅367KB便于下载后打印或随时翻阅。题目按选择题、填空题、判断题、综合题四类组织覆盖分类与聚类区别、K均值与DBSCAN对比、关联规则与“啤酒尿布”案例、凝聚/分裂层次聚类、Min/Max/组平均/Ward方法、相似度矩阵及树状图绘制等核心知识点其中对K均值与DBSCAN的对比、Ward方法与组平均的异同、支持度与置信度计算等易错点均有体现。关键题目附有参考答案和简要解析可帮助读者对照纠错、强化概念理解综合题中的距离矩阵实操还能训练层次聚类树状图的手工绘制流程。目前已有58人学习可作为考前刷题、查漏补缺或组卷参考的轻量资料。1. 一套数据挖掘考试题里真正拦住人的是层次聚类如果你手头有一份《数据挖掘考试题.pdf》刷完第一遍的感受多半是选择题里“啤酒与尿布”送分判断题里“K 均值能处理不同密度数据”直接画叉真正卡住的是层次聚类那几道手算题——尤其是要求用 MAX全链逐步合并、画出树状图的综合题。这道题放在最后不是为了考记忆而是考你能不能把“簇间邻近度”这个抽象概念落实到每一次距离矩阵更新上。本文把这套 PDF 里的聚类考点拆开讲从 MIN/MAX/组平均/Ward 四种邻近度定义到 K 均值与 DBSCAN 的选型边界再到支持度与置信度的手算逻辑最后落在一个实用的复盘技巧上。适合正在复习数据挖掘课程、准备期末考试或面试前突击聚类知识点的读者。2. 凝聚层次聚类的邻近度定义MIN、MAX、组平均与 Ward 方法层次聚类是第二类重要的聚类方法它不直接给数据分 K 个簇而是生成一棵嵌套的层次树。你在这份 PDF 的综合题第 4 题里会看到基本凝聚层次聚类算法的标准答案先计算邻近度矩阵然后反复合并最接近的两个簇再更新矩阵直到只剩一个簇。这个流程听起来简单但每一步“合并哪两个簇”完全由簇间邻近度的定义决定。2.1 四种簇间邻近度如何影响合并结果2.1.1 MIN单链为什么会“串簇”MIN 把两个簇的邻近度定义为两个簇中所有点对距离的最小值。也就是说只要两个簇里各有一个点靠得足够近这两个簇就会被合并。这种定义擅长处理非椭圆、细长甚至环绕形状的簇所以在填空题第 9 题里单链技术的适用场景是“非椭圆形状的簇”但对噪声点和离群点很敏感。原因很直观一个离群点只要刚好贴近另一个簇的某个点就会把两个本不该合并的簇强行拉在一起形成一条“链”。经典教材里称这种现象为 chaining effect。你在判断题第 10 题看到“单链擅长处理椭圆形状的簇”要直接判错——它擅长的是细长、非椭圆的形状。2.1.2 MAX全链为什么偏好球形MAX 取的是两个簇之间所有点对距离的最大值所以两个簇只有在“最远的点也够近”时才会合并。这是三种方法里最保守的对噪声点和离群点敏感度较小但代价是当簇大小不同时较大的簇容易被撕裂而且偏好生成球状簇。判断题第 7 题“全链对噪声点和离群点很敏感”判错正是因为这个。全链的缺点不是怕噪声而是怕大小不一的簇——大簇和小簇合并时大簇内部距离可能超过阈值导致大簇被拆散。填空题第 8 题原话是“全链在处理大小不同的簇时可能使大的簇破裂并且偏好球形”这两句话要一起记考试经常拆成两个空来考。2.1.3 组平均的折中组平均把簇间距离定义为两个簇所有点对距离的平均值。它既不像 MIN 那样对单个近邻点过度敏感也不像 MAX 那样被最远点一票否决所以填空题第 6 题说它是“介于单链和全链之间的折中方法”。从计算量上看组平均比 MIN、MAX 都大因为它要枚举两个簇之间的所有点对。但它的稳定性更好选择题第 6 题说 Group Average 擅长处理球状簇这个说法是对的——它对非球形簇的支持不如单链但对噪声的容忍度比单链好。2.1.4 Ward 方法不是距离而是误差增量Ward 方法在概念上和其他三种不一样它不直接定义“簇间距离”而是定义“如果合并这两个簇SSE误差平方和会增加多少”。两个簇合并后导致的 SSE 增量越小越应该优先合并。选择题第 5 题问 Ward 方法说法错误的是哪项答案是 C“对于 Ward 方法两个簇的邻近度定义为两个簇合并时导致的平方误差”——这个表述的问题在于省略了“增量”。Ward 的邻近度不是合并后的平方误差本身而是合并前后平方误差的变化量。这个细节判断题第 4 题也考了当点间邻近度取距离的平方时Ward 方法与组平均非常相似判对。2.2 MIN/MAX/组平均/Ward 优缺点速查表邻近度定义对噪声/离群点擅长形状主要缺点MIN单链很敏感非椭圆、细长、环形易产生链式效应串簇MAX全链不太敏感球形簇大簇易破裂偏好球形组平均不太敏感球形簇计算量大对非球形支持一般Ward对离群点敏感球形簇距离取平方离群点被放大这张表覆盖了选择题第 5、6、7 题和填空题第 4、6、8、9 题的全部考点。复习时可以把这张表当口诀背但更重要的是理解每一行背后的逻辑。比如 Ward 对离群点敏感的原因它用的是距离平方离群点与簇中心的距离被平方放大后会显著拉高 SSE 增量导致它不容易被合并。2.3 用 Python 把邻近度定义落成代码刷题时手算 MIN/MAX 还好组平均一旦簇变大枚举所有点对会非常烦。我一般直接写个小函数验证手算结果import numpy as np def cluster_distance(dist_matrix, cluster_a, cluster_b, methodmax): # 枚举两个簇之间的所有点对 pairs [(i, j) for i in cluster_a for j in cluster_b] values np.array([dist_matrix[i, j] for i, j in pairs]) if method max: return values.max() if method min: return values.min() if method average: return values.mean() raise ValueError(method must be max/min/average) # 测试假设簇 A 包含点 0 和 1簇 B 包含点 2 dist np.array([ [0.0, 0.24, 0.22], [0.24, 0.0, 0.14], [0.22, 0.14, 0.0] ]) print(cluster_distance(dist, [0, 1], [2], methodmin)) # 0.14 print(cluster_distance(dist, [0, 1], [2], methodmax)) # 0.24 print(cluster_distance(dist, [0, 1], [2], methodaverage)) # 0.19这个函数的逻辑很直白cluster_a和cluster_b是点的索引列表dist_matrix[i, j]取两个点之间的距离然后按method聚合。min对应单链max对应全链average对应组平均。注意点对要排除i j的情况——实际聚类中两个簇不会包含同一个点但如果你的索引列表写错了这里会混入 0 距离导致结果偏差。手算和代码对不上的时候先检查这一步。3. 距离矩阵驱动的 MAX 聚类逐步合并与树状图复现综合题第 5 题是整套 PDF 里最有实操价值的一道给一个 6×6 距离矩阵要求用 MAX 做凝聚层次聚类并画出树状图。这种题考的不是算法背诵而是你能不能按“合并-更新-再合并”的循环把 6 个点归并到 1 个簇。3.1 从 6×6 距离矩阵看第一次合并如何发生原始距离矩阵是P1P2P3P4P5P6P10.000.240.220.370.340.23P20.240.000.140.200.130.25P30.220.140.000.150.280.11P40.370.200.150.000.290.22P50.340.130.280.290.000.39P60.230.250.110.220.390.00第一步只看对角线之外的原始距离找最小值。P3 与 P6 的距离是 0.11是全局最小所以第一个合并的簇是 {3, 6}。这里有个新手容易犯的错MAX 聚类第一步和最邻近算法一样都是找距离矩阵里的最小值但从第二步开始就必须用“簇间距离”代替“点间距离”了。如果你在第二步还去原始矩阵里找最小值就会误以为 {2, 5} 的 0.13 该合并——实际上第二步要比较的是 {3, 6} 这个簇与其他所有点/簇的距离。3.2 更新邻近度矩阵MAX 的“取最大”操作合并 {3, 6} 后需要计算 {3, 6} 到 P1、P2、P4、P5 的簇间距离。用 MAX 定义就是取两组点对距离的最大值Dist({3,6}, {1}) max(dist(3,1), dist(6,1)) max(0.22, 0.23) 0.23 Dist({3,6}, {2}) max(dist(3,2), dist(6,2)) max(0.14, 0.25) 0.25 Dist({3,6}, {4}) max(dist(3,4), dist(6,4)) max(0.15, 0.22) 0.22 Dist({3,6}, {5}) max(dist(3,5), dist(6,5)) max(0.28, 0.39) 0.39更新后的矩阵里{3, 6} 到 P4 的距离 0.22 最小而 P2 到 P5 的原始距离 0.13 依然存在。这里暴露了 MAX 和 MIN 的一个关键区别在 MAX 下即使两个单点距离很近只要它们各自所在的簇有更远的点合并就可能被推迟。本例中第二步实际合并的是 {3, 6} 与 {4}因为簇间距离 0.22 小于 {2, 5} 的 0.13 吗不是——{2, 5} 的 0.13 是点间距离但第二步要在“当前所有簇”之间做比较也就是 {3,6}、{2}、{5}、{1}、{4} 这些对象之间的距离。注意 {2} 和 {5} 还是独立簇它们之间的距离仍是 0.13所以正确比较对象是0.23{3,6}-{1}、0.25{3,6}-{2}、0.22{3,6}-{4}、0.39{3,6}-{5}、0.13{2}-{5}等。0.13 依然是最小值所以第二步应该合并 {2} 和 {5}不是 {3,6} 和 {4}。这是这道题最容易算错的地方——原题配了图不同资料第二步合并对象可能不同原理都是“在当前所有簇的簇间距离里取最小”。我的建议是每步合并后把当前簇的完整距离矩阵重新列一遍再找最小值不要凭记忆跳步。完整合并顺序是{3,6} → {2,5} → {4} 并入 {3,6} → {1} 并入 {2,5} → 最后两大簇合并。每次合并都要重算 MAX 距离比如 {3,6,4} 与 {2,5} 的距离是 max(0.14, 0.28, 0.25, 0.39, 0.20, 0.29) 0.39。3.3 用 scipy numpy 复现全链合并并绘图手算容易在第三步开始乱我一般用scipy.cluster.hierarchy验证。scipy的linkage函数支持methodcomplete对应的就是 MAX 全链import numpy as np from scipy.cluster.hierarchy import linkage, dendrogram import matplotlib.pyplot as plt D np.array([ [0.00, 0.24, 0.22, 0.37, 0.34, 0.23], [0.24, 0.00, 0.14, 0.20, 0.13, 0.25], [0.22, 0.14, 0.00, 0.15, 0.28, 0.11], [0.37, 0.20, 0.15, 0.00, 0.29, 0.22], [0.34, 0.13, 0.28, 0.29, 0.00, 0.39], [0.23, 0.25, 0.11, 0.22, 0.39, 0.00] ]) # 把距离矩阵转成压缩形式 condensed D[np.triu_indices(6, k1)] # complete MAX全链 Z linkage(condensed, methodcomplete) # 打印合并过程 for i, row in enumerate(Z): a, b, dist, size row print(f第{i1}步: 簇{int(a)} 与 簇{int(b)} 合并距离{dist:.2f}样本数{int(size)}) dendrogram(Z, labels[fP{i1} for i in range(6)]) plt.title(MAX(complete linkage) 树状图) plt.show()运行后会得到五步合并记录dist列就是每一步合并时的簇间距离正好对应手算的 0.11、0.13、0.22、0.34、0.39。linkage返回的矩阵每一行格式是[簇A编号, 簇B编号, 距离, 新簇样本数]其中簇编号从 0 到 5 是原始样本6、7、8 是逐步生成的新簇。如果手算结果和condensed不一致优先检查np.triu_indices生成的压缩距离顺序——scipy要求压缩矩阵按“第一行右侧、第二行右侧……”排列顺序错了全链结果就会对不上。树状图里能直观看到P3/P6 最先合并P2/P5 其次随后两个子簇分别并入新点最后两大分支在高度 0.39 处汇合。这个 0.39 就是整棵树的根节点高度也是 MAX 定义下所有样本聚成一个簇时的最小可能距离。4. 聚类选型与关联规则K 均值 vs DBSCAN、支持度与置信度层次聚类之外这套题还考了两个高频考点K 均值与 DBSCAN 的对比、关联规则的支持度与置信度计算。前者考选型理解后者考手算基本功。4.1 为什么 K 均值处理不了非球形簇选择题第 4 题让选“不正确的说法”答案是 AK 均值丢弃被它识别为噪声的对象而 DBSCAN 一般聚类所有对象。这句话错在把 K 均值和 DBSCAN 的噪声处理策略说反了。K 均值基于原型每个点必须被分配到最近的聚类中心它不会主动丢弃任何点——真正被“忽略”的是那些离所有中心都远的点但算法不会显式标记它们为噪声。DBSCAN 恰好相反它明确把不满足密度要求的点标记为噪声并不强行归入任何簇。所以更准确的说法是DBSCAN 显式识别并排除噪声K 均值没有噪声概念所有点都会被分到一个簇。B、C、D 三个选项都是对的其中 C 是重要考点K 均值假设簇是凸的、近球形的对非球形簇和大小差异大的簇效果差DBSCAN 基于密度能处理任意形状和大小的簇。D 选项提到 K 均值可以发现重叠不明显的簇而 DBSCAN 会把有重叠的簇合并——这提醒你 DBSCAN 的瓶颈在于密度阈值eps和min_samples的选择密度不均匀的数据集上一个阈值很难同时适配稀疏区和密集区。4.2 支持度与置信度的计算逻辑第 8 题给了一个 5 条事务的购物篮数据要求计算规则 {牛奶, 尿布} → {啤酒} 的支持度和置信度。五个事务分别是TID项集1{面包, 牛奶}2{面包, 尿布, 啤酒, 鸡蛋}3{牛奶, 尿布, 啤酒, 可乐}4{面包, 牛奶, 尿布, 啤酒}5{面包, 牛奶, 尿布, 可乐}支持度的定义是“包含规则左侧和右侧所有项的事务数 ÷ 总事务数”。规则左侧 {牛奶, 尿布}右侧 {啤酒}所以要看同时包含牛奶、尿布、啤酒的事务。逐条数T1 有牛奶没有尿布排除T2 有尿布和啤酒但没牛奶排除T3 三项全有计数T4 三项全有计数T5 有牛奶尿布没啤酒排除。支持度 2/5 0.4。置信度的定义是“同时包含左侧和右侧的事务数 ÷ 只包含左侧的事务数”。先数只包含 {牛奶, 尿布} 的事务T3、T4、T5 都有牛奶和尿布共 3 条其中同时有啤酒的是 T3、T4共 2 条。置信度 2/3 ≈ 0.67。所以答案是 C0.4, 0.67。4.3 用 Python 实现最小支持度/置信度计算这种题事务少可以手算事务一多就得写脚本。我用 Python 模拟一遍顺便验证选择题答案from itertools import combinations transactions [ {面包, 牛奶}, {面包, 尿布, 啤酒, 鸡蛋}, {牛奶, 尿布, 啤酒, 可乐}, {面包, 牛奶, 尿布, 啤酒}, {牛奶, 尿布, 可乐} ] def support_confidence(transactions, lhs, rhs): rule set(lhs) | set(rhs) rule_count sum(1 for t in transactions if rule t) lhs_count sum(1 for t in transactions if set(lhs) t) support rule_count / len(transactions) confidence rule_count / lhs_count if lhs_count 0 else 0 return support, confidence sup, conf support_confidence(transactions, [牛奶, 尿布], [啤酒]) print(f支持度{sup:.2f}, 置信度{conf:.2f}) # 0.40, 0.67rule t判断规则集合是否为事务集合的子集这是关联规则挖掘里的标准写法。注意事务要用set存储否则子集判断会退化成元素遍历效率低且容易出错。lhs_count如果为 0说明规则左侧从未出现置信度直接置 0避免除零异常。实际刷题时我还会顺手算一下提升度lift confidence / (右侧项单独出现的概率)用来判断规则是不是伪关联。比如本题啤酒出现的事务数是 3T2、T3、T4提升度 0.67 / (3/5) ≈ 1.11大于 1 说明牛奶尿布确实提升了啤酒的购买概率规则有实际意义。5. 判断题与填空题复盘容易被绕进去的五个聚类考点刷完这套题你会发现判断题和填空题其实在反复敲打同样的几个误区把它们单独拎出来复盘比多刷十道新题更有效。第一个高频坑凝聚 vs 分裂。判断题第 1 题“从点作为个体簇开始每一步合并两个最接近的簇”描述的是凝聚层次聚类不是分裂判错。区分方法就一句凝聚是自底向上合并分裂是自顶向下切分。填空题第 5 题让写两种基本方法答案就是凝聚层次聚类和分裂层次聚类MST 属于分裂方法的一种实现。第二个坑聚类效果的判定方向。判断题第 3 题“簇内相似性越大簇间差别越大聚类效果就越差”判错——恰恰相反好的聚类是“内聚外离”。这个考点经常和 K 均值的 SSE、轮廓系数一起考理解成“组内紧凑、组间分离”就不会记反。第三个坑全链和单链的噪声敏感度。判断题第 7 题说全链对噪声敏感错第 10 题说单链擅长椭圆簇也错。单链怕噪声、擅长细长簇全链不怕噪声、偏好球形簇组平均和 Ward 都偏向球形。这个结论在填空题第 8、9 题里原样出现属于必拿分。第四个坑属性的性质与度量值性质的关系。判断题第 6 题“属性的性质不必与用来度量它的值的性质相同”判对。比如年龄是区间属性但你完全可以用 0/1 编码表示“是否成年”这是标称表示反过来也一样。这题考察的是属性类型与数据表示的解耦做数据预处理时尤其要留意。第五个坑Ward 方法与组平均的关系。判断题第 4 题判对但很多教材表述不一样当点间距离取平方时Ward 方法在数学上和组平均的簇间距离定义趋同。考试如果出选择题看到“Ward 方法 距离平方 SSE 增量最小化”就直接选这是最稳妥的口诀。最后说一个画树状图的验证技巧。每次合并后把当前所有簇的编号按“先合并的放左边后合并的放右边”排列在纸上把合并高度标在纵轴上全部合并完后再用scipy的dendrogram对照检查。只要发现某一步的合并高度和代码输出的dist对不上几乎都是上一步更新矩阵时漏了某个点对的 MAX 值——回到原始距离矩阵把两个簇之间的所有点对逐个枚举取最大值这个操作重复三遍手算结果和程序输出就能对齐。本文还有配套的精品资源点击获取