资讯详情

零基础搞懂K-means聚类:MATLAB七行代码实现分堆

📅 2026/10/31 4:36:26 | 华诺云谱 👁 阅读
零基础搞懂K-means聚类:MATLAB七行代码实现分堆
简介这份资源是一份面向Matlab初学者与数据分析入门者的K-means聚类算法学习文档聚焦无监督学习中最常用的聚类方法帮助读者理解算法原理并掌握Matlab内置kmeans函数的调用方式。文档围绕聚类基本流程展开涵盖初始化聚类中心、按距离分配样本、迭代更新质心直至收敛等关键步骤并配有可直接运行的示例代码与结果可视化说明同时讨论了K值选取、异常值敏感、初始化依赖等局限性及K-means等改进思路。资源包共1个docx文件大小约15KB内容紧凑适合作为课堂笔记或自学参考快速查阅。目前已有444人学习读者可从中获得算法要点梳理、可复用的代码模板以及聚类结果绘图方法便于在课程作业或小型数据实验项目中直接套用与调试。1. 零基础搞懂 K-means 聚类一堆散点怎么自动分成几堆你有没有过这种经历桌上摊着一堆没分类的照片想按内容分成几摞但一张张看太累于是心里冒出一个念头——能不能让电脑自己分K-means 聚类算法干的就是这件事。你给它一堆数据点再告诉它“我想分成 K 堆”它就自动把彼此靠近的点归到一起最后告诉你每一堆的中心在哪。放到 MATLAB 里这件事几行代码就能跑通这也是为什么很多零基础同学的第一堂聚类课都是从 MATLAB 的kmeans函数开始的。这份资源是一份 MATLAB 实现 K-means 聚类算法的示例文档核心就是一段可直接运行的代码加逐行讲解。它适合谁适合刚接触数据分析、机器学习听说过“聚类”但没真正跑过一行代码的新手也适合课程作业里需要做数据分组、却不知道从哪下手的学生。你不需要先学完一整套数学课只要会打开 MATLAB、会复制粘贴就能看到第一张聚类结果图。接下来我按“先懂概念、再跑例子、最后知道往哪走”的顺序带你走一遍。2. 先弄明白 K-means 在干什么分堆这件事电脑是怎么想的2.1 用“分宿舍”理解聚类和 K 值想象你是一个宿管手里有一批新生要根据生活习惯把他们分到 K 间宿舍让同宿舍的人尽量像、不同宿舍的人尽量不像。K-means 的思路非常朴素先随便指定 K 个“宿舍长”的位置然后每个人看自己离哪个宿舍长最近就搬过去人搬完后每个宿舍重新选一个“平均位置”当新宿舍长再让大家重新看距离、重新搬。来回几轮直到没人再换宿舍分堆就稳定了。这里有两个词要先记住。一个是“簇”就是上面说的“一间宿舍”也就是一组合在一起的数据点。另一个是“质心”就是“宿舍长的平均位置”它是这一堆点的中心坐标。K-means 全程只做两件事算距离、求平均。所谓“聚类”就是把没有标签的数据按相似程度自动分组它不告诉你每组叫什么名字只告诉你“这几个是一伙的”。这也是它和分类最大的区别——分类是你提前告诉电脑答案聚类是电脑自己找结构。那 K 值是什么就是你想要几堆。K2 就是分两堆K3 就是分三堆。这个数字得你自己定算法不会替你猜。新手最容易卡在这里我到底该分几堆入门阶段先别纠结拿一个你心里有数的小数据集试 K2、K3看图说话比空想有用得多。2.2 为什么新手值得先学 K-means而不是别的算法我见过不少零基础同学一上来就扎进复杂模型结果连“数据长什么样、分组靠不靠谱”都没感觉。K-means 的好处是它足够简单简单到你可以在脑子里把整个过程演一遍而简单恰恰是入门最需要的。你跑完一次就能亲眼看到“距离近的点被染成同一种颜色”这种直观反馈是看十页公式换不来的。再者K-means 是很多后续内容的垫脚石。你以后接触数据预处理、特征缩放、聚类效果评估甚至更复杂的无监督方法都会反复回到“距离”“中心”“迭代”这几个概念。先把这套东西跑熟后面学别的不会发怵。还有一点很实际MATLAB 自带kmeans函数你不需要自己从零写循环先把“调用—看结果—调参数”这条链路走通成就感来得快也更容易坚持。入门的话建议先别追求“算法原理全懂”。你只需要知道它靠距离分组、靠迭代收敛就够跑第一个例子了。原理的细节可以等你看图看出疑问了再回头补那时候你带着问题学效率反而高。3. 动手跑第一个例子七行数据两堆结果3.1 把数据准备好先看懂 data 和 K第一个例子用的是 7 个二维点每个点有两个坐标你可以把它想成 7 个人在平面上的位置。代码里data的每一行就是一个点第一列是横坐标第二列是纵坐标。K 2表示我们想分成两堆。别小看这两行新手翻车经常翻在数据格式上行是样本、列是特征这个约定要刻在脑子里。% 初始化数据每一行是一个二维数据点 data [1 1; 1.5 2; 3 4; 5 7; 3.5 5; 4.5 5; 3.5 4.5]; K 2; % 聚类簇数想分几堆就改这个数这段代码没有复杂语法分号表示一行结束方括号里用分号隔开每一行。你可以先把这 7 个点在纸上大致画一下左下角有两个挨得很近的点右上方有一撮点。肉眼都能看出大概分两堆这正是选这个小数据集的用意——结果对不对你一眼能判断。如果一上来就拿几万行数据跑出什么你都看不出好坏。提示data里如果混进了文字或者某一行少一列kmeans会直接报错。复制数据后先看一眼行数和列数养成习惯。3.2 调用 kmeans两个返回值分别是什么真正干活的就一行[idx, centroids] kmeans(data, K);。左边方括号里是两个输出右边括号里是两个输入。输入你已经有了输出才是关键。idx是一个列向量长度等于数据点个数每个位置存的是这个点被分到了第几堆取值是 1 到 K。centroids是一个 K 行、列数等于特征数的矩阵每一行是一堆的中心坐标。% 执行 K-means 聚类 % idx每个数据点所属簇的编号1 到 K % centroids每个簇的质心坐标K 行、每行一个中心 [idx, centroids] kmeans(data, K);白话解释一下跑完这一行idx会告诉你第 1 个点属于哪堆、第 2 个点属于哪堆以此类推centroids会告诉你这两堆各自的“中心”落在平面的哪个位置。你可以先在命令行里输入idx回车看看再输入centroids回车看看这两个变量长什么样比任何文字描述都直观。很多新手跑完代码只看到一张图却不知道中间结果在哪其实它们就躺在工作区里。参数上kmeans最少给两个数据和 K。入门阶段这两个够用了。等你跑顺了可以试着加第三个参数比如用Replicates, 5让它多跑几次取最好的结果因为 K-means 对初始中心敏感多试几次能降低“运气不好”的概率。这个先记着第一个例子不加上去也能跑。3.3 把结果画出来scatter 两行代码看懂聚类图数字看多了容易麻木画图是让新手“信服”的关键一步。下面这段代码先开一个图窗用hold on让后续绘图叠加在同一张图上然后用scatter把数据点按idx上色再用一次scatter把质心用黑色叉号标出来最后加图例、关掉叠加。% 绘制聚类结果 figure; % 新建图窗 hold on; % 允许在同一张图上叠加绘制 % 数据点按所属簇 idx 着色filled 表示实心点 scatter(data(:, 1), data(:, 2), [], idx, filled); % 质心用大号黑色叉号标出 scatter(centroids(:, 1), centroids(:, 2), 100, k, filled, Marker, x); legend(Cluster 1, Cluster 2, Centroids); % 图例 hold off; % 取消叠加逐句说清楚。data(:, 1)取的是所有点的横坐标data(:, 2)是纵坐标冒号表示“所有行”这是 MATLAB 里非常常用的取列写法。第一个scatter的第三个参数传空方括号表示点的大小用默认值第四个参数传idx意思是按簇编号给点上色同一堆自动同色。第二个scatter里100是质心点的大小k是黑色Marker, x指定用叉号形状这样质心和普通数据点一眼能区分。legend里的文字要和实际画的东西对应你分几堆就写几个。跑完你应该看到左下两个点一种颜色右上五个点另一种颜色两个黑色叉号分别落在两堆的中间位置。如果图例对不上或者颜色只有一种先检查idx是不是真的有两个取值。这张图就是你入门的第一个成果别急着往下翻先自己改改K的值比如改成 3再跑一遍看看图变成什么样。改参数、看变化是入门阶段最有效的学习方式。4. 跑通之后别急着走几个让结果更靠谱的习惯4.1 K 值不是拍脑袋先试再定第一个例子跑通后很多人会问K 到底怎么选入门阶段最实在的办法是“多试几个看图判断”。你把K从 2 改到 3、4每次跑完看两件事一是分出来的堆是不是符合你对数据的直觉二是每一堆内部是不是足够紧凑。如果某一堆里明显混着两拨离得很远的点说明 K 可能偏小如果两堆的中心几乎挨在一起说明 K 可能偏大。这里有个血泪经验不要拿一个你完全不了解来源的数据集去调 K那样你连“分得对不对”都判断不了。先用小数据、用你心里有预期答案的数据练手等手感有了再上真实数据。真实数据往往有噪声、有异常值K-means 对异常值又比较敏感一个离群点就能把质心拽偏。所以入门阶段先把“看图判断”这个习惯养起来比背一堆评估指标管用。4.2 结果每次不一样先别慌这是正常现象有同学跑第二遍发现颜色分配变了或者点的归属和上次不同就以为代码写错了。其实 K-means 一开始是随机选初始中心的初始位置不同最后收敛到的结果可能不同这叫对初始化敏感。解决办法不是改代码逻辑而是让它多跑几次取较优结果也就是前面提到的Replicates参数。你可以在调用时写成kmeans(data, K, Replicates, 5)意思是重复 5 次选其中簇内距离和最小的那次。理解这一点对新手很重要算法结果有随机性不代表你操作错了。你要做的是让结果稳定下来而不是每次看到不同就推翻重来。等你以后处理更大数据这个习惯能帮你省下大量“是不是我写错了”的自我怀疑。4.3 从二维到多维数据形状变了思路没变第一个例子是二维点画出来能看。真实场景里一个样本可能有几十个特征比如一组测量值有长度、宽度、高度、重量等这时候就没法直接画散点图了。但你要知道K-means 的思路完全没变还是算距离、还是求平均只是距离从平面上的直线距离变成了多维空间里的距离。kmeans函数照样能用data变成多列而已centroids的列数也跟着变多。入门阶段不用急着处理高维数据但心里要有这个预期二维图只是帮你建立直觉的工具不是算法的限制。等你能把二维例子讲清楚“为什么这两个点被分到一起”多维数据的逻辑你自然能迁移过去。这也是我一直建议新手先跑小例子的原因——直觉建立起来了后面换数据格式不至于慌。5. 新手最容易踩的五个坑现象、原因和解决办法5.1 报错“未定义函数或变量 kmeans”现象是刚敲完代码就飘红提示找不到kmeans。原因通常有两个一是 MATLAB 版本里没有装统计与机器学习相关的工具箱kmeans不是基础环境自带的二是你把变量命名成了kmeans把函数名覆盖了。解决办法是先确认环境里有没有对应工具箱再看工作区里有没有同名变量有就换个变量名比如叫myKmeans之类别和函数重名。5.2 图画出来只有一种颜色现象是散点全是一个色看不出分堆。原因多半是idx只有一个取值也就是所有点被分到了同一簇常见于 K 设成了 1或者数据本身太集中、算法认为没必要分。解决办法是先打印idx看看有几个不同取值再检查K是不是写成了 1。如果 K 没问题就换一组区分度更明显的数据先练手别在“数据本身分不开”的情况下死磕。5.3 图例数量和实际簇数对不上现象是分了 3 堆图例却只写了两个名字。原因是legend里的文字是手写的你改了K却没改图例。解决办法很简单图例文字跟着 K 走分几堆就写几个。更稳妥的做法是入门阶段先不写死图例等确认簇数后再补。这个坑很小但特别影响你判断结果别让一张图因为图例误导你。5.4 数据行列搞反结果完全不对现象是代码不报错但分出来的结果莫名其妙。原因是把“行是样本、列是特征”记反了比如把 7 个点写成了 2 行 7 列。kmeans会按行当样本处理行列一反它就把每个特征当成一个样本去分了。解决办法是跑之前先size(data)看一眼确认行数是你预期的样本数。这个习惯我到现在还保留着几秒钟的事能省掉半小时排查。5.5 直接拿真实大数据开跑跑完不知道对错现象是代码跑通了图也出来了但你完全无法判断结果好坏。原因是跳过了小数据练手阶段没有建立“什么算分得好”的直觉。解决办法是退回去用本文这 7 个点先跑再自己造一组有明显分堆的数据跑等你能预测结果了再上真实数据。入门最怕的不是不会是跑完了心里没底还硬着头皮往下走。6. 下一步学什么从跑通例子到能用在作业里第一个例子跑通、图也看懂了接下来怎么走才不迷路我给你一条按顺序来的路径不用全学挑着来就行。阶段学什么大概花多久判断自己过关的标准第一步改 K 值、改数据观察结果变化半天能说出为什么这次分成了 3 堆第二步加Replicates参数理解结果稳定性半天能解释为什么两次结果可能不同第三步用自己的二维数据替换示例数据一天数据行列没搞反图能看懂第四步了解 K-means 这类改进初始化思路按需知道它解决的是“初始中心选得好不好”具体说第一步就是把本文代码当玩具反复改。你可以把data换成自己随手编的 10 个点故意让其中两堆离得很近看算法会不会分错再想想为什么。第二步重点体会“随机性”和“多跑几次”的关系这能帮你以后少走“结果不稳定就以为代码坏了”的弯路。第三步是真正把流程迁移到自己的场景哪怕还是二维数据只要是你自己的感受完全不同。再往后你会遇到“K 怎么科学地选”这个问题。入门阶段看图判断够用等你要写进作业或报告可以了解一下肘部法这类思路把 K 从 1 试到某个数看簇内误差怎么变化找那个“再增加 K 收益明显变小”的位置。不用一上来就啃公式先知道有这么个方法用的时候再查。至于 K-means、二分 K-means 这些改进等你被“初始化敏感”坑过一两次自然会想去看它们解决了什么那时候学起来不痛苦。我第一次带人跑这段代码时犯过一个很蠢的错跑完只看图没看idx和centroids的实际数值结果别人问我“第 3 个点属于哪堆”我答不上来。从那以后我每次跑完聚类都强制自己先在命令行把这两个变量打印一遍再去看图。图是给人看的数值才是你能拿去写报告、做后续处理的东西。希望这个习惯也能帮到你别只停在“图挺好看”这一步。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑