新闻详情

新闻详情

首页 / 资讯中心 / 详情

MATLAB K-means聚类实战:多维矩阵分组与可视化

发布时间:2026/9/28 1:47:39来源:尧图网络
MATLAB K-means聚类实战:多维矩阵分组与可视化
简介本资源面向MATLAB环境下从事数据分析与机器学习的学习者聚焦K-means聚类在多维矩阵上的实现与可视化。包内共7个文件以5个m脚本和2个mat数据文件为主脚本涵盖质心初始化、样本分配、质心更新与主流程调用等模块mat文件提供可直接加载的测试数据压缩包约62KB结构紧凑便于快速上手。已有2270人学习下载说明其在聚类入门与实战练习中具有一定参考价值。读者可借助完整代码走通从加载数据、运行kmeans、迭代更新质心到绘制散点图与质心标记的全过程理解高维数据聚类的关键环节并在此基础上尝试特征选择或降维处理适合作为课程实验、项目练手与算法巩固的参考素材。1. 从一份 MATLAB 聚类包说起多维矩阵到底怎么分组手上有一批样本每个样本有多个特征想按相似度自动分成几堆又不想引入 Python 那一整套环境MATLAB 的 K-means 就是最省事的路子。这次拆的资源是一个.rar包里面是纯 MATLAB 实现的多维矩阵 K-means 聚类加可视化文件包括main.m、runkMeans.m、findClosestCentroids.m、computeCentroids.m、kMeansInitCentroids.m外加两个测试数据football_test.mat和karate_test.mat。它解决的不是调个库函数的问题而是把 K-means 的分配、更新、初始化三个核心步骤全部摊开写成独立函数让你能看清每一次迭代质心是怎么挪的。适合两类人一类是刚接触聚类、想搞明白算法内部循环到底在干什么的另一类是手头有 MATLAB 环境、需要快速对多维特征矩阵做分组和出图的从业者。下面按能跑起来 → 看懂每步 → 避开坑 → 换数据验证的顺序拆。2. 把包跑起来main.m 的调用链与数据加载2.1 先认清文件分工拿到这个包别急着点运行先花两分钟把六个.m文件的职责理清楚后面调参和排错全靠这张地图。文件职责输入输出main.m主入口串流程、画图无内部加载 .mat图形窗口kMeansInitCentroids.m随机选 K 个初始质心数据矩阵 X、KK×n 质心矩阵findClosestCentroids.m把每个点分到最近质心X、质心每点的簇索引computeCentroids.m按当前分配重算质心X、簇索引、K新质心矩阵runkMeans.m迭代调度循环分配与更新X、初始质心、迭代次数最终质心、簇索引football_test.mat/karate_test.mat测试数据—多维矩阵变量这种拆法的好处是每个函数只干一件事你改初始化策略不会碰到迭代逻辑改距离度量也不会影响质心更新。常见做法是把这几个函数放在同一个目录下MATLAB 的当前文件夹切过去即可不需要额外配置路径。2.2 加载数据并确认矩阵维度MATLAB 里.mat文件用load直接读但读进来之后第一件事是确认变量名和维度否则后面X(:,1)取列会直接报越界。% 加载测试数据load 会把 .mat 里的变量注入当前工作区 load(football_test.mat); % 不确定变量名时用 whos 列出工作区所有变量及其维度 whos; % 假设数据变量名为 X打印前 5 行和前 3 列肉眼确认数据正常 disp(X(1:5, 1:3)); % 记录样本数和特征维度后面初始化和画图都要用 [m, n] size(X); fprintf(样本数 m %d, 特征维度 n %d\n, m, n);load之后如果whos显示的是一个结构体而不是矩阵说明.mat里存的是 struct需要用X data.X这类方式取出来。size返回的m是样本数、n是特征数这两个值决定了后面 K 能取多大——K 不能超过样本数实际用的时候一般远小于样本数。football_test.mat和karate_test.mat是两套不同规模的数据建议先用小的那套跑通流程再换大的看迭代次数和耗时变化。2.3 跑通主流程数据确认没问题后直接运行main.m。它内部会依次调用初始化、迭代、画图。如果你想手动控制每一步可以按下面的顺序自己串一遍这样出问题时能定位到具体环节。% 设定簇数量先从小值试比如 3 K 3; % 设定最大迭代次数防止质心震荡导致死循环 max_iters 10; % 第一步初始化质心 initial_centroids kMeansInitCentroids(X, K); % 第二步跑迭代返回最终质心和每个点的簇索引 [centroids, idx] runkMeans(X, initial_centroids, max_iters); % 第三步可视化用颜色区分簇用黑色叉标出质心 figure; scatter(X(:,1), X(:,2), 20, idx, filled); hold on; plot(centroids(:,1), centroids(:,2), kx, MarkerSize, 12, LineWidth, 2); title(sprintf(K-means 聚类结果 (K%d), K)); colorbar; hold off;runkMeans内部是一个for循环每次先调findClosestCentroids重新分配再调computeCentroids更新质心。max_iters设成 10 是常见起点多数数据在 5 到 10 次内质心就基本不动了。scatter的第四个参数传idx时MATLAB 会自动按簇索引映射颜色filled让点实心视觉上更容易分辨重叠区域。质心用kx画成黑色叉尺寸调大一点避免被数据点盖住。3. 拆开三个核心函数分配、更新、初始化各在干什么3.1 findClosestCentroids距离计算与向量化写法这个函数干的事很直白对每个样本点算它到 K 个质心的距离取最小的那个索引。新手容易写成双重循环样本一多就慢得离谱正确做法是用矩阵运算一次性算完。function idx findClosestCentroids(X, centroids) K size(centroids, 1); % 质心个数 m size(X, 1); % 样本个数 idx zeros(m, 1); % 预分配簇索引 % 向量化对每个质心算所有样本到它的距离平方 for k 1:K % X 是 m×ncentroids(k,:) 是 1×nbsxfun 做广播减法 diff bsxfun(minus, X, centroids(k,:)); dist_sq sum(diff.^2, 2); % 按行求和得到 m×1 距离平方 if k 1 min_dist dist_sq; idx ones(m, 1); else % 距离更小的样本更新其簇索引 mask dist_sq min_dist; min_dist(mask) dist_sq(mask); idx(mask) k; end end end这里用距离平方而不是开根号是因为比较大小的时候平方和开根号单调一致省掉sqrt能快不少。bsxfun在较老的 MATLAB 版本里是标准写法新版本可以直接写X - centroids(k,:)MATLAB 会自动广播。sum(diff.^2, 2)的第二个参数2表示按行求和得到每个样本的总距离平方。mask是逻辑索引只更新距离变小的那些样本避免每次全量覆盖。如果数据维度很高diff.^2这一步会生成一个 m×n 的临时矩阵内存吃紧时可以考虑分块处理。3.2 computeCentroids均值更新与空簇处理分配完之后每个簇的质心要挪到该簇所有点的均值位置。逻辑简单但有个坑某个簇可能一个点都没分到这时候均值是 NaN。function centroids computeCentroids(X, idx, K) [m, n] size(X); centroids zeros(K, n); % 预分配新质心 for k 1:K % 找出属于第 k 簇的所有样本索引 members (idx k); count sum(members); if count 0 % 空簇保持原质心不动或重新随机选一个点 % 这里选择保持不动避免 NaN 传播 continue; end % 对该簇样本按列求均值得到 1×n 的新质心 centroids(k, :) sum(X(members, :), 1) / count; end endidx k返回逻辑向量X(members, :)取出该簇所有样本。sum(..., 1)按列求和再除以样本数就是均值。空簇的处理是关键如果不判断count 0sum空矩阵会得到 0除以 0 就是 NaN下一轮距离计算全变 NaN整个算法崩掉。常见做法是空簇时重新随机选一个样本点当质心或者直接跳过保持原位。这个包里用的是跳过策略简单但可能导致某个簇长期为空实际用的时候可以改成重新初始化。3.3 kMeansInitCentroids随机初始化的影响K-means 对初始质心敏感选不好会收敛到局部最优。这个函数用的是最朴素的随机选点法。function centroids kMeansInitCentroids(X, K) m size(X, 1); % 随机打乱样本索引 randidx randperm(m); % 取前 K 个样本作为初始质心 centroids X(randidx(1:K), :); endrandperm(m)生成 1 到 m 的随机排列取前 K 个就相当于无放回随机抽样。这种写法比randi有放回抽样好因为不会选到重复点导致初始质心重合。但它的缺点是不保证选出的点分散可能两个初始质心挨得很近导致最终只分出 K-1 个有效簇。改进方向是 K-means 初始化第一个质心随机选后续每个质心按距离平方加权的概率选让初始质心尽量分散。这个包里没实现 K-means但你可以把kMeansInitCentroids.m替换成自己的版本接口保持一致即可。4. 可视化与结果判读散点图之外还能看什么4.1 二维散点图与质心叠加最直接的可视化就是散点图加质心标记前面已经给过代码。这里补充几个判读要点颜色分块是否清晰、有没有明显该分到一起却被切开的情况、质心是否落在簇的几何中心。如果两个簇颜色交错严重说明 K 选大了或者数据本身不适合 K-means。% 画最终结果同时把每次迭代的质心轨迹画出来 figure; scatter(X(:,1), X(:,2), 20, idx, filled); hold on; plot(centroids(:,1), centroids(:,2), kx, MarkerSize, 12, LineWidth, 2); % 如果 runkMeans 返回了历史质心可以画出移动轨迹 % 假设 history 是 max_iters×K×n 的三维数组 % for i 1:max_iters % plot(squeeze(history(i,:,1)), squeeze(history(i,:,2)), k--); % end title(K-means 聚类结果与质心); xlabel(特征 1); ylabel(特征 2); hold off;质心轨迹能帮你判断算法是否稳定如果质心在几次迭代后基本不动说明收敛了如果来回跳可能是 K 太大或者数据分布太散。squeeze用来去掉三维数组里的单维度方便取每次迭代的质心坐标。4.2 高维数据的降维可视化多维矩阵没法直接画散点图常见做法是先降到二维再画。MATLAB 里可以用 PCA 做线性降维。% 对数据做 PCA取前两个主成分 [coeff, score, ~, ~, explained] pca(X); % score 的前两列就是降维后的坐标 figure; scatter(score(:,1), score(:,2), 20, idx, filled); hold on; % 质心也要投影到同样的主成分空间 centroids_pca (centroids - mean(X)) * coeff(:,1:2); plot(centroids_pca(:,1), centroids_pca(:,2), kx, MarkerSize, 12, LineWidth, 2); title(sprintf(PCA 降维可视化 (前两主成分解释 %.1f%%), sum(explained(1:2)))); xlabel(主成分 1); ylabel(主成分 2); hold off;pca返回的coeff是特征向量矩阵score是投影后的坐标explained是各主成分的方差解释比例。质心投影时要注意用同样的均值和特征向量做变换否则质心位置会偏。如果前两个主成分解释比例太低比如不到 50%说明二维展示丢失了太多信息这时候可以考虑用tsne或者只对部分特征做可视化。4.3 用轮廓系数判断 K 选得对不对光看图有时候拿不准 K 该取几可以用轮廓系数做定量参考。% 计算轮廓系数评估聚类质量 silh silhouette(X, idx); mean_silh mean(silh); fprintf(平均轮廓系数: %.4f\n, mean_silh); % 画轮廓图 figure; silhouette(X, idx); title(sprintf(轮廓系数 (均值 %.3f), mean_silh));轮廓系数范围是 -1 到 1越接近 1 说明簇内越紧凑、簇间越分离。一般均值超过 0.5 就算不错低于 0.2 说明聚类效果差。可以写个循环对 K 从 2 到 8 各跑一遍取轮廓系数最大的 K。注意silhouette在样本数很大时计算量不小可以先抽样再算。5. 避坑与排查跑不通、结果怪、图不对怎么办5.1 报错索引超出矩阵维度现象运行main.m时报Index exceeds matrix dimensions指向X(:,1)或类似取列操作。原因.mat文件里的变量名不是X或者数据是转置的实际是 n×m 而不是 m×n。解决先whos看变量名和维度确认样本是按行排列的。如果变量名是data就改成X data;。如果维度反了用X X;转置。转置前确认数据语义别把特征和样本搞反。5.2 质心变成 NaN图上一片空白现象迭代几次后质心全是 NaN散点图颜色全一样或者画不出来。原因某个簇在分配后没有分到任何样本computeCentroids里除以 0 产生 NaN下一轮距离计算全变 NaN。解决在computeCentroids里加空簇判断count 0时跳过更新或重新随机选点。另外检查 K 是不是设得太大样本数少的时候 K 接近样本数就容易出空簇。5.3 每次运行结果都不一样现象同样的数据和 K每次跑出来的簇划分都不同。原因kMeansInitCentroids用randperm随机选初始质心随机种子没固定。解决在main.m开头加rng(42);固定随机种子这样每次运行结果可复现。调试阶段固定种子正式跑的时候可以多跑几次取轮廓系数最高的那次。5.4 高维数据聚类效果差现象数据有几十个特征跑出来的簇在 PCA 图上混在一起轮廓系数很低。原因维度灾难高维空间里距离度量变得不敏感所有点之间的距离趋于接近。解决先做特征选择或降维。常见做法是用 PCA 保留 95% 方差的主成分或者用sequentialfs做特征筛选。也可以对特征做标准化避免量纲大的特征主导距离计算。5.5 迭代次数设太小质心还没稳定就停了现象max_iters设成 3跑完发现质心还在明显移动簇划分不合理。原因迭代次数不够算法没收敛。解决把max_iters调大到 10 到 20或者在runkMeans里加收敛判断如果新旧质心距离小于某个阈值就提前退出。阈值一般取1e-4量级具体看数据尺度。6. 换自己的数据跑一遍从 .mat 到结果图的完整验证拿到这个包最终目的是用它跑自己的数据。假设你有一个my_data.mat里面存了一个features矩阵每行一个样本每列一个特征。下面是从加载到出图的完整流程顺便把 K 的选择也串进去。% 固定随机种子保证结果可复现 rng(42); % 加载自己的数据 load(my_data.mat); X features; % 确认变量名后赋值给 X % 数据标准化K-means 对量纲敏感zscore 按列标准化 X zscore(X); % 确认维度 [m, n] size(X); fprintf(样本数 %d, 特征数 %d\n, m, n); % 用轮廓系数选 K范围 2 到 8 K_range 2:8; silh_scores zeros(length(K_range), 1); for i 1:length(K_range) K K_range(i); init_c kMeansInitCentroids(X, K); [~, idx_tmp] runkMeans(X, init_c, 10); silh_scores(i) mean(silhouette(X, idx_tmp)); end % 找最佳 K [best_silh, best_idx] max(silh_scores); best_K K_range(best_idx); fprintf(最佳 K %d, 轮廓系数 %.4f\n, best_K, best_silh); % 用最佳 K 跑最终聚类 init_c kMeansInitCentroids(X, best_K); [centroids, idx] runkMeans(X, init_c, 20); % PCA 降维可视化 [coeff, score, ~, ~, explained] pca(X); figure; scatter(score(:,1), score(:,2), 20, idx, filled); hold on; centroids_pca (centroids - mean(X)) * coeff(:,1:2); plot(centroids_pca(:,1), centroids_pca(:,2), kx, MarkerSize, 12, LineWidth, 2); title(sprintf(K%d, 轮廓系数%.3f, 前两主成分解释 %.1f%%, ... best_K, best_silh, sum(explained(1:2)))); xlabel(主成分 1); ylabel(主成分 2); colorbar; hold off;这段代码里有几个关键决策点。zscore标准化是必须的因为 K-means 用欧氏距离量纲差一个数量级就会让某个特征主导距离计算。K 的选择用轮廓系数循环扫描比拍脑袋定 K 靠谱。runkMeans的迭代次数在选 K 阶段用 10 就够最终跑用 20 保证收敛。PCA 降维只用于可视化聚类本身还是在原始标准化空间里做的这样不会因为降维丢失信息影响簇划分。跑完这一遍你应该能看到一张带颜色分块的散点图质心用黑叉标出标题里有 K 值和轮廓系数。如果轮廓系数低于 0.3先别急着调 K回头检查数据标准化做了没有、有没有明显的异常值、特征之间是不是高度相关。我自己的习惯是每次换新数据先跑一遍标准化加轮廓系数扫描确认 K 的选择有依据再去看图。从那以后我每次拿到多维矩阵做聚类都强制走一遍标准化 → 轮廓系数选 K → PCA 可视化这三步省掉了很多来回试参数的功夫。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

xberg Dart 绑定中的 LLM 抽象式文档摘要:从配置到实现的全链路解析 2026/9/28 2:42:00

xberg Dart 绑定中的 LLM 抽象式文档摘要:从配置到实现的全链路解析

后端AI 应用NLP 【免费下载链接】xberg Polyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with …

阅读更多 →
SoC存储体系深度解析:从冷启动到应用运行的七层数据流 2026/9/28 2:42:00

SoC存储体系深度解析:从冷启动到应用运行的七层数据流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
open-slide 前端性能实践:为 localStorage、sessionStorage 与 Cookie 读取建立内存缓存 2026/9/28 2:41:59

open-slide 前端性能实践:为 localStorage、sessionStorage 与 Cookie 读取建立内存缓存

【免费下载链接】open-slide A slide framework built for agents. 项目地址: https://gitcode.com/gh_mirrors/op/open-slide 点击查看 免费下载 localStorage、sessionStorage 与 document.cookie 的读写都是同步 I/O,属于浏览器主线程上的阻塞操作&a…

阅读更多 →
FastLED TDD 工作流实战:基于 Red-Green-Refactor 纪律的测试驱动开发指南 2026/9/28 2:41:59

FastLED TDD 工作流实战:基于 Red-Green-Refactor 纪律的测试驱动开发指南

嵌入式物联网硬件开发驱动开发 【免费下载链接】FastLED The FastLED library for colored LED animation on Arduino. Please direct questions/requests for help to the FastLED Reddit community: http://fastled.io/r Wed like to use github "issues" just for…

阅读更多 →
改需求拖一周?一文搞懂企业网站建设内容程序开发 2026/9/28 2:41:59

改需求拖一周?一文搞懂企业网站建设内容程序开发

改需求拖一周?一文搞懂企业网站建设内容程序开发 “改个按钮颜色,代码怎么还要等一周?” 这是很多甲方爸爸或者业务部门同事在催进度时最爱抱怨的话。作为在网站建设圈子里摸爬滚打十年的老兵,我太熟悉这种场景了。很多老板以为网站就是个网页,改改图片…

阅读更多 →
ClawX OpenClaw 配置投递机制深度解析:单一协调器、Mutator 事务与安全提交 2026/9/28 2:41:52

ClawX OpenClaw 配置投递机制深度解析:单一协调器、Mutator 事务与安全提交

人工智能AI 应用桌面应用交互助手 【免费下载链接】ClawX ClawX is a desktop app that provides a graphical interface for OpenClaw AI agents. It turns CLI-based AI orchestration into a desktop experience without using the terminal. China website is https://claw…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉