MATLAB聚类分析实战:从距离度量到系统聚类谱系图
简介这份PPT资料围绕聚类分析的多元统计方法展开重点讲解系统聚类层次聚类的原理、步骤与MATLAB实现适合统计学、数据挖掘、模式识别方向的学生或研究人员用于课堂学习与算法实践。内容从样品或变量间相近性度量讲起给出欧氏、绝对、明氏、马氏、方差加权等常用距离的定义与适用场景并介绍谱系聚类法、快速聚类法的基本思路。系统聚类部分说明“先将每个样本视为一类再逐步合并距离最近的两类直至所有样本并为一大类”的迭代流程强调用聚类图可视化合并过程并依据聚类图和领域知识确定最终类别数。MATLAB实现环节逐一介绍pdist、squareform、linkage、dendrogram、cophenet、cluster等函数的功能与调用方法并补充clusterdata、inconsistent等辅助函数的使用场景使从距离矩阵计算到分类结果输出的完整链路更加直观。同时区分Q型聚类对样品分类与R型聚类对变量分类的不同作用指出R型分析有助于识别主要变量、为后续回归或Q型分析提供基础。资源为PPT课件共1个文件压缩包大小467KB已有125人学习。课件结合产品等级评定、生物分类、考古化石研究、体育球队分组等案例说明聚类结果需要结合具体领域知识进行解释和验证数据质量、算法选择与参数设定都会影响聚类效果因此课前预处理与事后评估十分关键。整体结构清晰适合作为教学演示或自学参考资料。1. 聚类分析及MATLAB实现这份PPT教你把“物以类聚”变成可计算的矩阵运算很多人学聚类分析时最大的困惑不是算法本身而是“距离”这两个字——欧氏距离、明氏距离、马氏距离到底该用哪一个MATLAB里那一串pdist、linkage、cluster函数返回的究竟是什么样的结构这份PPT恰好把这条链路讲透了。它从样品间的相近性度量讲起用五省消费数据和十三国可持续发展数据两个完整案例一步步演示系统聚类法在MATLAB中的实现涵盖欧氏距离、绝对距离、明氏距离三种度量方式以及谱系聚类和快速聚类两大方法。适合正在上多元统计分析课、需要完成课程设计或者刚接触数据分类、想快速用MATLAB出聚类结果的从业者。读完你不仅能照着代码跑通整个流程还能看懂聚类图中那些分支和坐标的真正含义。2. 距离度量选型为什么同一个数据集换一种距离就换了分类结果2.1 从数据矩阵说起Q型聚类和R型聚类分别处理什么聚类分析的起点是一张数据矩阵n行代表n个样品p列代表p个指标第i行第j列就是第i个样品关于第j项指标的观测值。以PPT中的五省消费数据为例5行8列——5个省是样品人均粮食支出、人均副食支出、人均烟酒茶支出等8个变量是指标。聚类分析的基本思想就是在样品之间定义距离在指标之间定义相似系数然后按相似度大小逐一归类。这里要先分清两种聚类方向。Q型聚类是对样品分类样本是行看的是“哪些省消费结构相似”常用统计量是距离R型聚类是对变量分类看的是“哪些消费指标走势接近”常用统计量是相似系数相关系数、夹角余弦。PPT第7页说得很直白课堂主要讨论Q型聚类。但R型聚类的价值同样不该忽略——它能帮你在一堆相关性很强的变量里挑出代表性变量再做Q型聚类或回归分析。实际做数据分析时我一般会先跑一次R型聚类看变量分组再决定是否降维这样后续Q型聚类的结果解释起来也更有底气。2.2 六种距离的适用场景欧氏距离默认但不是万能距离本质上是对“两个样品在p维空间中的间隔”的量化。PPT给出了六种常用距离欧氏距离、绝对距离曼哈顿距离、明氏距离、切氏距离、方差加权距离、马氏距离。前三个在例题里直接跑出了结果后三个在处理特殊数据结构时更有用。欧氏距离是默认选项几何意义直观但有一个隐含前提——所有维度等权。如果你的指标量纲差异大比如一个变量范围在0到1另一个在0到10000欧氏距离会被大量纲变量主导这时候就需要考虑方差加权距离标准化后的欧氏距离或马氏距离。马氏距离的独到之处在于它考虑了变量间的相关性不再把各维度当独立变量处理所以对相关性强的数据更合理只是计算要求数据矩阵可逆。切氏距离取的是各维度差值的最大值适合“只要有一个指标差很多就算不相似”的场景。我做客户分群时遇到过这样的坑直接用欧氏距离算出的群组基本被消费金额这个高量纲变量牵着走换成方差加权距离后消费频次和商品类目才真正在分组里发挥作用。2.3 五省案例复现三行代码看出距离矩阵的全貌PPT第14页给出了一组五省1991年城镇居民生活月均消费数据8个指标。以这个数据为例跑通欧氏、绝对、明氏三种距离的核心代码非常短但每一步输出的形态都值得停下来看。a [7.93 9.77 8.49 12.94 19.27 11.05 2.04 13.29; 7.68 50.37 11.35 13.31 9.25 14.59 2.75 14.87; 9.42 27.93 8.20 8.14 16.17 9.42 1.55 9.76; 9.16 27.98 9.01 9.32 15.99 9.10 1.82 11.35; 10.06 28.64 10.52 10.05 16.18 8.39 1.96 10.81]; d1 pdist(a); % 默认计算欧氏距离返回行向量 D squareform(d1) % 转成5x5实对称距离矩阵 S tril(squareform(d1)) % 取下三角方便对照PPT输出pdist默认返回的是一个行向量顺序是(1,2),(1,3),(1,4),(1,5),(2,3),(2,4)...这样组合排列。新手容易在这里懵——明明输入是矩阵为什么输出是行向量因为pdist只存储上三角部分n个样品两两距离有n(n-1)/2个值5个省就是10个值。squareform把这10个值还原成5x5的对称方阵对角线为0第i行第j列就是第i个样品和第j个样品的距离。tril取的是下三角部分输出和PPT第15页的S矩阵完全对得上。注意PPT里S矩阵的数值第一列除了第一个元素全是11.67、13.81这种非零值说明辽宁和浙江的距离是11.67和河南是13.81一眼能看出浙江和河南距离最远。绝对距离和明氏距离只需要改pdist的第二个参数d2 pdist(a, cityblock); % 绝对距离又叫曼哈顿距离 S2 tril(squareform(d2)); d3 pdist(a, minkowski, 3); % 明氏距离指定r3 S3 tril(squareform(d3));cityblock计算的是各坐标差绝对值之和对应PPT中的绝对距离公式。minkowski需要第三个参数rr2时退化为欧氏距离r1时退化为绝对距离r越大越强调大差值的影响。对比S2和S1的数据可以发现绝对距离下辽宁和浙江是19.89欧氏距离下是11.67说明这两个省在某个指标上有较大差值但在多个指标上差值相对均衡。真实业务里我很少用纯欧氏距离出结论一般会把欧氏和绝对距离各跑一遍如果两类结果差异很大说明数据里有明显的离群方向值得深挖。提示pdist对NaN值敏感数据里存在缺失值时距离会变成NaN。处理办法是先用isnan查缺失位置再用均值填充或直接删除该样品否则后续linkage会全部输出NaN。3. 系统聚类核心流程从距离矩阵到聚类树的完整链路3.1 八个MATLAB函数的职责划分先看懂再动手PPT第5页列了一张函数功能对照表八个函数覆盖了系统聚类的全部环节。pdist负责计算距离squareform负责格式转换linkage创建系统聚类树dendrogram绘制谱系图cluster根据linkage输出创建分类clusterdata一步到位把pdist和cluster串起来cophenet计算Cophenetic相关系数inconsistent计算不一致系数。前六个是必用的主链路后两个是验证质量的工具。值得强调clusterdata的定位——它是把pdist、linkage、cluster封装在一起的一步到位函数。初学者图省事喜欢直接用clusterdata但我的建议是先用分步方式跑一遍因为你往往需要中间提出来距离矩阵和聚类树做检查比如看看哪两类最先合并、距离值增长是否均匀这些信息在clusterdata的黑匣子输出里是看不到的。分步跑一次确认结构合理之后批量处理类似数据再用clusterdata提速不迟。3.2 linkage的五种类间距离最短距离法和ward法差别在哪linkage是系统聚类的核心引擎它的输入是pdist输出的距离向量输出是一个(n-1)行3列的矩阵。每一行代表一次合并第一列和第二列是被合并的两个类的编号第三列是这两个类之间的距离。矩阵的n-1行记录了从n个单点类合并到1个大类的全过程。linkage的第三个参数决定了类间距离的计算方式PPT里直接用了默认的最短距离法和ward法做对比。最短距离法取两类中所有样品对的最小距离擅长发现细长形状的类但容易被链式效应带偏——一点点噪声就能把两个本不相干的类串联起来。ward法全称Ward最小方差法合并时选择使类内离差平方和增量最小的两类倾向于生成紧凑的球形类对噪声更稳健。PPT第17到19页的十三国案例就是两种方法结果不同的真实例子——同样是分成4类最短距离法把中国、俄罗斯、法国分在了一组ward法却把中国和意大利、俄罗斯放在一组日本在ward法里单独成类而在最短距离法里和欧美国家混在一起。这说明算法选择直接改变业务结论。运行linkage的代码在上一章距离矩阵基础上只需要一行Z1 linkage(d1, single); % 最短距离法single是默认值 Z2 linkage(d1, ward); % Ward离差平方和法比较Z1和Z2的前几行就能看到合并顺序不同。Z1第一行通常是距离最小的两个省合并Z2可能从另一个分支开始。后处理时有的文献建议先标准化数据再做linkage特别是使用ward法时因为ward法对量纲敏感量纲大的变量会主导离差平方和的计算。我处理多指标数据时如果指标单位不统一会先用zscore标准化再加ward法这个习惯帮我避掉了不少伪聚类的坑。3.3 谱系图与冰柱图从图上读出该分几类聚类树的直观呈现依赖dendrogram函数。谱系图的横坐标是样品编号纵坐标是合并时的距离值两条竖线交汇的位置越低说明两类合并得越早、相似度越高。读图的关键是找“分层线”——一条水平线自上而下移动穿过几条竖线就对应几个类穿过的竖线越少类的数量越少。dendrogram(Z2) % 绘制ward法的谱系图 dendrogram(Z2, 0) % 0表示显示全部叶子节点不折叠第二个参数设为0很重要样品多的时候MATLAB默认只显示30个叶子节点超出部分折叠成分支容易误判类数。PPT里提到的冰柱图dendrogram输出类似冰柱的纵向排列结构实际工作中较少直接使用多数人还是直接看谱系图。要决定类数一个常见做法是在谱系图上找一条距离值较大的横线看它穿过的树枝数量。以十三国ward法结果为例如果希望得到4类横线应该画在使4个分支保持独立的位置然后对照实际业务含义检验——日本单独一类是否合理、美国和所有国家都不相似是否合理。3.4 从聚类树切出最终分类结果聚类树建好之后cluster函数负责把树“切”成指定数量的类。这里有两种切法——按最大类数切和按距离阈值切。idx cluster(Z2, maxclust, 4); % 分成4类返回每个样品的类编号 idx2 cluster(Z2, cutoff, 1.5); % 距离阈值1.5合并距离小于1.5的类maxclust指定类数上限这是最常用的方式适用于你已经根据谱系图或业务需求确定了类数的情况。cutoff指定距离阈值适用于数据量大、不想预先定类数的场景但阈值怎么定通常需要参考谱系图的纵轴范围多次尝试。cluster返回的idx是一个列向量长度等于样品数每个元素是该样品所属的类编号。类编号没有大小含义只是分组标签不能因为“第1类”就认为它优于“第2类”。拿到idx之后建议做一个交叉检查把原始数据和类编号按列拼接逐类看均值特征。比如五省消费数据分成3类可以算每类在8个指标上的平均消费额如果某两类在多数指标上均值接近说明这个类数切得太细需要回头重新看谱系图。这个验证步骤在PPT里没有写但实际项目里是判断聚类质量最直观的方式。4. 聚类数判定与质量验证谱系图之外还有两个量化指标4.1 不一致系数看合并发生时距离是否出现“跳变”inconsistent函数计算聚类树的不一致系数它衡量的是某次合并距离相对于它附近合并距离的平均水平和离散程度。系数越大说明这一步的合并比周围合并更“突兀”这通常意味着合并前后的两个类差异较大在这里截断比较合理。I inconsistent(Z2); % 计算每一级合并的不一致系数inconsistent输出与linkage输出同规格的矩阵第4列是不一致系数。一般经验是看系数首次明显增大或跳变的层级。比如系数从1.2突然跳到2.8说明这一步合并了一个相距较远的类在此之前截断能保留更自然的分类结构。不过不一致系数的绝对阈值没有统一标准更多是看相对变化。单独使用容易误判最好与谱系图、业务含义三者交叉验证。如果谱系图显示合并距离均匀增长、没有明显断层那说明数据本身可能没有清晰的类结构强行分类的意义有限。4.2 Cophenetic相关系数聚类树对原始距离的还原程度cophenet计算的是Cophenetic相关系数它比较聚类树中两个样品合并时的高度与它们的原始距离之间的相关程度。相关系数接近1说明聚类树很好地保留了样品间的原始距离关系聚类结果可信任系数偏低比如低于0.6说明聚类树在合并过程中严重扭曲了原始距离结构需要考虑更换类间距离计算方法。c cophenet(Z1, d1); % 最短距离法聚类树的相关系数 c2 cophenet(Z2, d1); % ward法聚类树的相关系数同一份距离矩阵不同linkage方法会得到不同的cophenet系数。我习惯把single、average、complete、ward四种方法各跑一遍分别计算cophenet系数选最高的一种作为最终聚类方案。这是一个纯数学层面的质量指标不依赖业务判断适合在还没有业务结论之前做初步筛选。如果所有方法的cophenet系数都不高先回数据预处理查查标准化和离群值处理是否到位比纠结算法参数更重要。4.3 类数选择的经验法则从“肘部”到业务校验聚类数怎么定是聚类分析里最“玄学”的环节。谱系图上的横线法只能给出大致范围实际操作中我会同时用三种方式交叉验证第一种是看合并距离的增量。把linkage结果第三列合并距离按顺序取出画折线图找“肘部”——距离急剧增大的那个位置。例如从1.2跳到3.5那在此之前合并出的类数就是相对自然的类数。第二种是和实际业务需求对齐。市场细分里业务方如果想出3套运营策略那k3就是硬约束谱系图只是参考。第三种是用cophenet和inconsistent交叉验证两个指标都在合理范围内再定案。五省消费案例里如果看欧氏距离的谱系图浙江和河南在距离约11.7处最先分开成两个明显分支辽宁和甘肃青海分属另外两支分成3类时甘肃和青海合并、辽宁独立、浙江河南各自一组分成4类时辽宁单独成类。哪种更有解释力去看原始数据——辽宁的人均衣着支出是五省里最高的19.27元浙江的副食支出50.37元断层第一这两个省单独成类确实符合消费结构差异大的事实。注意聚类数一旦确定就要回到原始数据做业务验证。纯靠数学指标选出的类数若无业务解释大概率是“数据上的偶然分组”不是可用的结论。5. 聚类分析避坑指南距离矩阵、量纲和谱系图的三类典型翻车现场5.1 现象pdist输出全是NaN聚类树直接报错用含缺失值的数据跑pdist时输出向量中凡是涉及缺失样品的位置全部变成NaNlinkage遇到NaN会直接中断或生成全NaN的聚类树。原因在于pdist默认不处理缺失值任何含有NaN的样品对距离计算都无法完成。解决分三步先用sum(isnan(a), 2)找出缺失行数然后根据缺失比例决定删除样品或填充缺失值——缺失比例低于5%时用列均值或中位数填充即可高于20%时建议直接删掉该行避免填充值扭曲真实距离最后重跑pdist确认输出中不再有NaN。一个容易被忽略的细节是pdist对数据类型的容忍度有限如果输入是cell数组而非数值矩阵同样会报错记得用cell2mat转换后再传参。5.2 现象标准化前后聚类结果完全不同不知道信哪个同一个数据集直接算距离和zscore标准化后再算距离得到的分类结果差别很大。这不是代码bug而是量纲差异导致的必然结果。比如消费数据里人均副食支出范围从9.77到50.37而人均燃料支出只有1.55到2.75直接算欧氏距离时副食支出几乎独占了距离贡献其他七个变量形同虚设。解决思路是回到分析目的。如果希望所有指标等权参与分类先标准化是必须的如果某个指标本身就是业务上的主导因素比如消费数据中副食支出占比大是合理分类依据保留原始量纲反而更贴合业务逻辑。我的习惯是两类结果都跑出来对比如果聚类结构翻转剧烈说明数据的主导维度太集中值得先做变量筛选而不是急于选标准化方案。5.3 现象谱系图叶子节点太少丢失分类细节直接调用dendrogram(Z)时样品数超过30MATLAB会把部分分支折叠显示谱系图上只剩30个叶子节点。折叠后某些类的分支结构看不出来读图时容易把多个子类误判为一个类。解决方法是给dendrogram传第二个参数0dendrogram(Z, 0)0代表显示全部叶子节点。如果节点太多导致图形拥挤可以改用dendrogram(Z, P)指定显示P个节点P取50到100之间再用reorder调整节点顺序减少交叉。真实项目里几千个样品的谱系图不做折叠几乎无法阅读但做折叠前先把聚类树写成文本输出留存确保后续检查有据可依。5.4 现象不同linkage方法结果差异大到无法收场同一份数据single法分出3个细长类ward法分出2个紧凑类中间还有complete法的第三种结构。每个方法都有数学合理性但结论对不上项目没法交付。这里的关键在于理解不同方法的几何偏好——single生成细长链状类、对噪声敏感complete倾向于等直径的球状类、对离群值敏感ward生成方差最小的紧凑类、对量纲敏感。方法没有绝对优劣只有适不适合当前数据的分布形态。解决前先做数据可视化对二维数据直接scatter散点图看形状高维数据用pca降到二维再看。数据点呈细长分布选single呈团状分布选ward或complete。如果可视化后仍然无法判断用cophenet比较各方法的相关系数取最高者。上述流程走完仍有分歧最后以业务解释力定婚——哪种分类结果能被业务方说出合理解释就采用哪种。6. 用cophenet和inconsistent做聚类结果的最后体检两个函数守住质量关聚类分析的代码跑通不难难在怎么说服自己“这个聚类结果是可用的”。在我经手的项目里最后一道工序永远是量化验证——不是看一眼谱系图觉得“差不多”就收工。这一步的核心是两个函数cophenet和inconsistent配合一个简单的特征对比表就能完成。先跑一遍全流程验证代码把前面每一步串起来% 标准化数据量纲不统一时使用 a_std zscore(a); % 计算距离并构建聚类树 d pdist(a_std, euclidean); Z linkage(d, ward); % 验证聚类树质量 coph cophenet(Z, d); % 越接近1越好参考阈值0.6以上 I inconsistent(Z); % 观察不一致系数的跳变位置 % 切分聚类并输出特征对比 idx cluster(Z, maxclust, 3); result [a_std, idx];cophenet的输出是一个标量代表聚类树高度与原始距离的相关系数。如果coph低于0.6说明聚类树在合并过程中严重失真我会果断换linkage方法重跑而不是硬着头皮解读聚类结果。inconsistent的输出是矩阵我关注第4列的跳变位置——某一步合并的系数明显大于前后层级时这个位置前后的类结构值得单独画出来检查。两步验证通过后再看每个类在各指标上的均值如果出现某个类的均值全维度都居中、和其他类无法区分的“平庸类”就要回退一步把类数调小。从这以后我再也没犯过“跑出谱系图就交付”的错误——每次拿到聚类结果强制走一遍cophenet加inconsistent的体检流程至少能拦截掉三成“看起来漂亮但经不起推敲”的分组方案。这套流程也适用于任何MATLAB聚类场景无论你的数据是五省消费、客户分群还是传感器状态分类希望帮到你。本文还有配套的精品资源点击获取